![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
OnClose в модальной форме на KOL [Delphi, Windows]
AlexLumpov © (2005-07-25 22:19:00)Уважаемые мастера 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 не понимаю?
SPeller (2005-08-08 11:10:00) [1]Я не уточнил важной детали - даже если включено NEW_MODAL, то ShowModal будет работать как и работало. Вместо неё надо вызывать ShowModalParented. Если неохота всегда писать ShowModalParented, то надо включить USE_SHOWMODALPARENTED_ALWAYS, чтобы вместо этого длинного имени использовать ShowModal.
_ecm_ (2005-08-04 12:19:00) [2]ПРи использовании NEW_MODAL не должен цепляться обработчик WndProcShowModal
Не верь глазам своим...(с) К.Прутков.
[9] ...NEW_MODAL задавалось в опциях проекта (D7,KOL2.10)
... Надо внимательно посмотреть - странно все это...
SPeller (2005-08-03 22:49:00) [3]Да, чтобы не вносить изменения в свой код, надо ещё определить USE_SHOWMODALPARENTED_ALWAYS. ПРосто функция показа модальной формы была обозвана по-другому, потому что её идеология отличается от оригинала. Но если передать ей параметр Applet, то она будет функционировать одинаково с оригинальной ShowModal. Для этого и был введён define USE_SHOWMODALPARENTED_ALWAYS, который заменяет оригинал ShowModal на заглушку, которая лишь вызывает мою функцию с аплетом в параметре.
SPeller (2005-08-03 22:30:00) [4]ПРи использовании NEW_MODAL не должен цепляться обработчик WndProcShowModal.
ECM (2005-08-03 13:03:00) [5]2ECM: But result :=false should mean: Do Process!...e.t.c.
Это "и ежу понятно" ... :) я оставил коментарий "//True; // Do not process !", чтобы было понятнее в какой строке я произвел изменения!
That means it is a KOL bug!Согласен... но хотелось чтобы автор проверил исправление...:)
Thaddy (2005-08-03 12:22:00) [6]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 11:33:00) [7]З.Ы. Я думаю что дело все-таки в том что и при 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
...
То все вроде бы начинает работать правильно....! ...?
ECM (2005-08-03 11:20:00) [8]2Speller: NEW_MODAL - это первое что я попробовал...
Легко можно убедиться, что и в этом случае OnClose для модальной формы не вызывается... Хотя наколдовано действительно много...и в отношении OnClose тоже... Вам, как автору кода, новерное будет быстрее и легче посмотреть и разобраться почему это происходит. У меня до выяснения причины руки не дошли...:)
...NEW_MODAL задавалось в опциях проекта (D7,KOL2.10)
SPeller (2005-08-02 20:09:00) [9]А можно поставить $DEFINE NEW_MODAL, и колдовать не надо - всё уже наколдовано. А заодно пройтись по коду KOL.PAS и посмотреть, на что это влияет.
Thaddy (2005-07-28 18:54:00) [10]We were thinking too complex ;)
Thaddy (2005-07-28 18:53:00) [11]We were thinking too complex ;)
AlexLumpov (2005-07-28 18:20:00) [12]Я решил проблему другим путем.
В нужных случаях ставлю ModalResult в 1.
После закрытия анализирую ModalResult
И если он не 1, то запускаю снова.
while Form.ShowMaodal <> 1 do ;
:)
Спасиба за советы
ECM (2005-07-27 15:29:00) [13]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);
Thaddy (2005-07-26 19:22:00) [14]Well, use a flag to keep the status. if "earned" is true, accept :=true else accept :=false;
;)
AlexLumpov (2005-07-26 13:31:00) [15]так в том то и дело что хочется чтоб по крестику не закрывалась
и по лубому сообщение "Заработало!" должно выдаваться
Thaddy (2005-07-25 23:18:00) [16]Accept: = False; ?? Accept:=true!