Einzelnen Beitrag anzeigen

Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#2

Re: [Artikel] Callback-Funktionen

  Alt 31. Mär 2006, 01:44
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.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat