Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
7-24252
SergeyDon
2002-05-23 13:59
2002.08.08
Как заставить Win_XP


14-24192
Igorek
2002-07-12 17:17
2002.08.08
Стереть информацию с HDD без возможности восстановления


3-23864
Поляков А.Н.
2002-07-19 15:30
2002.08.08
Головоломка с IBX-компонентами


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


3-23907
sniknik
2002-07-17 12:19
2002.08.08
Метод на обсуждение, рефреш датасета измененного копией программы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский