Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа с дочерними формами


Irisss ©   (2010-11-15 14:37:00) 

Из главной формы (VCL Form) создаются дочерние формы.
При закрытии главной формы нужно пройти по всем дочерним формам и закрыть их, чтобы отработал метод Close (в этом методе у каждой формы есть еще некоторые действия, которые нужно выполнить)
Вопрос:
1. как получить количество дочерних форм?
2. как обратиться к конкретной форме, зная их количество?

Спасибо


Leonid Troyanovsky   (2010-11-15 22:18:00) [1]


> Irisss   (15.11.10 16:18) [12]

> Такой код решил мою проблему полностью (FFormManager - главная
> форма)
>        for i := Self.FFormManager.ComponentCount - 1 downto

Screen.Forms.

--
Regards, LVT.


Irisss   (2010-11-15 16:18:00) [2]

Такой код решил мою проблему полностью (FFormManager - главная форма)
       for i := Self.FFormManager.ComponentCount - 1 downto 0
       do begin
           if ( Self.FFormManager.Components[ i ] is TForm )
           then begin
               AForm := Self.FFormManager.Components[ i ] as TForm;
               if ( AForm.Visible = True )
               then begin
                   AForm.Show();
                   AForm.Close();
               end;
           end;
       end;

Спасибо всем


Irisss   (2010-11-15 15:43:00) [3]

В каждой форме у меня на обработчике
FormCloseQuery стоит MessageDlg, который спрашивает, закрыть ли текущую форму


clickmaker   (2010-11-15 15:43:00) [4]

> показать каждую форму и спросить у пользователя, хочет он
> ее закрыть или нет

OnCloseQuery


Irisss   (2010-11-15 15:40:00) [5]

собственно мне как раз и нужно, что показать каждую форму и спросить у пользователя, хочет он ее закрыть или нет


RWolf   (2010-11-15 15:36:00) [6]


> Irisss   (15.11.10 15:25) [6]
> стоит MessageDlg, он не вызывается

обработчик вызывается, просто MessageDlg не срабатывает. Если при закрытии форм нужно что-то спросить, то да, закрывать их надо вызовом метода Close перед закрытием главной формы.


И. Павел   (2010-11-15 15:32:00) [7]

> приложение закрывается, а обработчики не вызываются.
> Там стоит MessageDlg, он не вызывается

Это не показатель. При Application->Terminate тоже MessageDlg не вызывается, хотя процедура, вызвавшая Terminate, выполняется до конца.


Irisss   (2010-11-15 15:25:00) [8]

приложение закрывается, а обработчики не вызываются.
Там стоит MessageDlg, он не вызывается


12   (2010-11-15 15:19:00) [9]


> При закрытии главной формы закроется всё приложение, а значит,
>  обработчики закрытия всех открытых форм так или иначе будут
> вызваны.
>


по-идее да, но не факт

пишу

TfrmChild = class(TForm)
procedure TfrmChild.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Action := caFree;
end;

TfrmSubject = class(TfrmChild)
procedure TfrmSubject.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 ShowMessage( '' );
 inherited;
end;

не кажет ничего при закрытии  TMainForm


RWolf   (2010-11-15 15:11:00) [10]

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


Irisss   (2010-11-15 15:05:00) [11]

MDIChildCount показывает равно 0 при открытых формах

попробывал сделать так:
       count := Self.FFormManager.ComponentCount;
       if ( count > 0 )
       then begin
           for i := count - 1 downto 0
           do begin
               if ( Self.FFormManager.Components[ i ] is TForm )
               then begin
                   Caption := TForm(Self.FFormManager.Components[ i ]).Caption;
                   TForm(Self.FFormManager.Components[ i ]).Show;
                   TForm(Self.FFormManager.Components[ i ]).Close;
               end;
           end;

но пока ругается на метод Show,


12   (2010-11-15 14:45:00) [12]

а не
or i := MainForm.MDIChildCount - 1 downto 0 do MainForm.MDIChildren[i].Close;


12   (2010-11-15 14:44:00) [13]

for i := 0 to MainForm.MDIChildCount - 1 do MainForm.MDIChildren[i].Close;


Наверх

Титульная страница Поиск, карта сайта Написать письмо