![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Непонятки с подгружаемыми модулями [D6, Win2k]
Андрусь © (2002-07-19 13:00:00)Привет всем! Возник такой вопрос: делаю приложение с подгружаемыми пакетами. В опциях проекта ставлю использование своего пакета. Тогда,если я пишу в главной форме
Form2:=TForm2.Create(Application);,то что лишнее будет прикомпилено к exe файлу?
Чего вообще возник вопрос - просмотрел пример в статье "Подгружаемые модули (plugins) в Delphi " Трофимова Игоря.
Там он старается не использовать инициализацию классов в главной форме,а Манагер классов криэйтит в своём модуле на Initialization. Я тоже так пробовал, но лезут ошибки - нарушение доступа по адресу,видимо из-за того,что TList не просит при криэйте Ownera.
Кто сталкивался с этим посоветуйте как лучше.
Зараннее спасибо всем!
Skier (2002-07-23 16:32:00) [21]>Андрусь
Ужасть !
Зачем же тебе сообщение !??
Андрусь (2002-07-23 16:28:00) [22]Нет проблем:
procedure TBaseModalForm.FormDestroy(Sender: TObject);
begin
PostMessage (Application.MainForm.Handle, WM_MDICHILDDESTROYED,
Package_Handle,0);
end;
А в главной МДИ ловлю этот месседж. И выгружаю пакет с этим хэндлом.
procedure TMainForm.WMMDIChildDestroyed (var Message : TMessage);
begin
if Message.Wparam <> 0 then UnloadPackage(Message.Wparam);
end;
Андрусь (2002-07-23 16:26:00) [23]Нет проблем:
procedure TBaseModalForm.FormDestroy(Sender: TObject);
begin
PostMessage (Application.MainForm.Handle, WM_MDICHILDDESTROYED,
Package_Handle,0);
end;
А в главной МДИ ловлю этот месседж.
Skier (2002-07-23 16:20:00) [24]Андрусь
> просто параметром через PostMessage на FormDestroy
Поясни..., пожалуйста.
Андрусь (2002-07-23 16:14:00) [25]Ты немного не понял вот код
initialization
{ ============================================= }
Begin
ClassManager.Add(TTS1003_1004Form);
TS1003_1004Data:=TTS1003_1004Data.Create(Application);
End;
{ ============================================= }
finalization
{ ============================================= }
Begin
ClassManager.Remove(TTS1003_1004Form);
TS1003_1004Data.Destroy;
End;
А сама форма - в коде загрузки,который я писал выше.
Application.CreateForm(BaseFormClass,BaseForm);
Skier (2002-07-23 16:10:00) [26]>Андрусь
> Так вот нужно создать DataModule до самой формы,которую
> я создаю как в статье
Если об этой форме идёт речь,
Application.CreateForm(TTS1003_1004Form,TS1003_1004Form);
то как же ты собираешься создавать DataModule до самой формы
если форма у тебя создаётся в секции initialization, т.е. при
загрузке пакета !?
Андрусь (2002-07-23 16:02:00) [27]Согласен,извиняюсь. Сейчас постараюсь прояснить.
Сразу ясен вопрос зачем создавать форму там - у меня некоторые childы сцеплены с DataModule,в которых невизуальные компоненты для работы с базой. Так вот нужно создать DataModule до самой формы,которую я создаю как в статье. Можно былобы делать как в статье через TList тоже,но так казалось проще,а сейчас даже интерестно.Надеюсь немного прояснил :-)
Загрузка пакета:
var BaseFormClass: TComponentClass;
BaseForm: TBaseModalForm;
PackageHandle : HMODULE;
begin
PackageHandle := LoadPackage("P_TS1003_1004.bpl");
BaseFormClass := ClassManager[0];
Application.CreateForm(BaseFormClass,BaseForm);
BaseForm.Package_Handle:=PackageHandle;передача в хэндла в подгруженный модуль для простоты выгрузки(просто параметром через PostMessage на FormDestroy)
BaseForm.Show;
Секции Initialization,Finalization ты видел,только там создаётся не форма,а DataModule просто
DataModule:=TDataModule.Create()
На FormClose
Action:=CaFree;
Что непонятно ещё?
Skier (2002-07-23 15:28:00) [28]>Андрусь
Нет так я не cмогу тебе помочь...Давай весь свой код мне высылай
что ли, а то получается "ошибка в 17 - ой строке".
Андрусь (2002-07-23 15:23:00) [29]На FormClose childа
Skier (2002-07-23 15:20:00) [30]>Андрусь
А в какой строке твоей программы у тебя появляется AV ?
Андрусь (2002-07-23 15:16:00) [31]Не,ну я не видел,но хотел так сделать - почему нельзя так. При подгузке выполняется секция Initialization ,а при выгрузке - Finalization.
Skier (2002-07-23 14:50:00) [32]>Андрусь
Ну круто ! И где же ты такое в статье видел !?
Андрусь (2002-07-23 14:48:00) [33]Хочу создавать форму при подгрузке пакета.
Skier (2002-07-23 14:45:00) [34]>Андрусь
А это у тебя зачем !?
Application.CreateForm(TTS1003_1004Form,TS1003_1004Form);
и
TS1003_1004Form.Destroy;
Андрусь (2002-07-23 14:03:00) [35]ClassManager создаётся также,но доступ через ф-ю(по статье). Но разве в этом фишка...
var
Manager: TClassManager;
function ClassManager: TClassManager;
begin
Result := Manager;
end;
{ ============================================= }
initialization
{ ============================================= }
Manager := TClassManager.Create;
{ ============================================= }
finalization
{ ============================================= }
Manager.Free;
Skier (2002-07-23 13:51:00) [36]>Андрусь
А как у тебя создаётся ClassManager !?
Андрусь (2002-07-23 13:45:00) [37]Извиняюсь за задержку - ездил в гости...
Код простой:
initialization
{ ============================================= }
Begin
ClassManager.Add(TTS1003_1004Form);
Application.CreateForm(TTS1003_1004Form,TS1003_1004Form);
End;
{ ============================================= }
finalization
{ ============================================= }
Begin
ClassManager.Remove(TTS1003_1004Form);
TS1003_1004Form.Destroy;
End;
end{ ========================================= }.
Skier (2002-07-19 16:59:00) [38]>Андрусь
Хорошо бы код увидеть.