AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Fenster ungefragt immer vor Hauptfenster - warum?
Thema durchsuchen
Ansicht
Themen-Optionen

Fenster ungefragt immer vor Hauptfenster - warum?

Offene Frage von "p80286"
Ein Thema von ralfiii · begonnen am 18. Jul 2012 · letzter Beitrag vom 19. Jul 2012
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von ralfiii
ralfiii

Registriert seit: 30. Mai 2007
489 Beiträge
 
Delphi 2010 Professional
 
#1

Fenster ungefragt immer vor Hauptfenster - warum?

  Alt 18. Jul 2012, 17:21
Seltsam!
Ich hab hier ein frisches leeres Testprojekt angelegt und folgenden Code:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  with TForm.Create(self) do
    Show;
end;
Das erzeugte Fenster ist immer vor dem Haupfenster. Eh nicht schlecht, aber warum?
Und seit wann ist das denn so?

Aber, am aller wichtigsten: Was könnte der Grund sein wenn das bei einer Anwendung plötzlich nicht mehr der Fall ist?

Geändert von ralfiii (18. Jul 2012 um 17:26 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.149 Beiträge
 
Delphi 12 Athens
 
#2

AW: Fenster ungefragt immer vor Hauptfenster - warum?

  Alt 18. Jul 2012, 17:43
Alles (alle VCL-Forms) ist "standardmäßig" immer vor der Hauptform ... ist schon seit einer Weile so, also mindestens seit D2009. (in D7 war's noch nicht)


Du kannst aber Delphi-Referenz durchsuchenPopupMode und Delphi-Referenz durchsuchenPopupParent (TForm) beim jedem Fenster anpassen, bzw. Delphi-Referenz durchsuchenApplication.ModalPopupMode und damit regeln was/wie/wo ausgerichtet wird.


[edit]
Du kannst auch mal Folgendes ausprobieren:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  with TForm1.Create(self) do begin
    PopupMode := pmExplicit;
    PopupParent := Self;

    Top := Self.Top + 25;
    Left := Self.Left + 25;
    Self.Tag := Self.Tag + 1;
    Caption := Self.Caption + ' PopupForm' + IntToStr(Self.Tag);
    Show;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  with TForm1.Create(self) do begin
    Top := Self.Top + 25;
    Left := Self.Left + 25;
    Self.Tag := Self.Tag + 1;
    Caption := Self.Caption + ' Form' + IntToStr(Self.Tag);
    Show;
  end;
end;
pmNone


Zitat von OH: Application.ModalPopupMode:
Das Popup-Fenster zeigt das Verhalten von Versionen vor Delphi 8.
Also seit D2005/D2006/TDE (D8 ignorier ich einfach mal)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (18. Jul 2012 um 18:00 Uhr)
  Mit Zitat antworten Zitat
Patito

Registriert seit: 8. Sep 2006
108 Beiträge
 
#3

AW: Fenster ungefragt immer vor Hauptfenster - warum?

  Alt 19. Jul 2012, 09:31
Alles (alle VCL-Forms) ist "standardmäßig" immer vor der Hauptform ... ist schon seit einer Weile so, also mindestens seit D2009. (in D7 war's noch nicht)
Stellt sich die Frage was "der Hauptform" ist. Ich habe hier eine Anwendung, die beim Start 4 (gleichberechtigte) Fenster anzeigt...

Die Historie von dem Problem war glaube ich folgende:
1) Alle Delphi-Formulare hatten früher als zOrder-Parent das Application.Handle.
2) Windows hat mit mit einem XP-Servicepack das zOrder-Verhalten geändert
Bei zwei Fenstern mit gleichem zOrder-Parent kann sich die Reihenfolge auf dem Bildschirm ändern.
(Ein modaler Dialog kann also auch mal hinter einem anderes Formular wandern)...

-> die VCL, insbesondere Dialogs.pas hat also nicht mehr recht funktioniert.
Seither muss man die Handles der Parent-Formulare selber verwalten.

In D7 verwende ich als Fix für die z-Order Probleme oft folgendes:
Delphi-Quellcode:
procedure TMyForm.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  if (Parent <> nil) or (ParentWindow <> 0) then
    Exit; // must not mess with wndparent if form is embedded

  if Assigned(Owner) and (Owner is TWinControl) then
    Params.WndParent := TWinControl(Owner).Handle
  else if Assigned(Screen.ActiveForm) then
    Params.WndParent := Screen.ActiveForm.Handle;
end;
Der Code sagt dem Formular, dass es sich über den Owner hängen soll, und wenn kein Owner da ist hängt es sich über das gerade aktive Formular (falls eins da ist)).
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.149 Beiträge
 
Delphi 12 Athens
 
#4

AW: Fenster ungefragt immer vor Hauptfenster - warum?

  Alt 19. Jul 2012, 09:44
Die HauptForm ist eindeutig.

Das ist die, welche in Application.MainForm drinsteht und standardmäßig ist das die zuerst erstellte Form (über Application.CreateForm).

Wenn noch (wieder) keine Form exisitert, bzw. grade nichts bei Application.MainForm drinsteht, und eine neue Form erstellt wird, dann wird diese automatisch zur Hauptform.
Also meistens ist es das erste Application.CreateForm(T..., ...); in der DPR, bzw. die erste Form, welche in den Projektoptionen bei "Formulare > Automatisch erzeugen" auftaucht.

Also praktisch macht Delphi nun das automatisch, was dein CreateParams machte.

Dialoge werden meistens auch an das aktive Form gehängt.
Wobei wir da aktuell in Problemchen hatten.
- wärend der Abarbeitung wurde eine Progressform angezeigt
- diese Progressform wurde am Ende, bzw. bei einem Fehler (Exception) wieder ausgeblendet
- Exceptiondialoge und Query-Dialoge verschwanden dann urplötzlich
Grund: Diese hängten sich an die aktive Form, was die ProgressForm war
und zusammen mit der ProgressForm wurden auch alle Dialoge gleich mit geschlossen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (19. Jul 2012 um 09:49 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von ralfiii
ralfiii

Registriert seit: 30. Mai 2007
489 Beiträge
 
Delphi 2010 Professional
 
#5

AW: Fenster ungefragt immer vor Hauptfenster - warum?

  Alt 19. Jul 2012, 10:40
Ich hab's!!
Der Eintrag
Application.MainFormOnTaskbar := True;
in der Projektdatei hat gefehlt.

Mal sehen was das nun wieder für Sideeffects hat...

Aber eine Frage hab ich noch.
himitsu, wenn das Hauptformular das zuerst erzeugte Fenster ist, krieg ich dann mit so einem Code (->Splashscreen) Probleme:

Delphi-Quellcode:
begin
  frmSplash := TfrmSplash.Create(nil);
  frmSplash.Show;
  frmSplash.Refresh;

  Application.Initialize;
  Application.MainFormOnTaskbar:=True;
  Application.ProcessMessages;
  Application.CreateForm(TfrmMain, frmMain);
  ...
  Application.Run;
end.
(frmSplash wird in frmMain.OnShow freigegeben)

Da ist ja dann der Splashscreen das zuerst erzeugte Formular.
Oder rückt das MainForm nach wenn der Splashscreen freigegeben wird?
Danke!
  Mit Zitat antworten Zitat
Benutzerbild von Sybok Factor
Sybok Factor

Registriert seit: 15. Jan 2003
Ort: Billerbeck
39 Beiträge
 
Delphi 2010 Professional
 
#6

AW: Fenster ungefragt immer vor Hauptfenster - warum?

  Alt 19. Jul 2012, 11:43
Du bekommst Probleme! Die Splashform muss nach dem Hauptformular erzeugt werden, du kannst aber das Hauptformular unsichtbar erzeugen, dann den Splashscreen und mit dem Schließen vom Splashscreen machst du das Hauptformular sichtbar. Setze ich selber so ein, funktioniert!
Viele Grüße
Sybok Factor
Jetzte michse verstehen dein Problem!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.149 Beiträge
 
Delphi 12 Athens
 
#7

AW: Fenster ungefragt immer vor Hauptfenster - warum?

  Alt 19. Jul 2012, 11:51
Wenn die Spalshform nicht über CreateForm erstellt wird, sollte sie sich nicht als MainForm registrieren und es dürfte IMHO keine Probleme damit geben.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Patito

Registriert seit: 8. Sep 2006
108 Beiträge
 
#8

AW: Fenster ungefragt immer vor Hauptfenster - warum?

  Alt 19. Jul 2012, 13:35
Zu einem Splashscreen hatte ich gerade einen netten Effekt:
- mein Splashscreen ist fsStayOnTyp
- wenn man jetzt irgendwann zwischen Splashscreen.Show und Splashscreen.Hide
zu einer anderen Anwendung wechselt passiert folgendes:
-> die ganze Anwendung ist auf einmal immer über allen anderen Programmen

Workaround: immer warten bis der Splashscreen weg ist...
Fix im Code: Splashscreen.Free einfügen...
?!????
  Mit Zitat antworten Zitat
Benutzerbild von Sybok Factor
Sybok Factor

Registriert seit: 15. Jan 2003
Ort: Billerbeck
39 Beiträge
 
Delphi 2010 Professional
 
#9

AW: Fenster ungefragt immer vor Hauptfenster - warum?

  Alt 19. Jul 2012, 13:44
Wenn die Spalshform nicht über CreateForm erstellt wird, sollte sie sich nicht als MainForm registrieren und es dürfte IMHO keine Probleme damit geben.
Naja, wie man es nimmt: In der Taskbar wird ein leerer Eintrag erzeugt, der mit dem Schließen des Splashscreens nicht verschwindet. Davon abgesehen, läuft dann alles wie gewünscht. So ist das zumindest bei mir unter Win 7 Prof, 32 Bit.
Jetzte michse verstehen dein Problem!
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.349 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Fenster ungefragt immer vor Hauptfenster - warum?

  Alt 19. Jul 2012, 14:50
Das passiert, wenn man Application.MainFormOnTaskbar erst nach dem Erzeugen des Splashscreens setzt. Denn dann ist das Application-Window schon auf der Taskleiste. Also einfach als erstes (z.B. direkt nach dem begin) Application.MainFormOnTaskbar auf true setzen und dann funktioniert das auch korrekt.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  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 23:29 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