H
hegyi
Unregistered / Unconfirmed
GUEST, unregistred user!
程序中报错,不知道错在哪,也不知道为为什么错,请高手指出并给讲讲原因,谢谢。
我在程序中定义了以下类
TSimpleClient = class(TObject)
UserID:Integer;
timerRemain:integer;
Threadointer;
end;
有一个ListView,以下是增加项的过程,目的是将Treeview的Item与线程互相关联
procedure TServerMgmt.AddAUser(ComBlock:TComBlock;AThread: TIdPeerThread);
var
l:TlistItem;
Client:TsimpleClient;
begin
……
l:=lvUsers.Items.Add;
Client:=TSimpleClient.Create;
client.timerRemain:=20;
Client.Thread:=Athread;
l.Caption:=inttostr(comBlock.SendID)
//列出在线人员的ID号
……
l.Data:=pointer(Client); //挂到Item上,便于通过Item直接找到连接线程(Athread)
Athread.Data:=l
//以便根据Athread可以直接找到Item
end;
在Listview的Item删除时,应当清理内存:
procedure TServerMgmt.lvusersDeletion(Sender: TObject
Item: TListItem);
var
Client:TSimpleClient;
aThread : TIdpeerThread ;
begin
if item.Data=nil then exit;
Client:=TSimpleClient(Item.data) ; //应当是Client:=Pointer(Item.data)?
aThread:=TIdpeerThread(Client.Thread);
aThread.Connection.disConnect;
aThread.Data:=nil;//aThread.data实际上应当等于Item,去掉关联。也许没必要。
Client.Thread:=nil;
Client.Free; //这里报错!
item.Data:=nil;
end;
我的问题出在Pointer与对象的关系没弄清楚。Pointer是一个指针,比如上面的Client.Thread,Object对象变量中也是存放地址,其实也是一个指针,但一个Pointer变量与Object变量之间的赋值关系应当是怎样的呢?比如:
A,B:Tobject;
Pointer;
p:=A;
B:=P;
这时对B的操作和对A的操作是同等的吗?对TObject(P)的操作与对A同等吗?
我在程序中定义了以下类
TSimpleClient = class(TObject)
UserID:Integer;
timerRemain:integer;
Threadointer;
end;
有一个ListView,以下是增加项的过程,目的是将Treeview的Item与线程互相关联
procedure TServerMgmt.AddAUser(ComBlock:TComBlock;AThread: TIdPeerThread);
var
l:TlistItem;
Client:TsimpleClient;
begin
……
l:=lvUsers.Items.Add;
Client:=TSimpleClient.Create;
client.timerRemain:=20;
Client.Thread:=Athread;
l.Caption:=inttostr(comBlock.SendID)
//列出在线人员的ID号
……
l.Data:=pointer(Client); //挂到Item上,便于通过Item直接找到连接线程(Athread)
Athread.Data:=l
//以便根据Athread可以直接找到Item
end;
在Listview的Item删除时,应当清理内存:
procedure TServerMgmt.lvusersDeletion(Sender: TObject
Item: TListItem);
var
Client:TSimpleClient;
aThread : TIdpeerThread ;
begin
if item.Data=nil then exit;
Client:=TSimpleClient(Item.data) ; //应当是Client:=Pointer(Item.data)?
aThread:=TIdpeerThread(Client.Thread);
aThread.Connection.disConnect;
aThread.Data:=nil;//aThread.data实际上应当等于Item,去掉关联。也许没必要。
Client.Thread:=nil;
Client.Free; //这里报错!
item.Data:=nil;
end;
我的问题出在Pointer与对象的关系没弄清楚。Pointer是一个指针,比如上面的Client.Thread,Object对象变量中也是存放地址,其实也是一个指针,但一个Pointer变量与Object变量之间的赋值关系应当是怎样的呢?比如:
A,B:Tobject;
Pointer;
p:=A;
B:=P;
这时对B的操作和对A的操作是同等的吗?对TObject(P)的操作与对A同等吗?