Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.08.08;
Скачать: [xml.tar.bz2];




Вниз

Непонятки с подгружаемыми модулями 


Андрусь   (2002-07-19 13:00) [0]

Привет всем! Возник такой вопрос: делаю приложение с подгружаемыми пакетами. В опциях проекта ставлю использование своего пакета. Тогда,если я пишу в главной форме
Form2:=TForm2.Create(Application);,то что лишнее будет прикомпилено к exe файлу?
Чего вообще возник вопрос - просмотрел пример в статье "Подгружаемые модули (plugins) в Delphi " Трофимова Игоря.
Там он старается не использовать инициализацию классов в главной форме,а Манагер классов криэйтит в своём модуле на Initialization. Я тоже так пробовал, но лезут ошибки - нарушение доступа по адресу,видимо из-за того,что TList не просит при криэйте Ownera.
Кто сталкивался с этим посоветуйте как лучше.
Зараннее спасибо всем!



Skier   (2002-07-19 16:59) [1]

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



Андрусь   (2002-07-23 13:45) [2]

Извиняюсь за задержку - ездил в гости...

Код простой:

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-23 13:51) [3]

>Андрусь
А как у тебя создаётся ClassManager !?



Андрусь   (2002-07-23 14:03) [4]

ClassManager создаётся также,но доступ через ф-ю(по статье). Но разве в этом фишка...


var
Manager: TClassManager;

function ClassManager: TClassManager;
begin
Result := Manager;
end;

{ ============================================= }
initialization
{ ============================================= }
Manager := TClassManager.Create;

{ ============================================= }
finalization
{ ============================================= }
Manager.Free;



Skier   (2002-07-23 14:45) [5]

>Андрусь
А это у тебя зачем !?

Application.CreateForm(TTS1003_1004Form,TS1003_1004Form);
и
TS1003_1004Form.Destroy;



Андрусь   (2002-07-23 14:48) [6]

Хочу создавать форму при подгрузке пакета.



Skier   (2002-07-23 14:50) [7]

>Андрусь
Ну круто ! И где же ты такое в статье видел !?



Андрусь   (2002-07-23 15:16) [8]

Не,ну я не видел,но хотел так сделать - почему нельзя так. При подгузке выполняется секция Initialization ,а при выгрузке - Finalization.



Skier   (2002-07-23 15:20) [9]

>Андрусь
А в какой строке твоей программы у тебя появляется AV ?



Андрусь   (2002-07-23 15:23) [10]

На FormClose childа



Skier   (2002-07-23 15:28) [11]

>Андрусь
Нет так я не cмогу тебе помочь...Давай весь свой код мне высылай
что ли, а то получается "ошибка в 17 - ой строке".



Андрусь   (2002-07-23 16:02) [12]

Согласен,извиняюсь. Сейчас постараюсь прояснить.
Сразу ясен вопрос зачем создавать форму там - у меня некоторые 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 16:10) [13]

>Андрусь


> Так вот нужно создать DataModule до самой формы,которую
> я создаю как в статье


Если об этой форме идёт речь,
Application.CreateForm(TTS1003_1004Form,TS1003_1004Form);

то как же ты собираешься создавать DataModule до самой формы
если форма у тебя создаётся в секции initialization, т.е. при
загрузке пакета !?





Андрусь   (2002-07-23 16:14) [14]

Ты немного не понял вот код

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:20) [15]

Андрусь


> просто параметром через PostMessage на FormDestroy


Поясни..., пожалуйста.



Андрусь   (2002-07-23 16:26) [16]

Нет проблем:

procedure TBaseModalForm.FormDestroy(Sender: TObject);
begin
PostMessage (Application.MainForm.Handle, WM_MDICHILDDESTROYED,
Package_Handle,0);
end;

А в главной МДИ ловлю этот месседж.



Андрусь   (2002-07-23 16:28) [17]

Нет проблем:

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;



Skier   (2002-07-23 16:32) [18]

>Андрусь
Ужасть !
Зачем же тебе сообщение !??



Андрусь   (2002-07-23 16:46) [19]

А чего мне нравится - просто. Как лучше? Хочу ещё передачу глобальной переменной убрать и слать через сообщение в подгруженный модуль.



Skier   (2002-07-23 16:52) [20]

>Андрусь
А зачем же ты для своего собственного сообщения
используешь, то что уже использует Delphi (WM_MDICHILDDESTROYED)?
Да ещё и без Inherited ! Честно говоря, твой код это вообще
полная горбуха ! (без обид...)



Андрусь   (2002-07-23 17:08) [21]

Обожди,нечего гнать на мою горбушку - как могу так и делаю. То что не доконца всё поясняю - согласен виноват.

const
WM_MDICHILDDESTROYED = WM_USER + 777;

И кстати,скажи мне пожалйста,где эта мессага описана - самому интерестно:искал в unitе Messages - нету.
Так что не надо...

Я же спрашиваю как лучше - знаешь, помоги брату по разуму.



Skier   (2002-07-23 17:14) [22]

>Андрусь
Да ты прав насчёт WM_MDICHILDDESTROYED я погорячился,
был в полной уверенности что это сообщение объявлено в
Messages.



Skier   (2002-07-23 17:16) [23]

>Андрусь
замени PostMessage на SendMessage !



Андрусь   (2002-07-23 17:16) [24]

Попрошу,что-нибудь по существу. Говоришь горбыли я строгаю - подскажи как лучше.



Андрусь   (2002-07-23 17:33) [25]

>замени PostMessage на SendMessage !
А смысл.

Думал что-то глобальное предложишь.
Сейчас предельно всё упростил,чтобы было как я описал,без наворотов. Нашел небольшой глюк - судя по всему AV из-за него был.Но особо лучше не стало. При закрытии главной формы вываливает CPU Window. Причем так прикольно - если форму,которая в пакете откроешь больше 2 раз - его не будет.



Skier   (2002-07-23 17:35) [26]

>Андрусь
Высылай мне свой предельно упрощённый код.
Иначе мне очень трудно идти на ощупь...



Андрусь   (2002-07-23 17:44) [27]

Я сделал его таким какой тебе присылал.Что конкретно ещё показать.



Андрусь   (2002-07-23 18:20) [28]

Вообще вываливающие CPU window - это от чего. Если нет исходников ошибки?



Андрусь   (2002-07-23 19:59) [29]

Уважуемый тов. Skier! Куда же вы пропали.
Смотрю Event Log - не освобождаю что-то в куче.Исходя из написанного выше кода,какие могут быть догадки.

ODS: HEAP: Free Heap block 12cafe0 modified at 12cb188 after it was freed Process Str_Project.exe ($3EC)



Андрусь   (2002-07-25 16:05) [30]

Уважуемый Skier!
Давайте попробуем ещё раз. Уже который день долблюсь - та же ошибка. Удалось локализовать проблему,но ясности нет.
Зараннее большое спасибо за поддержку.



Skier   (2002-07-25 16:07) [31]

>Андрусь
См. Skier © (23.07.02 17:35)
На других условиях я пас...



Андрусь   (2002-07-25 16:43) [32]

Ок нет проблем!
Буду слать по частям. Чего неясно спрашивай. Если сильно засорять форум будем - можно по аське.
Так вот: есть MDI приложение с дочерними формами в пакетах. Приложение для работы с базой. Доступ к базе через Odac. Чаелды идут от TForm и разделяются на 2 ветви - модальные и немодальные.

TBaseModalForm = class(TForm);
TBaseChildForm = class(TBaseModalForm);

В классе TBaseModalForm я организовываю систему сохранения персональных настроек под юзера. Их я храню в базе. И на FormCreate зачитываю.

Function TBaseModalForm.LoadFormSettings:Boolean;
var user:string;a:array of integer;
Begin
Result:=False;
With MainOraData Do
Begin
Query_Clear(FormOptionsSmQuery,False);
user:=MainOraData.MainOraSession.Username;
End;
SetLength(a,4);
{With MainOraData.FormOptionsSmQuery Do
Begin
AddWhere
("UserName = "+""""+user+""""+"AND FormName = "+""""+Self.Name+"""");
Open;
If RecordCount>0 Then
If Locate("FormItemName",Self.Name,[]) Then
With Self Do
Begin
StrToInt_Arr(FieldByName("InitialData").AsString,a);
Width:=a[0];
Height:=a[1];
Left:=a[2];
Top:=a[3];
Result:=True;
End;}
End;
End;

MainOraData - главный DataModule,где находятся общие компоненты для доступа к базе. Так вроде названия информативные - если не ясно спрашивай.
Если поставить {} там,где они стоят,то всё сработает нормально,если их убрать,то вылетает CPU window с ошибкой.
И ещё прикол. Вкладываю в пакет наследника от TBaseModalForm - ошибки нет. Если - от TBaseChildForm,тогда ошибка.



Skier   (2002-07-25 16:50) [33]

>Андрусь
дык ! по почте шли !



Андрусь   (2002-07-25 17:15) [34]

Ок,а что слать. Пошлю 3 модуля:MainForm; BaseModalForm; BaseChildForm.
Поясни как тебе удобней.



Skier   (2002-07-25 17:17) [35]

>Андрусь
Высылай всё...Что бы программы у меня скомпилилась.



Андрусь   (2002-07-25 17:27) [36]

Ок щас пошлю - у тебя есть Odacовские компоненты и грид от DevExpress. Если нет,буду обрезать либо сам покоцаешь чтоб скомпилилось.



Skier   (2002-07-25 17:29) [37]

>Андрусь
Ну ты дал ! Я же писал "Высылай мне свой предельно упрощённый код" !



Андрусь   (2002-07-25 17:42) [38]

Понимаешь ли,я же писал - ставишь фигурные скобки в одном месте - локализация проблемы - и всё в порядке. Даже не знаю чего делать. Но та штука локальная ошибка - модуль я послал. и как быть....




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.08.08;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.79 MB
Время: 0.036 c
1-23983           Mr. JS                2002-07-27 13:19  2002.08.08  
Имя узла в TreeView?


3-23912           maxon                 2002-07-15 10:31  2002.08.08  
запрос


1-24010           anod                  2002-07-28 16:32  2002.08.08  
TTrackBar


1-23982           DeepProg              2002-07-20 19:37  2002.08.08  
Два в одном


7-24247           Bosss20000            2002-05-24 19:35  2002.08.08  
Запуск приложений....