procedure TForm1.Button7Click(Sender: TObject);
var
  s: String[200];
  s1, s2: String;
begin
  s := 'abcdefghijklmn';
  SetLength(s1, Length(s));
  s2 := s1;     // s2 := s1 = ‘’
  Move(s, PChar(s2)^, Length(s));  
  s1[1] := 'z';
  s2[8] := #0;
  ShowMessage(s1 + ':' +
    IntToStr(Length(PChar(s2))) + IntToStr(Length(s2)));
end;
我的问题是,为什么Move操作之后,S2的内容不等于S 而是 等于' abcdefghijklmn'第一个字符为空?procedure TForm1.Button6Click(Sender: TObject);
var
  s1: array[1..10] of Char;
  s2, s3: array of Char;
begin
  FillChar( s1, 10, 'M');
  SetLength(s2, 10);
  SetLength(s3, 10);
  Move(s1, s2[0], 10);
  s3 := s2;
  s3[0] := 'B';
  ShowMessage(PChar(s2));
end;
这里Move之后 S2 却又是等于s1的希望大家指教

解决方案 »

  1.   

    先不用管下面的move,执行
      s := 'abcdefghijklmn';
      SetLength(s1, Length(s));
      ShowMessage(s1);
    看看结果
      

  2.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      s: String[200];
      s1, s2: String;
    begin
      s := 'abcdefghijklmn';
      SetLength(s1, Length(s));//设置s1的长度为14
      s2 := s1;     // s2 := s1  //在这段函数中的作用是将s2的长度和s1设置得一样长
    //  Move(s, PChar(s2)^, Length(s));//复制了14个字符,从0~13位
      Move(s[1], PChar(s2)^, Length(s));//复制了14个字符,从1~14位
      //string类型是从第一位算起。Pchar类型是从第0位算起。
      s1[1] := 'z';
      s2[8] := #0;
      ShowMessage(s);
      ShowMessage(s1);
      ShowMessage(s2);
      ShowMessage(s1 + ':' +
        IntToStr(Length(PChar(s2))) +':' +IntToStr(Length(s2)));
    end;
      

  3.   

    var
      s1: array[1..10] of Char;
      s2, s3: array of Char;
    begin
      FillChar( s1, 10, 'M');
    //  ShowMessage(s1[1]+s1[2]+s1[3]+s1[4]+s1[5]+s1[6]+s1[7]+s1[8]+s1[9]+s1[10]);
      SetLength(s2, 10);
      SetLength(s3, 10);
      Move(s1, s2[0], 10);  //你的s1是[1..10],所以,这里的s1=s1[1]
    //  Move(s1[1], s2[0], 10);  //和上面的语句一样的效果
      s3 := s2;                   
      s3[0] := 'B';
      s3[10]:=#0;               //加上这句,字符串则从0..9,动态数组起始是0
      ShowMessage(PChar(s2));
    end;
      

  4.   

    ok 明白了,谢谢 mastersky(浪)