我使用TIdTCPserver控件,定义了一个通讯包,包结构如下:
  CommBlock = record                //数据包通讯结构     服务端通讯
    CommandType: integer;//TCommandType;
    OperatorType: Byte;    //操作方式(0:增加;1:删除;2:修改)
    Name: string[255];          //
  end;
  
  其中name字段最大长度只能255(我需要更大的长度,),但是这个字段必须用固定长度字节,
  因为TIdTCPserver控件读取包的时候用此方法
  AThread.Connection.ReadBuffer(mCommBlock, SizeOf (mCommBlock));(如果Name: string[255]; 变为Name: string;那ReadBuffer不能 正确读出mCommBlock变量)。  还有其他定义字符串变量的方法么?

解决方案 »

  1.   

    用类似 Memo 或 二进制流格式,你查看吧,应该有的
      

  2.   

    array [1..1024] of charhttp://lysoft.7u7.net
      

  3.   

    建议用字符数组: array[1..length] of char
      

  4.   

    建议用Char数组 以防把空地方认成结束------------------------------------------------------------------------------
    金盆洗澡    重出江湖     打劫.抢分   掀起一场腥风血雨   戒烟攒钱 只为换新车
      

  5.   

    CommBlock = record                //数据包通讯结构     服务端通讯
        CommandType: integer;//TCommandType;
        OperatorType: Byte;    //操作方式(0:增加;1:删除;2:修改;9:上一个记录的继续)
        Name: string[255];          //
      end;你首先统计一下你的Name 的平均长度,比如通常不超过 64字节,那就干脆定义 Name: string [64];如果超过 64字节,你可以在下一个记录里面些其余的部分,这样不论多长Name,你都可以用若干的记录合并成你需要的Name,同时又不浪费太多的空间。
    到时候你根据OperatorType的类型来判断后面的是不是前面的其余部分。
      

  6.   

    AnsiString和WideString是可以超过255个字符的类型,最大好像是2GB,足够你用的了。
      

  7.   

    是的,Delphi中的String最大只能是255,如果你有多于255个字符的需要,你可以用TSstringList或定义一个动态字符数组,例如:
    var
      StrList: TStringList
      Chr: Array of char;
      

  8.   

    array[1..length] of char
    接受的时候可以使用PChar接受,这样可以除去多余的#0,我在做UDP通信的时候就是这么定义的...,同时要注意在赋值前要初始化一下数据...
      

  9.   

    记得定义成string类型的默认成AnsiString,而不是shortstring类型的 如果要设成shortstring类型的必须{$H-},AnsiString不限长度,
      

  10.   

    以上是delphi开发人员指南里边写的
      

  11.   

    1、用array of char 是可以了,谢谢哦~~;
    2、to pazee(耙子)(今年过年不收礼,收礼只收尿不湿):你所说的方法,可能在我的程序里用不了,因为可能同时会有好多包过来,到时候组装起来会有点麻烦(不过真要用上应该还是可以的^_^);
    3、建议我用AnsiString的同学们,主要是不能定义Name: AnsiString[255];(读取包的时候要用sizeof()方法的)       ;