我定义了一个数据结构,使用结构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;

解决方案 »

  1.   

    建议你 在使用你的数据结构之前 FillChar 初始化一次。
    另外我也不清楚到底对不对,建议你StuInfo.lvItem 改成 StuInfo^.lvItem。
      

  2.   

     lxm:=PClientInfo(ClientInfos.Items[iClientIndex])^.StuInfo.lvItem; 
    改为:
     lxm:=PClientInfo(ClientInfos.Items[iClientIndex])^.StuInfo^.lvItem; 
      

  3.   

    按理说用指针的话应该要加 ^ 符号的。但delphi的源码里也有些地方是直接像 StuInfo.lvItem 这样写,编译都能通过,也没出什么错。所以到底这么写是对是错就不知道了,不过不加 ^ 符的话,很多地方都会出错,遇到过好多次了
      

  4.   

    StuInfo:PStuInfo; PStuInfo=^TStuInfo; StuInfo记录域是个指向TStuInfo的指针, 所以应该写成StuInfo^.lvItem
      

  5.   

    StuInfo:PStuInfo;当你声明成指针类型后在delphi中StuInfo^的^可以省略
    楼主的错误应该是
    SockAddr:TSockAddrIn;中的SockAddr没有初始化
      

  6.   

    谢谢各位朋友.
    TSockAddrIn是表示通讯地址的东东,包含Ip地址,通讯端口等,在Winsock中.
    问题还是没有解决.
      

  7.   

    TSockAddrIn相当于一个Cardinal,不需要初始化,应该是其它错误。PClientInfo(ClientInfos.Items[iClientIndex])^.StuInfo.lvItem
    访问lvItem错误,那应该是StuInfo为nil,所产生的,
    结构指针在D里面,可以用.也可以^.访问,这个省略^是没有任何问题的。
      

  8.   

    初始化var
      PInfo: PStuInfo;FillChar(PInfo^, SizeOf(TStuInfo), 0);
    如果是指针就更加要初始化了。因为指针不初始化就使用,初始化之前很可能指向有其他东西。
      

  9.   

      SunW = packed record
        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;