| 
| 
 | Вопрос # 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;beginend.{{/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. |  
 Мини-форум вопросаМини-форум пуст. Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |