Ja, dieses ein-prozedurige Interface ist eh "blöd".
Zitat:
das Originale Interface hat den Nachteil, dass man den Anfang und vorallem das Ende nicht sicher erkennen kann
Daher würde ich es gut finden, wenn der Entwickler, den Callback als anonyme Funktion übergeben kann.
(oder halt auch ein Zeiger auf eine Funktion)
Jupp, wenn Callback-Methode, dann hatte ich eh an
reference to procedure
gedacht, damit der Entwickler da ganz frei alles übergeben kann.
Bezüglich dem FPC muß ich noch nachsehn
ob/wie das dort geht.
* man könnte das einfache Interface ersetzen oder ein zweites "Besseres" danebenlegen (Abwärtskompatibilität)
* man kann einen einfachen Prozedurzeiger zusätzlich daneben hinzufügen oder das Interface komplett ersetzen (rauswerfen)
Demos:
der aktuelle Hauptthread zum Projekt
https://www.delphipraxis.net/206356-...erfuegbar.html
Code eigentlich hier (diese Demo steckt noch in der Entwicklung fest, drum nicht im Master)
https://github.com/MHumm/DelphiEncry...elopment/Demos
aber bei mir liegt da grade der aktuellere Code (hab grad erst die ProjekteOptionen aufgeräumt, und Dergleichen)
https://github.com/geheimniswelten/D...s/Progress_VCL
https://github.com/MHumm/DelphiEncry...endium/pull/11
und Seite 3 ganz oben, da hat jemand die Demo grade nochmal überarbeitet (hab ich mir noch nicht angesehn)
https://www.delphipraxis.net/206356-...ml#post1479751
[edit]
Ich denk mal so wäre es doch eine gute Lösung?
Delphi-Quellcode:
// alt
IDECProgress =
interface
procedure Progress(
const Min, Max, Pos: Int64);
end;
// neu
TDECProgressState = (Start, Progress, Finish, Error);
TDECProgressParams =
record
Sender: TObject;
Min, Max: Int64;
Pos: Int64;
Percent: Single;
State: TDECProgressState;
function ErrorMessage:
string;
// die Exception.Message aus dem umgebenden Try-Except-Block (oder als "function Error: Exception;", falls wer nicht selber auf System.ExceptObj zugreifen kann)
end;
TDECProgress = reference
to procedure(
const Progress: TDECProgressParams);
Bei Objekt-Methode und anonymer Methode bekommt man eigene Daten in den Callback.
Und bei einer Prozedur kann man sich über den Sender (die übergeordnete
DEC-Klasse) als Vergleichswert zu einer Datenquelle durcharbeiten.
Oder sollte man hier vielleicht auch noch eine Data-Variable durchschleifen? (NativeInt, Pointer oder TObject)
Eigentlich nicht nötig, denn wer was braucht, der kann ja Methode statt Prozedur benutzen.
Nur die neue coole Interface-CallbackDemo muß dann wer umbauen.