社区
C++ Builder
帖子详情
好久没发问,问个关于双字节的问题
rainfall19831109
2007-07-18 05:59:38
软件中使用了TMS的AdvMemo控件,目前我只能用这个控件了,不能用别的Memo控件代替了
问题是AdvMemo可以正确显示中文字,但当我按下退格键准备删除中文字的时候,只能删除该中文字的一半,另外一半还存在,造成乱码
而VCL带的Memo能根据当前的字符决定究竟是退2格还是1格
有没有什么方法入手修改这问题?
控件有源码的。。。
...全文
669
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
2024
字节
跳动秋招技术面试题:Kafka+反射+分布式锁+volatile
围绕项目
问
了很多
问
题,和我讨论了怎么保证双写的一致性、消息队列中消息积压了怎么办、为什么要用到分布式锁、ZK的分布式锁的使用流程、ZK的选主策略、同步策略然后又围绕Kafka
问
了一些
问
题。3、有一个10G大小的...
2023 年初 Go 后端社招面经(
字节
、米哈游、富途、猿辅导)
目录背景面试准备面试
字节
跳动米哈游富途牛牛猿辅导总结一些推荐1. 背景距离上一次面试[1]已经过去快 3 年了,又碰上 2022 年互联网行业大动荡,很多企业都做出了裁员决定。身为互联网人要时刻关注自身成长,所以会...
写在 2023 年初的后端社招面试经历(四年经验):
字节
米哈游 富途 猿辅导
目录背景面试准备面试
字节
跳动米哈游富途牛牛猿辅导总结一些推荐1. 背景距离上一次面试[1]已经过去快 3 年了,又碰上 2022 年互联网行业大动荡,很多企业都做出了裁员决定。身为互联网人要时刻关注自身成长,所以会...
阿里后台四年,想要跳槽
字节
,艰难4面,已收开发岗offer
自己在阿里呆了四年目前是P6,感觉遇到了瓶颈P7一直上不去,这才我决定跳槽到
字节
试试 面试准备 ...3. 面试中哪些
问
题会被经常
问
到、面试中自己该如何回答。 4. 自己的简历该如何写。 “80%的off
字节
跳动的OKR也有不OK的时候
3月31日,
字节
跳动创始人张一鸣在公司成立九周年的庆典上的演讲刷屏了。其中,张一鸣用
字节
跳动双月会材料拼凑出的一段话被广泛传播。
C++ Builder
13,826
社区成员
102,678
社区内容
发帖
与我相关
我的任务
C++ Builder
C++ Builder相关内容讨论区
复制链接
扫一扫
分享
社区描述
C++ Builder相关内容讨论区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章