我是首先定义了一个
MessageContent: array of Char; 然后在使用的时候
SetLength(MessageContent,length(eMsg.Text));但strpcopy( MessageContent, eMsg.Text ); 
却报错([Error] main.pas(284): Incompatible types: 'Array' and 'Char')这是什么原因,不能这样写吗,如果messagecontent是定长就可以了哪位大大知道,请告知,谢谢

解决方案 »

  1.   

    MessageContent: array of Char; 干吗 不用 string呢。。StrCopy(@MessageContent, PChar(sMsg.Text));
      

  2.   

    同意楼上
    ,感觉string 好,不用定字节
      

  3.   

    StrCopy(@MessageContent, PChar(sMsg.Text));
      

  4.   

    strpcopy(PChar(MessageContent), eMsg.Text  );
      

  5.   

    我用strpcopy(PChar(MessageContent), eMsg.Text  );在赋值过程中就会报“project xxxxx.exe raised exception class eaccessviolation with message'access violation at address 00409161 in module 'xxxxx.exe'.write of address 00000000' process stopped.use step or run to continue.”
    而用StrCopy(@MessageContent, PChar(sMsg.Text));
    就会报“project d:\xxxxx.exe faulted with messatge:access violation at 0xc3a2cfc5:read of address oxc3a2cfc5'.process stopped.use step or run to continue.”
    决定用string试试
      

  6.   

    不行啊,我是定义一个包的类型,然后用socket发出这个包,用string就接收不对,就是说必须用char类型,但赋值到底要怎么办啊
      

  7.   

    用move函数吧
    procedure TForm1.Button1Click(Sender: TObject);
    var MessageContent: array of Char;
    begin
        SetLength(MessageContent,length(eMsg.Text));
        Move(eMsg.text, MessageContent, length(eMsg.Text));
        showmessage(PChar(MessageContent));
    end;
      

  8.   

    一个比较笨的方法,用for循环赋值
    SetLength(MessageContent,length(eMsg.Text));
    for i := 1 to length(eMsg.Text) do
      MessageContent[i] := eMsg.text[i];
      

  9.   

    用move也会报类似于strpcopy(PChar(MessageContent), eMsg.Text  );的错误
      

  10.   

    用for和用move一样,到底是为什么啊
      

  11.   

    procedure TMainFrm.Button1Click(Sender: TObject);
    var
      s: array of Char;
    begin
      SetLength(s, 100);
      StrCopy(PChar(s), PChar(LbPrompt.Caption));
      ShowMessage(string(s));
    end;这样 OK 我刚试过。
      

  12.   

    to beyondtkl(大龙驹<*学习祖国医学中,国粹,路在何方?*>) 还是报错,可能不是赋值的原因,再去看看,谢谢各位大大
      

  13.   

    var
      MessageContent: String;
    begin
      setLength(MessageContent,length(eMsg.Text));
      strpcopy(Pchar(MessageContent),eMsg.Text );
      emsg.Lines.Add(MessageContent);
    end;
      

  14.   

    字符串类型在访问上与数据是一致的,只不过字符串是从1开始的
    例如:
    Var
      S:String;
    begin
      S :='qaz';
      //S[1] 就等于 字符'q'
      //S[2] 就等于 字符'a'   ....
    end;
      

  15.   

    应该是其它地方的错误,你单步执行看看到哪里出的错,我的move也是试过之后才给你的...
      

  16.   

    上面的方法单独试都可以呢,但不知道为什么加到我的程序里面就不行了我是定义了一个
    TSGIP_SUBMIT_tag = packed record
            MessageCoding: Byte; 
            MessageType: Byte; //信息类型
            MessageLength: longword; //信息长度
            MessageContent: array of Char;         
            Reserve: array[0..7] of Char; //保留
        end;这样一个包
    然后
    SetLength(Sgip_SUBMIT_tag.MessageContent,length(eMsg.Text)+1);(//看到有人说要加1就是加个#0)
        FillChar( Sgip_SUBMIT_tag, SizeOf( Sgip_SUBMIT_tag ), 0 );
    with Sgip_SUBMIT_tag do
        begin
          MessageCoding := 15; //byte;//信息格式  
          MessageType:=0;
          MessageLength:=htonl(length(eMsg.Text));
          strpcopy(Pchar(MessageContent),eMsg.Text )
        end;然后再cSocket.SendBuf运行过程中就会报“project xxxxx.exe raised exception class eaccessviolation with message'access violation at address 00409161 in module 'xxxxx.exe'.write of address 00000000' process stopped.use step or run to continue.”