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/)
-   -   (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 :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:09 Uhr.
Seite 1 von 2  1 2      

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