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


Автор: Serggggg 31.8.2004, 13:13
Доброго всем времени суток!
Прошу помощи! Приложение использует MDI-архитектуру.
Нужно: при попытке открытия MDI-Child-окна отследить, открыто ли оно. Если да - вынести на передний план, нет - создать экземпляр.
При вызове из главного окна программы (из меню, например) я решаю этот вопрос так:
Код

procedure TFMain.Button1Click(Sender: TObject);
var
i :integer;
f : boolean;             // флаг - была ли найдена такая форма
begin
f:=False;
// Просмотр всех открытых MDI-окон
for i:=0 to FMain.MDIChildCount-1 do
    if (FMain.MDIChildren[i] is TFComp) then
       f:=True;
// Если нужная форма найдена,
if f then begin
   // Вынесли ее вперед
   FComp.BringToFront;
   if FComp.WindowState=wsMinimized then
      FComp.WindowState:=wsNormal;
   end  
   // В противном случае - создаем экземпляр
   else Application.CreateForm(TFComp,FComp);
end;


Вопрос: Теперь надо сделать то же самое, но при попытке вызова MDI-Child не из главного окна программы, а из другой MDI-Child.
Помогите, если кто знает!

Автор: <Spawn> 31.8.2004, 13:47
Попробуй через (MDIChildForm.Parent as TForm).MDIChildren[i]

Автор: Serggggg 31.8.2004, 14:22
<Spawn>, попробовал - вылетает Access Violation sad.gif
Речь вообще идет о том, чтобы в приложении, использующем MDI, создавать экземпляр формы (чтобы обращаться к свойствам и методам этой формы). При этом для корректной работы (как ты мне когда-то давно советовал) нужно, чтобы каждое дочернее MDI-окно открывалось только 1 раз.
Вот это я и пытаюсь реализовать.

Автор: Serggggg 31.8.2004, 16:14
Ответ был найден!
Спасибо всем за внимание.
Решение достаточно простое - при любом вызове (откуда-угодно) используется обработчик:
Код

procedure TForm1.Form21Click(Sender: TObject);
begin
if Not Assigned(Form3) then
   Application.CreateForm(TForm3,Form3)
   else
   Form3.BringToFront;
end;


При этом в вызываемых MDIChild-окнах необходимо сделать следующий обработчик OnClose:
Код

procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
Form3:=Nil;
end;

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