我定义了一个数据结构,使用结构2的形式,就能够使用,使用结构1就出现一个表示内存地址的错误,实在搞不清楚,请各位帮帮忙?
使用的代码如下:
lxm:TListItem; lxm:=PClientInfo(ClientInfos.Items[iClientIndex])^.StuInfo.lvItem;
lxm.SubItems[5]:='正在下载';
------------------------------------------------------------------------------------------------------结构1: TStuInfo=packed record
zkh:string[15];
xm:string[10];
xxName:string[20];
lvItem:TListItem;
SockAddr:TSockAddrIn; //与结构2中不同的地方
end;
PStuInfo=^TStuInfo; PClientInfo=^TClientInfo;
TClientInfo=packed record
zkh:string[15];
StuInfo:PStuInfo;
end;结构2
TStuInfo=packed record
zkh:string[15];
xm:string[10];
xxName:string[20];
lvItem:TListItem;
ip:string[15]; //就这里与结构1不同,这种形式正常
end;
PStuInfo=^TStuInfo; PClientInfo=^TClientInfo;
TClientInfo=packed record
zkh:string[15];
StuInfo:PStuInfo;
end;
使用的代码如下:
lxm:TListItem; lxm:=PClientInfo(ClientInfos.Items[iClientIndex])^.StuInfo.lvItem;
lxm.SubItems[5]:='正在下载';
------------------------------------------------------------------------------------------------------结构1: TStuInfo=packed record
zkh:string[15];
xm:string[10];
xxName:string[20];
lvItem:TListItem;
SockAddr:TSockAddrIn; //与结构2中不同的地方
end;
PStuInfo=^TStuInfo; PClientInfo=^TClientInfo;
TClientInfo=packed record
zkh:string[15];
StuInfo:PStuInfo;
end;结构2
TStuInfo=packed record
zkh:string[15];
xm:string[10];
xxName:string[20];
lvItem:TListItem;
ip:string[15]; //就这里与结构1不同,这种形式正常
end;
PStuInfo=^TStuInfo; PClientInfo=^TClientInfo;
TClientInfo=packed record
zkh:string[15];
StuInfo:PStuInfo;
end;
另外我也不清楚到底对不对,建议你StuInfo.lvItem 改成 StuInfo^.lvItem。
改为:
lxm:=PClientInfo(ClientInfos.Items[iClientIndex])^.StuInfo^.lvItem;
楼主的错误应该是
SockAddr:TSockAddrIn;中的SockAddr没有初始化
TSockAddrIn是表示通讯地址的东东,包含Ip地址,通讯端口等,在Winsock中.
问题还是没有解决.
访问lvItem错误,那应该是StuInfo为nil,所产生的,
结构指针在D里面,可以用.也可以^.访问,这个省略^是没有任何问题的。
PInfo: PStuInfo;FillChar(PInfo^, SizeOf(TStuInfo), 0);
如果是指针就更加要初始化了。因为指针不初始化就使用,初始化之前很可能指向有其他东西。
s_w1, s_w2: u_short;
end; PInAddr = ^TInAddr;
{$EXTERNALSYM in_addr}
in_addr = record
case integer of
0: (S_un_b: SunB);
1: (S_un_w: SunW);
2: (S_addr: u_long);
end;
TInAddr = in_addr; PSockAddrIn = ^TSockAddrIn;
{$EXTERNALSYM sockaddr_in}
sockaddr_in = record
case Integer of
0: (sin_family: u_short;
sin_port: u_short;
sin_addr: TInAddr;
sin_zero: array[0..7] of Char);
1: (sa_family: u_short;
sa_data: array[0..13] of Char)
end;
TSockAddrIn = sockaddr_in;