Delphi-PRAXiS

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/)
-   -   Form2 NICHT modal anzeigen - XE2 (https://www.delphipraxis.net/164292-form2-nicht-modal-anzeigen-xe2.html)

Guido Eisenbeis 7. Nov 2011 08:24

Form2 NICHT modal anzeigen - XE2
 
Teste zur Zeit Delphi XE2. Ich hab ein simples Projekt erstellt, das lediglich zwei Forms enthält. Auf Form1 ist ein Button, der Form2 zeigt (Form2.Show). Ergebnis:

In Turbo Delphi wird Form2 "normal" gezeigt, gleichrangig mit Form1 (Z-Order wechselt beim Fokus).

In Delphi XE2 wird Form2 modal angezeigt, also immer über Form1.

Ist das ein Bug oder ein Feature? Und wichtiger: Wie erhalte ich das "alte" Verhalten, das die Forms gleichwertig sind, was die Z-Order betrifft?

Guido.

DeddyH 7. Nov 2011 08:40

AW: Form2 NICHT modal anzeigen - XE2
 
Das kann ich unter XE nachvollziehen. Wenn man in der Projektdatei das Application.MainFormOnTaskBar auskommentiert, verhält sich das Fenster aber wie gewünscht.

plusplus 7. Nov 2011 08:43

AW: Form2 NICHT modal anzeigen - XE2
 
Check if the PopupMode property of the second form is pmNone.

Andreas L. 7. Nov 2011 08:53

AW: Form2 NICHT modal anzeigen - XE2
 
Zitat:

Zitat von DeddyH (Beitrag 1134771)
Das kann ich unter XE nachvollziehen. Wenn man in der Projektdatei das Application.MainFormOnTaskBar auskommentiert, verhält sich das Fenster aber wie gewünscht.

Das ist die Lösung. Hatten wir erst vor kurzem im DF: http://www.delphiforum.de/viewtopic.php?t=107604

himitsu 7. Nov 2011 10:45

AW: Form2 NICHT modal anzeigen - XE2
 
[add]
http://forum.delphi-treff.de/showthr...nFormOnTaskbar
[/add]


Abgesehn davon, daß es eigentlich besser sind, wenn seit Vista und vorwiegend Windows 7, die Hauptform sich in der Taskbar befindet und nicht die versteckte Application-Form (ist für die Messagebehandlung und Co.).

Zitat:

Zitat von Aus der Delphi-OH
Steuert, wie Taskleisten-Schaltflächen von Windows von der VCL behandelt werden.

Die Eigenschaft MainFormOnTaskBar steuert, wie Taskleisten-Schaltflächen von Windows von der VCL behandelt werden.

Wenn die Eigenschaft True ist, repräsentiert eine Taskleisten-Schaltfläche das Hauptformular einer Anwendung und zeigt dessen Titel an. Bei False repräsentiert eine Taskleisten-Schaltfläche das (verborgene) Hauptfenster einer Anwendung und zeigt den Anwendungstitel an.

MainFormOnTaskBar muss True sein, damit die Aero-Effekte aus Windows Vista oder Windows 7 verwendet werden können. Dazu zählen: LiveTaskbar-Miniaturansichten, dynamische Fenster, Windows-Flip und Windows-Flip-3D.

Wenn eine Änderung des Standardverhaltens erforderlich ist, sollte MainFormOnTaskBar in der .dpr-Datei nach Application.Initialize und vor der Erstellung des Hauptformulars gesetzt werden. MainFormOnTaskBar sollte beim Start gesetzt werden und während der gesamten Anwendungsdauer erhalten bleiben. Das Ändern dieser Eigenschaft zur Laufzeit könnte unerwartetes Verhalten verursachen.

Die Standardeinstellung von MainFormOnTaskBar für in Delphi 2007 und späteren Produkten erstellte Anwendungen ist True, für frühere Produkte False.

Die Eigenschaft kann auch für ältere Anwendungen verwendet werden. Beachten Sie, dass sich die Eigenschaft auf die Z-Reihenfolge des Hauptformulars auswirkt, falls Ihre Anwendung davon abhängig ist.


Guido Eisenbeis 7. Nov 2011 11:55

AW: Form2 NICHT modal anzeigen - XE2
 
@plusplus

I've played around with PopupMode property in both forms, but without success.

So, ich hoffe, in meinem englichen Satz steht nichts Blödes (Online-Translator). Ich habe mit dem PopupMode Property rumgespielt in beiden Forms, aber ohne Erfolg.


Zitat:

Zitat von DeddyH (Beitrag 1134771)
Wenn man in der Projektdatei das Application.MainFormOnTaskBar auskommentiert, verhält sich das Fenster aber wie gewünscht.

Ja, funktioniert. :-D


- Ab welcher Delphi-Version wurde das geändert? Ich konnte es schon soweit eingrenzen, dass es in Turbo-Delphi (=2006) noch "normal" war. Kann das jemand noch weiter eingrenzen?

- Weiß jemand, warum das geändert wurde?


Die beiden Fragen wurden gerade durch himitsus Posting #5 beantwortet. :-D Und der Link in himitsus Posting enthält auch schon gleich eine Antwort auf die Frage, die ich als nächstes stellen wollte:

- Kann man MainFormOnTaskBar = true lassen und trotzdem erreichen, dass weitere Forms nicht modal zu Form1 gezeigt werden?

Den CreateParams-Ansatz im Link in himitsus Posting sehe ich als die bessere Lösung an. :thumb: Oder was meint ihr?

Zitat:

Zitat von himitsu (Beitrag 1134790)
... besser ... für die Messagebehandlung und Co.

Fällt dir da ein Beispiel ein?


OffTopic:

Im Projekt-Verwaltung-Fenster kann man ja Units und Forms doppelklicken und die werden dann im Editor-Fenster(-Bereich) geöffnet und angezeigt. Geht das auch mit der Projekt-Datei? Das geht zwar per Kontextmenü, aber das Menü ist ziemlich lang und der Punkt nicht sofort zu finden. Per Shortcut Strg+V gehts auch, aber das geht mir nicht so ins Gedächtnis rein. Ein Doppelklick wär halt bequem (Ich geb's ja zu. :mrgreen: )


Guido.

himitsu 7. Nov 2011 13:02

AW: Form2 NICHT modal anzeigen - XE2
 
Ein Beispiel?

Nja, es einige Messages, wie WM_CHANGEINI (oder so) und das App-Beenden laufen über das HWND (Application.Handle), welches das versteckte Fenster ist), damit Borland/Codegear/Embarcadero die Codes dafür nicht mehrfach im Programm haben (in jedem Fenster).


[OT] Hättest du kein Turbo Delphi, dann hätte man sich da etwas über die OTA (Open Tools API) basteln können, aber da du keine BPLs installieren darfst, geht dieser Weg nicht.

Guido Eisenbeis 7. Nov 2011 13:18

AW: Form2 NICHT modal anzeigen - XE2
 
Zitat:

Zitat von himitsu (Beitrag 1134836)
Ein Beispiel?

Nja, es einige Messages, wie WM_CHANGEINI (oder so) und das App-Beenden laufen über das HWND (Application.Handle), welches das versteckte Fenster ist), damit Borland/Codegear/Embarcadero die Codes dafür nicht mehrfach im Programm haben (in jedem Fenster).

Oh, sorry, hab ich falsch verstanden:

Zitat:

Zitat von himitsu (Beitrag 1134790)
Abgesehn davon, daß es eigentlich besser sind, wenn seit Vista und vorwiegend Windows 7, die Hauptform sich in der Taskbar befindet und nicht die versteckte Application-Form (ist für die Messagebehandlung und Co.).

Ich dachte eigentlich, das mit der Messagebehandlung wäre auf die Mainform bezogen. :oops: Jetzt nochmal richtig rum formuliert: Was ist denn besser, wenn sich die Hauptform in der Taskbar befindet?


[OT] Hättest du kein Turbo Delphi, dann hätte man sich da etwas über die OTA (Open Tools API) basteln können, aber da du keine BPLs installieren darfst, geht dieser Weg nicht.[/QUOTE]

Da steh ich jetzt auf dem Schlauch. :gruebel: Bei Turbo-Delphi gibts doch das "normale" Verhalten, oder was meinst du, was man basteln könnte?

Guido.

himitsu 7. Nov 2011 13:39

AW: Form2 NICHT modal anzeigen - XE2
 
Bei Alt+Tab, Win+Tab und in der Fenstervorschau der Taskleiste sieht man immer das Fenster, welches in der Taskbar registriert ist.
- ist das die Mainform, dann sieht man die Mainform
- ist das die Application.Form, dann sieht man nix (nur eine leere Form)

Du darfst doch beim TDE keine fremden BPLs installieren und um die OTA nutzen zu können, installiert man seine Codes eigentlich als BPL in die IDE rein. (ich wüßte jetzt keinen anderen Weg)

DeddyH 7. Nov 2011 13:41

AW: Form2 NICHT modal anzeigen - XE2
 
Er will doch nicht das Verhalten in TDE ändern, sondern das in XE2.

Guido Eisenbeis 7. Nov 2011 13:56

AW: Form2 NICHT modal anzeigen - XE2
 
Zitat:

Zitat von himitsu (Beitrag 1134849)
...
- ist das die Application.Form, dann sieht man nix (nur eine leere Form)

Ah, kapiert. Danke. :)

Zitat:

Zitat von DeddyH (Beitrag 1134851)
Er will doch nicht das Verhalten in TDE ändern, sondern das in XE2.

Janz jenau. :wink:

himitsu 7. Nov 2011 15:11

AW: Form2 NICHT modal anzeigen - XE2
 
Ups, stümmt ja (bin nach dem gegangen, was er im Profil stehn hat :lol: ).
OK, dort könnte man bestimmt schon etwas machen ... irgendwie muß man ja das Klickverhalten ändern können.

Guido Eisenbeis 8. Nov 2011 08:17

AW: Form2 NICHT modal anzeigen - XE2
 
.
Ok, hier eine Zusammenfassung der bisherigen Tipps. :-D


================================================== =====================
----------------------------------------------------
.. Form2 NICHT modal anzeigen
----------------------------------------------------

Quellen:
http://www.delphipraxis.net/164292-f...eigen-xe2.html
http://forum.delphi-treff.de/showthr...l=1#post168156
http://www.delphiforum.de/viewtopic.php?t=107604

Zusammenstellung der folgenden Tipps: Guido Eisenbeis, 2011-11-07.
================================================== =====================


Bis Delphi 2006 (und Turbo Delphi) wird standardmäßig das unsichtbare Applikations-Fenster in der Taskbar angezeigt.

Ab Delphi 2007 wird standardmäßig die MainForm in der Taskleiste angezeigt. Dadurch werden einige Darstellungs-Features
von Windows Vista und 7 ermöglicht, wie z. B. WinFlip. (Ungetestet: Möglicherweise wird in der Win 7 Superbar in der
Fenstervorschau eine leere Form angezeigt.)

Als Nachteil ergibt sich aber eine Beeinflussung der Z-Order zwischen der MainForm und allen weiteren Forms, denn die
werden modal zur MainForm angezeigt. (Siehe in der Delphi-Hilfe für "Application.MainFormOnTaskBar").

Ein simples Beispiel-Projekt hat zwei Forms: Form1 und Form2. Wird das Projekt gestartet und z. B. mit einem Button die
Form2 gezeigt, so lässt sich die MainForm (Form1) NICHT in den Vordergrund bringen. Selbst wenn Form1 aktiv ist, bleibt
sie dennoch hinter Form2.

Will man dieses Verhalten ändern, so dass jeweils Form1 oder Form2 in den Vordergrund kommt, wenn sie aktiv wird, gibt
es mehrere Möglichkeiten.


Möglichkeit 1: In der Projektdatei stellt man Application.MainFormOnTaskBar := False.

Vorteil: Sehr einfach zu implementieren: Muss nur an einer Stelle angegeben werden.

Nachteil: Die oben genannten Features von Vista und Win 7 werden beeinträchtigt, und es wird der Applikations-Titel
in der Taskbar und an anderen Stellen gezeigt, anstatt der Titel der MainForm.



Möglichkeit 2: Per CreateParams kann man die weiteren Forms unabhängig von der MainForm machen.

Vorteil: Die oben genannte Kompatibilität zu Vista und Win 7 bleibt erhalten.

Nachteil: Der Code muss in jeder Form eingefügt werden, außer in der MainForm.

Beispiel:
Delphi-Quellcode:
type
  TForm2 = class(TForm)
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  end;

...

procedure TForm2.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  //Params.WndParent := HWND_DESKTOP;    // mit Taskbar-Button
  Params.WndParent := Application.Handle; // ohne Taskbar-Button
end;


Möglichkeit 3: Die MainForm unsichtbar machen und die Form2 als Ersatz-MainForm benutzen, die im FormClose die echte
MainForm schließt und damit das Programm beendet. Dabei wird auch der Taskbar-Eintrag von der Form2 übernommen.

Vorteil: Die oben genannte Kompatibilität zu Vista und Win 7 bleibt erhalten, und Code muss nur in Form1 und
Form2 implementiert werden. Alle weiteren Forms können ohne Veränderung benutzt werden. Nützlich, wenn ein Projekt
viele Forms enthält.

Nachteil: Etwas mehr Code muss implementiert werden, und die echte MainForm ist "außer Betrieb".

Beispiel:

In Form1:
Delphi-Quellcode:
        procedure TForm1.FormCreate(Sender: TObject);
procedure TForm1.FormCreate(Sender: TObject);
begin
   // Hauptfenster verstecken
   Application.ShowMainForm := false;
end;
In Form2:
Delphi-Quellcode:
type
  TForm2 = class(TForm)
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  end;

...

uses Unit1;

procedure TForm2.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.WndParent := HWND_DESKTOP;    // mit Taskbar-Button
  //Params.WndParent := Application.Handle; // ohne Taskbar-Button
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  Self.Visible := True;
end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Form1.Close;
end;

Lob, Kritik und Anregungen willkommen. :-D

Guido.

blauweiss 8. Nov 2011 13:01

AW: Form2 NICHT modal anzeigen - XE2
 
Zitat:

Zitat von Guido Eisenbeis (Beitrag 1134930)

Lob, Kritik und Anregungen willkommen. :-D

Guido.

Lob !!! :thumb:
Auch ohne jetzt Deine Möglichkeit 3 auszuprobieren, finde ich Deine Zusammenstellung klasse, sowohl inhaltlich als auch in der Qualität der Aufbereitung. Respekt !

Gruß,
blauweiss

Guido Eisenbeis 9. Nov 2011 13:25

AW: Form2 NICHT modal anzeigen - XE2
 
Vielen Dank! :-D Lob ist eines meiner liebsten Dinge. :wink:

Guido.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:57 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