![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с дочерними формами
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;