![]() |
Topmost für Form2
Hallo.
Ich will für mein derzeitiges Programm drei Dinge erreichen: Probleme: 1) Das Programm soll NICHT in der Taskleiste angezeigt werden 2) Das Startformular soll NICHT angezeigt werden 3) Das zweite Formular soll angezeigt werden und zwar topmost Lösungen: zu 1) ShowWindow(Application.Handle, SW_HIDE); zu 2) Application.ShowMainForm := false; (in der Projekt-Datei) zu 3) ??? Ich habe alles mögliche ausprobiert was mir eingefallen ist. Nichts hat funktioniert. Damit keine Missverständnisse entstehen: Ich habe extra ein einfaches Testprojekt erstellt, das lediglich Form1 un Form2 enthält. Kein anderes Form, keinen anderen Code (kein entfernen aus der Taskleiste, kein "Nichtangzeigen" der Mainform)! Nur zwei Forms und nichts anderes. Ziel in dem Test-Projekt ist es, Form2 topmost anzuzeigen. Zuerst habe ich natürlich die delphieigene Eigenschaft "FormStyle := fsStayOnTop" ausprobiert. Dann mithilfe von CreateParams "Params.ExStyle := Params.ExStyle or WS_EX_TOPMOST;" Dann SetWindowLong(Form2.Handle, GWL_EXSTYLE, GetWindowLong(Form2.Handle, GWL_EXSTYLE) or WS_EX_TOPMOST); Dann SetWindowPos(Form2.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE); Und alle möglichen und unmöglichen Kombinationen. Wie schon gesagt, nichts hat funktioniert. Also, wie bekommt man eine "Nicht-Mainform" (z. B. Form2) topmost? Guido. |
Re: Topmost für Form2
zu 1. folgendes habe ich getestet, jedenfalls bei mir ging es.
Delphi-Quellcode:
zu 2.:
procedure TForm1.FormShow(Sender: TObject);
begin ShowWindow(Application.Handle, SW_HIDE); end; ![]() Ich weis nicht ob es eine gute Idee ist, aber folgendes funktioniert auch:
Delphi-Quellcode:
Du kannst die Form ja auch erst später erstellen:
procedure TForm1.FormShow(Sender: TObject);
begin self.Top:= self.Top- self.Height- 30; end;
Delphi-Quellcode:
zu 3. also bei mir funktionierte es:
program Project1;
uses Forms, Unit1 in 'Unit1.pas' {Form1}, Unit3 in 'Unit2.pas' {Form2}; {$R *.res} begin Application.Initialize; //Application.CreateForm(TForm1, Form1); Application.CreateForm(TForm2, Form2); Application.Run; end.
Delphi-Quellcode:
procedure TForm2.FormShow(Sender: TObject);
begin SetWindowPos(Form2.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE); end; |
Re: Topmost für Form2
Hallo bitsetter.
Zitat:
Zitat:
Zitat:
In meinem Programm ist es so, dass das erste Formular das eigentliche Mainform ist und entsprechend viel Code enthält. Dieses erste Form ist beim Start unsichtbar (wird später über Klick auf Form2 sichtbar). Das zweite Form soll nach dem Programmstart gezeigt werden. Es ist mit wenigen Routinen ausgestattet und dient eigentlich nur dem Zeigen und Verstecken der Mainform. Das ist alles in Form2. Lediglich das Topmost-Setzen ist bisher nicht zu bewerkstelligen. Das erste Formular, so wie in deinem Vorschlag aus dem Erstellen des Projektes herauszunehmen, würde somit Form2 zum ersten Form machen. Somit würde nicht wirklich die ZWEITE Form topmost gesetzt. Du würdes nur die zweite Form zur ersten Form machen und die dann topmost setzen. Und das funktioniert ja sowieso. Die Frage bleibt: Wie setzt man eine zweite Form topmost? Guido. |
Re: Topmost für Form2
Und wieso setzt du nicht die zweite Form als Hauptfomular ein, welche du dann auf Topmost setzt. Ich versteh gerade nicht, wieso Form1 unbedingt Hautformular, aber bei Start nicht zu sehen sein soll.
Und über die entsprechenden Events kannst du das schließen ja abfangen und auch Form2 beenden. :gruebel: |
Re: Topmost für Form2
Hallo monta.
Zitat:
Zitat:
Im Form2 befindet sich eigentlich (so gut wie) nichts. Dort sind lediglich zwei Routinen. Die eine ist dazu da, das Mainform per Klick anzuzeigen und die zweite wertet Activate-Messages aus, wodurch das Mainform per Tastatur (Alt+Tab) aktiviert werden kann. Das Ganze würde sich problemlos so handhaben lassen, dass Form1 das Mainform darstellt und Form2 lediglich zum Zeigen der Mainform, wenn da nicht dieses Topmost-Problem wäre. Denn das funktioniert (bisher) nicht mit einer "Nicht-Mainform" eines Projektes! Wie schon gesagt, derzeit ist meine (Behelfs-)Lösung die eigentliche Mainform als Form2 und die eigentliche Form2 als Mainfrom im Projekt angzugeben. Das ändert aber nichts an meiner Frage: Wie kann man Form2 topmost setzen? Gruß, Guido. |
Re: Topmost für Form2
Hallo Guido,
ich bin gerade über deine Frage gestolpert. Der letzte Beitrag in diesem Thread ist zwar schon etwas her, aber vielleicht hilfts ja trotzdem noch weiter:
Delphi-Quellcode:
Dieser Code sollte Form2 anzeigen und danach als top-most setzen. Form2 ist dann solange top-most, bis du ein andere Applikation fokusierst.
procedure TForm2.FormCreate(Sender: TObject);
begin Show; Windows.BringWindowToTop(Handle); end; Gruß, pszopp |
Re: Topmost für Form2
Hallo pszopp.
Zitat:
Als kleiner Tipp: Man sollte die Routine nicht im FormCreate aufrufen. Das funktioniert "zufällig" bei der Mainform, weil für die andere Regeln gelten als für die übrigen Forms. (Das war auch Teil des Problems in diesem Topic.) Wenn du das ausprobieren willst, setze den Aufruf von BringWindowToTop in das FormCreate von Form2. Dennoch herzlichen Dank für deinen Beitrag. Diese Problem habe ich mittlerweile gelöst. (Weiß schon garnicht mehr wie :gruebel: ). Die Lösung fand ich aber erst, nach dem dieses Topic schon in den Tiefen des Archivs verschwunden war. Sonst hätte ich die Lösung auch gepostet. Manchmal bleibt ein Thema/Problem aber ungelöst. Und dann freut man sich um so mehr, wenn dann jemand (sei es auch einige Zeit später) eine Lösung oder einen Ansatz postet. Deshalb nochmals danke. Gruß, Guido. |
Re: Topmost für Form2
Hallo,
Zitat:
![]() ![]() |
Re: Topmost für Form2
Hallo bitsetter.
Du hast mir schon einmal weitergeholften und jetzt auch noch meinem Gedächtnis auf die Sprünge! :thumb: *freu* Ja, ich denke das sind die Postings, die mich (und andere) zur Lösung geführt haben. Gruß, Guido. |
Re: Topmost für Form2
Irgendwie werde ich das Gefühl nicht los, dass da irgendwas mit deinem Desgin nicht stimmt.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:24 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