![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
MDI Child форма [D6, Win95/98]
matvey © (2002-05-30 13:37:00)Подскажите, как мне закрыть MDI Child форму,
в событии onClose - Action:=caFree, но
form1.close - выдаёт ощибку!
nedden (2002-05-31 10:54:00) [1]я извращался так:
В основной форме :
procedure TfrmMain.FormShow(Sender: TObject);
var i : integer;
begin
for i :=0 to MDIChildCount-1 do MDIChildren[i].Close;
end;
в дочке :
procedure TfrmLog.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action :=caNone;
ShowWindow(Handle,SW_HIDE);
end;
при инициализации дочки :
ShowWindow(frmLog.Handle,SW_MAXIMIZE);
Внук (2002-05-31 09:20:00) [2]>>matvey (30.05.02 21:20)
Да, сурово. Фактически, уничтожение формы происходит из ее же собственного метода. Добрее надо быть :)
Во-первых, здесь надо использовать TForm.Release (см. Игорь Шевченко © (30.05.02 14:00)), или PostMessage(...WM_CLOSE...) как вариант.
Во-вторых. При создании формы типа TForm3 ее владельцем назначается экземпляр формы типа TForm2, который к тому моменту уже уничтожен. Здесь надо что-то вроде TForm3.Create(Application);
matvey (2002-05-30 21:20:00) [3]да вот собственно что я делал:
procedure TForm2.Button1Click(Sender: TObjet);
begin
Form2.Close;
TForm3.Create(Self);
end;
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
обе формы - MDIChild.
а вот что выдаёт:
Project Project1.exe raised exception class EAccesessViolation whith message "Accsess violation at address 0045CC75 in module "Project1.exe"
Внук (2002-05-30 14:39:00) [4]>>Игорь Шевченко ©
Я же с этого и начал :-)
Как бы автор сам ответил на такой вопрос: "У меня не работает программа. Что делать?"
Игорь Шевченко (2002-05-30 14:28:00) [5]Тогда неработающий код - в студию
kaif (2002-05-30 14:13:00) [6]2 Игорь Шевченко © (30.05.02 14:00)
Гениально!
А я всегда по инерции делал
for i := MDIChildCount - 1 downto 0 do
MDIChildren[i].Close;
matvey (2002-05-30 14:13:00) [7]да, такое я знаю, но мне надо, чтобы из дочернего окна открывалось другое, а оно само при этом закрывалось!
Игорь Шевченко (2002-05-30 14:00:00) [8]release.
К примеру, закрытие всех окон:
procedure TfMain.CloseAllMDIChilds;
begin
while ActiveMDIChild <> nil do begin
ActiveMDIChild.Release();
Application.ProcessMessages();
end;
end;
matvey (2002-05-30 13:57:00) [9]ну конечно надо, иначе бы не спрашивал... когда закрываешь обычным "крестиком" всё работает, а мне надо программно!
Игорь Шевченко (2002-05-30 13:51:00) [10]А ее не надо close...
matvey (2002-05-30 13:50:00) [11]что-то не особо понял...
Внук (2002-05-30 13:46:00) [12]Как сказал бы Анатолий Подгорецкий - ошибка в 17-ой строке