Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Was ist eine Callback Funktion (https://www.delphipraxis.net/66456-ist-eine-callback-funktion.html)

NicoDE 31. Mär 2006 08:35

Re: Was ist eine Callback Funktion
 
Zitat:

Zitat von Luckie
Wie wäre es denn jetzt korrekt?

Typsicher und ohne Adressoperator (Delphi sorgt implizit dafür, dass die Adresse übergeben wird).

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:

Zitat von Luckie
Bzw. wie macht es Windows? Da wird ja auch immer ein zeiger erwartet.

Das kommt auf die Übersetzung des Headers an... wenn die Parameter nicht als Funktionsprototypen deklariert sind, kommt man leider nicht ohne Typkonvertierungen und/oder den Adressoperator aus.
In eigenen Schnittstellen sollte dies allerdings nicht vorkommen.

Luckie 31. Mär 2006 08:58

Re: Was ist eine Callback Funktion
 
So, habe es mal korrigiert und entsprechend angepasst.

Luckie 22. Apr 2006 12:45

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:
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;
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?

Luckie 23. Apr 2006 13:39

Re: Was ist eine Callback Funktion
 
Hat da niemand eine Meinung zu?

sniper_w 23. Apr 2006 13:51

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.

xaromz 23. Apr 2006 13:54

Re: Was ist eine Callback Funktion
 
Hallo,
Zitat:

Zitat von Luckie
was spricht für einen Pointer bzw. Integer?

die aktuelle Befindlichkeit :mrgreen: .
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

Hawkeye219 23. Apr 2006 14:11

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

Luckie 23. Apr 2006 14:25

Re: Was ist eine Callback Funktion
 
Ich denke auch, dass ich bei Pointer bleiben werde, da das mehr nach benutzerspezifischen Daten klingt.[xml]

BlackJack 23. Apr 2006 14:54

Re: Was ist eine Callback Funktion
 
Zitat:

Zitat von Oxmyx
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.

z.b. TList macht das auch so: wenn du TList.Sort() aufrufst, musst du als parameter eine Funktion übergeben, und diese funktion bekommt dann nachher beim sortieren die Pointer auf zwei Elemente, die du dann vergleichst und dementsprechend einen bestimmten rückgabewert zurückgibst (-1, 0 oder 1).


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:14 Uhr.
Seite 4 von 4   « Erste     234   

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