Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Непонятки с подгружаемыми модулями [D6, Win2k]


Страницы:   1 2

Андрусь ©   (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]

>Андрусь
Хорошо бы код увидеть.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо