Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.02;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2006.04.02;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.047 c
2-1142492556
Darkwing
2006-03-16 10:02
2006.04.02
Скринсейвер


2-1142507523
integery
2006-03-16 14:12
2006.04.02
знаки ???????????? вместо надписей


2-1142429241
Megabyte
2006-03-15 16:27
2006.04.02
Запрос логина и пароля текущего пользователя БД


15-1141971896
ZeroDivide
2006-03-10 09:24
2006.04.02
Отчисления Open Source проекту


2-1142831819
Canopus
2006-03-20 08:16
2006.04.02
Отметка в меню POPUP