AGB  ·  Datenschutz  ·  Impressum  







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

Topmost für Form2

Ein Thema von Guido Eisenbeis · begonnen am 16. Feb 2007 · letzter Beitrag vom 14. Apr 2007
Antwort Antwort
Seite 1 von 2  1 2      
Guido Eisenbeis

Registriert seit: 9. Apr 2006
389 Beiträge
 
Delphi 10.3 Rio
 
#1

Topmost für Form2

  Alt 16. Feb 2007, 18:25
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.
  Mit Zitat antworten Zitat
Benutzerbild von bitsetter
bitsetter

Registriert seit: 17. Jan 2007
1.169 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Topmost für Form2

  Alt 16. Feb 2007, 19:56
zu 1. folgendes habe ich getestet, jedenfalls bei mir ging es.
Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
begin
  ShowWindow(Application.Handle, SW_HIDE);
end;
zu 2.:
ein Fenster ohne Hintergrund erzeugen
Ich weis nicht ob es eine gute Idee ist, aber folgendes funktioniert auch:
Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
begin
  self.Top:= self.Top- self.Height- 30;
end;
Du kannst die Form ja auch erst später erstellen:
Delphi-Quellcode:
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.
zu 3. also bei mir funktionierte es:
Delphi-Quellcode:
procedure TForm2.FormShow(Sender: TObject);
begin
  SetWindowPos(Form2.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE);
end;
Gruß bitsetter
"Viele Wege führen nach Rom"
Wolfgang Mocker (geb. 1954), dt. Satiriker und Aphoristiker
  Mit Zitat antworten Zitat
Guido Eisenbeis

Registriert seit: 9. Apr 2006
389 Beiträge
 
Delphi 10.3 Rio
 
#3

Re: Topmost für Form2

  Alt 16. Feb 2007, 20:59
Hallo bitsetter.

Zitat von bitsetter:
zu 1. folgendes habe ich getestet, jedenfalls bei mir ging es.
Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
begin
  ShowWindow(Application.Handle, SW_HIDE);
end;
Das geht bei mir auch. Deshalb habe ich es ja unter "Lösungen" geschrieben.

Zitat von bitsetter:
zu 2.:
ein Fenster ohne Hintergrund erzeugen
Ich weis nicht ob es eine gute Idee ist, aber folgendes funktioniert auch:
Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
begin
  self.Top:= self.Top- self.Height- 30;
end;
Die Idee ist nicht schlecht. Sie hat den Vorteil, dass das Formular NICHT zu sehen und trotzdem für Windows "Visible" ist. Dadurch kann es dann Ereignisse empfangen (z. B. Fokus). Aber auch hier: Das geht bei mir und steht unter "Lösungen".

Zitat von bitsetter:
Du kannst die Form ja auch erst später erstellen:
Delphi-Quellcode:
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.
zu 3. also bei mir funktionierte es:
Delphi-Quellcode:
procedure TForm2.FormShow(Sender: TObject);
begin
  SetWindowPos(Form2.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE);
end;
Dieser dritte Punkt ist der, um den es geht. Bei deinem Vorschlag würde das erste Formular nicht geladen und das zweite würde geladen. Das kann ganz klar NICHT die Lösung sein, weil dann einfach das zweite Form zum ersten gemacht würde. Dennoch danke für den Vorschlag!

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.
  Mit Zitat antworten Zitat
monta

Registriert seit: 18. Okt 2004
Ort: Dresden
141 Beiträge
 
#4

Re: Topmost für Form2

  Alt 16. Feb 2007, 21:59
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.

Johannes M.
.
  Mit Zitat antworten Zitat
Guido Eisenbeis

Registriert seit: 9. Apr 2006
389 Beiträge
 
Delphi 10.3 Rio
 
#5

Re: Topmost für Form2

  Alt 16. Feb 2007, 23:20
Hallo monta.


Zitat von monta:
Und wieso setzt du nicht die zweite Form als Hauptfomular ein, welche du dann auf Topmost setzt.
Das ist meine derzeitige (unbefriedigende) Lösung.

Zitat von monta:
Ich versteh gerade nicht, wieso Form1 unbedingt Hautformular, aber bei Start nicht zu sehen sein soll.
Dieses Form1 ist das eigentliche Mainform. Es enthält über 1300 Zeilen Code, setzt die Start-Vorbereitungen wie OleCheck (RegisterDragDrop), CreateMutex, RegisterShellNotifier, Erstellen und Initialisieren von Controls und deren Eigenschaften, Platzieren von Controls und vieles mehr. Die DragDrop-Ereignisse werden darin empfangen und verarbeitet, Werte werden ermittelt, die für (und eigentlich vor) andere(n) Forms vorhanden sein müssen. Und (fast) alles was der User siehr und womit er arbeitet befindet sich in diesem Form. Deshalb sehe ich es als Mainform an und will es eigentlich auch zur besseren Pflege des Programmes als Mainform im Projekt eintragen.

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.
  Mit Zitat antworten Zitat
pszopp

Registriert seit: 7. Sep 2005
Ort: Alsdorf
95 Beiträge
 
Delphi 2010 Professional
 
#6

Re: Topmost für Form2

  Alt 13. Apr 2007, 14:04
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:
procedure TForm2.FormCreate(Sender: TObject);
begin
  Show;
  Windows.BringWindowToTop(Handle);
end;
Dieser Code sollte Form2 anzeigen und danach als top-most setzen. Form2 ist dann solange top-most, bis du ein andere Applikation fokusierst.

Gruß,
pszopp
www.pstipp.de | Tippseite zur Formel 1 und Fußball WM/EM - kostenlos und Just-For-Fun
  Mit Zitat antworten Zitat
Guido Eisenbeis

Registriert seit: 9. Apr 2006
389 Beiträge
 
Delphi 10.3 Rio
 
#7

Re: Topmost für Form2

  Alt 13. Apr 2007, 21:58
Hallo pszopp.

Zitat von Online-Hilfe:
Calling this function is similar to calling the SetWindowPos function to change a window's position in the Z order. BringWindowToTop does not make a window a top-level window.
Wie du siehst, entspricht BringWindowToTop in etwa der SetWindowsPos-Funktion. Und in meinem ersten Beitrag (siehe ganz oben) habe ich geschrieben, dass ich eben diese ausprobiert habe. Neben vielen anderen Versuchen.

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 ). 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.
  Mit Zitat antworten Zitat
Benutzerbild von bitsetter
bitsetter

Registriert seit: 17. Jan 2007
1.169 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Topmost für Form2

  Alt 13. Apr 2007, 22:18
Hallo,

Zitat von Guido Eisenbeis:
Diese Problem habe ich mittlerweile gelöst. (Weiß schon garnicht mehr wie ). 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.
Waren es diese hier?
Topmost die Zweite
Taskbareintrag nur für fenster, nicht für die Anwendung
Gruß bitsetter
"Viele Wege führen nach Rom"
Wolfgang Mocker (geb. 1954), dt. Satiriker und Aphoristiker
  Mit Zitat antworten Zitat
Guido Eisenbeis

Registriert seit: 9. Apr 2006
389 Beiträge
 
Delphi 10.3 Rio
 
#9

Re: Topmost für Form2

  Alt 13. Apr 2007, 22:32
Hallo bitsetter.

Du hast mir schon einmal weitergeholften und jetzt auch noch meinem Gedächtnis auf die Sprünge! *freu*

Ja, ich denke das sind die Postings, die mich (und andere) zur Lösung geführt haben.

Gruß,
Guido.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Topmost für Form2

  Alt 13. Apr 2007, 23:13
Irgendwie werde ich das Gefühl nicht los, dass da irgendwas mit deinem Desgin nicht stimmt.
Michael
Ein Teil meines Codes würde euch verunsichern.
  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 19:13 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