ошибка в ActionMainMenuBar при работе с MDIChild окнами
От: Аноним  
Дата: 05.02.03 07:36
Оценка:
Может кто сталкивался, и знает как обойти?
В ActionMainMenuBar при нажатии на кнопки сворачивания и закрытия MDI окна в обоих случаях срабатывает FormClose. Но мне то окно <B>ЗАКРЫВАТЬ</B> не нужно!!!!
Re: ошибка в ActionMainMenuBar при работе с MDIChild окнами
От: Sergey Ten http://www.fastalgo.com
Дата: 05.02.03 19:24
Оценка:
Здравствуйте, Аноним, Вы писали:

А>В 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.
Re[2]: ошибка в ActionMainMenuBar при работе с MDIChild окна
От: SergIG  
Дата: 06.02.03 07:54
Оценка:
А>>В 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 >>
Re[3]: ошибка в ActionMainMenuBar при работе с MDIChild окна
От: Sergey Ten http://www.fastalgo.com
Дата: 06.02.03 08:13
Оценка:
Здравствуйте, SergIG, Вы писали:

SIG>В TChildForm.FormClose только Action := caFree прописано.


Нельзя ему сказать на FormClose

  if Action <> caMinimize then 
    Action := caFree


?
Re[4]: ошибка в ActionMainMenuBar при работе с MDIChild окна
От: SergIG  
Дата: 06.02.03 08:37
Оценка:
Здравствуйте, 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 >>
Re[5]: ошибка в ActionMainMenuBar при работе с MDIChild окна
От: SergIG  
Дата: 07.02.03 07:37
Оценка:
Так больше никно ничего предложить не может?
... << RSDN@Home 1.0 beta 6a >>
Re[6]: ошибка в ActionMainMenuBar при работе с MDIChild окна
От: SergIG  
Дата: 07.02.03 07:42
Оценка:
Здравствуйте, SergIG, Вы писали:

SIG>Так больше никно ничего предложить не может?

Может мне вообще отказаться от использования ActionMainMenubar?
... << RSDN@Home 1.0 beta 6a >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.