Здравствуйте, Аноним, Вы писали:
А>В ActionMainMenuBar при нажатии на кнопки сворачивания и закрытия MDI окна в обоих случаях срабатывает FormClose. Но мне то окно <B>ЗАКРЫВАТЬ</B> не нужно!!!!
Вот кусок из TCustomForm:
procedure TCustomForm.Close;
var
CloseAction: TCloseAction;
begin
if fsModal in FFormState then
ModalResult := mrCancel
else
if CloseQuery then
begin
if FormStyle = fsMDIChild then
if biMinimize in BorderIcons then
CloseAction := caMinimize else
CloseAction := caNone
else
CloseAction := caHide;
DoClose(CloseAction); // Это сгенерит эвент OnClose
if CloseAction <> caNone then
if Application.MainForm = Self then Application.Terminate
else if CloseAction = caHide then Hide
else if CloseAction = caMinimize then WindowState := wsMinimized
else Release;
end;
end;
Попробуйте проверить CloseAction на предмет caMinimize. Подумайте также насчет того, чтобы перенести код из OnClose в OnDestroy.
А>>В ActionMainMenuBar при нажатии на кнопки сворачивания и закрытия MDI окна в обоих случаях срабатывает FormClose. Но мне то окно <B>ЗАКРЫВАТЬ</B> не нужно!!!!
ST>Вот кусок из TCustomForm:
ST>ST>procedure TCustomForm.Close;
ST>var
ST> CloseAction: TCloseAction;
ST>begin
ST> if fsModal in FFormState then
ST> ModalResult := mrCancel
ST> else
ST> if CloseQuery then
ST> begin
ST> if FormStyle = fsMDIChild then
ST> if biMinimize in BorderIcons then
ST> CloseAction := caMinimize else
ST> CloseAction := caNone
ST> else
ST> CloseAction := caHide;
ST> DoClose(CloseAction); // Это сгенерит эвент OnClose
ST> if CloseAction <> caNone then
ST> if Application.MainForm = Self then Application.Terminate
ST> else if CloseAction = caHide then Hide
ST> else if CloseAction = caMinimize then WindowState := wsMinimized
ST> else Release;
ST> end;
ST>end;
ST>
ST>Попробуйте проверить CloseAction на предмет caMinimize. Подумайте также насчет того, чтобы перенести код из OnClose в OnDestroy.
Все хорошо, все замечательно ... но почему-то не работает...
В TChildForm.FormClose только Action := caFree прописано.
Покопался в unit ActnMenus (Borland Delphi Visual Component Library ) ; там такой код —
procedure TInternalMDIAction.ExecuteTarget(Target: TObject);
begin
case MDIAction of
maActivate: SendMessage(GetParent(Form.Handle), WM_MDIACTIVATE, Form.Handle, 0);
maClose: Form.Close;
maRestore: SendMessage(GetParent(Form.Handle), WM_MDIRESTORE, Form.Handle, 0);
maMinimize: Form.Close;
end;
end;
Почему maClose: Form.Close; и maMinimize: Form.Close ?
... << RSDN@Home 1.0 beta 6a >>
Здравствуйте, SergIG, Вы писали:
SIG>В TChildForm.FormClose только Action := caFree прописано.
Нельзя ему сказать на FormClose
if Action <> caMinimize then
Action := caFree
?
Здравствуйте, Sergey Ten, Вы писали:
ST>Здравствуйте, SergIG, Вы писали:
SIG>>В TChildForm.FormClose только Action := caFree прописано.
ST>Нельзя ему сказать на FormClose
ST>ST> if Action <> caMinimize then
ST> Action := caFree
ST>
ST>?
Подробнее:
При нажатии BorderIcons и закрытия и сворачивания на ActionMainMenuBar срабатывает событие OnClose:
procedure TChildForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caNone;
end;
и в обоих случаях приходит Action=caMinimize
Если же нажать BorderIcons Restore на ActionMainMenuBar,а затем
1. BorderIcons закрытия уже на самой форме MDI окна, то срабатывает то же событие OnClose: с Action=caMinimize
2. BorderIcons сворачивания — событие OnClose НЕ СРАБАТЫВАЕТ!!!!
if Action <> caMinimize then
Action := caFree
В данном случае, Action ВСЕГДА равно caMinimize на входе TChildForm.FormClose
... << RSDN@Home 1.0 beta 6a >>
Так больше никно ничего предложить не может?
... << RSDN@Home 1.0 beta 6a >>
Здравствуйте, SergIG, Вы писали:
SIG>Так больше никно ничего предложить не может?
Может мне вообще отказаться от использования ActionMainMenubar?
... << RSDN@Home 1.0 beta 6a >>