Форум: "KOL";
Текущий архив: 2006.04.02;
Скачать: [xml.tar.bz2];
ВнизOnClose в модальной форме на KOL Найти похожие ветки
← →
AlexLumpov (2005-07-25 22:19) [0]Уважаемые мастера Delphi+KOL.
Столкнулся со следующей проблемой:
вызываю модальную форму
with NewMyForm(Applet).Form^ do begin
ShowModal;
Free;
end;
при этом хочу чтоб она закрывалась крестиком только при определенных условиях, но FormClose не вызывается, хотя при создании я указал:
function NewMyForm(const AParent: PControl): PMyForm;
begin
Result := New(PMyForm, Create);
Result.Form := NewForm(AParent, "test").SetClientSize(370, 105);
Result.Form.OnClose := Result.FormClose;
Result.Form.OnQueryEndSession := Result.FormClose;
Result.Form.Add2AutoFree(Result);
...
end;
procedure TMyForm.FormClose(Sender: PObj; var Accept: Boolean);
begin
ShowMessage("Заработало!");
Accept := False;
end;
В чем может быть проблема?
Может я чего то в KOL не понимаю?
← →
Thaddy (2005-07-25 23:18) [1]Accept: = False; ?? Accept:=true!
← →
AlexLumpov (2005-07-26 13:31) [2]так в том то и дело что хочется чтоб по крестику не закрывалась
и по лубому сообщение "Заработало!" должно выдаваться
← →
Thaddy (2005-07-26 19:22) [3]Well, use a flag to keep the status. if "earned" is true, accept :=true else accept :=false;
;)
← →
ECM © (2005-07-27 15:29) [4]OnClose не вызывается при модальном показе формы....
KOL.PAS(PAS_VERSION):
...
function WndProcShowModal( Self_: PControl; var Msg: TMsg; var Rslt: Integer ): Boolean;
//var Accept: Boolean; // {Alexander Pravdin, AP}
begin
if Msg.message = WM_CLOSE then
begin
//++++++++ {AP} +++++++++++++++++++++++++++++++++++++++++++++++++++++++//
{Accept := True; //
if Assigned( Self_.fOnClose ) then Self_.fOnClose( Self_, Accept ); //
}//-------- {AP} ----------------------------------------------------//
if Self_.ModalResult = 0 then { (Sergey Shishmintzev) }
Self_.ModalResult := -1;
//++++++++ {AP} +++++++++++++++++++++++++++++++++++++++++++++++++++++++//
{if not Accept then //
Self_.ModalResult := 0; //не закрываем форму, оставляя её на экране//
}//-------- {AP} ----------------------------------------------------//
Rslt := 0;
Result := True; // Do not process !
end
else
Result := False;
end;
Вызов OnClose закомментирован...
Зачем это было сделано я не знаю - но думаю могут быть "сюрпризы". Можно:
1)Раскомментировать (прийдется править KOL.PAS :( ...) и определить
procedure TMyForm.FormClose(Sender: PObj; var Accept: Boolean);
begin
// ShowMessage("Заработало!");
if SomeCheckForCloseUpModal then begin
Accept := False;
Form.Show; // Без этого диалог куда-то пропадает!
end else Accept := TRUE;
end;
2)ИМХО "кошернее" будет запретить "крестик" вообще, а закрывать форму по кнопке (напр. ОК), а в обработчике нажатия сделать
Form.ModalResult := Integer(SomeCheckForCloseUpModal = TRUE);
← →
AlexLumpov (2005-07-28 18:20) [5]Я решил проблему другим путем.
В нужных случаях ставлю ModalResult в 1.
После закрытия анализирую ModalResult
И если он не 1, то запускаю снова.
while Form.ShowMaodal <> 1 do ;
:)
Спасиба за советы
← →
Thaddy (2005-07-28 18:53) [6]We were thinking too complex ;)
← →
Thaddy (2005-07-28 18:54) [7]We were thinking too complex ;)
← →
SPeller © (2005-08-02 20:09) [8]А можно поставить $DEFINE NEW_MODAL, и колдовать не надо - всё уже наколдовано. А заодно пройтись по коду KOL.PAS и посмотреть, на что это влияет.
← →
ECM © (2005-08-03 11:20) [9]2Speller: NEW_MODAL - это первое что я попробовал...
Легко можно убедиться, что и в этом случае OnClose для модальной формы не вызывается... Хотя наколдовано действительно много...и в отношении OnClose тоже... Вам, как автору кода, новерное будет быстрее и легче посмотреть и разобраться почему это происходит. У меня до выяснения причины руки не дошли...:)
...NEW_MODAL задавалось в опциях проекта (D7,KOL2.10)
← →
ECM © (2005-08-03 11:33) [10]З.Ы. Я думаю что дело все-таки в том что и при NEW_MODAL к модальной форме цепляется тотже обработчик WM_CLOSE (WndProcShowModal) что и без NEW_MODAL. А он "съедает" это сообщение (Result := TRUE) не давая выполняться другим обработчикам...
Если исправить WndProcShowModal таким образом:
...
if Msg.message = WM_CLOSE then
begin
...
Rslt := 0;
Result := FALSE;//True; // Do not process !
end
...
То все вроде бы начинает работать правильно....! ...?
← →
Thaddy (2005-08-03 12:22) [11]2ECM:
But result :=false should mean: Do Process!
result:=true means: I have processed the message, do not process further, or do not pass on (with defwindowproc).
Also:
The rslt variable may be set by defwindowproc or other handlers in the chain. Again, if it is set it almost always means: finished processing.
See kol.pas.
Strange that it works correctly with result :=false. That means it is a KOL bug!
← →
ECM © (2005-08-03 13:03) [12]2ECM: But result :=false should mean: Do Process!...e.t.c.
Это "и ежу понятно" ... :) я оставил коментарий "//True; // Do not process !", чтобы было понятнее в какой строке я произвел изменения!
That means it is a KOL bug! Согласен... но хотелось чтобы автор проверил исправление...:)
← →
SPeller © (2005-08-03 22:30) [13]ПРи использовании NEW_MODAL не должен цепляться обработчик WndProcShowModal.
← →
SPeller © (2005-08-03 22:49) [14]Да, чтобы не вносить изменения в свой код, надо ещё определить USE_SHOWMODALPARENTED_ALWAYS. ПРосто функция показа модальной формы была обозвана по-другому, потому что её идеология отличается от оригинала. Но если передать ей параметр Applet, то она будет функционировать одинаково с оригинальной ShowModal. Для этого и был введён define USE_SHOWMODALPARENTED_ALWAYS, который заменяет оригинал ShowModal на заглушку, которая лишь вызывает мою функцию с аплетом в параметре.
← →
_ecm_ (2005-08-04 12:19) [15]ПРи использовании NEW_MODAL не должен цепляться обработчик WndProcShowModal
Не верь глазам своим...(с) К.Прутков.
[9]...NEW_MODAL задавалось в опциях проекта (D7,KOL2.10)
... Надо внимательно посмотреть - странно все это...
← →
SPeller © (2005-08-08 11:10) [16]Я не уточнил важной детали - даже если включено NEW_MODAL, то ShowModal будет работать как и работало. Вместо неё надо вызывать ShowModalParented. Если неохота всегда писать ShowModalParented, то надо включить USE_SHOWMODALPARENTED_ALWAYS, чтобы вместо этого длинного имени использовать ShowModal.
Страницы: 1 вся ветка
Форум: "KOL";
Текущий архив: 2006.04.02;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.038 c