急!!!100分,请各位大虾帮忙解决:
用户在edit1中输入任意中文+4字符的数据帧头,总提示内存使用错误。
代码如下:procedure TForm1.Button2Click(Sender: TObject);
type
  Tmsg = ^msg;
  msg=packed record
    Command:array[0..3] of char;
    des:string;
end;
var
  Mymsg:Tmsg;
  s:string;
  desLength:integer;//汉字总长度
begin
  s:=edit1.text;
  desLength:=length(s);
  GetMem(Mymsg,desLength+4);//command占4字节
  Mymsg.command[0]:='S';
  Mymsg.command[1]:='E';
  Mymsg.command[2]:='N';
  Mymsg.command[3]:='D';
  Mymsg.des:=s;
  idtcpclient.WriteBuffer(Mymsg^,desLength+4);
  FreeMem(Mymsg);
end;

解决方案 »

  1.   

    Command才4字节,你的中文要多长,再加上4个字符,早就超出范围了
      

  2.   

    des:array[0..500] of char;这样定义嘛
      

  3.   


    procedure TForm1.Button2Click(Sender: TObject);
    type
    Tmsg = ^msg;
    msg=packed record
    Command:array[0..500] of char;
    des:string;
    end;
    var
    Mymsg:Tmsg;
    s:string;
    desLength:integer;//汉字总长度
    begin
    s:=edit1.text;
    desLength:=length(s);
    GetMem(Mymsg,desLength+4);//command占4字节
    Mymsg.command[0]:='S';
    Mymsg.command[1]:='E';
    Mymsg.command[2]:='N';
    Mymsg.command[3]:='D';
    move(s[1],Mymsg.des[0],desLength); //这样子  。
    idtcpclient.WriteBuffer(Mymsg^,desLength+4);
    FreeMem(Mymsg);
    end;
      

  4.   

    Socket通讯大多都是定义一套协议的,最常见是先发一个4字节的长度,后面是数据,服务器在接收数据的时候,先接收4字节的长度,然后可以根据长度,都剩下的数据,如:var
      iLen: Integer;
      sStr: string;
    begin
      iLen := 0;
      AThread.Connection.ReadBuffer(iLen, SizeOf(iLen));
      sStr := AThread.Connection.ReadString(iLen);
    end;如果太长的数据就依次分为几个小包发送。
      

  5.   


    idtcpclient   这个是什么啊   是一个客户端么?
      

  6.   


    delphi 6 没有idtcpclient么?
      

  7.   

    type
      Tmsg = ^msg;
      msg = packed record
        Command:array[0..3] of char;
        des:string;
      end;
    var
      Mymsg: Tmsg;按这样的结构定义的Tmsg记录类型, 你用 idtcpclient.WriteBuffer(Mymsg^,desLength+4); 发送出去的是Command记录域的内容和des这个字符串的地址值,而不是Command记录域的内容和des字符串的内容。如果des的内容可知其最大长度(比如最长为30个字符),则可以这样修改:
    type
      Tmsg = ^msg;
      msg = packed record
        Command:array[0..3] of char;
        des:string[30];
      end;idtcpclient.WriteBuffer(Mymsg^, SizeOf(msg));
      

  8.   

    这个记录类型建议修改成这样:type
      Tmsg = ^msg;
      msg = packed record
        Command  : array[0..3] of char;
        desLength: Integer;
        des      : String;
      end;
    代码部分修改成这样:var
      Mymsg: Tmsg;
      s    : string;
    begin
      s := edit1.text;
      new(Mymsg);
      Mymsg.command[0] := 'S';
      Mymsg.command[1] := 'E';
      Mymsg.command[2] := 'N';
      Mymsg.command[3] := 'D';
      Mymsg.desLength := length(s);
      Mymsg.des := s;
      //发送
      idtcpclient.WriteBuffer(Mymsg.command, 4);
      idtcpclient.WriteBuffer(Mymsg.desLength, Sizeof(Integer));
      idtcpclient.WriteBuffer(Mymsg.des[1], Mymsg.desLength);
      dispose(Mymsg);
    end;