Ich finde den Artikel eigentlich nicht so gut.
Du zeigst dort als Beispiel einen Pointer, der auf einen versteckten Funktionszeigertyp geboxt wird, als sei das normale oder sogar gern gesehene Praxis.
Wenn du davon ausgehst, dass dein CallBack einen Integer bekommt und ein boolean zurückliefern muss, dann _solltest_ du nur passende CallBacks zu lassen.
Aus dem hier:
Delphi-Quellcode:
procedure DoSomething(cb: Pointer); stdcall;
var
i: Integer;
CallBackProc: function(i: Integer): Boolean; stdcall;
begin
if Assigned(cb) then
begin
@CallBackProc := cb;
for i := 0 to 9 do
if not CallBackProc(i) then
break;
end;
end;
...würde das werden:
Delphi-Quellcode:
type TCallBackProc = function(i: Integer): Boolean;
procedure DoSomething(CallBackProc: TCallBackProc);
var
i: Integer;
begin
if Assigned(CallBackProc) then
begin
for i := 0 to 9 do
if not CallBackProc(i) then
break;
end;
end;
Oder hier ein kleines kompilierbares Beispiel, das auch Funktionszeiger zeigt, die auf einer Instanz sitzen (TAddItem). Das ist die gleiche Methode in der Delphis "Events" funktionieren.
Delphi-Quellcode:
program Delegates;
{$APPTYPE CONSOLE}
uses
Contnrs,
SysUtils;
type
TSample = class
private
fValue: string;
public
property Value : string read fValue write fValue;
end;
TAddItem = function(item : TObject) : Integer of object;
function Compare(const left, right: TSample): Integer;
begin
if Assigned(left) and Assigned(right) then
Result := AnsiCompareStr(left.Value, right.Value)
else if Assigned(left) then
Result := 1
else if Assigned(right) then
Result := -1
else
Result := 0;
end;
var
list : TObjectList;
i : Integer;
addItem : TAddItem;
function Add(const value : string) : TSample;
begin
Result := TSample.Create();
Result.Value := value;
addItem(Result);
end;
begin
list := TObjectList.Create();
try
addItem := list.Add;
Add('E');
Add('C');
Add('d');
Add('a');
Add('b');
list.Sort(@Compare);
for i := 0 to list.Count - 1 do
Writeln(TSample(list[i]).Value);
finally
list.Free();
end;
end.
Einfach mit F7 durchhüpfen, dann sollte klar sein was passiert.