Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Fortschrittsanzeige aus DLL? (https://www.delphipraxis.net/193399-fortschrittsanzeige-aus-dll.html)

sko1 26. Jul 2017 09:13

Fortschrittsanzeige aus DLL?
 
Hallo,

ist es überhaupt möglich, aus einer in einer DLL enthaltenen Funktion heraus ein kleines Fenster zur Fortschrittsanzeige anzuzeigen, welches dann im Vordergrund des aufrufenden Programms erscheint?

Ciao
Stefan

himitsu 26. Jul 2017 09:41

AW: Fortschrittsanzeige aus DLL?
 
VCL?
Besser nicht, falls du nicht mit Laufzeitpackages arbeitest. (DLL und EXE gegen die RTL/VCL-BPLs gelinkt)

Leg die Fortschrittsanzeige in ein Interface oder eine/mehrere Callback-Funktion (in deiner EXE definiert),
übergibt das an die DLL und die DLL kann dann über den Callback/Interface die Anzeige steuern.

jaenicke 26. Jul 2017 09:43

AW: Fortschrittsanzeige aus DLL?
 
Ja, im Grunde genauso wie hier, nur dass die aufgerufene Funktion, die das Interface bekommt, in der DLL liegt:
http://www.delphipraxis.net/193391-d...ml#post1377488
Dann kann das Fenster selbst aus der Anwendung stammen und wird nur von der DLL aus gesteuert. Das vereinfacht das ganze.

sko1 26. Jul 2017 10:17

AW: Fortschrittsanzeige aus DLL?
 
Schade!

Ich kann die Schnittstelle zum aufrufenden Programm nicht erweitern, muss also irgendwie direkt aus der DLL was anzeigen können!

Gibt es noch andere Ansätze?

Ciao
Stefan

TiGü 26. Jul 2017 10:20

AW: Fortschrittsanzeige aus DLL?
 
Was haste denn bisher und was fehlt denn?

sko1 26. Jul 2017 10:23

AW: Fortschrittsanzeige aus DLL?
 
Ich kann bisher:

- ein Mini-Formular anzeigen
- es während der DLL-Funktion stehen lassen
- es nach Ende der Funktion wegblenden

Was nicht geht:
- diese Formular nicht in der Taskleiste erscheinen lassen
- ein auf das Formular gelegtes TProgressbar zeigt nichts an

Ciao
Stefan

jaenicke 26. Jul 2017 10:31

AW: Fortschrittsanzeige aus DLL?
 
Zitat:

Zitat von sko1 (Beitrag 1377500)
Was nicht geht:
- diese Formular nicht in der Taskleiste erscheinen lassen

Eine Demo habe ich hier angehängt:
http://www.delphipraxis.net/193372-i...ml#post1377249

TiGü 26. Jul 2017 10:33

AW: Fortschrittsanzeige aus DLL?
 
Zitat:

Zitat von sko1 (Beitrag 1377500)
- ein auf das Formular gelegtes TProgressbar zeigt nichts an

Wie wird denn der Fortschritt "gefüttert"? Ja, das ist die Stelle wo man in der Regel Quelltexte zeigt.

sakura 26. Jul 2017 11:05

AW: Fortschrittsanzeige aus DLL?
 
Zitat:

Zitat von sko1 (Beitrag 1377500)
- ein auf das Formular gelegtes TProgressbar zeigt nichts an

Die DLL-Funktion läuft mit hoher Wahrscheinlichkeit im Hauptthread der Anwendung und es werden keine Windows-Nachrichten verarbeitet, damit auch der Fortschritt nicht angezeigt. Wird schwer, wenn überhaupt möglich.

...:cat:...

sko1 26. Jul 2017 12:20

AW: Fortschrittsanzeige aus DLL?
 
So, die Progressbar-Anzeigegeschichte ist gegessen, ein Progress.Repaint hat Abhilfe geschaffen...

Was jetzt noch die Anzeige in der Taskbar betrifft, da bin ich irgendwie mit dem verlinkten Beispiel nicht so richtig klargekommen:

Das beispiel enthält ein Formular in der DLL, ich erzeuge meines dynamisch im Code.
Versuche ich eines direkt ins Projekt einzufügen bekomme ich jede Menge Warnungen und Hinweise um die Ohren gehauen mit denen ich kaum was anfangen kann!

Ciao
Stefan

Nachtrag:
Mir ist noch aufgefallen, dass trotz Repaint die Progressbar irgendwie "hinterherhängt", im Debugger sehe ich kurz vor Ende des Ablaufs dass Max und Position übereinstimmen, optisch ist die Progressbar aber erst bei ca. 80%!
Wie stellt man denn das ab?

sakura 26. Jul 2017 13:13

AW: Fortschrittsanzeige aus DLL?
 
Zitat:

Zitat von sko1 (Beitrag 1377513)
optisch ist die Progressbar aber erst bei ca. 80%!
Wie stellt man denn das ab?

Das liegt an den Animationen seit Windows Vista. Schau mal, ob du diese abgestellt bekommst ;)

...:cat:...

sko1 26. Jul 2017 14:06

AW: Fortschrittsanzeige aus DLL?
 
Habe einen "Würgaround" gefunden, erst StepBy(2) und danach StepBy(-1)...
wenns schrittweise gehen soll, sonst Position auf 1 zu hoch und dann zurücksetzen...

Ciao
Stefan

jaenicke 26. Jul 2017 15:52

AW: Fortschrittsanzeige aus DLL?
 
Ich setze statt der Position einfach den Maximalwert schrittweise herab. Lässt sich leicht ausrechnen und dabei passiert das animierte Nachziehen nicht.

sko1 27. Jul 2017 05:55

AW: Fortschrittsanzeige aus DLL?
 
Zitat:

Ich setze statt der Position einfach den Maximalwert schrittweise herab
Interessante Idee!

Wenn ich mir das aber mal für z.B. max = 5 durchdenke, kommt folgendes raus:
1 : 1/5 Balken
2 : 1/4 Balken
3 : 1/3 Balken
4 : 1/2 Balken
5 : ganzer Balken

was bedeutet der Fortschritt verläuft bei gleicher Zeit für je einen Schritt nicht linear!

Das schnelle Vorspringen um +2 bei mir ist ja praktisch nicht sichtbar weil Windows das durch die Animation verzögert, so dass man in der Praxis wirklich nur das schrittweise verlängern des Balkens erkennt...

Ciao
Stefan

jaenicke 27. Jul 2017 07:22

AW: Fortschrittsanzeige aus DLL?
 
Ich berechne den Maximalwert und zähle den nicht einfach herunter. Beispiel:
1% --> Pos = 100, Max = 10000 / 1 = 10000
2% --> Pos = 100, Max = 10000 / 2 = 5000
50% --> Pos = 100, Max = 10000 / 50 = 200
100% --> Pos = 100, Max = 10000 / 100 = 100

hoika 27. Jul 2017 07:27

AW: Fortschrittsanzeige aus DLL?
 
Hallo,
da werfe ich doch mal schnell Application.ProcessMessages in die Runde.

jaenicke 27. Jul 2017 08:20

AW: Fortschrittsanzeige aus DLL?
 
Zitat:

Zitat von hoika (Beitrag 1377549)
da werfe ich doch mal schnell Application.ProcessMessages in die Runde.

Was hat das mit der verzögerten Anzeige des Fortschritts einer Progressbar unter Windows Vista und höher mit aktivierten Themes zu tun?

sko1 27. Jul 2017 08:42

AW: Fortschrittsanzeige aus DLL?
 
Das war auch meine zweite Idee nach der ersten "Repaint" und "Refresh", bringt aber nichts!

Ciao
Stefan

himitsu 27. Jul 2017 10:25

AW: Fortschrittsanzeige aus DLL?
 
Zitat:

Zitat von sko1 (Beitrag 1377561)
Das war auch meine zweite Idee nach der ersten "Repaint" und "Refresh", bringt aber nichts!

Außer die Form wird zwischendurch zum neuzeichnen gezwungen und dann ist alles wieder weg.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz