xfcanyue / DuiLib_DuiEditor

UIDesigner for duilib
BSD 2-Clause "Simplified" License
176 stars 70 forks source link

直接在as脚本里面调用控件的SetText,Unicode会得到乱码 #7

Open akinpdev opened 1 month ago

akinpdev commented 1 month ago

已确定工程属性是Unicode,并且也使用了Unicode版本的DuiScript_64ud.dll,你们提供的Demos工程里,那个时钟Label也是一样乱码,请问如何让angelscript支持Unicode?也就是如何让angelscript传给控件的SetText参数支持Unicode?

akinpdev commented 1 month ago

1

akinpdev commented 1 month ago

2022-01-21 1,更新脚本接口。 脚本中有个BUG,暂时无法解决。 比如脚本中这么写,SetText("1234"),首先"1234"初始化为CDuiString,然后是脚本引擎调用opImplConv转为LPCTSTR,转完后,原先的CDuiString被释放掉了。看起来是作用域没写好。导致真正调用CControlUI::SetText时,是个空字符串。要避免这个问题,注册到脚本内的函数都不能使用LPCTSTR作为参数。。。。又要改一大片-_-!! 那么以前怎么不会出错呢。因为原先CDuiString内部有个szBuffer[64],短字符串是存在这个数组里,转换之后,SetText()接收到的LPCTSTR实际上指向的是一片野内存。 目前脚本中应该这么写,CDuiString s = "1234"; SetText(s); 不要在传递参数过程中,产生CDuiString临时对象。 3,CMsgWnd,增加配置显示日期和时间,增加接口CMsgWnd::ClearMsg()。 4, 一组Option,当改变Selected时,取消和选中的那个都会收到 DUI_MSGTYPE_SELECTCHANGED 消息。

看了更新日志后,脚本中直接这样写: bool OnClockControlEvent(CControlUI &obj, TEventUI &ev) { if(ev.Type == UIEVENT_TIMER) { datetime dt; dt.GetCurrentTime(); CDuiString s1 = "1234"; obj.SetText(s1); } return false; }

运行后报错: 2 求问该怎么解决,才可以直接在脚本里执行SetText?

xfcanyue commented 1 month ago

脚本里面的字符串类名是 string,参考一下文件 DuiScript/RegCDuiString.h

xfcanyue commented 1 month ago

已确定工程属性是Unicode,并且也使用了Unicode版本的DuiScript_64ud.dll,你们提供的Demos工程里,那个时钟Label也是一样乱码,请问如何让angelscript支持Unicode?也就是如何让angelscript传给控件的SetText参数支持Unicode?

要避免这个问题,注册到脚本内的函数都不能使用LPCTSTR作为参数。。。。又要改一大片-_-!!

32位的没问题,64位的有问题。 原因是CDuiString类指针隐式转换的问题,一点都不能偷懒。。。所有输入参数是LPCTSTR的函数,都要单独注册了。