Delphi-PRAXiS

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/)
-   -   (Dynamisch erzeugte) Form immer im Vordergrund dargestellen (https://www.delphipraxis.net/158020-dynamisch-erzeugte-form-immer-im-vordergrund-dargestellen.html)

Viktorii 2. Feb 2011 15:16

(Dynamisch erzeugte) Form immer im Vordergrund dargestellen
 
Moin.

Wie kann ich erreichen, das eine (dynamisch erzeugte) Form immer im Vordergrund dargestellt wird?

Mit diesem Code wird die Form nicht mehr im Vordergrund dargestellt wenn ich den Fokus auf einen andere Applikation setze:

Delphi-Quellcode:
   
FPasswordForm := TPasswordForm.Create(self);
FPasswordForm.FormStyle := fsStayOnTop;
ret := FPasswordForm.ShowModal;
Wer weiß Rat?

Vielen Dank

GPRSNerd 2. Feb 2011 15:26

AW: (Dynamisch erzeugte) Form immer im Vordergrund dargestellen
 
Hi,

hier ein bisschen Code um diese StayOnTop-Feature ein und auszuschalten.

Delphi-Quellcode:
procedure TForm_Main.spbStayOnTopClick(Sender: TObject);
begin
  if spbStayOnTop.Down then
  begin
    SetWindowPos(Handle,
                 HWND_TOPMOST,
                 Left, Top, Width, Height,
                 SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
  end
  else
  begin
    SetWindowPos(Handle,
                 HWND_NOTOPMOST,
                 Left, Top, Width, Height,
                 SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
  end;
end;

DeddyH 2. Feb 2011 15:30

AW: (Dynamisch erzeugte) Form immer im Vordergrund dargestellen
 
Oder etwas kürzer:
Delphi-Quellcode:
procedure TForm_Main.spbStayOnTopClick(Sender: TObject);
const IsDown: array[Boolean] of Cardinal = (HWND_NOTOPMOST, HWND_TOPMOST);
begin
  SetWindowPos(Handle,
               IsDown[spbStayOnTop.Down],
               Left, Top, Width, Height,
               SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
end;

Viktorii 2. Feb 2011 15:34

AW: (Dynamisch erzeugte) Form immer im Vordergrund dargestellen
 
Das funktioniert leider nicht :(

So hab ich es versucht:
Delphi-Quellcode:
    FPasswordForm := TPasswordForm.Create(self);
    SetWindowPos(FPasswordForm.Handle,HWND_TOPMOST,Left, Top, Width, Height,SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
    ret := FPasswordForm.ShowModal;
Was (interessanterweise) teilweise funktioniert, ist der code den ich unter #1 gepostet habe und wenn ich in der Form folgendes mache:

Delphi-Quellcode:
procedure TPasswordForm.FormActivate(Sender: TObject);
begin
  Position := poScreenCenter;
end;
Wenn ich allerdings folgendes hinzufüge bzw. den Fokus zu Laufzeit mit der Maus auf das Edit setzte, bleibt das Fenster nicht mehr im Vordergrund :shock:

Delphi-Quellcode:
procedure TPasswordForm.FormShow(Sender: TObject);
begin
  EditPassword.SetFocus;
end;

DeddyH 2. Feb 2011 15:38

AW: (Dynamisch erzeugte) Form immer im Vordergrund dargestellen
 
Pack doch mal den SetWindowPos-Aufruf mit ins FormActive des Passwortforms, das sollte helfen.

GPRSNerd 2. Feb 2011 15:50

AW: (Dynamisch erzeugte) Form immer im Vordergrund dargestellen
 
Zitat:

Zitat von DeddyH (Beitrag 1079104)
Oder etwas kürzer:
Delphi-Quellcode:
procedure TForm_Main.spbStayOnTopClick(Sender: TObject);
const IsDown: array[Boolean] of Cardinal = (HWND_NOTOPMOST, HWND_TOPMOST);
begin
  SetWindowPos(Handle,
               IsDown[spbStayOnTop.Down],
               Left, Top, Width, Height,
               SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
end;

Coole Vereinfachung!

Viktorii 2. Feb 2011 15:51

AW: (Dynamisch erzeugte) Form immer im Vordergrund dargestellen
 
Hilft leider auch nicht.

Habe das in FormShow, FormActivate und FormCreate versucht.

GPRSNerd 2. Feb 2011 15:53

AW: (Dynamisch erzeugte) Form immer im Vordergrund dargestellen
 
Zitat:

Zitat von Viktorii (Beitrag 1079105)
Das funktioniert leider nicht :(

So hab ich es versucht:
Delphi-Quellcode:
    FPasswordForm := TPasswordForm.Create(self);
    SetWindowPos(FPasswordForm.Handle,HWND_TOPMOST,Left, Top, Width, Height,SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
    ret := FPasswordForm.ShowModal;

Du hast wahrscheinlich nicht bemerkt, dass die Properties Left, Top, Width, Height natürlich auch von FPasswordForm sein müssen! So, wie du es aufgerufen hast, übergibst du die Properties von deiner Parentform.

DeddyH 2. Feb 2011 15:53

AW: (Dynamisch erzeugte) Form immer im Vordergrund dargestellen
 
Komisch, ich habe das eben ausprobiert, bei mir geht das :gruebel:

[edit] @GPRSNerd: Solange SWP_NOMOVE und SWP_NOSIZE gesetzt sind, ist es vollkommen wurscht, wie die Koordinaten belegt sind, da sie schlicht ignoriert werden. [/edit]

Viktorii 2. Feb 2011 15:58

AW: (Dynamisch erzeugte) Form immer im Vordergrund dargestellen
 
@DeddyH: Ich werde mal ein Minimal Beispiel machen und das posten. Wird aber wahrscheinlich erst morgen früh was werden :)

DeddyH 2. Feb 2011 16:07

AW: (Dynamisch erzeugte) Form immer im Vordergrund dargestellen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich war schneller ;)

Viktorii 3. Feb 2011 08:23

AW: (Dynamisch erzeugte) Form immer im Vordergrund dargestellen
 
Liste der Anhänge anzeigen (Anzahl: 1)
So... Okay, Dein Beispiel funktioniert und das Beispiel welches ich zuerst programmiert funktionierte auch.

Dann habe ich geschaut wieso das in meinem eigentlichen Projekt nicht funktioniert und habe gesehen, dass ich wohl die entscheidende Info unterschlagen habe :oops:

Es ist so, dass mein Hauptfenster nicht sichtbar ist und die zweite Form durch einen Doppelklick auf das Trayicon der Anwendung erzeugt und dargestellt wird. Und hier tritt nun besagtes Verhalten auf.

Das unsichtbar machen des Hautfensters habe ich so erreicht:

Delphi-Quellcode:
program TopMost;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2};

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.ShowMainForm := False;           // <-- Hauptfenster unsichtbar
  Application.CreateForm(TForm1, Form1);
  //  Application.CreateForm(TForm2, Form2);
  Application.Run;
end.
Dann hänge ich jetzt noch das Minimalbeispiel an, welches meiner Situation ehr entspricht und hoffe, dass mit da jemand weiterhelfen kann :)

DeddyH 3. Feb 2011 09:09

AW: (Dynamisch erzeugte) Form immer im Vordergrund dargestellen
 
OK, jetzt kann ich das Problem nachvollziehen, habe aber im Moment noch keine Lösung, da mir die Ursache noch nicht ganz klar ist.

Viktorii 7. Feb 2011 16:34

AW: (Dynamisch erzeugte) Form immer im Vordergrund dargestellen
 
*push*


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:26 Uhr.

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