Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi mal wieder StayOnTop (https://www.delphipraxis.net/52345-mal-wieder-stayontop.html)

tinibeenie 28. Aug 2005 14:10


mal wieder StayOnTop
 
Hallöchen!

In meinem Programm soll Form2 immer im Vordergrund bleiben. Bis jetzt hat es nicht funktioniert, folgende Wege habe ich schon probiert:
  • nur bei Form2 FormStyle auf fsStayOnTop gestellt,
  • bei Form1 und Form2 den FormStyle auf fsStayOnTop gestellt,
  • am besten funktioniert es mit
    Delphi-Quellcode:
    procedure TForm2.FormShow(Sender: TObject);
    begin
    SetWindowPos(Handle, HWND_TOPMOST, Left,Top, Width, Height, SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
    SetWindowLong(Handle, GWL_HWNDPARENT, 0);
    end;
    allerdings erscheint dann Form2 extra in der Taskbar, das ganze Programm sollte insgesamt aber nur 1x in der Taskbar erscheinen.

Hat jemand eine Idee, wie man das machen könnte? Meine Forms haben alle BorderStyle bsNone, auf Form2 ist ein jvTransparentForm (macht aber glaub ich eh keinen Unterschied) und das ganze soll unter XP laufen.

phXql 28. Aug 2005 14:18

Re: mal wieder StayOnTop
 
wenn du mal die zeile mit dem SetWindowLong rausnimmst?

tinibeenie 28. Aug 2005 14:30

Re: mal wieder StayOnTop
 
Zitat:

Zitat von phXql
wenn du mal die zeile mit dem SetWindowLong rausnimmst?

Hab ich auch schon ausprobiert, es erscheint dann zwar kein neuer Eintrag in der Taskbar, aber ich bekomm eine Fehlermeldung (Zugriffsverletzung in Adresse...) oder es funktioniert gar nicht (je nachdem, bei welchem Form ich fsStayOnTop auf true setze).

Armageddon 28. Aug 2005 14:38

Re: mal wieder StayOnTop
 
Ich wollte mal das selbe machen wie Du aber hat auch nicht so hingehauen wie ich wollte. Habe es halt dann mit einem Timer gemacht.

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Application.BringToFront;
end;
Ist zwar nicht grad die feine Art aber wollte mir kein Kopf mehr mit den anderen Methoden machen. Stehe sowieso grad mit Delphi auf dem Kiegsfuß. *grrrrr*

tinibeenie 28. Aug 2005 14:52

Re: mal wieder StayOnTop
 
Hab's grad mal ausprobiert. Es funktionierte auch, aber das Problem ist, dass ich dann mit anderen Programmen nicht weiterarbeiten kann (es ist nämlich nur so ein kleines Form, was dann unten rechts in der Ecke dauerhaft zu sehen sein soll, man soll inzwischen aber was anderes machen können). Außerdem fing das Programm in der Taskbar ab und zu an zu blinken, so als hätte man es gerade erst geöffnet.
Hast du da vielleicht irgendwelche Bedingungen gesetzt, wann der Timer anfangen soll zu laufen?

phXql 29. Aug 2005 19:26

Re: mal wieder StayOnTop
 
stay on top heisst ja auch nur, dass das formular von den fenstern der EIGENEN anwendung ist. andere anwendungen sind davon nicht betroffen. normalerweise geht das aber auch ohne SetWindowLong...

holliesoft 12. Sep 2005 16:01

Re: mal wieder StayOnTop
 
Hallo,

schau hier einmal hier:

http://groups.google.de/group/borlan...360bcb446012af

und hier:

http://groups.google.de/group/borlan...9fda46db846ee1


Hatte das Problem auch gehabt...

Gruß
Patrick

n0b0dy 18. Okt 2005 21:17

Re: mal wieder StayOnTop
 
hi,

habe das gleiche problem. möchte eine Form immer im Vordergrund haben. Leider habe ich auch diesen zweiten Taskbareintrag, den ich nicht haben will. Kann mir jemand helfen. Konnte hier keine Lösung "rauslesen" :gruebel:

himitsu 19. Okt 2005 00:22

Re: mal wieder StayOnTop
 
Der zweite Taskbareintrag kommt durch dieses
Delphi-Quellcode:
SetWindowLong(Handle, GWL_HWNDPARENT, 0);
Hast du es mal ohne diese Änderung des Parentwindoweintrags versucht?


Es gibt aber auch noch die Möglichkeit den Taskbareintrag der Anwendung zu entfernen,
dieses könntest du ja mal auf den Eintrag der Form anwenden?

n0b0dy 19. Okt 2005 00:29

Re: mal wieder StayOnTop
 
wenn man das weg lässt, ist es nicht wirklich immer im vordergrund. mache ich den tasbareintrag weg, auch nicht mehr....

SirThornberry 19. Okt 2005 05:40

Re: mal wieder StayOnTop
 
das, das fenster dann nicht im Vordergrund liegt hängt höchstwahrscheinlich damit zusammen das, das fenster nochmal neu creiert wird (RecreateWnd). Man sollte also sicherstellen das solche Sachen wie "FormStyle", "Position" etc. des Formulars auf Standard stehen damit eben sowas nicht passiert. Oder eben diese Anweisungen erst dann ausführen wenn all diese Sachen abgearbeitet wurden (also frühestens nach dem ersten OnShow)

n0b0dy 19. Okt 2005 10:49

Re: mal wieder StayOnTop
 
das ist ein fenster, was je nach wunsch angezeigt werden kann. es wird mit .Hide versteckt und mit .Show wieder angezeigt...

n0b0dy 19. Okt 2005 14:41

Re: mal wieder StayOnTop
 
Liste der Anhänge anzeigen (Anzahl: 1)
also bin bald am verzweifeln :?

habe mal ein bspprog angehängt.
die form1 hat keinen taskbareintrag.
ruft man Form2.Show auf, hat ist es zwar "Immer im Vordergrund", aber hat einen Taskbareintrag. dieser taskbareintrag soll jedoch auch nicht vorhanden sein. Kann mir jemand helfen?

Khabarakh 19. Okt 2005 14:49

Re: mal wieder StayOnTop
 
Von meinen hüpfenden Viechern:
Delphi-Quellcode:
procedure TBlobForm.FormShow(Sender: TObject);
begin
  // Setzt Fenster an die vorderste Front
  SetWindowPos(Handle, HWND_TOPMOST, Left, Top, Width, Height,
    SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
  // Setzt Parent auf den Desktop
  SetWindowLong(Handle, GWL_HWNDPARENT, 0);
  // Versteckt das Fenster in der Taskleiste
  SetWindowLong(Handle, GWL_EXSTYLE,
    GetWindowLong(Handle, GWL_EXSTYLE) or
    WS_EX_TOOLWINDOW and not WS_EX_APPWINDOW);
end;
Da das aber mein erster richtiges Projekt mit direkter WinAPI-Nutzung war, bin ich mir nicht sicher, ob ich dieser damit nicht irgendwie ans virtuelle Schienbein trete :stupid: .
Funktionieren tut es aber.

n0b0dy 19. Okt 2005 14:54

Re: mal wieder StayOnTop
 
hm. habs versucht aber genau das gleiche prob.... :(

[Edit]
Die Viecher sind genial :D

holliesoft 19. Okt 2005 15:22

Re: mal wieder StayOnTop
 
Hallo,

liest denn keiner mein Posting oben dazu? Ich hatte 2 Links gepostet... :roll:

Zitat von dem einen Link:

You may try adding Application->RestoreTopMosts(); to the OnDeactivate
event handler.

Also, bei TApplication.OnDeactivate sollte ein Application.RestoreTopMosts ausgeführt werden. Dann reicht auch

Delphi-Quellcode:
SetWindowPos(Handle, HWND_TOPMOST, Left, Top, Width, Height,
    SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
bei der Form2 und es gibt keinen Eintrag in der Taskbar. Hab das so bei meinem Programm Klebezettel für die Notizen gemacht und es funktioniert einwandfrei :)

Gruß
Patrick

n0b0dy 19. Okt 2005 19:18

Re: mal wieder StayOnTop
 
naja,

das funktioniert innerhalb der Anwendung aber nicht überall. mit diesem Code ist Form2 innerhalb der Anwendung StayonTop und das auch ohne Taskbareintrag, aber damit ist nicht das forumlar für windows "Immer im Vordergrund"....


habs eben getestet

holliesoft 19. Okt 2005 19:54

Re: mal wieder StayOnTop
 
Hi n0b0dy,

hast Du denn beim
Delphi-Quellcode:
TApplication.OnDeactivate
ein

Delphi-Quellcode:
Application.RestoreTopMosts
ausgeführt?

n0b0dy 19. Okt 2005 20:24

Re: mal wieder StayOnTop
 
ja hab ich. will trotzdem net. ich habe die befürchtung dass meine style komponente (sry, vergessen zu erwähnen) das irgendwie verändert...
ich mach den style mal weg und teste es nochmal.

n0b0dy 19. Okt 2005 21:31

Re: mal wieder StayOnTop
 
also, habs nochmal probiert und holliesoft's lösung funzt einwandfrei.
das lag an meinem style, der das wieder rückgängig gemacht hat.

also einfach im OnShow folgendes ausführen ...
Delphi-Quellcode:
SetWindowPos(Handle, HWND_TOPMOST, Left, Top, Width, Height,
    SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
... und im Application.OnDeactivate das hier ausführen:
Delphi-Quellcode:
Application.RestoreTopMosts

Ciao


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:58 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-2025 by Thomas Breitkreuz