本帖最后由 kindao2 于 2013-07-09 21:38:25 编辑

解决方案 »

  1.   

    把 Myfun 函数定义在uThread中走位成员函数
      

  2.   

    把 Myfun 函数定义在uThread中作为成员函数
      

  3.   


    // 线程类
    unit Unit2;interfaceuses
      Classes;type
      TMyThread = class(TThread)
      private
        FUserName: string;
        FPassWord: string;
        FFlag: Boolean;
        procedure GetUserName(const Value: string);
        procedure GetPassWord(const Value: string);
        { Private declarations }
      protected
        procedure Execute; override;
      public
        property UserName: string read FUserName write GetUserName;
        property PassWord: string read FPassWord write GetPassWord;
        property MyFunRetVal: Boolean read FFlag default False;
        function Myfun(FUserName, FPassWord: string): Boolean;
        constructor Create(b: Boolean = True);
      end;implementationfunction TMyThread.Myfun(FUserName, FPassWord: string): Boolean;
    begin
      Result := True; // 简单起见让它固定为True
    end;constructor TMyThread.Create(b: Boolean = True);
    begin
      inherited Create(b);
      Self.FreeOnTerminate := True;
    end;procedure TMyThread.Execute;
    begin
      FFlag := Myfun(FUserName, FPassWord);
    end;procedure TMyThread.GetPassWord(const Value: string);
    begin
      FPassWord := Value;
    end;procedure TMyThread.GetUserName(const Value: string);
    begin
      FUserName := Value;
    end;end.// 调用单元
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        btn1: TButton;
        procedure btn1Click(Sender: TObject);
      private
      public
        procedure MyOnTerminate(Sender: TObject);
      end;var
      Form1: TForm1;implementation{$R *.dfm}uses Unit2; // 线程类定义在unit2单元var
      retVal: Boolean; // 线程"返回值"procedure TForm1.btn1Click(Sender: TObject);
    var
      myThread: TMyThread;
    begin
      myThread := TMyThread.Create; // 创建线程并挂起
      myThread.UserName := 'sololie'; // 传参
      myThread.PassWord := '撸过更健康';
      myThread.OnTerminate := MyOnTerminate; // 线程结束的回调函数
      myThread.Resume; // 开始执行线程
    end;procedure TForm1.MyOnTerminate(Sender: TObject);
    begin
      retVal := (Sender as TMyThread).MyFunRetVal;
      if retVal then
        ShowMessage('线程执行函数返回 True')
      else
        ShowMessage('线程执行函数返回 False');
    end;end.
      

  4.   

    function Myfun(FUserName, FPassWord: string): Boolean; 这行上面加个 private:
    这个函数没必要 也不应该public。另外注意,如果线程中涉及操作UI,就把操作UI的代码放到Synchronize中执行例如:unit Unit2;interfaceuses
      Classes;type
      TMyThread = class(TThread)
      private
        FUserName: string;
        FPassWord: string;
        FFlag: Boolean;
        procedure GetUserName(const Value: string);
        procedure GetPassWord(const Value: string);    procedure Myfun; // 原本的参数传递交由 TMyThread的实例赋值完成
      protected
        procedure Execute; override;
      public
        property UserName: string read FUserName write GetUserName;
        property PassWord: string read FPassWord write GetPassWord;
        property MyFunRetVal: Boolean read FFlag default False;
        constructor Create(b: Boolean = True);
      end;implementationprocedure TMyThread.Myfun;
    begin
      // 假设这里做了操作UI的工作
      FFlag := True;
    end;constructor TMyThread.Create(b: Boolean = True);
    begin
      inherited Create(b);
      Self.FreeOnTerminate := True;
    end;procedure TMyThread.Execute;
    begin
      // 让操作UI的代码放回主线程中执行已保证同步
      Synchronize(Myfun);
    end;procedure TMyThread.GetPassWord(const Value: string);
    begin
      FPassWord := Value;
    end;procedure TMyThread.GetUserName(const Value: string);
    begin
      FUserName := Value;
    end;end.
      

  5.   

    传递函数指针,以回调的形式调用type
      TMyFunc = function(username,password:string):boolean;stdcall; 
      Th = class(TThread)  
      private    { Private declarations } 
       FMyFunc : pointer;     
      protected    
        procedure Execute; override; 
      public
        Procedure SetMyFunc(func : pointer); 
      end;
    implementation
    procedure Th.Execute;
    begin
      if assigned(FMyFunc) then TMyFunc(FMyFunc)(username,password);
    end;procedure Th.SetMyFunc(func : pointer); 
    begin
      FMyFunc := func;
    end;//在其它地方定义一个函数,比如
    function MyFunc(username,password) :boolean;stdcall;
    begin
      //
    end;procedure TForm1.btn1Click(Sender: TObject);
     var  myThread: TMyThread;
    begin  
      myThread := TMyThread.Create(false);
      myThread.SetMyFunc(@MyFunc); 
    end;
      

  6.   

        property UserName: string read FUserName write GetUserName;
        property PassWord: string read FPassWord write GetPassWord;名字都给弄错了,SetUserName、SetPassWord 
        property UserName: string read FUserName write SetUserName;
        property PassWord: string read FPassWord write SetPassWord;