Re[2]: Проблема с mdi формой в dll
От: Danchik Украина  
Дата: 11.09.08 23:38
Оценка: 1 (1)
Здравствуйте, mr_hell, Вы писали:

_>сорри, это я писал, почему то незалогинился


Сначала почитать вот это RunTime Packages
Проблема с mdi формой в dll
От: Аноним  
Дата: 11.09.08 18:39
Оценка:
Есть программа на 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 форму — вываливается пресловутая ошибка, которую нельзя отловить.
Что делать, может кто нибудь предложить какоенибудь решение проблемы?
Re: Проблема с mdi формой в dll
От: mr_hell  
Дата: 11.09.08 18:56
Оценка:
сорри, это я писал, почему то незалогинился
Re[2]: Проблема с mdi формой в dll
От: mr_hell  
Дата: 12.09.08 10:47
Оценка:
попытался реализовать плагин в bpl — получил

ошибка 1407 не удается найти класс окна, при открытии child формы
Re[3]: Проблема с mdi формой в dll
От: DarkMaster Украина http://www.bdslib.at.ua
Дата: 12.09.08 11:30
Оценка:
Здравствуйте, mr_hell, Вы писали:

_>попытался реализовать плагин в bpl — получил

_>ошибка 1407 не удается найти класс окна, при открытии child формы
RegisterClasses() не помогает?
WBR, Dmitry Beloshistov AKA [-=BDS=-]
Re[4]: Проблема с mdi формой в dll
От: mr_hell  
Дата: 12.09.08 12:11
Оценка:
Здравствуйте, DarkMaster, Вы писали:

DM>Здравствуйте, mr_hell, Вы писали:


_>>попытался реализовать плагин в bpl — получил

_>>ошибка 1407 не удается найти класс окна, при открытии child формы
DM>RegisterClasses() не помогает?

нет ((
Re[2]: Проблема с mdi формой в dll
От: mr_hell  
Дата: 12.09.08 12:35
Оценка:
Удалось локализовать источник — похоже Application.Mainform,
пришел к этому выводу, так как когда окно плагина полностью закрывает окно основного приложения, то никаких багов не вылезает, а когда часть окна основного попадает на отрисовку — тутже появляется ошибка
Re[3]: Проблема с mdi формой в dll
От: Danchik Украина  
Дата: 12.09.08 16:19
Оценка:
Здравствуйте, mr_hell, Вы писали:

_>Удалось локализовать источник — похоже Application.Mainform,

_>пришел к этому выводу, так как когда окно плагина полностью закрывает окно основного приложения, то никаких багов не вылезает, а когда часть окна основного попадает на отрисовку — тутже появляется ошибка

Перестань парится фигней, форма в DLL это хак и будет это падать в самый не подходящий момент. Самое правильное — использовать Run-Time packages (для этого их и придумали).
Но если уж так хочется, то сделай попроще. Создай в основном приложении Host MDI Child окно, а плагин пускай возврашает окно без рамочки. Вот и вставляй это окно в Host MDI Child окно и все будет работать на порядок надежней.
Re[4]: Проблема с mdi формой в dll
От: mr_hell  
Дата: 13.09.08 18:38
Оценка:
Здравствуйте, 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 меню пыталось объединиться с меню основного приложения.
Re[5]: Проблема с mdi формой в dll
От: Danchik Украина  
Дата: 14.09.08 05:32
Оценка:
Здравствуйте, mr_hell, Вы писали:

[Skip]

_>Вы можете найти/сделать пример mdi формы в bpl, у меня это не работает по причине, написанной выше.

_>Буду очень благодарен, если сможете помочь.

_>Проблема с вылетом dll оказалась в механизме объединения child и main меню, так как основной формой считалась форма основного приложения, а не dll, то оно child меню пыталось объединиться с меню основного приложения.


Честно могу, но не буду по причине того что итак все обьяснено в статье как нельзя лучше, и нет у меня времени учить вас пользоваться Delphi.
Задача Run-Time Packages обьединить memory manager и VCL в двух разных приложениях.

Компилите EXE c галочкой Build With Runtime packages
Компилите DLL c этой же галочкой.
И вуаля — перестало падать



Создайте себе тестовый проэкт и убедитесь что все работает.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.