有没有人在什么地方看过关于如何“自己写一个”TMemo或TRichEdit的算法的说明或文章?

Frank6600 2015-01-24 05:43:07
有没有人在什么地方看过关于如何“自己写一个”TMemo或TRichEdit的算法的说明或文章?
我自己看过最接近的只有设计模式的组合模式和迭代子模式。
这几年来一直想自己写一个,反复写了两个,效果不好,代码凌乱不好维护。
谁见过类似这样的东西,麻烦转贴一下,谢谢。
...全文
211 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Frank6600 2015-01-28
  • 打赏
  • 举报
回复
> 不需要复杂算法吧。 > 这玩意要什么算法,需要的就是慢功夫,慢慢磨. 也许我用“算法”这个词没有正确的表达我的意思。 总之就是我实际在实现这个控件时,觉得有点无法完全掌控, 希望有些技巧(模式?数据结构?其他特殊方法、经验?),最终能够解决这些无法完全掌控的问题。 起初也不觉得太难,实际设计后,光下面这个问题就让我不知如何是好: 假设场景:在一个长达8页(暂时不考虑800页)的内容中, 1.用户在第1页第一段某处按了一下回车 回车造成第1页第1段分成2段,于是原本第2段以后位置,全部向下挤。 (这部份不论我怎么调整修改,始终有闪烁或画面刷新不乾净现象。 即便我已用了BeginUpdate, EndUpdate的技巧,使用户一个动作只会发生1次“从必须处开始刷新”, 还是稍微有闪烁;或者是类似闪烁,总之就是刷新得不乾净利落导致眼睛看起来画面脏脏的感觉) (大家都知道,一段里有n行,总共有m字,假设n大约10,m大约400;当原本第2段开始往下移, 最笨的方法就是从那一段开始,每一行每个字都重新刷新一次; 这种方式我实现过一次, 可能因为每一次字都要从相对位置计算相对于控件的绝对位置,显示时既慢又不舒服; 后来的做法是,段落内容每一次用bitmap记住, 段落移动时,重新在绝对位置paint bitmap一次, 这么做后感觉好了很多,但仍不太好, 而且缺点是,用户在用鼠标选择n个字导致那n个字必须显示被选择的底色时,bitmap的存在会导致其不会立即刷新, 因此bitmap的使用得区分时机点) 2.用户在第1行第1段某处连续快速地输入n个字,此时该段文字要像祖玛游戏那样,快速地向后向下流动, 当然,因此新增一行,又会发生像第1个问题一样的“后续段落位置下挤刷新”的问题; (看著祖玛,就会想它怎么实现的?想到的一个方法是用TGraphpicControl来画每个球 TGraphicControl又是怎么确保它移动一次位置,整个Canvas只刷新一次呢? 我因为不确定使用TGraphicControl是否能在鼠标选择n个字时正确地将鼠标动作传送给底层Control, 因此一直没使用TGraphicControl实现) 3.Replace时,如何快速取代内容且刷新乾净呢? 总之,就是这些看似简单、但我一直没有乾净利落地处理(当然同时还要保证代码也要乾净利落好维护)的琐碎问题, 不再详述。 网上查过Chrome核心的Layout概念,但它没有用户编辑内容的功能,似乎无法借鉴。 不知道有没有高手们怎么处理这方面问题的经验讨论或说明呢? 光Composite模式和迭代子模式不够啊。 谢谢suiyunonghen,有空会看一下WPTools和RichView代码。
haitao 2015-01-28
  • 打赏
  • 举报
回复
memo还好办一些:只有文本,而且字体大小统一、每行等高 richedit,多字体,有图文,其实比较复杂了 如果能文字自动环绕图片,那就是word了 如果图片支持不规则形状,文字的自动环绕 就更复杂了(word2007都没实现吧?)
lhy 2015-01-28
  • 打赏
  • 举报
回复
引用 6 楼 frank_lee_cn 的回复:
> 不需要复杂算法吧。 > 这玩意要什么算法,需要的就是慢功夫,慢慢磨. 也许我用“算法”这个词没有正确的表达我的意思。 总之就是我实际在实现这个控件时,觉得有点无法完全掌控, 希望有些技巧(模式?数据结构?其他特殊方法、经验?),最终能够解决这些无法完全掌控的问题。 起初也不觉得太难,实际设计后,光下面这个问题就让我不知如何是好: 假设场景:在一个长达8页(暂时不考虑800页)的内容中, 1.用户在第1页第一段某处按了一下回车 回车造成第1页第1段分成2段,于是原本第2段以后位置,全部向下挤。 (这部份不论我怎么调整修改,始终有闪烁或画面刷新不乾净现象。 即便我已用了BeginUpdate, EndUpdate的技巧,使用户一个动作只会发生1次“从必须处开始刷新”, 还是稍微有闪烁;或者是类似闪烁,总之就是刷新得不乾净利落导致眼睛看起来画面脏脏的感觉) (大家都知道,一段里有n行,总共有m字,假设n大约10,m大约400;当原本第2段开始往下移, 最笨的方法就是从那一段开始,每一行每个字都重新刷新一次; 这种方式我实现过一次, 可能因为每一次字都要从相对位置计算相对于控件的绝对位置,显示时既慢又不舒服; 后来的做法是,段落内容每一次用bitmap记住, 段落移动时,重新在绝对位置paint bitmap一次, 这么做后感觉好了很多,但仍不太好, 而且缺点是,用户在用鼠标选择n个字导致那n个字必须显示被选择的底色时,bitmap的存在会导致其不会立即刷新, 因此bitmap的使用得区分时机点) 2.用户在第1行第1段某处连续快速地输入n个字,此时该段文字要像祖玛游戏那样,快速地向后向下流动, 当然,因此新增一行,又会发生像第1个问题一样的“后续段落位置下挤刷新”的问题; (看著祖玛,就会想它怎么实现的?想到的一个方法是用TGraphpicControl来画每个球 TGraphicControl又是怎么确保它移动一次位置,整个Canvas只刷新一次呢? 我因为不确定使用TGraphicControl是否能在鼠标选择n个字时正确地将鼠标动作传送给底层Control, 因此一直没使用TGraphicControl实现) 3.Replace时,如何快速取代内容且刷新乾净呢? 总之,就是这些看似简单、但我一直没有乾净利落地处理(当然同时还要保证代码也要乾净利落好维护)的琐碎问题, 不再详述。 网上查过Chrome核心的Layout概念,但它没有用户编辑内容的功能,似乎无法借鉴。 不知道有没有高手们怎么处理这方面问题的经验讨论或说明呢? 光Composite模式和迭代子模式不够啊。 谢谢suiyunonghen,有空会看一下WPTools和RichView代码。
刷新可以等50毫秒或100毫秒一次。如果规定时间内被更改就刷新,不更改就不刷新。
武稀松 2015-01-27
  • 打赏
  • 举报
回复
这玩意要什么算法,需要的就是慢功夫,慢慢磨.
不得闲 2015-01-27
  • 打赏
  • 举报
回复
富文本编辑器,目前有WPTools和RichView是安全从底层自己实现的
lhy 2015-01-26
  • 打赏
  • 举报
回复
不需要复杂算法吧。
lyhoo163 2015-01-24
  • 打赏
  • 举报
回复
TRichEdit是一个比较好的控件,它支持Rich文本格式,支持类似WORD部分功能。 但我在D7中运用,它的汉字支持和英文字符混合运用,常出现错误。 希望在XE7中,能够较好的表现。

5,388

社区成员

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

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