Einzelnen Beitrag anzeigen

mquadrat

Registriert seit: 13. Feb 2004
1.113 Beiträge
 
Delphi XE2 Professional
 
#4

Re: Modales Fenster soll Hauptform "ersetzen"

  Alt 2. Jan 2009, 10:04
Application.MainForm wird korrekt umgesetzt, hat aber interessanterweise keinerlei Effekt auf das Fensterpreview.

So also Minimieren der gesamten Anwendung lässt sich recht simpel mittels überschreiben von SYSCOMMAND lösen
Delphi-Quellcode:
    case (msg.cmdtype and $FFF0) of
      SC_MINIMIZE: begin
          ShowWindow( Application.MainForm.Handle, SW_MINIMIZE );
          msg.result := 0;
        end;
      else
        inherited;
    end;
Beim Wiederherstellen sitzt dann allerdings der Fokus im Nirvana.


-----------------------------------------------


Hier mal meine eine vorläufige Lösung:

Beim Aufruf des Modalen-Forms den Taskbar-Eintrag des Hauptform verstecken und anschließend wieder einblenden

Delphi-Quellcode:
  ShowWindow(Application.MainFormHandle, SW_HIDE);
  SetWindowLong(Application.MainFormHandle, GWL_EXSTYLE,
    GetWindowLong(Application.MainFormHandle, GWL_EXSTYLE) and not WS_EX_APPWINDOW
    or WS_EX_TOOLWINDOW);
  ShowWindow(Application.MainFormHandle, SW_SHOW);
  
  MyModalForm.showModal;

  ShowWindow(Application.MainFormHandle, SW_HIDE);
  SetWindowLong(Application.MainFormHandle, GWL_EXSTYLE,
    GetWindowLong(Application.MainFormHandle, GWL_EXSTYLE) and not WS_EX_TOOLWINDOW
    or WS_EX_APPWINDOW);
  ShowWindow(Application.MainFormHandle, SW_SHOW);
Beim Erzeugen des modalen-Forms einen Taskbar-Button erzeugen

Delphi-Quellcode:
procedure TMyModalForm.CreateParams(var Params: TCreateParams);
begin
  inherited;
  with Params do exStyle := exStyle or WS_EX_APPWINDOW;
end;
Und letzlich das Minimieren und Wiederherstellen überschreiben

Delphi-Quellcode:
procedure TMyModalForm.WMSyscommand(var msg: TWmSysCommand);
begin
  case (msg.CmdType and $FFF0) of
    SC_MINIMIZE:
    begin
      ShowWindow(Handle, SW_MINIMIZE);
      msg.Result := 0;
    end;
    SC_RESTORE:
    begin
      ShowWindow(Handle, SW_RESTORE);
      msg.Result := 0;
    end;
  else
    inherited;
  end;


end;
Nachteil ist das "Blinken" in der Taskbar, wenn der eine Button verschwindet und der andere angezeigt wird.
  Mit Zitat antworten Zitat