Форум: "Основная";
Текущий архив: 2007.06.03;
Скачать: [xml.tar.bz2];
ВнизMDI in DLL Найти похожие ветки
← →
Feds (2007-04-02 14:10) [0]День добрый!
Сталкнулся с проблемой и никак не могу решить!
Ситуация. Создал МДИ-форму, положил ее в ДЛЛ. Подгружаю Длл. Создаю форму. Форма создается. Все работает. НО!
как бы не передается полностью ей управление. т.е. таб бегает по контролам главной форме, хотя активно мое МДИ окно.
В чем может крыться подвох?
← →
Feds (2007-04-03 07:57) [1]может быть от того что кроме присвоения Application := TApplication(App);
нужно скрин присваивать еще Screen := TScreen(Scr);??
Scr, App - скрин и апликатион главной формы
← →
Сергей М. © (2007-04-03 08:48) [2]
> Feds
> Сталкнулся с проблемой и никак не могу решить
Проблема сама собой рассосется, если разместить форму в BPL и собрать оба проекта (ЕХЕ и BPL) с установленной опцией Build With Run-Time Packages
← →
Feds (2007-04-03 09:01) [3]Да да, я тоже это предполагал..... Но много пересобирать придется... С Длл никак не решается чтоль?
← →
Сергей М. © (2007-04-03 09:05) [4]
> много пересобирать придется
Лучше один раз пересобрать все взаимодействующие проекты, чем создавать себе проблемы и потом героически их преодолевать.
← →
Lex3912 (2007-04-03 09:28) [5]Поставил галку на билд виз рантайм пакадж на екзешнике и длл таб заработал. Почему?
← →
Сергей М. © (2007-04-03 09:57) [6]Потому что RTL у ЕХЕ и DLL стала общая.
← →
Feds (2007-04-03 11:36) [7]Дык придется бпл так за собой таскать.... неужели никак не решается проблема при использовании Длл и без такой компиляции?
← →
Сергей М. © (2007-04-03 11:39) [8]
> Дык придется бпл так за собой таскать
а dll разве не придется с собой таскать ? Ты ее, эту свою dll, зачем тогда разрабатываешь, если не "таскать" ?)
← →
Lex3912 (2007-04-03 12:37) [9]Вылез такой косяк - есть две длл, обе и екзешник компилим с пакаджами. При вызове их возникает ошибка что класс ХХХ уже зарегестрирован и существует. Как это обрулить?
← →
Сергей М. © (2007-04-03 12:47) [10]
> Как это обрулить?
"Обрулить" оч просто - убрать к чертям дублирование декларации одного и того же класса в более чем одном из взаимодействующих модулей, обращающихся к этому классу.
← →
Lex3912 (2007-04-03 13:13) [11]Так скорее всего не получится, потому как длл компилится не будет. Ругается в частности на TcxRect.
← →
Lex3912 (2007-04-03 13:26) [12]Обе длл используют сх-компаненты. Соответсвенно в uses имеют один и тот жде модуль с этим класом.
← →
Сергей М. © (2007-04-03 13:36) [13]
> длл компилится не будет
Это как ?
С луны готовая свалится что ли ?)
← →
Сергей М. © (2007-04-03 13:38) [14]
> Обе длл используют сх-компаненты
Да по барабану что они используют)
Важно что они декларируют !
← →
Lex3912 (2007-04-03 13:43) [15]я возможно покажусь тормозом, но где они деклариуются? откуда вырезать?
← →
Lex3912 (2007-04-03 13:50) [16]т.е. я создал 2 длл. поместил туда форму. на форме разместил сх-компонент. скомпилировал с ран-тайм. и при загрузке обоих длл получаю эту ошибку...
← →
Lex3912 (2007-04-03 13:54) [17]я сам руками нигде не прописывал регистрацию классов....
← →
Сергей М. © (2007-04-03 13:59) [18]"поместил туда форму" = декларировал класс формы !
> я сам руками нигде не прописывал регистрацию классов
Регистрация декларированного тобой класса в RTTI происходит в ран-тайм, т.е. при загрузке модуля.
← →
Lex3912 (2007-04-03 14:09) [19]ну... дык как получается быть с использованием одного и тогоже класса компонента в двух разных длл, одноврменно подгружаемых? Не понимаю. Так как я использую компонент, класс нужен в обоих длл.. Каким образом чего объявляется в таких ситуациях?
← →
Сергей М. © (2007-04-03 14:14) [20]Тебе уже сказано - пользуй пакеты (bpl), там под твои задачи "заточено" все.
← →
vl_chel © (2007-04-03 15:25) [21]Если хотите нормально экспортировать форму из dll то в нее надо передать Application.Handle приложения и связать с объектом Application который в dll
А для MDI Child (наверное) нужно передать Handle MDI главного окна
и не забыть все востановить при выгрузки dll
← →
Сергей М. © (2007-04-03 15:32) [22]
> vl_chel © (03.04.07 15:25) [21]
>
> Если хотите нормально экспортировать форму
dll не экспортирует никаких "форм".
dll экспортирует именованые и/или индексированные адреса.
Точно так же как и bpl - разницы никакой.
← →
vl_chel © (2007-04-03 15:39) [23]>>Ситуация. Создал МДИ-форму, положил ее в ДЛЛ. Подгружаю Длл. Создаю форму. Форма создается. Все работает. НО!
А как это называеться?
← →
Сергей М. © (2007-04-03 15:48) [24]Это называется "вызываю некую ф-цию, которую экспортирует моя dll".
← →
vl_chel © (2007-04-03 16:19) [25]Но при создании окна через класс TForm, экземпляр окна регистрируется в объекте Application. Эти экземпляры для библиотеки и приложения разные, форма будет нормально создаваться, в принципе корректно работать до тех пор пока ее модель поведения не пересекается с другими формами приложения, поэтому и надо согласовывать работу экземпляров Application. Для MDI приложений это намного сложнее - в свое время изза этого отказался от этой архитектуры.
В классической литературе (Том Сван, Тексейра) вызов функции библиотеки, создающей экземпляр TForm и называется "экспортом формы из библиотеки"
← →
Сергей М. © (2007-04-03 16:22) [26]
> при создании окна через класс TForm, экземпляр окна регистрируется
> в объекте Application
Чавой-то ?
Цитируй код ..
← →
vl_chel © (2007-04-03 16:37) [27]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:41) [28]Ну и чаво ты этим кодом хотел сказать ?
Ну да, ну любой объект-наследник TForm тем самым заносится в упомянутый список...
и чаво ?
И это - "регистрация класса" называется ?
← →
Frozzen (2007-04-04 06:07) [29]Действительно наверно выход переход на бпл. С длл все непросто там с классами выходит
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2007.06.03;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.044 c