Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi ALT-TAB bei nur einer offenen Applikation (https://www.delphipraxis.net/141795-alt-tab-bei-nur-einer-offenen-applikation.html)

James Kafka 16. Okt 2009 09:33


ALT-TAB bei nur einer offenen Applikation
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen

Ich suche einen Workaround oder gar eine Lösung zu folgendem Problem:

Ich habe ein MainForm und ein zusätzliches fsStayOnTop-Form. Das fsStayOnTop-Form verschwindet hinter dem MainForm, wenn meine Applikation die einzig offene ist, das MainForm den Fokus hat und ALT-TAB gedrückt wird.

Code um das Problem nachzuvollziehen:
Delphi-Quellcode:
  Application.Initialize;
  Application.CreateForm(TForm, Form1);
  Application.CreateForm(TForm, Form2);
  Form1.Caption := 'Form1';
  Form2.Caption := 'Form2';
  Form1.SetBounds(100, 100, 400, 400);
  Form2.SetBounds(200, 200, 200, 200);
  Form2.FormStyle := fsStayOnTop;
  Form2.Show;
  Application.Title := 'AltTabTest';
  Application.Run;
Als Attachment habe ich zusätzlich das Borland-Projekt als zip-File hinterlegt.

Das Problem wurde bereits im experts-exchange-Forum beschrieben und vermeintlich gelöst.

Das Problem an der beschriebenen Lösung ist aber, dass ich in meiner Applikation in der das Problem auftritt, noch andere StayOnTop-Fenster habe. Wenn ich nun das fsStayOnTop-Form einfach im Code wieder in den Vordergrund bringe, bleiben alle anderen Formulare hinter dem MainForm zurück, obwohl es das einzige Fenster ist, welches fsStayOnTop nicht gesetzt hat.

Ich nutze
- D2005, WinXP SP2

Ich danke euch für eure Unterstützung!

Progman 16. Okt 2009 12:08

Re: ALT-TAB bei nur einer offenen Applikation
 
Vielleicht hilft es, dein MainForm auf den Desktop zu "kleben"? Dann könnte kein Fenster mehr dahinter sein, sondern alle davor.
Delphi-Quellcode:
type
  TfrmMain = class(TForm)
    ...
Integer);
    ...
  private
    ...
  public
    ...
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

procedure TfrmMain.CreateParams(var Params: TCreateParams);
begin //Form klebt am Desktop, d. h. es kann kein Fenster dahinter verschwinden :-)
  inherited CreateParams(Params);
  if Assigned(Application.MainForm) then begin
    Params.WndParent := GetDesktopWindow;
    Params.Style := WS_CHILD;
  end;
end;

James Kafka 16. Okt 2009 12:41

Re: ALT-TAB bei nur einer offenen Applikation
 
Habe deinen Vorschlag getestet, es hatte aber keinen Effekt auf das Problem.

Um im Hinterkopf zu halten. Weitere Anforderugnen an meine Applikation (nicht an das @ Test-Programm):
- Applikation muss maximiert sein
- die Windows-TaskBar muss überblendet werden (auch mit dem MainForm)
- ALT-TAB muss sich bei mehreren offenen Applikationen wie gewohnt verhalten

Progman 16. Okt 2009 13:09

Re: ALT-TAB bei nur einer offenen Applikation
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe mal aus einer Anwendung von mir ein kleines Testprogramm extrahiert, das in etwa das macht, was dir vorschwebt. Allerding arbeite ich mit Delphi 2007. Ich weiß nicht, wie das mit deiner Delphi-Version dann klappt.

James Kafka 16. Okt 2009 13:53

Re: ALT-TAB bei nur einer offenen Applikation
 
Hab dein kompiliertes Programm ausgeführt. (Delphi 2007)
-> das Problem trat nicht auf

Dann kompilierte ich dein Projekt mit Delphi 2005. Dabei stellte ich fest, dass das property
Application.MainFormOnTaskbar := True;
in Delphi 2005 nicht existiert. Wenn ich diese Zeile auskommentiere, ist aber das Verhalten genau gleich wie bei meinem Testprogram
-> Problem immer noch vorhanden

Application.MainFormOnTaskbar kam laut (link) erst bei Delphi 2007 dazu.

Lösungen für Delphi 2005?

Progman 16. Okt 2009 14:04

Re: ALT-TAB bei nur einer offenen Applikation
 
Da kann ich leider nicht weiterhelfen, da ich kein Delphi 2005 habe. Vielleicht hat jemand anderes noch eine Idee?

blauweiss 16. Okt 2009 15:29

Re: ALT-TAB bei nur einer offenen Applikation
 
Hallo James,

FormStyle fsStayOnTop funktioniert schlicht nicht zuverlässig. Wir verwenden es überhaupt nicht mehr.
Stattdessen haben wir einen Workaround gebaut.

Hiermit wird ein Form vor ein anderes gesetzt:
Delphi-Quellcode:
      SetWindowLong(aFrontForm.Handle, GWL_HWNDPARENT, aBackForm.Handle);
Damit entsteht aber ein Problem beim Minimieren/Wiederherstellen der Applikation. Die "Vorne"-Fenster bleiben sichtbar beim Minimieren. Um dieses Problem zu lösen, mußten wir die Forms.pas (Delphi5) manipulieren (TApplication.WndProc fängt jetzt WM_SIZE mit WParam = SIZE_MINIMIZED ab). Unter Delphi2009 hat es gereicht, Application.MainFormOnTaskbar auf false zu setzen.


blauweiss

James Kafka 16. Okt 2009 17:09

Re: ALT-TAB bei nur einer offenen Applikation
 
Hallo blauweiss

Hab dein Vorschlag in mein Beispielprogramm integriert. Es scheint das beschriebene Hauptproblem zu lösen. Allerdings stellte ich wie du beschrieben hast fest, dass nun Probleme beim Minimieren/Wiederherstellen entstehen.

Kannst du mir deine Lösung noch etwas genauer erklären? Könnt ihr nach dieser Änderung euer Programm überhaupt noch minimieren?

Ich werde nächste Woche versuchen das ganze in meine eigentliche Applikation einzuweben.

Erstmal herzlichen Dank euch 2'en!

blauweiss 16. Okt 2009 17:44

Re: ALT-TAB bei nur einer offenen Applikation
 
Hallo James,

ja, unsere Applikationen (1-5 "normale Fenster", einige dutzend "Vorne-Fenster") laufen nun problemlos. Inklusive Minimieren.

Wir mußten dafür jedoch die ausgelieferte Forms.pas anpassen. Das hat den Nachteil, daß wir diese Applikationen nun nicht mehr mit Runtime-Packages compilieren können.


Unsere Änderungen in der Forms.pas:
Delphi-Quellcode:
procedure TApplication.WndProc(var Message: TMessage);
...
        WM_SIZE:
          if WParam = SIZE_MINIMIZED then
            begin
              DoShowOwnedPopups(false);
            end;
...
sowie
Delphi-Quellcode:
procedure TApplication.Restore;
...
    DoShowOwnedPopups(true); // RBRBRB
...
Die Methode TApplication.DoShowOwnedPopups haben wir aus der Delphi2009 Forms.pas abgekupfert.
Bei Interesse kann ich Dir den Code (~2 Bildschirmseiten) geben. Bin aber erst wieder am Montag im Büro.


blauweiss

James Kafka 19. Okt 2009 09:59

Re: ALT-TAB bei nur einer offenen Applikation
 
Hallo blauweiss

Ich wäre in der Tat sehr froh um deinen Code. Ich habe ausserdem noch keine Erfahrung bei Änderungen in der VCL, wie kompiliere ich die Änderung korrekt? Gibt es verschiedene Varianten (z.B. Änderung gilt nur für einzelnes Projekt oder Änderung gilt für alles)? Wir arbeiten im Team, gibt es da gute Verfahren um die Änderung zu verteilen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:36 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz