![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
MDI in DLL
Feds © (2007-04-02 14:10:00)День добрый!
Сталкнулся с проблемой и никак не могу решить!
Ситуация. Создал МДИ-форму, положил ее в ДЛЛ. Подгружаю Длл. Создаю форму. Форма создается. Все работает. НО!
как бы не передается полностью ей управление. т.е. таб бегает по контролам главной форме, хотя активно мое МДИ окно.
В чем может крыться подвох?
Frozzen (2007-04-04 06:07:00) [1]Действительно наверно выход переход на бпл. С длл все непросто там с классами выходит
Сергей М. (2007-04-03 16:41:00) [2]Ну и чаво ты этим кодом хотел сказать ?
Ну да, ну любой объект-наследник TForm тем самым заносится в упомянутый список...
и чаво ?
И это - "регистрация класса" называется ?
vl_chel (2007-04-03 16:37:00) [3]Sorry в Screen
constructor TCustomForm.CreateNew(AOwner: TComponent; Dummy: Integer);
begin
inherited Create(AOwner);
.........
Screen.AddForm(Self);
end;
procedure TScreen.AddForm(AForm: TCustomForm);
begin
FCustomForms.Add(AForm);
if AForm is TForm then
begin
FForms.Add(AForm);
Application.UpdateVisible;
end;
end;
Сергей М. (2007-04-03 16:22:00) [4]
> при создании окна через класс TForm, экземпляр окна регистрируется
> в объекте Application
Чавой-то ?
Цитируй код ..
vl_chel (2007-04-03 16:19:00) [5]Но при создании окна через класс TForm, экземпляр окна регистрируется в объекте Application. Эти экземпляры для библиотеки и приложения разные, форма будет нормально создаваться, в принципе корректно работать до тех пор пока ее модель поведения не пересекается с другими формами приложения, поэтому и надо согласовывать работу экземпляров Application. Для MDI приложений это намного сложнее - в свое время изза этого отказался от этой архитектуры.
В классической литературе (Том Сван, Тексейра) вызов функции библиотеки, создающей экземпляр TForm и называется "экспортом формы из библиотеки"
Сергей М. (2007-04-03 15:48:00) [6]Это называется "вызываю некую ф-цию, которую экспортирует моя dll".
vl_chel (2007-04-03 15:39:00) [7]>>Ситуация. Создал МДИ-форму, положил ее в ДЛЛ. Подгружаю Длл. Создаю форму. Форма создается. Все работает. НО!
А как это называеться?
Сергей М. (2007-04-03 15:32:00) [8]
> vl_chel © (03.04.07 15:25) [21]
>
> Если хотите нормально экспортировать форму
dll не экспортирует никаких "форм".
dll экспортирует именованые и/или индексированные адреса.
Точно так же как и bpl - разницы никакой.
vl_chel (2007-04-03 15:25:00) [9]Если хотите нормально экспортировать форму из dll то в нее надо передать Application.Handle приложения и связать с объектом Application который в dll
А для MDI Child (наверное) нужно передать Handle MDI главного окна
и не забыть все востановить при выгрузки dll
Сергей М. (2007-04-03 14:14:00) [10]Тебе уже сказано - пользуй пакеты (bpl), там под твои задачи "заточено" все.
Lex3912 (2007-04-03 14:09:00) [11]ну... дык как получается быть с использованием одного и тогоже класса компонента в двух разных длл, одноврменно подгружаемых? Не понимаю. Так как я использую компонент, класс нужен в обоих длл.. Каким образом чего объявляется в таких ситуациях?
Сергей М. (2007-04-03 13:59:00) [12]"поместил туда форму" = декларировалкласс формы !
> я сам руками нигде не прописывал регистрацию классов
Регистрация декларированного тобой класса в RTTI происходит в ран-тайм, т.е. при загрузке модуля.
Lex3912 (2007-04-03 13:54:00) [13]я сам руками нигде не прописывал регистрацию классов....
Lex3912 (2007-04-03 13:50:00) [14]т.е. я создал 2 длл. поместил туда форму. на форме разместил сх-компонент. скомпилировал с ран-тайм. и при загрузке обоих длл получаю эту ошибку...
Lex3912 (2007-04-03 13:43:00) [15]я возможно покажусь тормозом, но где они деклариуются? откуда вырезать?
Сергей М. (2007-04-03 13:38:00) [16]
> Обе длл используют сх-компаненты
Да по барабану что они используют)
Важно что они декларируют!
Сергей М. (2007-04-03 13:36:00) [17]
> длл компилится не будет
Это как ?
С луны готовая свалится что ли ?)
Lex3912 (2007-04-03 13:26:00) [18]Обе длл используют сх-компаненты. Соответсвенно в uses имеют один и тот жде модуль с этим класом.
Lex3912 (2007-04-03 13:13:00) [19]Так скорее всего не получится, потому как длл компилится не будет. Ругается в частности на TcxRect.
Сергей М. (2007-04-03 12:47:00) [20]
> Как это обрулить?
"Обрулить" оч просто - убрать к чертям дублирование декларации одного и того же класса в более чем одном из взаимодействующих модулей, обращающихся к этому классу.