Форум: "Основная";
Текущий архив: 2006.12.03;
Скачать: [xml.tar.bz2];
ВнизЗакрытие Modal form Найти похожие ветки
← →
dmitry kholl (2006-10-17 16:28) [0]Задача следующего характера.
Модальная форма открывается например так
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. И я в принципе понимаю причину, пытается вернуться из стека вызовов, а данных то уже нет.
Бредовая ситуация, но что-то делать нужно. Если у меня получилось обьяснить проблему, может у кого-то есть идеи?
← →
Сергей М. © (2006-10-17 16:35) [1]
> есть идеи?
Есть.
Не плести абракадабру про "пытается вернуться из стека вызовов", а по таймеру рассылать всем заинтересованным формам сообщение об истечении таймаута, с тем чтобы каждая из этих форм сама принимала решение, стоит ли ей при этом закрыться.
← →
Ketmar © (2006-10-17 16:35) [2]послать модальной форме сообщение "закройся!". например, WM_USER. и обработать его, натурально.
← →
dmitry kholl (2006-10-17 16:49) [3]
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:50) [4]Ну а начерта тут вызов Close, скажи на милость ?
От балды вставил ? типа "на всякий пожанный" ?
← →
dmitry kholl (2006-10-17 16:59) [5]> Ну а начерта тут вызов Close, скажи на милость ?
Как с ним так и без него диалог не закрывается.
← →
Плохиш © (2006-10-17 17:45) [6]
for iForm := Screen.FormCount - 1 downto 0 do
begin
tmpForm := Screen.Forms[iForm];
if fsModal in tmpForm.FormState then
begin
tmpForm.Close;
end;
end;
← →
MsGuns © (2006-10-18 13:45) [7]>procedure TfrmAlGenDlg.ALM_SELF_DESTRUCTION(var aMessage: TMessage);
>begin
> ModalResult := mrCancel;
> Close;
>end;
"Входит-выходит... Замечательно выходит !"
"Королей мешаю я с тузами, и с дебютом путаю дуплет"
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.12.03;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.038 c