procedure _Thread_SQ_(_ball_: Pointer);
var
    b: Ball;
begin
    b := _ball_ as Ball;
    showmessage(b.link_sq);
end;_ball_ 是传进来的 Ball 类 Pointer
现在想 b := _ball_ as Ball;
怎么搞都不成功!!帮帮忙~~~谢谢了!!

解决方案 »

  1.   

    procedure ShowClass(obj : Pointer);
    var
      myObj : TMyClass;
    begin
      myObj := TObject(obj) as TMyClass;
      Showmessage(myObj.ClassName);
    end;var
      s : TMyClass;
    begin
      s := TMyClass.Create;
      ShowClass(Pointer(s));
      s.Free;
    end;
      

  2.   

    b := Ball(_ball_); 也是行的
      

  3.   

    报错了!procedure _Thread_SQ_(_ball_: Pointer);
    var
        b: Ball;
    begin
        b := TObject(_ball_) as Ball;
        showmessage(b.ClassName);//这里报错
    end;错误信息:
    Project C:\sq\sq.exe faulted with message: 'access violation at 0x00478abd: read of address 0x00000000'.
    process Stopped. Use Step or Run to Continue.我的是多线程的
    _ball_: Pointer 是在创建线程时传进来的参数!
    不知道是不是和你们的不一样!!?
      

  4.   

    实际代码如下:function _Thread_SQ_(_ball_: Pointer):DWORD;stdcall;
    var
        b: Ball;
    begin
        b := TObject(_ball_) as Ball;
        showmessage(b.ClassName);
    end;procedure TForm1.BTN_ActionClick(Sender: TObject);//开始
    var
        i: Integer;
        b: Ball;
        temp: WideString;
        hThread: THandle;
    begin
        text.Text := '';
        for i := 1 to sg.RowCount - 1 do begin
            temp := sg.Cells[7,i];
            if trim(temp) <> '' then begin
                b := Ball.create;
                b.row_num := i;
                b.link_sq := temp;
                system.IsMultiThread := true;
                hThread := windows.CreateThread(nil,0,@_Thread_SQ_,@b,0,b.thread_id_sq);
                closehandle(hThread);
                common.bs.add(common.GetSys_DTZ,b);
            end;
        end;
    end;
      

  5.   

    windows.CreateThread(nil,0,@_Thread_SQ_,Pointer(b),0,b.thread_id_sq);
    @b改为Pointer(b),或直接用b,b已经是个指针了,不要再取地址