TFrame и dll
От: Slider2k Россия  
Дата: 16.05.03 06:26
Оценка:
Приветствую, уважаемые.
Есть такая задачка. Есть куча библиотек. В каждой — фрейм.
Библиотеки экспортируют функцию

void AssignWin(TApplication* app, TWinControl* owner, TFrame** frame)
{
        // Здесь пропущено сохранение ?старого? указателя Application для 
последующего восстановления при выгрузке dll
        Application=app;
        (*frame)=new MyFrameClass(owner);
        (*frame)->Parent=owner;
}

MyFrameClass — соответственно, наследник TFrame.
То есть, эта функция создает описанный в dll фрейм и возвращает на него
указатель. При этом она еще и подменяет указатель Application на указатель
Application из главного приложения.

В главной программе последовательность такая:
1. Динамическая загрузка dll-ки
2. вызов AssignWin(Application, TabSheet1, &myFrame)
3. UpdateControl для отображения фрейма

Проблема следующая — все загружается, рисуется, кнопочки нажимаются. Но:
1. Напроч отказываются работать любые гриды (и обычные и DB) ? при
любой попытке манипуляции с ними — Control- has no parent window. При этом
все остальные контролы работают нормально (по крайней мере, те, которые я
проверял ? около 20 штук)
2. Такое ощущение, что все контроля расположены непосредственно на
фрейме. То есть, при проектировании Memo лежал на одной из закладок
TabControl-а. При описанном выше запуске ? такое ощущение, что просто
поверх всего TabControl-а, то есть, при переключении закладок он всегда
виден.
3. Кнопки со включенным стилем Flat после ухода с них курсора
остаются выделенными, как будто курсор все еще на них.

Если сделать просто приложение и добавить к нему юнит с описанием фрейма
из одной из dll-к и провести создание фрейма в run-time, все работает,
никаких глюков.

Соответственно, вопросы — может, я что-то недоинициализировал ? Может
одной подмены Application мало ?
Или существует какое-то другое решение, которое я проглядел ?
Единственное, на что обращаю внимание ? загрузка библиотек только
динамическая (это принципиально). Соответственное, экспорт класса из dll
не подходит, так как главное приложение в этом случае не будет знать его
тип (а он, соответственно, от dll к dll меняться будет).

ЗЫ Вчера еще поэкспериментировал вот с чем. Вместо фрейма запихнул в dll-ку TForm.
Сооветственно, когда главное приложение загружает библиотеку и получает указатель на TForm из dll-ки,
то:
1. если просто показать созданное окно — все ок.
2. если пробежать по всем контролам созданного окна и переделать им Parent на TTabSheet (это куда раньше я фрейм вывести пытался) — все глюки остаются, как и при использовании фреймов (см. выше). Хотя если просто в приложении создать 2 формы и перекинуть с одной на другую контролы с помощью описанного метода — все работает.
3. Можно созданному из dll-ки окну (самой форме) сделать Parent в TTabSheet — получается прикольно, прямо на закладке имеем полное окно (с заголовком, кнопками). Ведет себя как MDI Child, но в пределах TTabSheet, а не всей формы. Глюки при этом остаются.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.