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/)
-   -   TTaskBar Problem mit Initialize (https://www.delphipraxis.net/195651-ttaskbar-problem-mit-initialize.html)

UliBru 15. Mär 2018 14:02

TTaskBar Problem mit Initialize
 
Ich möchte in einem vorhandenen größeren Projekt die TTaskBar Komponente verwenden und damit einen Progress im Taskbar-Icon darstellen.
Also eigentlich das übliche
Code:
Taskbar1.ProgressState := xxx
Nun, in diesem Projekt zeigt das Icon aber nichts an.
Erstelle ich ein neues Projekt und bau die TTaskbar ein, läuft es.

Bei der Suche bin ich nun darauf gestossen, dass beim einfachsten Testprojekt = eine leere Form, eine TTaskbar-Komponente und keine weitere Programmzeile, beim Programmaufruf in der Vcl.Taskbar.pas die Prozedur
Code:
procedure TCustomTaskbar.Initialize;
aufgerufen wird.
Was bei dem Zielprojekt aber nicht der Fall ist.
Das Initialize wird wiederum von der Prozedur procedure TCustomForm.WndProc(var Message: TMessage); in Vcl.Forms.pas angestossen mit
Code:
    else if Cardinal(Message.Msg) = RM_TaskBarButtonCreated then
      begin
        if FTaskbarHandler <> nil then
        begin
          TaskbarHandler.Initialize;
          TaskbarHandler.CheckApplyChanges;
        end;
Beim Debuggen kann ich feststellen, dass das nun nicht ausgeführt wird. Also kommt vermutlich keine entsprechende Message.
Ab da verliessen sie mich, ich weiss nicht, was die Ursache dafür sein könnte bzw. wie ich das herausfinden kann.

Der constructor TCustomTaskbar.Create(AOwner: TComponent); wird jedoch ausgeführt. Eine Zuweisung an ProgressState klappt auch, es passiert nur nichts.

Wenn ich nun selbst einen Aufruf Taskbar1.Initialize; starte (siehe dazu auch http://www.delphipraxis.net/193065-t...light=ttaskbar), dann gibt es eine Exception, weil dann die Initialize-Prozedure nun zweimal durchlaufen wird.

Kann mir da einer der Spezialisten weiterhelfen?

Grüsse
Uli

himitsu 15. Mär 2018 14:12

AW: TTaskBar Problem mit Initialize
 
Delphi-Referenz durchsuchenMainFormOnTaskBar, MSDN-Library durchsuchenWS_EX_APPWINDOW, MSDN-Library durchsuchenWS_CHILD und Dergleichen.

Ist deine Form überhaupt in der Taskleiste?

UliBru 15. Mär 2018 14:32

AW: TTaskBar Problem mit Initialize
 
Das Programm hat ein Icon in der Taskleiste.
Aber der Tip mit der MainFormOnTaskbar hat unmittelbar geholfen. Die Zeile hat im Projekt gefehlt. Weshalb weiss ich nun nicht (mehr).
Und was das sonst für Auswirkungen hat, wenn ich das nun wieder mit reinnehme, muss sich zeigen.

Danke !

günni0 15. Mär 2018 14:41

AW: TTaskBar Problem mit Initialize
 
Ein Problem wirst du später eventuell noch bekommen mit der TTaskBar.
Wenn du eine Anwendung hast aber zwei Taskbar-Icons, dann ist es quasi unmöglich den Progress im zweiten Icon anzeigen zu lassen statt im ersten.
Jedenfalls bin ich bis heute nicht dahinter gekommen, wie das möglich sein soll.

himitsu 15. Mär 2018 14:46

AW: TTaskBar Problem mit Initialize
 
Früher (Delphi 7 und so) war das unsichtbare Message-Fenster des
Delphi-Quellcode:
Application
in der Taskleiste.
Seit es mit Vista+ in den Taskbuttons aber die Vorschau (AeroPeek) gibt, hat sich das ändern müssen, da man dort sonst nur ein leeres Fenster sieht.
> Delphi-Referenz durchsuchenApplication.MainFormOnTaskbar

Und Delphi ändert das aber nicht von sich aus, denn wenn jemand früher z.B. das Menü App-Buttons in der Taskbar verändert oder den Taskbar-Button ein-/ausgeblendet hat oder wenn du im alten elphi schon diese Progressbar genutz hättest, dann gingen diese Codes ja auf Application.Handle, anstatt auf Application.MainForm.Handle und es würde nichts mehr funktionieren.

KodeZwerg 15. Mär 2018 14:55

AW: TTaskBar Problem mit Initialize
 
Für Taskbar Icons ab Windows 7 hier ein paar gute Fakten, Beispiele und eventuell sogar neue Erkenntisse.

himitsu 15. Mär 2018 14:55

AW: TTaskBar Problem mit Initialize
 
@günni0: Du bräuchtest dann an jedem Fenster einen TaskbarHandler. Aber so wie es aussieht, könnte es sein, dass die VCL-Komponente immer nur auf die erste Form (MainForm) geht.

Du kannst aber hindert dich niemand daran, die API direkt zu nutzen oder eine Komponente von jemand Anderem zu nutzen, wo das "richtig" funktioniert.
https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

günni0 15. Mär 2018 14:59

AW: TTaskBar Problem mit Initialize
 
Für dieses Thema hier sicher interessant.
Gibt es eine Komponente, wo das richtig funktioniert? Wenn ja, magst du sie hier vorstellen?

UliBru 16. Mär 2018 15:26

AW: TTaskBar Problem mit Initialize
 
Zur direkten Nutzung per API siehe http://www.drbob42.com/examine/examinC5.htm
Das sieht mir doch simpel und trotzdem wertig aus. Wenn ich das vorher gefunden hätte wäre mir das mit der MainFormOnTaskbar eher klar gewesen.

günni0 16. Mär 2018 15:50

AW: TTaskBar Problem mit Initialize
 
Simple wäre für mich ein paar wenige Zeilen Code. Das da kommt ja schon einer Komponente gleich :shock:


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