比如有个结构体
  TAAA=record
    A :array[0..9]  of char;
    B :array[0..9] of char;
    C :array[0..9] of char;
    D :array[0..0] of char;
  end;
其中AAA.A为11, AAA.B为22, AAA.C为33, AAA.D为9有什么办法可以将上面这个结构体转成下面的这字符串呢
11        22        33        9
其中11和22之间是8个空格,也就是数据的长度跟结构体定义的相同

解决方案 »

  1.   

    TAAA=record
      A :array of char;
      B :array of char;
      C :arrayof char;
      D :array of char;
      end;  
      v : TAAA ; SetLength(var.A, Length(v.A) + 1) ;
     v.A[High(v)]  := 1 ;
     SetLength(v.A, Length(v.A) + 1) ;
     v.A[High(v)]  := 1 ;
      SetLength(v.B, Length(v.B) + 1) ;
     v.B[High(v)]  := 2 ;
     SetLength(v.B, Length(v.B) + 1) ;
     v.B[High(v)]  := 2 ;
      
      function convers(v : TAAA) :String ;
      var
    str : String ;
    i, Len  : Integer ;
      begin
      // v.A
    Result := '' ;
    str := '' ;
    Len := Length(v.A) ;
    for i := 0 to Len -1 do
    begin
    str := str + v.A[i] ;
    end ;
    while(Length(str) <10) do
    begin
    str := str + ' ' ;
    end ;
    Result := Result + str ;

    //v.B
    Len := Length(v.B) ;
    str := '' ;
    for i := 0 to Len -1 do
    begin
    str := str + v.B[i] ;
    end ;
    while(Length(str) <10) do
    begin
    str := str + ' ' ;
    end ;

    Result := Result + str ;

    //v.C 和v.D不写啦


      end ;
      

  2.   

    我的电脑上没有Delphi开发环境,代码可能写的不对, 你自己看着办了,Notepad++中编辑的
      

  3.   

    晕倒,这么麻烦啊。其中我是通过这个结构体接收socket报文,然后收到报文后写到日志文件中有没有简单点的方法?
      

  4.   

    看到LZ在大富翁相同的帖子了,既然是定长的数组,fillchar(AAA.A,10,#0)
    之后再赋值,这样转字符串的时候#0会被自动截取的至于数组转字符串方法很多的,有段时间没用了,我身边也没有环境,你试下string(AAA.A)或者用pchar中转一下,我印象里很简单的
      

  5.   

    4个数组 和多维数组一样。。 和一个数组没区别的 只是大小和地址。问题这也是法子。
    Create your own Database using Delphi's "File Of" Typed Files
    http://delphi.about.com/od/fileio/a/fileof_delphi.htm
      

  6.   

    setlength(s,sizeof(Taaa));
    move(aaa,s[1],sizeof(Taaa));
      

  7.   

    笨方法:TAAA=record
      A :array[0..9] of char;
      B :array[0..9] of char;
      C :array[0..9] of char;
      D :array[0..9] of char;
      end;
    TBBB = record
      A: array [0..39] of Char;
    END;
      FillChar(AAA,SizeOf(AAA),#0);
      AAA.A:= '11';
      AAA.B:= '22';
      AAA.C:= '33';
      AAA.D:= '44';
      //转型
      BBB:= TBBB(AAA);
      Str:= EmptyStr;
      for I:= 0 to Length(BBB.A) - 1 do
      begin
        C:= BBB.A[I];
        if C = #0 then
          C:= ' ';
        Str:= Str + C;
      end;
      ShowMessage(Str);
      

  8.   

    反过来,有一个定长的字符串,长度为31位,与下面的结构体相同,怎么将这31位长的字符串赋值给结构体呢?难道要根据长度一个一个的截取?  TAAA=record
      A :array[0..9] of char;
      B :array[0..9] of char;
      C :array[0..9] of char;
      D :array[0..0] of char;
      end;
      

  9.   


    还得补充一下
    s := StringReplace(S , #0 , #$20 , [rfReplaceAll]);//他要求空格是空格
      

  10.   

    to sz_haitaosetlength(s,sizeof(Taaa));
    move(aaa,s[1],sizeof(Taaa));
    ----------------------------------上面这段代码只是返回TAAA.A的数据吧?
      

  11.   


    这个不对,只是返回TAAA.A的数据,我是想把TAAA.A, TAAA.B等连在一起
      

  12.   

    FillChar(AAA, SizeOf(TAAA), $20);
    //AAA.A[0]:= '11'; .....
    SetLength(S, SizeOf(TAAA));
    Move(AAA, S[1], SizeOf(TAAA));
    //反方向的也类似
      

  13.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      S: string;
      AAA: TAAA;
    begin
      FillChar(AAA, SizeOf(TAAA), $20);
      with AAA do
      begin
        A[0] := '1';  A[1] := '1';
        B[0] := '2';  B[1] := '2';
        C[0] := '3';  C[1] := '3';
        D[0] := '9';
      end;
      SetLength(S, SizeOf(TAAA));
      Move(AAA, S[1], SizeOf(TAAA));
      ShowMessage(S); // 11 ?
    end;
      

  14.   


    这样赋值可以,但我是用StrPCopy(AAA.A, '11')赋值,这样赋值得到值只有11
      

  15.   

    那是因为StrPCopy后面会跟一个#0,把字符截断了,
    这样赋值吧
    B := '11';
    Move(B[1], AAA.A, 2);
      

  16.   

    注意空格和 #0 的区别,消息包一般是#0填充的吧,先把#0都换成 空格
    定义个字符串,setlength,然后结构体 赋值到 string,可以用Copymemory注意结构体的字节对齐,一般消息包用 packed record 好一点