Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
2-1142790242
VEZ
2006-03-19 20:44
2006.04.02
Autorun


10-1115984546
Chaser
2005-05-13 15:42
2006.04.02
Excel - формат ячейки


15-1142127014
Бугага
2006-03-12 04:30
2006.04.02
Расчет количества дней между двумя датами


3-1139203688
Wood
2006-02-06 08:28
2006.04.02
про Order by...


4-1137224992
Старик
2006-01-14 10:49
2006.04.02
Память, WinAPI, OpenGL API





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский