如何做一个平行显示两行文字,并且可以点击的文本输入控件?求思路

guofang 2012-07-11 11:03:28


就像这种

功能要求就是同时平行显示两行文本 一行中文 一行英文 上下位置对应

可以自动换行 换行不会截断中英文单词

鼠标可以划选编辑框内的文本


鼠标悬浮在文本上可以弹出下拉菜单

鼠标点击单词可以激发事件 将所点击单词拷贝出来


这种编辑框怎么做呢?
感觉delphi的Memo的派生不能实现这个功能
用canvas画文本 是死的 是个图片无法编辑

用透明的edit做 又没法划选 因为划选的时候是多个单词一起划选的

而且一个单词一个透明edit的话 会导致数千个控件堆积在程序里 会卡住

查了下vcl的customedit类 发现没有具体的实现过程 只是从windows那里拿来一个style就成为
可编辑文字的控件了 没有具体怎么让文字可以选择 怎么让文字可以删除的过程





...全文
248 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Frank.WU 2012-07-12
  • 打赏
  • 举报
回复
不能指望有现成的,很多文本编辑控件都是从 CustomControl 继承的呢。
JPEXE 2012-07-12
  • 打赏
  • 举报
回复
兄弟,看来你只能自制了,有难度的。
guofang 2012-07-12
  • 打赏
  • 举报
回复
两个richedit 应该不行吧 平行显示两行的意思是
a1a2
b1b2
a3a4
b3b4
a5a6
b5b6
......

这样交叉的 直到数千行

用现成的控件去组合 先不说能不能同时选择上下两行的内容 就说资源占用也不大可能
1000行就要1000个控件 那很快就卡住了
JPEXE 2012-07-12
  • 打赏
  • 举报
回复
试试用两个RichEdit
guofang 2012-07-12
  • 打赏
  • 举报
回复
不是一对一的关系 而是多对多的关系

work works working worked

对应

n 工作
n 职业
n 劳动
v 做事
v 使工作
v 管理
v 操作
v 可行
v 抽搐
n 工厂
n 部件
n 全套物品
adj 可行的


用richedit怎么让单词在特定位置显示呢?因为第一对词长度不等的,一般中文比英文的width长一些,所以第二对词定位的时候就要以第一对词的结尾为准, 这个时候richedit怎么定位第二对词的开始位置呢,而且是两行同时定位,这时候第一行还没结尾呢。

在指定坐标 textout显然不行,因为textout是画,不可选择,不可插入,不可编辑。

skertone 2012-07-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
关键是没思路 能用文字表述一下么?比如发什么消息 怎么个数据结构之类的

话说我现在也不知道怎么让canvas输出的文字 是可选择 复制 删除 插入的“活”文字 而不是图片
[/Quote]

实现这玩意,还是老一套 数据结构 + 算法

数据可以有两种方式

1.
一个节点 对应两组数据 一是英文单词 一是中文词句

一系统节点组成一串句子

2.
两个 StringList 一个为英文单词列表,一个为中文字串列表, 翻译关系一一对应。


显然 第二个方案容易实现些
第一个 用 ObjectList 也可以不难实现



算法实现

输出绘制:
因为如果不利用 RichEdit的显示能功能,要显示 自已放在 List中的内容只能 用Canvas来绘制了,问题也不会太大。工作量多些。但实现输入 如选择反白显示,光标这些还是挺麻烦.

所以要利用 RichText的语法 自已加些标记 每一个词就是一个 语法段, 自定义的标记显然 要加上词对应的 List.Index

输入绘制:
光标位置,选择相当同的 语法属性文件 (其实就是 一个词),通过获取自定义标记 就取得 Index 然后绘个Hint窗口,加两个Edit就搞得定。






guofang 2012-07-12
  • 打赏
  • 举报
回复
关键是没思路 能用文字表述一下么?比如发什么消息 怎么个数据结构之类的

话说我现在也不知道怎么让canvas输出的文字 是可选择 复制 删除 插入的“活”文字 而不是图片

5,379

社区成员

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

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