如题

解决方案 »

  1.   

    type
      TMyProc = function(A, B: Integer): Boolean;function  IsLower(X, Y: Integer): Boolean;
    begin
      Result := X < Y;
    end;function  IsEqual(X, Y: Integer): Boolean;
    begin
      Result := X = Y;
    end;function  TestCallback(A, B: Integer; P1, P2: TMyProc): string;
    begin
      if P1(A, B) then
        Result := 'P1 Pass'
      else if P2(A, B) then
        Result := 'P2 Pass'
      else
        Result := 'None Pass';
    end;function  GetString(M, N: Integer): string;
    begin
      Result := TestCallback(M, N, @IsLower, @IsEqual);
    end;procedure Test;
    begin
      ShowMessage(GetString(1, 2));
      ShowMessage(GetString(2, 2));
      ShowMessage(GetString(3, 2));
    end;也许太罗嗦了,但应该很清晰。
    建议楼主再瞧瞧TTreeView中的自定义排序例子,那是更有实际意义的应用。
      

  2.   

    回调函数就是,你写的一个特定功能的函数,把这个函数交给WINDOWS操作系统来调用,以实现相应的功能。
    比如:要想得到当前显示运行的所有窗口,需要使用enumwindows函数,来指定回调函数,如下:
    BOOL EnumWindows(    WNDENUMPROC lpEnumFunc, // pointer to callback function
        LPARAM lParam  // application-defined value
       );
    第一个参数指定了回调函数的地址,这个函数由你自己编写,由WINDOWS来调用它,在这个函数中你就可以得到所有的窗口句柄:
    BOOL CALLBACK EnumWindowsProc(    HWND hwnd, // handle to parent window
        LPARAM lParam  // application-defined value
       );
    你的回调函数不能是类的函数。
    举例,下面代码可以取得当前系统窗口的句柄及文本。function Enumwindowscallback(handle:integer;Lparam:integer):boolean;stdcall;
    var s:string;
        a:integer;
    begin
      setlength(s,100);
      a:=getwindowtext(handle,@s[1],90);
      if a>0 then
        form1.ListBox1.items.add(format('%8d  %s',[handle,s]));
      result:=true;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      enumwindows(@Enumwindowscallback,0);
    end;