社区
C++ Builder
帖子详情
好久没发问,问个关于双字节的问题
rainfall19831109
2007-07-18 05:59:38
软件中使用了TMS的AdvMemo控件,目前我只能用这个控件了,不能用别的Memo控件代替了
问题是AdvMemo可以正确显示中文字,但当我按下退格键准备删除中文字的时候,只能删除该中文字的一半,另外一半还存在,造成乱码
而VCL带的Memo能根据当前的字符决定究竟是退2格还是1格
有没有什么方法入手修改这问题?
控件有源码的。。。
...全文
739
16
打赏
收藏
好久没发问,问个关于双字节的问题
软件中使用了TMS的AdvMemo控件,目前我只能用这个控件了,不能用别的Memo控件代替了 问题是AdvMemo可以正确显示中文字,但当我按下退格键准备删除中文字的时候,只能删除该中文字的一半,另外一半还存在,造成乱码 而VCL带的Memo能根据当前的字符决定究竟是退2格还是1格 有没有什么方法入手修改这问题? 控件有源码的。。。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
16 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
rainfall19831109
2007-07-25
打赏
举报
回复
不好意思。。。这阵比较忙忘记结帖了。。。
再次写cczlp(不惑)
cczlp
2007-07-20
打赏
举报
回复
有时间改BUG还不如自己写了, AdvMemo居然从TWinControl继承, 画图是方便了, 但Memo标准的Windows消息 EM_XXXX 都不响应了.
jacknes009
2007-07-20
打赏
举报
回复
void __fastcall TForm1::AdvMemo1KeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
}
中判断AdvMemo1有没有选中,判断位置,
按字节判断,字节大于0x80的应该是双字节,也就是
for(int i = 1; i <= AdvMemo1->Text.Length(); i++)
{
Byte ch = Memo1->Text.operator [](i);
if(ch > 0x80)
{
i++;
}
}
TurboCIU
2007-07-19
打赏
举报
回复
学习了,谢谢。
cczlp
2007-07-19
打赏
举报
回复
void __fastcall TForm1::AdvMemo1SelectionChange(TObject *Sender)
{
BOOL bLeadByte;
BOOL bTrailByte;
BOOL bLeadEnd;
BOOL bTrailEnd;
CheckText(AdvMemo1, AdvMemo1->SelStart, &bLeadByte, &bTrailByte);
CheckText(AdvMemo1, AdvMemo1->SelStart + AdvMemo1->SelLength, &bLeadEnd, &bTrailEnd);
if (bTrailByte)
{
AdvMemo1->SelStart--;
AdvMemo1->SelLength++;
}
else if (bTrailEnd)
{
AdvMemo1->SelLength++;
}
}
只能从左到右选择, 从右到左不行, 应该是AdvMemo的BUG .
mimong_lin
2007-07-19
打赏
举报
回复
mark学习。
MEFULEU
2007-07-19
打赏
举报
回复
板凳~
hagic
2007-07-19
打赏
举报
回复
学习
rainfall19831109
2007-07-19
打赏
举报
回复
这个Memo的Bug的确不少
昨晚我几乎通宵在修改这个Memo的源码
现在几乎改好了。。。各个按键都正常了。。。
但另外又有问题出现了,就是这个Memo它本身有提供Undo跟Redo的功能,可是效果很差(或者说根本就是Undo和Redo的结果不对!)
我现在还在修改当中。。。
不过无论如果,虽然没使用不惑的代码,还是感谢你的热心解答!
cczlp
2007-07-18
打赏
举报
回复
void CheckText(TAdvMemo *memo, int Index, BOOL *bLead, BOOL *bTrail)
{
int MultiStart = 0;
*bLead = false;
*bTrail = false;
for (int i = Index; i > 0; i--)
{
if ((BYTE)memo->Lines->Text[i] < 0xa0)
{
MultiStart = i;
break;
}
}
if ((BYTE)memo->Lines->Text[Index + 1] >= 0xa0)
{
*bLead = (Index - MultiStart) % 2 == 0;
*bTrail = !*bLead;
}
}
void __fastcall TForm1::AdvMemo1KeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
BOOL bLeadByte = false;//IsDBCSLeadByte(AdvMemo1->Lines->Text[AdvMemo1->SelStart + 1]);
BOOL bTrailByte = false;//AdvMemo1->Lines->Text.IsTrailByte(AdvMemo1->SelStart);
BOOL bHalf = FALSE;
CheckText(AdvMemo1, AdvMemo1->SelStart, &bLeadByte, &bTrailByte);
if ((Key == VK_DELETE && bLeadByte) || (Key == VK_BACK && bTrailByte))
{
bHalf = TRUE;
}
else if (Key == VK_LEFT)
{
if (!bTrailByte && AdvMemo1->SelStart > 1)
{
if ((BYTE)AdvMemo1->Lines->Text[AdvMemo1->SelStart] >= 0xa0)
{
bHalf = TRUE;
}
}
}
else if (Key == VK_RIGHT)
{
if (bLeadByte)
{
bHalf = TRUE;
}
}
if (bHalf)
{
AdvMemo1->OnKeyDown = NULL;
SendMessage(AdvMemo1->Handle, WM_KEYDOWN, Key, 0);
AdvMemo1->OnKeyDown = AdvMemo1KeyDown;
}
}
rainfall19831109
2007-07-18
打赏
举报
回复
感谢 cczlp(不惑)的代码。。
是挺有效。。。
不过我想从根本上改变这个问题,不知还有办法没。。。
现在情况是,如果我不是删除,只是选择里面文本的话
假如里面文本是“我a”,那么当我选择a和我的后半个字节的话,被选择的部分advMemo会显示一个另外的乱码字,就是把我的后半字节与a合并了
cczlp
2007-07-18
打赏
举报
回复
void __fastcall TForm1::AdvMemo1KeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
BOOL bLeadByte = IsDBCSLeadByte(AdvMemo1->Lines->Text[AdvMemo1->SelStart + 1]);
BOOL bTrailByte = AdvMemo1->Lines->Text.IsTrailByte(AdvMemo1->SelStart);
if ((Key == VK_DELETE && bLeadByte) || (Key == VK_BACK && bTrailByte))
{
AdvMemo1->OnKeyDown = NULL;
SendMessage(AdvMemo1->Handle, WM_KEYDOWN, Key, 0);
AdvMemo1->OnKeyDown = AdvMemo1KeyDown;
}
}
rainfall19831109
2007-07-18
打赏
举报
回复
KeyDown里根本就处理不了
本来控件已经存在对按键的处理
我再处理Lines属性的话会乱掉。。。因为情况是有时候是英文,有时候是中文
LuoGD
2007-07-18
打赏
举报
回复
那在它的ONKEYDOWN里处理,每按一下把它存储的内容删除一个(既然是TStrings),不过这样不一定很好,
rainfall19831109
2007-07-18
打赏
举报
回复
根本就不是这个问题
我看过控件的代码
里面用来储存文本的是一个自定义类,该类是从TStrings继承
LuoGD
2007-07-18
打赏
举报
回复
说明你的AdvMemo操作的是char*,而VCL的是AnsiString
【免费下载】 Crusader Kings II
双
字节
字符补丁(CK2dll)常见
问题
解决方案
Crusader Kings II
双
字节
字符补丁(CK2dll)是开源项目,基于Visual Studio用C++开发,通过dll注入解决游戏显示
双
字节
字符
问题
。新手使用时可能遇到安装、游戏启动失败、自动更新插件不工作等
问题
,文中给出了相应解决步骤。
CK2DLL
双
字节
补丁终极指南:彻底解决中文乱码
问题
CK2DLL
双
字节
补丁专为解决《十字军之王2》中文乱码
问题
设计,支持3.3.4版本,兼容主流MOD,优化中文字体显示。通过修改内存处理机制,实现中文正常渲染,安装简便,无需复杂配置,是中文玩家提升游戏体验的必备工具。
双
字节
乘法执行过程
本文详细解析了
双
字节
两数相乘的过程,包括积的存储方式、部分积求和技巧、修正高位地址的策略,以及如何确保低位先运算以处理进位
问题
。通过实例演示,帮助读者深入理解
双
字节
乘法的实现细节。
如何彻底解决《十字军之王II》
双
字节
字符显示
问题
本文详解《十字军之王II》
双
字节
字符(如中文、日文)显示异常的根本原因:原版引擎采用单
字节
编码,导致多
字节
字符被错误拆分。提出基于DLL注入的修复方案,涵盖Visual Studio编译环境搭建、CK2dll补丁构建、UTF-8文本渲染钩子实现及字体配置优化,并支持Steam/GOG多平台适配。
CK2DLL
双
字节
补丁:彻底解决十字军之王II中文乱码
问题
CK2DLL是一款针对《十字军之王II》的开源
双
字节
字符补丁工具,通过DLL注入技术修复游戏中文乱码
问题
。支持全场景文字显示优化、智能更新与轻量免修改安装,适用于Steam平台Windows版本,有效提升中文MOD兼容性与可读性。
C++ Builder
13,872
社区成员
102,696
社区内容
发帖
与我相关
我的任务
C++ Builder
C++ Builder相关内容讨论区
复制链接
扫一扫
分享
社区描述
C++ Builder相关内容讨论区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章