Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> трабблы с не главной MDI формой 
:(
    Опции темы
mrhell
Дата 11.9.2008, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 23.5.2008

Репутация: нет
Всего: нет



Есть программа на 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 

Это сообщение отредактировал(а) mrhell - 11.9.2008, 21:43
PM MAIL   Вверх
Akella
Дата 11.9.2008, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



А что, в плагине обязательно использовать MDI? Может можно обычную форму создавать?
PM MAIL   Вверх
mrhell
Дата 12.9.2008, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 23.5.2008

Репутация: нет
Всего: нет



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

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

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

Это сообщение отредактировал(а) mrhell - 12.9.2008, 10:03
PM MAIL   Вверх
mrhell
Дата 12.9.2008, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 23.5.2008

Репутация: нет
Всего: нет



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

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

Это сообщение отредактировал(а) mrhell - 12.9.2008, 15:43
PM MAIL   Вверх
mrhell
Дата 13.9.2008, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 23.5.2008

Репутация: нет
Всего: нет



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

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

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

Это сообщение отредактировал(а) mrhell - 13.9.2008, 19:31
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0889 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.