|
Вопрос # 4 048/ вопрос открыт / |
|
Здравствуйте, эксперты!
Хочу написать процедуру, которая находит все компоненты на форме и переписывает их в файл.
Процедура д.б. в длл-ке, чтобы подгружать к разным проектам.
Проблема вот в чем. ПРоцедура видит количество элементов на форме, но перебора не происходит.
Ни одно условие в цикле не срабатывает.
Подскажите почему?
Заранее спасибо.
Приложение: Переключить в обычный режим-
- {{code}}
- library MyDll;
-
- uses
- SysUtils,
- Classes,
- Forms,
- IniFiles,
- StdCtrls,
- Buttons,
- Mask,
- ComCtrls,
- CheckLst,
- Menus,
- ActnList;
-
- {$R *.res}
-
- procedure GenerateCompList(targetForm: TForm; path: String); export;
- var
- i, j, k, ComCount, valv, valcode: Integer;
- tmpStr, tmpStr2, tmpStr3: String;
- MyIniFile: TIniFile;
- begin
- tmpStr := path;
- MyIniFile := TIniFile.Create(tmpStr+'rescomps.ini');
- //
- tmpStr := targetForm.Name;
- //
- tmpStr2 := targetForm.Caption;
- MyIniFile.WriteString(tmpStr+'Section', 'CaptionValue', tmpStr2);
- tmpStr2 := targetForm.Hint;
- MyIniFile.WriteString(tmpStr+'Section', 'HintValue', tmpStr2);
- //
- ComCount := 0;
- for j := 0 to targetForm.ComponentCount - 1 do
- begin
- // simple components
- if targetForm.Components[j] is TLabel then
- begin
- ComCount := ComCount + 1;
- tmpStr2 := (targetForm.Components[j] as TLabel).Name;
- MyIniFile.WriteString(tmpStr+'Section', 'Item'+IntToStr(ComCount)+'Name', tmpStr2);
- MyIniFile.WriteString(tmpStr+'Section', 'Item'+IntToStr(ComCount)+'ClassName',
- (targetForm.Components[j] as TLabel).ClassName);
- //
- tmpStr3 := (targetForm.Components[j] as TLabel).Caption;
- MyIniFile.WriteString(tmpStr+'Section', 'Item'+IntToStr(ComCount)+'CaptionValue',
tmpStr3);
- tmpStr3 := (targetForm.Components[j] as TLabel).Hint;
- MyIniFile.WriteString(tmpStr+'Section', 'Item'+IntToStr(ComCount)+'HintValue', tmpStr3);
- end;
- //
- if targetForm.Components[j] is TEdit then
- begin
- ComCount := ComCount + 1;
- tmpStr2 := (targetForm.Components[j] as TEdit).Name;
- MyIniFile.WriteString(tmpStr+'Section', 'Item'+IntToStr(ComCount)+'Name', tmpStr2);
- MyIniFile.WriteString(tmpStr+'Section', 'Item'+IntToStr(ComCount)+'ClassName',
- (targetForm.Components[j] as TEdit).ClassName);
- //
- tmpStr3 := (targetForm.Components[j] as TEdit).Text;
- MyIniFile.WriteString(tmpStr+'Section', 'Item'+IntToStr(ComCount)+'TextValue', tmpStr3);
- tmpStr3 := (targetForm.Components[j] as TEdit).Hint;
- MyIniFile.WriteString(tmpStr+'Section', 'Item'+IntToStr(ComCount)+'HintValue', tmpStr3);
- end;
- end;
- //
- MyIniFile.WriteInteger(tmpStr+'Section', 'ItemsCount', ComCount);
- //
- MyIniFile.Free;
- MyIniFile := nil;
- end;
- //
- exports
- GenerateCompList;
- begin
- end.
- {{/code}}
-
-
- {{code}}
- var
- Form1: TForm1;
- //
- procedure GenerateCompList(tFrm: TForm; pth: String); external 'MyDll.dll' ;
-
- implementation
-
- {$R *.dfm}
-
- procedure TForm1.FormCreate(Sender: TObject);
- begin
- if ParamCount > 0 then
- if LowerCase(ParamStr(1)) = '/gentranstbl' then
- begin
- GenerateCompList(Form1, ExtractFilePath(Application.ExeName));
- end;
-
- end;
- {{/code}}
 |
Вопрос задал: Muratov Radik (статус: Посетитель)
Вопрос отправлен: 16 апреля 2010, 12:56
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, Muratov Radik!
Во первых, если есть функции с типом параметра String, то где sharemem в списке uses?
Но это не причина. Совершенно официально, для длл создается отдельный экземпляр Application и некоторых других структур.
Из этого всего получается
- любой класс, объявленный в основном приложении и в длл, хоть и имеют одинаковое имя и определение, являются РАЗНЫМИ КЛАССАМИ!
- обращаться с длл напрямую к элементам формы (и вообще vcl элементам приложения) НЕЛЬЗЯ. Результат такого поведения "неопределенный". Иногда работает, иногда глючит.
Почему? не предназначены длл для такой работы. То есть, это поведение по дизайну.
Но если сильно хочется вынести код в отдельный файл, то следует использовать bpl файлы. Там все будет работать так как ожидается. Плюс их размер удивит Вас:)
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 16 апреля 2010, 13:04
Оценка за ответ: 5
Комментарий к оценке: Спасибо. Попробую через bpl.
|
Мини-форум вопроса
Мини-форум пуст.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|