Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Kein Taskbarbutton bei Application.MainFormOnTaskbar := True


galagher - Mo 11.06.12 19:39
Titel: Kein Taskbarbutton bei Application.MainFormOnTaskbar := True
Hallo!

Ich möchte keinen Taskbar-Button, weil mein Programm "auf der Oberfläche" eines anderen läuft, so, als wäre es ein Teil dieses anderen Programms. Also F1 gedrückt und MainFormOnTaskbar gefunden.

Hat jemand eine Idee, warum bei mir der Taskbar-Button nur dann nicht angezeigt wird, wenn ich es so mache:

Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.FormCreate(Sender: TObject);
begin
  {Ja! Hier und True, nicht in der .dpr nach Application.Initialize und False!}
  Application.MainFormOnTaskbar := True;  // <-- kein Taskbar-Button!

Zitat Delphi XE2-Hilfe:
Zitat:
[...] sollte MainFormOnTaskBar in der .dpr-Datei nach Application.Initialize und vor der Erstellung des Hauptformulars gesetzt werden
Da sollte ja doch wohl Application.MainFormOnTaskbar := False gesetzt werden, oder? Aber da funktioniert es nicht. Es funktioniert mit False überhaupt nicht, und mit True funktioniert es nur in diesem einen Programm! :eyecrazy:

In meinem anderen Programm funktioniert es auch nicht, wenn ich es so, wie lt. Delphi empfohlen, mache.

Die Einstellungen im OI habe ich wie vorgegeben belassen.
Natürlich freut es mich, dass es jetzt klappt, aber ich verstehe es nicht!


Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mo 11.06.2012 um 22:44


SvenAbeln - Di 12.06.12 09:00

Über Application.MainFormOnTaskbar wird nicht der Eintrag in der Taskbar versteckt, sondern es wird festgelegt welches Fenster dort dargestellt wird.

Aus dem Docwiki [http://docwiki.embarcadero.com/Libraries/XE2/de/Vcl.Forms.TApplication.MainFormOnTaskBar]
Zitat:
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.


galagher - Di 12.06.12 19:52

Docwiki [http://docwiki.embarcadero.com/Libraries/XE2/de/Vcl.Forms.TApplication.MainFormOnTaskBar]
Zitat:
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.
Dann verstehe ich nicht, warum bei meinem Programm True das Nicht-Anzeigen eines Titels/Buttons bewirkt, denn es gibt ein Hauptfenster und dieses hat einen Titel!

False bewirkt wie beschrieben und wie erwartet das Anzeigen des Titels des verborgenen Anwendungs-Hauptfensters.
Ich habe den gesamten Code auskommentiert bis auf Application.MainFormOnTaskbar := True;, auch in der .dpr ist nichts aussergewöhnliches drin, andere Units hat das Projekt nicht, und auch der uses-Abschnitt bindet keine besonderen Dateien ein.
Nach obigem Text müsste True jedenfalls auch einen Button in der Taskleiste bewirken, aber es ist nicht so! True = nix, False = Button!


jaenicke - Di 12.06.12 22:12

Soweit ich das verstehe bettest du dein Hauptformular mit SetParent oder so in ein anderes ein. Dementsprechend hat es keinen Taskleistenbutton mehr.

Wenn du nun MainFormOnTaskBar auf True hast, ist also keines da, da deines ja in einem anderen Fenster als Child drin sitzt. Setzt du es aber auf False, wird in der Taskleiste das versteckte Application Window angezeigt und das hat mit dem eingebetteten Hauptfenster ja nix zu tun, ist also normal da. Und damit auch der Taskleisteneintrag.


galagher - Mi 13.06.12 18:56

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Soweit ich das verstehe bettest du dein Hauptformular mit SetParent oder so in ein anderes ein. Dementsprechend hat es keinen Taskleistenbutton mehr.
Nein, ich starte es mit ShellExecute aus meinem Programm, es ist ein eigener Prozess, eine eigene Instanz und wird auch im Taskmanager aufgelistet.

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
da deines ja in einem anderen Fenster als Child drin sitzt.
Genau das eben nicht: kein Child oder irgendwie ein Teil des aufrufenden Programms. Es läuft selbständig und kann per Taskmanager auch beendet werden.