Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > трабблы с не главной MDI формой


Автор: mrhell 11.9.2008, 18:25
Есть программа на 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 форму - вываливается пресловутая ошибка, которую нельзя отловить.
Что делать, может кто нибудь предложить какоенибудь решение проблемы? [code=delphi]

 smile 

Автор: Akella 11.9.2008, 23:39
А что, в плагине обязательно использовать MDI? Может можно обычную форму создавать?

Автор: mrhell 12.9.2008, 09:49
для моей задачи mdi форма была бы намного удобне, так как плагин представляет из себя редактор графики с расширинными возможностями

или что вы имели ввиду? сделать mdi форму - главную?

также проблема точно в dll, так как прикрутив код плагина к исходникам приложения - я такую ошибку уже не получаю

Автор: mrhell 12.9.2008, 13:15
Удалось локализовать источник - похоже Application.Mainform, 
пришел к этому выводу, так как когда окно плагина полностью закрывает окно основного приложения, то никаких багов не вылезает, а когда часть окна основного попадает на отрисовку - тутже появляется ошибка

попробовал сделать все это в bpl - при создании дочернего окна вываливается
ошибка 1407 не удается найти класс окна, RegisterClasses() не помогает

Автор: mrhell 13.9.2008, 18:08
попытался реализовать плагин в bpl — получил
ошибка 1407 не удается найти класс окна, при открытии child формы
((

С dll прояснилось следующее - если убрать меню в основном приложении, то ошибок не возникает, то есть как то связано с объединением меню родителя и дочернего окна

более того - меню child формы объединяется с меню формы основного приложения

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)