procedure Tfrm_Jsyl.Button23Click(Sender: TObject);
var
 SHOWSTRINGCFG:NET_DVR_SHOWSTRING_V30;
  osd:  string ;
  buf: array[0..43] of Char;
  s :string;
  i: Integer;
begin   SHOWSTRINGCFG.dwSize := sizeof(SHOWSTRINGCFG);    //   获取结构体空间大小
  // showmessage(inttostr(lUserID));
    osd:='video test';
    SHOWSTRINGCFG.struStringInfo[0].wShowString:=1; //1为显示
    strpcopy(@buf,osd);
   // showmessage(buf[0]);
   SHOWSTRINGCFG.struStringInfo[0].sString:=buf;    -----》这句提示错误了   Incompatible types    SHOWSTRINGCFG.struStringInfo[0].wStringSize:=120;
    SHOWSTRINGCFG.struStringInfo[0].wShowStringTopLeftX:=110;
    SHOWSTRINGCFG.struStringInfo[0].wShowStringTopLeftY:=200;      NET_DVR_SetDVRConfig(lUserID, NET_DVR_SET_SHOWSTRING_V30,strtoint(Edit_Ch_no.text), @SHOWSTRINGCFG,sizeof(SHOWSTRINGCFG)) ;    showmessage(inttostr(NET_DVR_GetLastError()));end;
 SHOWSTRINGCFG.struStringInfo[0].sString:=buf;    -----》这句提示错误了   Incompatible types以下是NET_DVR_SHOWSTRINGINFO的 结构体,请问如何解决???{///单字符参数(子结构) }
type
  NET_DVR_SHOWSTRINGINFO = record
    wShowString: Word;
    wStringSize: Word;
{= 该行字符的长度,不能大于44个字符 }
    wShowStringTopLeftX: Word;
{= 字符显示位置的x坐标 }
    wShowStringTopLeftY: Word;
{= 字符名称显示位置的y坐标 }
    sString: Array[0..44-1] of Char;
{= 要显示的字符内容 }
  end

解决方案 »

  1.   

    move(buf, SHOWSTRINGCFG.struStringInfo[0].sString, 44)
      

  2.   

     如果是Delphi 2010及以上版本,Char是UniCode Char, 因此上面的Char要改为AnsiChar
      

  3.   

    Delphi的一个糟糕之处就在于它的类型系统设计太严格,有时候显得很弱智,实际上,如果你把array[0..43] of Char;单独声明为一个类型:
    type
      String44 = array[0..43] of Char;
    然后把buf、sString都定义为String44类型,是可以互相赋值的
      

  4.   

        move(buf, SHOWSTRINGCFG.struStringInfo[0].sString,44);
        SHOWSTRINGCFG.struStringInfo[0].sString:=buf;
    这样吗? 还是报错
      

  5.   


    我把buf 已经定义成
    buf: array[0..44-1] of Char;
    那变量 SHOWSTRINGCFG.struStringInfo[0].sString ,的类型应该一样的啊但是还是不能赋值
      

  6.   

    SHOWSTRINGCFG.struStringInfo[0].sString:=buf;s'd'd'g'd'f'g'd
    改为
    move(buf, SHOWSTRINGCFG.struStringInfo[0].sString,44);另外,报错的原因,就是Delphi编译器认为record里面的array[0..43] of Char和其它地方的array[0..43] of Char不是同一个类型,这是编译器判断类型不够精确的问题,用户没办法改变。
      

  7.   

    把SHOWSTRINGCFG.struStringInfo[0].sString:=buf;
    改为
    move(buf, SHOWSTRINGCFG.struStringInfo[0].sString,44);另外,报错的原因,就是Delphi编译器认为record里面的array[0..43] of Char和其它地方的array[0..43] of Char不是同一个类型,这是编译器判断类型不够精确的问题,用户没办法改变。
      

  8.   


    我把buf 已经定义成
    buf: array[0..44-1] of Char;
    那变量 SHOWSTRINGCFG.struStringInfo[0].sString ,的类型应该一样的啊但是还是不能赋值type
      String44 = array[0..43] of Char;  NET_DVR_SHOWSTRINGINFO = record
        wShowString: Word;
        wStringSize: Word;
    {= 该行字符的长度,不能大于44个字符 }
        wShowStringTopLeftX: Word;
    {= 字符显示位置的x坐标 }
        wShowStringTopLeftY: Word;
    {= 字符名称显示位置的y坐标 }
        sString: String44;// ...
    var
    buf: String44;