![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Непонятки с подгружаемыми модулями [D6, Win2k]
Андрусь © (2002-07-19 13:00:00)Привет всем! Возник такой вопрос: делаю приложение с подгружаемыми пакетами. В опциях проекта ставлю использование своего пакета. Тогда,если я пишу в главной форме
Form2:=TForm2.Create(Application);,то что лишнее будет прикомпилено к exe файлу?
Чего вообще возник вопрос - просмотрел пример в статье "Подгружаемые модули (plugins) в Delphi " Трофимова Игоря.
Там он старается не использовать инициализацию классов в главной форме,а Манагер классов криэйтит в своём модуле на Initialization. Я тоже так пробовал, но лезут ошибки - нарушение доступа по адресу,видимо из-за того,что TList не просит при криэйте Ownera.
Кто сталкивался с этим посоветуйте как лучше.
Зараннее спасибо всем!
Андрусь (2002-07-25 17:42:00) [1]Понимаешь ли,я же писал - ставишь фигурные скобки в одном месте - локализация проблемы - и всё в порядке. Даже не знаю чего делать. Но та штука локальная ошибка - модуль я послал. и как быть....
Skier (2002-07-25 17:29:00) [2]>Андрусь
Ну ты дал ! Я же писал "Высылай мне свой предельно упрощённый код" !
Андрусь (2002-07-25 17:27:00) [3]Ок щас пошлю - у тебя есть Odacовские компоненты и грид от DevExpress. Если нет,буду обрезать либо сам покоцаешь чтоб скомпилилось.
Skier (2002-07-25 17:17:00) [4]>Андрусь
Высылай всё...Что бы программы у меня скомпилилась.
Андрусь (2002-07-25 17:15:00) [5]Ок,а что слать. Пошлю 3 модуля:MainForm; BaseModalForm; BaseChildForm.
Поясни как тебе удобней.
Skier (2002-07-25 16:50:00) [6]>Андрусь
дык ! по почте шли !
Андрусь (2002-07-25 16:43:00) [7]Ок нет проблем!
Буду слать по частям. Чего неясно спрашивай. Если сильно засорять форум будем - можно по аське.
Так вот: есть 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:07:00) [8]>Андрусь
См. Skier © (23.07.02 17:35)
На других условиях я пас...
Андрусь (2002-07-25 16:05:00) [9]Уважуемый Skier!
Давайте попробуем ещё раз. Уже который день долблюсь - та же ошибка. Удалось локализовать проблему,но ясности нет.
Зараннее большое спасибо за поддержку.
Андрусь (2002-07-23 19:59:00) [10]Уважуемый тов. Skier! Куда же вы пропали.
Смотрю Event Log - не освобождаю что-то в куче.Исходя из написанного выше кода,какие могут быть догадки.
ODS: HEAP: Free Heap block 12cafe0 modified at 12cb188 after it was freed Process Str_Project.exe ($3EC)
Андрусь (2002-07-23 18:20:00) [11]Вообще вываливающие CPU window - это от чего. Если нет исходников ошибки?
Андрусь (2002-07-23 17:44:00) [12]Я сделал его таким какой тебе присылал.Что конкретно ещё показать.
Skier (2002-07-23 17:35:00) [13]>Андрусь
Высылай мне свой предельно упрощённый код.
Иначе мне очень трудно идти на ощупь...
Андрусь (2002-07-23 17:33:00) [14]>замени PostMessage на SendMessage !
А смысл.
Думал что-то глобальное предложишь.
Сейчас предельно всё упростил,чтобы было как я описал,без наворотов. Нашел небольшой глюк - судя по всему AV из-за него был.Но особо лучше не стало. При закрытии главной формы вываливает CPU Window. Причем так прикольно - если форму,которая в пакете откроешь больше 2 раз - его не будет.
Андрусь (2002-07-23 17:16:00) [15]Попрошу,что-нибудь по существу. Говоришь горбыли я строгаю - подскажи как лучше.
Skier (2002-07-23 17:16:00) [16]>Андрусь
замени PostMessage на SendMessage !
Skier (2002-07-23 17:14:00) [17]>Андрусь
Да ты прав насчёт WM_MDICHILDDESTROYED я погорячился,
был в полной уверенности что это сообщение объявлено в
Messages.
Андрусь (2002-07-23 17:08:00) [18]Обожди,нечего гнать на мою горбушку - как могу так и делаю. То что не доконца всё поясняю - согласен виноват.
const
WM_MDICHILDDESTROYED = WM_USER + 777;
И кстати,скажи мне пожалйста,где эта мессага описана - самому интерестно:искал в unitе Messages - нету.
Так что не надо...
Я же спрашиваю как лучше - знаешь, помоги брату по разуму.
Skier (2002-07-23 16:52:00) [19]>Андрусь
А зачем же ты для своего собственного сообщения
используешь, то что уже использует Delphi (WM_MDICHILDDESTROYED)?
Да ещё и без Inherited ! Честно говоря, твой код это вообще
полная горбуха ! (без обид...)
Андрусь (2002-07-23 16:46:00) [20]А чего мне нравится - просто. Как лучше? Хочу ещё передачу глобальной переменной убрать и слать через сообщение в подгруженный модуль.