Hallo.
Zitat von
negaH:
was auch ziemlich dämlich wäre da du damit diese Source abhängig machst von einer rießigen
VCL
Ja, ich weiß, dass eine
Unit nicht auf Forms/Application zugreifen sollte. Ich habe ja nicht gesagt, dass die Units dieses Feature bräuchten oder dass es sinnvoll sei, dass unabhängige Units application.terminated berücksichtigen.
Zitat von
negaH:
1.) ein Variable FAbort:Boolean in dein TForm einbauen
2.) deine Methode die alles macht per try except Block schützen und auf EAbort reagieren
3.) einen Button auf's TForm der FAbort auf TRUE setzt
4.) in deiner Methode .Process() bei FAbort = TRUE die Prozedure Abort aufrufen
Danke für die Tipps. Die Progress-Klasse verwende ich bereits folgendermaßen, um den Fortschritt in einer Gauge darzustellen:
Delphi-Quellcode:
TProgress = class(TInterfacedObject, IDECProgress)
procedure Process(const Min, Max, Pos: Int64); stdcall;
constructor Create;
destructor Destroy; override;
end;
Ich verstehe aber nicht ganz, was du mit Punkt #2 meinst. Wie soll ich auf FAbort reagieren? Wie bekomme ich es hin, dass FAbort dazu führt, dass TCipher_xyz.EncodeFile etc. abbricht? Die einzigste Methode die mir einfällt, ist den Stream freizugeben und die Exceptions zu verschlucken (siehe Idee #1 ganz oben). Das scheint mir aber ziemlich unprofessionell, weil ich Speicher freigebe, der noch genutzt wird, um so die laufende Aktion zu terminieren. Außerdem verschlucke ich Exceptions (siehe
http://www.delphipraxis.net/internal...=206667#206667 , Sünde #1). Wie soll ich anders auf FAboirt reagieren?
Das mit den TStream Descants verstehe ich auch nicht ganz. Das es eine Callback-Funktion gibt, verstehe ich. Aber wie gehe ich bei diesem Descants bei einer Termination vor? Gebe ich dann auch den Stream einfach frei und verschlucke die Exceptions, wenn ich eine Termination des Programmes wünsche?
Sobald ich wieder zuhause bin, probiere ich mal mit Delphi das ganze aus.
Nachtrag:
Zitat von
negaH:
1.) eine OnClick() muß reentrant werden, zb. durch Disablen des Buttons oder durch ein Locking
Verstehe leider nicht, was du meinst. Im ersten Beitrag habe ich Button1OnClick als Beispiel einer Benutzeraktion verwendet.
Zitat von
negaH:
2.) OnCloseQuery des Form benutzen und dort erst dann TRUE zurückliefern wenn deine Berechnungsfunktion/Loop beendet wurde.
Erstmal muss ich es schaffen, die laufende
DEC/KaZIP/
ZLIB Aktion zuende zu führen. Dann muss ich gucken, wie ich ermitteln kann, ob das Programm gerade beschäftigt ist, oder nicht.
Gruß
blackdrake