![]() |
Was ist eine Callback Funktion
Also ich kenne sie und benutze sie auch zum Beispiel bei EnumWindows. Aber wie funktioniert eine Callback Funktion eigentlioch genau. Ich habe da mal was geschrieben:
Delphi-Quellcode:
Wäre das eine Callback Funktion oder habe ich da was falsch verstanden und wenn ja, wie geht es richtig?
type
TCallBack = function(i: Integer): Boolean; stdcall; function CallBack(i: Integer): Boolean; stdcall; begin ShowMessage(IntToStr(i)); end; procedure DoSomething(cb: TCallBack); var i: Integer; begin if Assigned(cb) then begin for i := 0 to 9 do CallBack(i); end; end; procedure TForm1.Button1Click(Sender: TObject); begin DoSomething(CallBack); end; |
Re: Was ist eine Callback Funktion
Jo is schon so fast richtig.
Bei APIs hast du eigentlich nur einen Pointer, d.h. es sieht in etwa so aus:
Delphi-Quellcode:
function CallBack(i: Integer): Boolean; stdcall; begin ShowMessage(IntToStr(i)); end; procedure DoSomething(cb: Pointer); stdcall; //das wäre die API var i: Integer; CallBack: function(i: Integer): Boolean; stdcall; begin if Assigned(cb) then begin @CallBack := cb; for i := 0 to 9 do CallBack(i); end; end; procedure TForm1.Button1Click(Sender: TObject); begin DoSomething(@CallBack); // aufruf der API mit der callback funtion als pointer end; |
Re: Was ist eine Callback Funktion
Eine Callback-Funktion ist eine Funktion, die du sozusagen uebergeben kannst. Nehmen wir an, deine Callback-Funktion heisst CB(), deine andere Funktion foo(). Callback bedeutet nun, dass du foo() aufrufst und deine Callback-Funktion uebergibst. foo() wird dann irgendwann deine Callback-Funktion mit vorbestimmten Parametern aufrufen. Deine Funktion macht dann was und gibt irgendwas zurueck. Dies wird wiederum von foo() verwendet.
Das nur um mal eine trockene Erklaerung zu bringen :lol: Greetz alcaeus |
Re: Was ist eine Callback Funktion
Danke Jungs, wieder was gelernt.
@brechi: Jupp, das sieht schon eher richtig aus. ;) Wann setzt man denn eigentlich eine Callback Funktion ein? Also ich würde sie einsetzen, wenn ich eigentlich ein dynamisches Array zurückgeben müsste, dies aber nicht will oder kann. Stattdessen übergebe ich eine Funktion, der ich dann die Elemente einzeln übergebe und der Nutzer sie dann in der Callback Funktion selber weiterverarbeiten kann. Wäre das ein Einatzgebiet? Zum Beispiel habe ich in MpuNTUser.pas eine Funktion EnumUsers, die alle Benutzer in einem dynamischen Array zurückgibt, dort könnte ich ja dann eine Callback Funktion nutzen, um das dynamische Array zu vermeiden. Richtig? |
Re: Was ist eine Callback Funktion
Zitat:
Ein weiteres häufiges Einsatzgebiet ist die Prüfung auf Abbruch, z.B. bei einem Druck- oder Kopierdialog. Dadurch ermöglich man zum einen ein "ProcessMessages" (die Aktualisierung des Fensters), zum anderen hat der User halt auch die Möglichkeit des Abbruchs, ohne dass deine Implementierung der Druck- oder Kopierfunktion über die Details Bescheid wissen muss. |
Re: Was ist eine Callback Funktion
OK. Gut. Allerdings wie das mit dem Abbrechen funktionieren soll, habe ich jetzt nicht ganz verstanden. Hättest du da etwas Beispiel Code zur Demonstration zur Hand?
Ich drohe an dieser Stelle schon mal mit meinem nächsten Artikel. :mrgreen: |
Re: Was ist eine Callback Funktion
Zitat:
|
Re: Was ist eine Callback Funktion
Du bist etwas spät dran sniper_w. ;)
|
Re: Was ist eine Callback Funktion
Zitat:
Ein anderes Beispiel finde ich jetzt gerade nicht, wobei ich eigentlich noch irgendwas mit Kopieren im Kopf habe... |
Re: Was ist eine Callback Funktion
|
Re: Was ist eine Callback Funktion
Hallo,
Zitat:
Gruß xaromz |
Re: Was ist eine Callback Funktion
Jupp, habe mein Beispiel gerade dahingehen angepasst. Morgen in der Mittagspause, werde ich mal einen kurzen Artikel dazu schreiben. Denn ich glaube, den meisten geht es wie mir, die dachten, dass hinter Callback Funktionen irgend was geheimnisvolles von Windows steckt. ;)
|
Re: Was ist eine Callback Funktion
Hallo,
Zitat:
Gruß xaromz |
Re: Was ist eine Callback Funktion
Ja OK. Aber ich kenne sie nur von Windows.
Aber belieb wir mal bei meinem Beispiel: dynamisches Array vs. Callback Funktion. Ich tendiere langsam zur Callback Funktion, weil man da dem Aufrufer eine gewisse Kontrolle gibt. (Er kann entscheiden, wann abgebrochen werden soll oder nicht.) Gibt es noch mehr Pro / Contra dynamisches Array - Callback Funktion? Zum Beispiel könnte man damit dies Problem lösen: ![]() Man list beide Namen aus dem Record aus und wenn der Name mit GetUsername übereinstimmt, bricht man ab und nimmt den vollständigen Namen. |
Re: Was ist eine Callback Funktion
Hi,
Zitat:
cu |
Re: Was ist eine Callback Funktion
Callback-Funktionen/Methoden sind IMHO immer dann nützlich, wenn
a) gegenseitige Abhängigkeiten in allgemeinen APIs aufgelöst werden müssen (DoSomething muss nichts über das benutzende Programm wissen) b) der Fortschritt beeinflusst werden kann (insbesondere bei Aufzählungen) c) man Entwickler mit unnötiger Abstraktion ärgern will ;) |
Re: Was ist eine Callback Funktion
Gut. Allerdings würde man heutzutage wohl, um OOP konform zu sein eher mit Events arbeiten oder?
|
Re: Was ist eine Callback Funktion
Hallo,
Zitat:
Gruß xaromz |
Re: Was ist eine Callback Funktion
Stimmt auch wieder. Also Callbacks nur neu verpackt. ;)
|
Re: Was ist eine Callback Funktion
Zitat:
|
Re: Was ist eine Callback Funktion
Zitat:
Hättest du recht, wäre das IMO eine potenzielle Sicherkeitslücke. |
Re: Was ist eine Callback Funktion
Zitat:
(sondern von Projekten die in C++ entwickelt werden und als kleinsten gemeinsamen Nenner eine flache "C"-API anbieten müssen) |
Re: Was ist eine Callback Funktion
Zitat:
|
Re: Was ist eine Callback Funktion
So, ich habe das hier noch mal alles in einem Artikel auf meiner Homepage zusammengefasst:
![]() Der entsprechende Thread in der Tutorialsparte: ![]() |
Re: Was ist eine Callback Funktion
Rückruffunktionen werden auch bei Sortierverfahren eingesetzt. Beispiel: Ich will einen ganzen Haufen TAutos sortieren. Meine Sortierfunktion kann natürlich nicht wissen, nach welchen Kriterien ich meine Autos sortiert haben will, also übergebe ich eine Funktion, um diese Entscheidung zu treffen.
|
Re: Was ist eine Callback Funktion
Ah, sehr schöne Ergänzung.
|
Re: Was ist eine Callback Funktion
Hallo Luckie,
ich bin etwas verwirrt, bei mir funktioniert das hier nicht:
Delphi-Quellcode:
sondern nur das:
DoSomething(@Callback);
Delphi-Quellcode:
Fehler? Oder was mach ich falsch. Dem allgemeinen Verständnis nach müsste deine Version richtig sein.
DoSomething(Callback);
Rainer |
Re: Was ist eine Callback Funktion
Bei mir funktioniert beides. :shock: Aber eigentlich sollte, wenn ich es mir genau überlege, nach Elvis Methode nur zweitere funktionieren, da kein Zeiger mehr erwartet wird.
Eventuell sollte man es so machen:
Delphi-Quellcode:
function CallBack(i: Integer): Boolean; stdcall;
begin result := True; ShowMessage(IntToStr(i)); if i = 5 then result := False; end; type TCallbackProc = function(i: Integer): Boolean; stdcall; PCallbackProc = ^TCallbackProc; procedure DoSomething(cbp: PCallbackProc); stdcall; var i: Integer; CallbackProc: TCallbackProc; begin if Assigned(cbp) then begin @CallbackProc := cbp; for i := 0 to 9 do if not CallBackProc(i) then break; end; end; procedure TForm1.Button1Click(Sender: TObject); begin DoSomething(@Callback); end; |
Re: Was ist eine Callback Funktion
Zitat:
Dadurch entstehen Codefragmente wie ![]()
Delphi-Quellcode:
DllProcNext := TDLLProc(DllProc);
TDLLProc(DllProc) := LibraryProc; |
Re: Was ist eine Callback Funktion
Wie wäre es denn jetzt korrekt? Bzw. wie macht es Windows? Da wird ja auch immer ein zeiger erwartet.
|
Re: Was ist eine Callback Funktion
Zitat:
In der Praxis kommt es leider vor, dass die Typen in den verschiedenen Delphi-Versionen unterschiedlich deklariert sind. In dem Fall werden (links- und/oder rechts) explizite Typkonvertierungen notwendig (was die Typsicherheit von Delphi leider ad absurdum führt...). Den Adressoperator würde ich, wann immer möglich, vermeiden. Zitat:
In eigenen Schnittstellen sollte dies allerdings nicht vorkommen. |
Re: Was ist eine Callback Funktion
So, habe es mal korrigiert und entsprechend angepasst.
|
Re: Was ist eine Callback Funktion
Ich überarbeite gerade meine Unit MpuNTU.pas mit ihren Callback-Funktionen. Dabei erweitere ich die eigentliche Funktion, um einen zusätzlichen Parameter, damit der Benutzer der Callback-Funktion weitere, beliebige Daten mitgeben kann. Das sieht dann so aus:
Delphi-Quellcode:
Jetzt meine Frage. EnumWindows macht es genauso, nur da ist der zusätzliche Parameter als LPARAM, also Cardinal, deklariert, ich verwende als Datentyp einen Pointer, weil ich dachte, da kann ich alles reinstopfen und wer weiß, was ein zukünftiger Benutzer der Unit damit machen will. Allerdings könnte man einen Pointer auch zu einem Integer casten, wie man es bei EnumWindow machen würde, wenn man obiges Beispiel nimmt. Ist das halo gehupft wie gesprungen oder was spricht für einen Pointer bzw. Integer?
type
PMyEnumParam = ^TMyEnumParam; TMyEnumParam = record lb: TListbox; end; function EnumUserCallback(Username: string; cntUsers: Integer; Data: Pointer): Boolean; begin PMyEnumParam(Data)^.lb.Items.Add(Username); Result := True; end; procedure TForm1.Button1Click(Sender: TObject); var Param: TMyEnumParam; begin Param.lb := Listbox1; EnumUsers('', FILTER_NORMAL_ACCOUNT, EnumUserCallback, @Param); end; |
Re: Was ist eine Callback Funktion
Hat da niemand eine Meinung zu?
|
Re: Was ist eine Callback Funktion
Ich denke, dass ein Integer besser passen würde wegen portabilitet.
Am sonsten, was Delphi betrifft, ist es egal, denn man kan einen Integer zum Pointer machen und umgekehrt. |
Re: Was ist eine Callback Funktion
Hallo,
Zitat:
Im Ernst, das ist Geschmackssache. Ein Pointer ist immer genauso groß wie ein Integer, also sind die beiden austauschbar. Die Frage ist, was wird vermutlich verwendet? Wenn ein Programmierer in der Situation öfter einen Integer übergeben möchte, so deklariert man auch einen Integer. Ist ein Pointer wahrscheinlicher, nimmt man eben auch einen Pointer. Hat man keine Ahnung, dann ist es auch egal. Gruß xaromz |
Re: Was ist eine Callback Funktion
Hallo Luckie,
ich bin für Pointer, das klingt etwas allgemeiner als Integer. Bei einem Integer-Parameter könnte man ja davon ausgehen, daß man durch unterschiedliche Werte das Verhalten der aufrufenden Routine steuern kann. Dies ist aber nicht der Fall, da sie den Wert unverändert an die Callback-Routine übergeben soll. Gruß Hawkeye |
Re: Was ist eine Callback Funktion
Ich denke auch, dass ich bei Pointer bleiben werde, da das mehr nach benutzerspezifischen Daten klingt.[xml]
|
Re: Was ist eine Callback Funktion
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:24 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