Форум: "Основная";
Текущий архив: 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]Понимаешь ли,я же писал - ставишь фигурные скобки в одном месте - локализация проблемы - и всё в порядке. Даже не знаю чего делать. Но та штука локальная ошибка - модуль я послал. и как быть....
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.08.08;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.007 c