Есть программа на Delphi 7, к ней там же был написан плагин. Плагин представляет из себя mdi — форму для работы с графикой.
Так в VCL предусмотрена как mdi форма только главная форма, то пришлось идти обходными путями — у дочерней формы изменить CreateWindowHandle
procedure TImageEditor.CreateWindowHandle(const Params: TCreateParams);
var CreateStruct:TMDICreateStruct;
begin
if (FormStyle=fsMDIChild) and not (csDesigning in ComponentState) then
begin
if (Owner=nil) or ((Owner as TForm).ClientHandle=0) then
raise EInvalidOperation.Create('Cannot create form. No MDI forms are currently active');
//ShowMessage('OK');with CreateStruct do
begin
szClass:=Params.WinClassName;
szTitle:=Params.Caption;
hOwner:=HInstance;
X:=Params.X;
Y:=Params.Y;
cX:=Params.Width;
cY:=Params.Height;
style:=Params.Style;
lParam:=Longint(Params.Param);
end;
WindowHandle:=SendMessage((Owner as TForm).ClientHandle,WM_MDICREATE,0,Longint(@CreateStruct));
Include(FFormState, fsCreatedMDIChild)
end
else
raise EInvalidOperation.Create('Form should be MDIChild form')
end;
в mdi форме изменен код загрузки child форм
ImageEditor:= TImageEditor.Create(self);
код создания mdi окна
function CreateWindow(App: TApplication): integer; stdcall;
begin
DllApp:= Application;
Application:= App;
ImageContainer:= TImageContainer.Create(Application);
end;
Так вот, на простом примере, где тестился плагин все это работало стабильно, но когда я прикрутил его к основной программе, то при попытке открыть окно dll вываливается с ошибкой, иногда правда не вываливается, но происходит это тогда, когда главная форма, полностью закрыта mdi окном из dll, а припопытке переместить mdi форму — вываливается пресловутая ошибка, которую нельзя отловить.
Что делать, может кто нибудь предложить какоенибудь решение проблемы?
Здравствуйте, mr_hell, Вы писали:
_>попытался реализовать плагин в bpl — получил _>ошибка 1407 не удается найти класс окна, при открытии child формы
RegisterClasses() не помогает?
Здравствуйте, DarkMaster, Вы писали:
DM>Здравствуйте, mr_hell, Вы писали:
_>>попытался реализовать плагин в bpl — получил _>>ошибка 1407 не удается найти класс окна, при открытии child формы DM>RegisterClasses() не помогает?
Удалось локализовать источник — похоже Application.Mainform,
пришел к этому выводу, так как когда окно плагина полностью закрывает окно основного приложения, то никаких багов не вылезает, а когда часть окна основного попадает на отрисовку — тутже появляется ошибка
Здравствуйте, mr_hell, Вы писали:
_>Удалось локализовать источник — похоже Application.Mainform, _>пришел к этому выводу, так как когда окно плагина полностью закрывает окно основного приложения, то никаких багов не вылезает, а когда часть окна основного попадает на отрисовку — тутже появляется ошибка
Перестань парится фигней, форма в DLL это хак и будет это падать в самый не подходящий момент. Самое правильное — использовать Run-Time packages (для этого их и придумали).
Но если уж так хочется, то сделай попроще. Создай в основном приложении Host MDI Child окно, а плагин пускай возврашает окно без рамочки. Вот и вставляй это окно в Host MDI Child окно и все будет работать на порядок надежней.
Здравствуйте, Danchik, Вы писали:
D>Здравствуйте, mr_hell, Вы писали:
_>>Удалось локализовать источник — похоже Application.Mainform, _>>пришел к этому выводу, так как когда окно плагина полностью закрывает окно основного приложения, то никаких багов не вылезает, а когда часть окна основного попадает на отрисовку — тутже появляется ошибка
D>Перестань парится фигней, форма в DLL это хак и будет это падать в самый не подходящий момент. Самое правильное — использовать Run-Time packages (для этого их и придумали). D>Но если уж так хочется, то сделай попроще. Создай в основном приложении Host MDI Child окно, а плагин пускай возврашает окно без рамочки. Вот и вставляй это окно в Host MDI Child окно и все будет работать на порядок надежней.
Вы можете найти/сделать пример mdi формы в bpl, у меня это не работает по причине, написанной выше.
Буду очень благодарен, если сможете помочь.
Проблема с вылетом dll оказалась в механизме объединения child и main меню, так как основной формой считалась форма основного приложения, а не dll, то оно child меню пыталось объединиться с меню основного приложения.
[Skip]
_>Вы можете найти/сделать пример mdi формы в bpl, у меня это не работает по причине, написанной выше. _>Буду очень благодарен, если сможете помочь.
_>Проблема с вылетом dll оказалась в механизме объединения child и main меню, так как основной формой считалась форма основного приложения, а не dll, то оно child меню пыталось объединиться с меню основного приложения.
Честно могу, но не буду по причине того что итак все обьяснено в статье как нельзя лучше, и нет у меня времени учить вас пользоваться Delphi.
Задача Run-Time Packages обьединить memory manager и VCL в двух разных приложениях.
Компилите EXE c галочкой Build With Runtime packages
Компилите DLL c этой же галочкой.
И вуаля — перестало падать
Создайте себе тестовый проэкт и убедитесь что все работает.