Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 048

/ вопрос открыт /

Здравствуйте, эксперты!

Хочу написать процедуру, которая находит все компоненты на форме и переписывает их в файл.
Процедура д.б. в длл-ке, чтобы подгружать к разным проектам.

Проблема вот в чем. ПРоцедура видит количество элементов на форме, но перебора не происходит.
Ни одно условие в цикле не срабатывает.
Подскажите почему?

Заранее спасибо.

Приложение:
  1.  
  2. {{code}}
  3. library MyDll;
  4.  
  5. uses
  6. SysUtils,
  7. Classes,
  8. Forms,
  9. IniFiles,
  10. StdCtrls,
  11. Buttons,
  12. Mask,
  13. ComCtrls,
  14. CheckLst,
  15. Menus,
  16. ActnList;
  17.  
  18. {$R *.res}
  19.  
  20. procedure GenerateCompList(targetForm: TForm; path: String); export;
  21. var
  22. i, j, k, ComCount, valv, valcode: Integer;
  23. tmpStr, tmpStr2, tmpStr3: String;
  24. MyIniFile: TIniFile;
  25. begin
  26. tmpStr := path;
  27. MyIniFile := TIniFile.Create(tmpStr+'rescomps.ini');
  28. //
  29. tmpStr := targetForm.Name;
  30. //
  31. tmpStr2 := targetForm.Caption;
  32. MyIniFile.WriteString(tmpStr+'Section', 'CaptionValue', tmpStr2);
  33. tmpStr2 := targetForm.Hint;
  34. MyIniFile.WriteString(tmpStr+'Section', 'HintValue', tmpStr2);
  35. //
  36. ComCount := 0;
  37. for j := 0 to targetForm.ComponentCount - 1 do
  38. begin
  39. // simple components
  40. if targetForm.Components[j] is TLabel then
  41. begin
  42. ComCount := ComCount + 1;
  43. tmpStr2 := (targetForm.Components[j] as TLabel).Name;
  44. MyIniFile.WriteString(tmpStr+'Section', 'Item'+IntToStr(ComCount)+'Name', tmpStr2);
  45. MyIniFile.WriteString(tmpStr+'Section', 'Item'+IntToStr(ComCount)+'ClassName',
  46. (targetForm.Components[j] as TLabel).ClassName);
  47. //
  48. tmpStr3 := (targetForm.Components[j] as TLabel).Caption;
  49. MyIniFile.WriteString(tmpStr+'Section', 'Item'+IntToStr(ComCount)+'CaptionValue', tmpStr3);
  50. tmpStr3 := (targetForm.Components[j] as TLabel).Hint;
  51. MyIniFile.WriteString(tmpStr+'Section', 'Item'+IntToStr(ComCount)+'HintValue', tmpStr3);
  52. end;
  53. //
  54. if targetForm.Components[j] is TEdit then
  55. begin
  56. ComCount := ComCount + 1;
  57. tmpStr2 := (targetForm.Components[j] as TEdit).Name;
  58. MyIniFile.WriteString(tmpStr+'Section', 'Item'+IntToStr(ComCount)+'Name', tmpStr2);
  59. MyIniFile.WriteString(tmpStr+'Section', 'Item'+IntToStr(ComCount)+'ClassName',
  60. (targetForm.Components[j] as TEdit).ClassName);
  61. //
  62. tmpStr3 := (targetForm.Components[j] as TEdit).Text;
  63. MyIniFile.WriteString(tmpStr+'Section', 'Item'+IntToStr(ComCount)+'TextValue', tmpStr3);
  64. tmpStr3 := (targetForm.Components[j] as TEdit).Hint;
  65. MyIniFile.WriteString(tmpStr+'Section', 'Item'+IntToStr(ComCount)+'HintValue', tmpStr3);
  66. end;
  67. end;
  68. //
  69. MyIniFile.WriteInteger(tmpStr+'Section', 'ItemsCount', ComCount);
  70. //
  71. MyIniFile.Free;
  72. MyIniFile := nil;
  73. end;
  74. //
  75. exports
  76. GenerateCompList;
  77. begin
  78. end.
  79. {{/code}}
  80.  
  81.  
  82. {{code}}
  83. var
  84. Form1: TForm1;
  85. //
  86. procedure GenerateCompList(tFrm: TForm; pth: String); external 'MyDll.dll' ;
  87.  
  88. implementation
  89.  
  90. {$R *.dfm}
  91.  
  92. procedure TForm1.FormCreate(Sender: TObject);
  93. begin
  94. if ParamCount > 0 then
  95. if LowerCase(ParamStr(1)) = '/gentranstbl' then
  96. begin
  97. GenerateCompList(Form1, ExtractFilePath(Application.ExeName));
  98. end;
  99.  
  100. end;
  101. {{/code}}


Muratov Radik Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Muratov Radik (статус: Посетитель)
Вопрос отправлен: 16 апреля 2010, 12:56
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Muratov Radik!
Во первых, если есть функции с типом параметра String, то где sharemem в списке uses?
Но это не причина. Совершенно официально, для длл создается отдельный экземпляр Application и некоторых других структур.
Из этого всего получается
- любой класс, объявленный в основном приложении и в длл, хоть и имеют одинаковое имя и определение, являются РАЗНЫМИ КЛАССАМИ!
- обращаться с длл напрямую к элементам формы (и вообще vcl элементам приложения) НЕЛЬЗЯ. Результат такого поведения "неопределенный". Иногда работает, иногда глючит.

Почему? не предназначены длл для такой работы. То есть, это поведение по дизайну.

Но если сильно хочется вынести код в отдельный файл, то следует использовать bpl файлы. Там все будет работать так как ожидается. Плюс их размер удивит Вас:)

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 16 апреля 2010, 13:04
Оценка за ответ: 5

Комментарий к оценке: Спасибо. Попробую через bpl.

Мини-форум вопроса

Мини-форум пуст.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:42
Выполнено за 0.02 сек.