AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ALT-TAB bei nur einer offenen Applikation

Ein Thema von James Kafka · begonnen am 16. Okt 2009 · letzter Beitrag vom 19. Okt 2009
Antwort Antwort
Seite 1 von 2  1 2      
James Kafka

Registriert seit: 16. Okt 2009
7 Beiträge
 
#1

ALT-TAB bei nur einer offenen Applikation

  Alt 16. Okt 2009, 09:33
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!
Angehängte Dateien
Dateityp: zip oo_in_delphi_647.zip (389,0 KB, 3x aufgerufen)
  Mit Zitat antworten Zitat
Progman

Registriert seit: 31. Aug 2007
Ort: 99974 MHL
695 Beiträge
 
Delphi 10.1 Berlin Starter
 
#2

Re: ALT-TAB bei nur einer offenen Applikation

  Alt 16. Okt 2009, 12:08
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;
Karl-Heinz
Populanten von Domizilen mit fragiler, transparenter Aussenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
(Wer im Glashaus sitzt sollte nicht mit Steinen werfen)
  Mit Zitat antworten Zitat
James Kafka

Registriert seit: 16. Okt 2009
7 Beiträge
 
#3

Re: ALT-TAB bei nur einer offenen Applikation

  Alt 16. Okt 2009, 12:41
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
  Mit Zitat antworten Zitat
Progman

Registriert seit: 31. Aug 2007
Ort: 99974 MHL
695 Beiträge
 
Delphi 10.1 Berlin Starter
 
#4

Re: ALT-TAB bei nur einer offenen Applikation

  Alt 16. Okt 2009, 13:09
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.
Angehängte Dateien
Dateityp: zip test_841.zip (227,6 KB, 5x aufgerufen)
Karl-Heinz
Populanten von Domizilen mit fragiler, transparenter Aussenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
(Wer im Glashaus sitzt sollte nicht mit Steinen werfen)
  Mit Zitat antworten Zitat
James Kafka

Registriert seit: 16. Okt 2009
7 Beiträge
 
#5

Re: ALT-TAB bei nur einer offenen Applikation

  Alt 16. Okt 2009, 13:53
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?
  Mit Zitat antworten Zitat
Progman

Registriert seit: 31. Aug 2007
Ort: 99974 MHL
695 Beiträge
 
Delphi 10.1 Berlin Starter
 
#6

Re: ALT-TAB bei nur einer offenen Applikation

  Alt 16. Okt 2009, 14:04
Da kann ich leider nicht weiterhelfen, da ich kein Delphi 2005 habe. Vielleicht hat jemand anderes noch eine Idee?
Karl-Heinz
Populanten von Domizilen mit fragiler, transparenter Aussenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
(Wer im Glashaus sitzt sollte nicht mit Steinen werfen)
  Mit Zitat antworten Zitat
blauweiss

Registriert seit: 19. Jun 2007
142 Beiträge
 
#7

Re: ALT-TAB bei nur einer offenen Applikation

  Alt 16. Okt 2009, 15:29
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:
      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
  Mit Zitat antworten Zitat
James Kafka

Registriert seit: 16. Okt 2009
7 Beiträge
 
#8

Re: ALT-TAB bei nur einer offenen Applikation

  Alt 16. Okt 2009, 17:09
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!
  Mit Zitat antworten Zitat
blauweiss

Registriert seit: 19. Jun 2007
142 Beiträge
 
#9

Re: ALT-TAB bei nur einer offenen Applikation

  Alt 16. Okt 2009, 17:44
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
  Mit Zitat antworten Zitat
James Kafka

Registriert seit: 16. Okt 2009
7 Beiträge
 
#10

Re: ALT-TAB bei nur einer offenen Applikation

  Alt 19. Okt 2009, 09:59
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?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:46 Uhr.
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