![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Закрытие Modal form
dmitry kholl © (2006-10-17 16:28:00)Задача следующего характера.
Модальная форма открывается например так
procedure New;
begin
frmDialog := TfrmDialog.Create(Application);
try
//
frmDialog.ShowModal;
//
finally
frmDialog.Free;
end;
end;
Из другого места программы, у меня по таймеру срабатывает код, который должен закрыть и разрушить эту форму. (Срабатывает автоматический логаут в программе).
Например:
var
iForm: Integer;
tmpForm: TForm;
begin
for iForm := Screen.FormCount - 1 downto 0 do
begin
tmpForm := Screen.Forms[iForm];
if fsModal in Screen.Forms[iForm].FormState then
begin
//Screen.Forms[iForm].Close;
// SendMessage(Screen.Forms[iForm].Handle, ALM_SELF_DESTRUCTION, 0, 0);
Screen.Forms[iForm].ModalResult := mrCancel;
// Application.ProcessMessages;
Screen.Forms[iForm].Visible := FALSE;
//Screen.Forms[iForm].Release;
end;
end;
Но получается AV. И я в принципе понимаю причину, пытается вернуться из стека вызовов, а данных то уже нет.
Бредовая ситуация, но что-то делать нужно. Если у меня получилось обьяснить проблему, может у кого-то есть идеи?
MsGuns (2006-10-18 13:45:00) [1]>procedure TfrmAlGenDlg.ALM_SELF_DESTRUCTION(var aMessage: TMessage);
>begin
> ModalResult := mrCancel;
> Close;
>end;
"Входит-выходит... Замечательно выходит !"
"Королей мешаю я с тузами, и с дебютом путаю дуплет"
Плохиш (2006-10-17 17:45:00) [2]
for iForm := Screen.FormCount - 1 downto 0 do
begin
tmpForm := Screen.Forms[iForm];
if fsModal in tmpForm.FormState then
begin
tmpForm.Close;
end;
end;
dmitry kholl (2006-10-17 16:59:00) [3]> Ну а начерта тут вызов Close, скажи на милость ?
Как с ним так и без него диалог не закрывается.
Сергей М. (2006-10-17 16:50:00) [4]Ну а начерта тут вызов Close, скажи на милость ?
От балды вставил ? типа "на всякий пожанный" ?
dmitry kholl (2006-10-17 16:49:00) [5]
SendMessage(Screen.Forms[iForm].Handle, ALM_SELF_DESTRUCTION, 0, 0);
Эта строчка посылает такое сообщение, и мои диалоги его обрабатывают
procedure TfrmAlGenDlg.ALM_SELF_DESTRUCTION(var aMessage: TMessage);
begin
ModalResult := mrCancel;
Close;
end;
Но программа не попадает на эту строчку
frmDialog.Free;
А AV по адресу показывает, чт окак раз в ней.
Сергей М. (2006-10-17 16:35:00) [6]
> есть идеи?
Есть.
Не плести абракадабру про "пытается вернуться из стека вызовов", а по таймеру рассылать всем заинтересованным формам сообщение об истечении таймаута, с тем чтобы каждая из этих форм сама принимала решение, стоит ли ей при этом закрыться.
Ketmar (2006-10-17 16:35:00) [7]послать модальной форме сообщение "закройся!". например, WM_USER. и обработать его, натурально.