海康设置osd,哪里出问题了

kciv 2019-10-22 10:53:45
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
...全文
1516 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
阚小菜鸟 2020-05-19
  • 打赏
  • 举报
回复
循环一个字符一个字符设置就可以了
BlueStorm 2019-10-24
  • 打赏
  • 举报
回复
把SHOWSTRINGCFG.struStringInfo[0].sString:=buf; 改为 move(buf, SHOWSTRINGCFG.struStringInfo[0].sString,44); 另外,报错的原因,就是Delphi编译器认为record里面的array[0..43] of Char和其它地方的array[0..43] of Char不是同一个类型,这是编译器判断类型不够精确的问题,用户没办法改变。
BlueStorm 2019-10-24
  • 打赏
  • 举报
回复
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不是同一个类型,这是编译器判断类型不够精确的问题,用户没办法改变。
kciv 2019-10-24
  • 打赏
  • 举报
回复
引用 3 楼 早打大打打核战争 的回复:
Delphi的一个糟糕之处就在于它的类型系统设计太严格,有时候显得很弱智,实际上,如果你把array[0..43] of Char;单独声明为一个类型:
type
String44 = array[0..43] of Char;
然后把buf、sString都定义为String44类型,是可以互相赋值的


我把buf 已经定义成
buf: array[0..44-1] of Char;


那变量 SHOWSTRINGCFG.struStringInfo[0].sString ,的类型应该一样的啊

但是还是不能赋值
kciv 2019-10-24
  • 打赏
  • 举报
回复
引用 1 楼 BlueStorm 的回复:
move(buf, SHOWSTRINGCFG.struStringInfo[0].sString, 44)



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


这样吗? 还是报错
  • 打赏
  • 举报
回复
引用 5 楼 kciv 的回复:
[quote=引用 3 楼 早打大打打核战争 的回复:]
Delphi的一个糟糕之处就在于它的类型系统设计太严格,有时候显得很弱智,实际上,如果你把array[0..43] of Char;单独声明为一个类型:
type
String44 = array[0..43] of Char;
然后把buf、sString都定义为String44类型,是可以互相赋值的


我把buf 已经定义成
buf: array[0..44-1] of Char;


那变量 SHOWSTRINGCFG.struStringInfo[0].sString ,的类型应该一样的啊

但是还是不能赋值[/quote]

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;
BlueStorm 2019-10-22
  • 打赏
  • 举报
回复
如果是Delphi 2010及以上版本,Char是UniCode Char, 因此上面的Char要改为AnsiChar
BlueStorm 2019-10-22
  • 打赏
  • 举报
回复
move(buf, SHOWSTRINGCFG.struStringInfo[0].sString, 44)
  • 打赏
  • 举报
回复
Delphi的一个糟糕之处就在于它的类型系统设计太严格,有时候显得很弱智,实际上,如果你把array[0..43] of Char;单独声明为一个类型:
type
String44 = array[0..43] of Char;
然后把buf、sString都定义为String44类型,是可以互相赋值的

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧