function TMainForm.SendStreamToServer(AThread:TIdPeerThread;Cmd:String): Boolean;
var
  MyStream: TMemoryStream;
  i:integer;
begin
  try
    MyStream:=TMemoryStream.Create;
    MyStream.Write(Cmd[1],Length(Cmd));
    MyStream.Position:=0;
    i:=MyStream.size;
    AThread.Connection.WriteLn(inttostr(i));
    AThread.Connection.WriteStream(MyStream);
    Result := True;
  except
    AThread.Connection.Disconnect;
    AThread.Terminate;
    MyStream.Free;
    Result := False;
  end;
    MyStream.Free;
end;此函数是灰鸽子1.2vip 里的一个发送流给idtcpclient里的一个函数
我想问下    MyStream.Write(Cmd[1],Length(Cmd));
这个东东。 为什么要用cmd[1]
他是把cmd里的东东。全写到流中。为什么cmd[0]不要呢?
我记得string里若是有字符的话。好像是从0开始的
就是说cmd[0]表示第一个字符。是否这样?那位对流比较熟的解释下?

解决方案 »

  1.   

    Cmd是一个Stying类型的变量,而String的下标,是从1开始的。
      

  2.   

    上面打错一个字母。Cmd是一个String类型的变量,而String的下标,是从1开始的。
      

  3.   

    短string的[0]放的是长度
    不管长短,[1]都是内容的第一个字符
      

  4.   

    那。
    var 
    s:string;
    i:integer;
    begin
    s:='adfssssssss';
    for i:=0 to length(s) do 
    begin
    showmessage(s[i]);
    end;这里是否表示s[0]是一个char
    那么他的长度呢?放在那里
      

  5.   

    http://blog.csdn.net/wzn0521/archive/2007/11/16/1887894.aspx
      

  6.   

    string[xxx]是短字符串,长度最大只有255,需要1个字节来存储长度,所以s[0]就足够了
    string是长字符串,机制与短字符串不同,长度最大可达2G,需要4个字节来存储长度
      

  7.   


    照ccrun的说法那么。string[0]并不是表示字符串的长度。是不是这样理解呢?
    他是向前偏移四个字节来保存的。所以并不是用string[0];
      

  8.   

    向前偏移四个字节是没错的,不过如果你象下面这样定义的话string[0]保存的和向前偏移四个字节是一样的,不过String[0]保存的是长度对应的Ascii码值
    var
      s:string[10];
    begin
      s := '12345';
      ShowMessage(IntToStr(Ord(s[0])));
    end;
      

  9.   

    请问。这个
    var
     s:string[10];//这个是定义为短字符类型。。
    //Cmd:String 照理说与string这个默认是长字符串类型。是否不通用?还是通用?
    看下面的说明。应与string与string[x]存储不同。所以楼上的例子是对的。但是上面的是定义为string类型string分两种, 
        一种是与Pascal传统string相兼容,叫ShortString, 
        它的存储结构如下: 
         +---------------------+    
         | 1Byte |    字符串内容 | 
         +---------------------+ 
         0         1 ...... 
          其中第一个字节为字符串的长度。 
          所以ShortString所能包括的字符串长度不能大于255。 
        另一种是叫长字符串AnsiString,    它就是一个指向字符串的指针,不过具体的存储有些特别。 
        它的存储结构如下: 
        +-----------------------+ 
        | 4B | 4B |    字符串内容 | 
        +-----------------------+ 
        -8     -4     0    ...... 
        其中,AnsiString指向字符串第一个字符, 
      

  10.   

    AnsiString定义的字符串下标也是从1开始的,0访问不了,应该是为了向下兼容吧
      

  11.   

    现在我这里用的机没装delphi 
    。我之前肯定试过。
    var 
    s:string; 
    i:integer; 
    begin 
    s:='adfssssssss'; 
    for i:=0 to length(s)-1 do 
    begin 
    showmessage(s[i]); 
    end; 
    这样肯定可以访问啊。/
    s[0] .....不过上面的介绍说是的第一个字节为字符串的长度。这个第一个字节里。 是否用s[0]这样表示,照理说不是这样表示的。这样表示的应是说的是这个字符串里的第一个字符,并不是说的存这个字符的长度的。第一个字节应是 pointer(s) 转为地址之后数值。
    若转为之后是
    100000
    那么就是这里之间存的是长度。。
    100001
    用什么表示么?
      

  12.   

    你写的代码我试过了,这样s[0]是可以访问,但是Show出来的内容为空,所以可以认为你那样写是错的,应该写成
    for i:=1 to length(s) do 
    begin 
    showmessage(s[i]); 
    end; 
    这样才能把所有的字符显示出来。
    另外,AnsiString的长度是没有限定的,如果说s[0]是长度的话也不对,因为s[0]也只有一个Byte,如果长度大于256那么就不行了,所以s[0]应该是针对ShortString的。
      

  13.   

    确实。。结帐。谢谢各位。因为之前看这个函数时机没装delphi的机。没测试。现在试了下s[0]确实是空的。
    谢谢了。。