DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: a12315
今日帖子: 52
在线用户: 20
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 reniastyc (天道玄虚) ▲▲▲△△ -
普通会员
2017/2/13 10:14:26
标题:
【ELT110】更加完善的可视化富文本控件 浏览:2251
加入我的收藏
楼主: 更新说明:
1、修复和完善了复制、剪切和粘贴功能。设定为默认快捷键(Ctrl + C、X、V)。
2、光标键可以控制光标位置(上下左右)
3、增加了光标闪烁功能。
4、增加鼠标控制功能为可选,默认开启鼠标控制滚动条。

目前存在以下问题:
1、复制功能如果对外,只能够复制文本,不能够复制格式。
2、粘贴功能一样只能够粘贴文本。这是由于相互间格式不通用的缘故,暂时还没想到解决办法。
3、还没有想到撤销功能的很好的实现方案,因此暂时没有撤销。

光标闪烁最终还是用计时器控件实现的,应该没有更好的实现手段了。

整体结构应该还存在优化空间,但是玄虚眼拙,实在是看不出了。如果哪位高手看出来了还望不吝赐教。

欢迎广大网友,各路大神提出宝贵的意见和建议。

源代码和演示程序位置:
https://pan.baidu.com/s/1csw0EE

由于个人原因,ELT109版本存在大量问题,各位就不要看了……
此帖子包含附件:
PNG 图像
大小:121.3K
----------------------------------------------
--O, ye Magnificient Deity's Miracle!
--I'm yet Reniastyc de El Magnifico.
作者:
男 reniastyc (天道玄虚) ▲▲▲△△ -
普通会员
2017/2/13 10:25:14
1楼: 代码文件可以做如下分类:

ELT为前缀的是单元文件和控件资源(图标资源文件)
Main为前缀的是工程文件,包括一个演示程序的工程,一个控件包的工程。还有一个工程组文件。打开工程组文件即可同时打开控件包和演示程序的工程。
UIPassage.bmp是控件图标文件,应该可以删除。
UnitTest是演示程序窗口文件。

整个核心的主文件是ELT_Main,ELT_Extra是几个非类的函数,ELT_Windows目前只含有一个获取Windows下字体的函数,核心文件中没有使用,放入其中只是为了方便。
目前还不知道安卓下获取已安装字体的方法。
----------------------------------------------
--O, ye Magnificient Deity's Miracle!
--I'm yet Reniastyc de El Magnifico.
作者:
男 vga (vga) ★☆☆☆☆ -
盒子活跃会员
2017/2/13 10:33:01
2楼: 向楼主致敬!!!
----------------------------------------------
-
作者:
男 starrysea (星海) ▲▲▲▲▲ -
普通会员
2017/2/13 12:06:55
3楼: 顶顶,, 赞一个
----------------------------------------------
挂机赚钱 https://www.yiluzhuanqian.com/P3VpZD0zNjY0MA%3D%3D
作者:
男 abcjingtong (jingtong) ★☆☆☆☆ -
普通会员
2017/2/13 12:59:38
4楼: 撤销和恢复,考验的不是技术水平,是设计水平,提供一个思路:
1.设计基类TCustomUndo,属性实现好文档操作对象的共同特性等,虚方法实现Redo等;
2.在1中基类的基础上设计好,样式撤销TTextStyleUnod、TParaStyleUndo、TEditUndo(或者拆分的更细些由TAppendUndo,TDeleteUndo,TReplaceUndo)等等相关操作的Undo类,继承并且实现好各自的Redo。
3.设计撤销步骤管理列表,TUndoList或栈;
4.每次操作都根据操作类型创建一个对应的TXXXUndo的实例,记录从哪个内容对象的哪部分,操作到哪个内部对象的哪部分(这里的对象就是文本和图片或表格或其他对象),同时赋值好1中所述的共同特性,插入或添加到TUndoList或压栈。
5.恢复时直接从TUndoList取出或出栈最近的一个执行Redo。
以上1、2和3的开发顺序可调换,根据自己的实际情况写就可以了。
如果要实现撤销-恢复-再撤销,就不能用栈了,同时也要处理好撤销到某一步后继续编辑时将该步后面的undo要删除掉,细节不再一一缀述;这是我能想到的一种思路,应该是具有可操作性的,当然最好是参考其他富文本控件的解决方法了解原理后自己消化吸收后繁殖。
----------------------------------------------
18114532@qq.com
作者:
男 cgzcgb (cgzcgb) ★☆☆☆☆ -
普通会员
2017/2/13 14:15:13
5楼: 改进建议:
1、当移动光标的时候,就不要一闪一闪的消失了(使用习惯)。
2、多输入几行,随意选择选择就会报Argument out of range.错误,然后就不能编辑了。
3、插入的图片是否可以支持改变大小。
4、说道win下面的富文本一定会想到rtf,所以如果能支持rtf格式就完美了。

另外,我看背景大概是个图片,这个图片是否可以透明?会不会和文字的背景透明度冲突?
----------------------------------------------
-
作者:
男 reniastyc (天道玄虚) ▲▲▲△△ -
普通会员
2017/2/13 15:41:22
6楼: 谢谢楼上几位的建议和支持。

插入的图片改变大小需要单击图片,然后在右下角的插图宽或者插图高那里输入数据,然后单击改变按钮。目前还不支持拖动改变大小。

经过多次测试,报错是因为选取后拖动的时候剪切行为与某个东西冲突,正在尝试解决。

背景图片的问题……你说的如果是上面那一个横杆,这个是绘制的。如果希望填充背景图片,目前还无法做到。这个和绘制的输出方式有关……

玄虚水平有限,还有很多不尽人意的地方,所以更需要大家的支持和建议。

我研究VCL下的richedit的撤销和FMX下memo的撤销后,发现这两个撤销用的是系统消息……
依照楼上的建议,的确可以设计出可行的撤销方案。

多谢各位的支持和建议
----------------------------------------------
--O, ye Magnificient Deity's Miracle!
--I'm yet Reniastyc de El Magnifico.
作者:
男 reniastyc (天道玄虚) ▲▲▲△△ -
普通会员
2017/2/13 15:42:30
7楼: 要支持RTF格式的话……
玄虚现在还没有研究RTF格式的协议,不过大致看了看,应该不成问题,只是需要研究研究,毕竟简单的网页生成也做出来了。
----------------------------------------------
--O, ye Magnificient Deity's Miracle!
--I'm yet Reniastyc de El Magnifico.
作者:
男 cgzcgb (cgzcgb) ★☆☆☆☆ -
普通会员
2017/2/13 15:56:22
8楼: firemonkey下的控件目前据我所知只有TMS有个富文本编辑器,楼主可以借鉴一下,原来试用过当内容比较多的时候效率就不行了,不知道现在搞成什么样了。
----------------------------------------------
-
作者:
男 reniastyc (天道玄虚) ▲▲▲△△ -
普通会员
2017/2/13 16:18:18
9楼: 找不到可以看到源码的TMS,只看到了官网的产品……

玄虚心里苦……

效率不行我估计是它重绘设计的不好。一开始我的设计也会卡,后面我改成了按照段落重绘,效率立马高出不少。

@cgzcgb 你看看我写的DrawToMap函数和Paint覆盖事件,你就知道如果每一次重绘的时候都按照全局重绘需要多占用多少资源了。

这个结构我不知道想了多久才设计出,但是这样就意味着不方便设计背景图片了,因为每一次重绘都是按照段落的,生成的是bmp。
我在FMX下没找到背景透明的png类,或许是有?
----------------------------------------------
--O, ye Magnificient Deity's Miracle!
--I'm yet Reniastyc de El Magnifico.
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2017/2/13 16:29:12
10楼: 支持。越来越好了。
----------------------------------------------
-
作者:
男 lordaeron (Terry) ★☆☆☆☆ -
禁用账号
2017/2/13 22:20:54
11楼: ……
被禁用帐号,帖子内容自动屏蔽!
……

----------------------------------------------
该账号是个傻逼
作者:
男 reniastyc (天道玄虚) ▲▲▲△△ -
普通会员
2017/2/14 8:38:50
12楼: 为什么你们这种大佬要在一般的中文字里面夹杂英文……

程序内的复制粘贴已经修复了,谢谢楼上的指点。但是如何自定义Clipboard的格式,我还不太懂。

谢谢关于撤销重做的指点,我现在有了思路,等思路清晰了就开始动手。
----------------------------------------------
--O, ye Magnificient Deity's Miracle!
--I'm yet Reniastyc de El Magnifico.
作者:
男 lordaeron (Terry) ★☆☆☆☆ -
禁用账号
2017/2/14 10:24:01
13楼: ……
被禁用帐号,帖子内容自动屏蔽!
……

----------------------------------------------
该账号是个傻逼
作者:
男 reniastyc (天道玄虚) ▲▲▲△△ -
普通会员
2017/2/14 11:27:36
14楼: 谢谢楼上的指点。我已经明白您的意思了。

只是FMX下,如何把网页的内容连带格式一起复制到粘贴板(Clipboard)里面呢?
我能够做到把选取的部分转换成网页,但是我只查到了有关复制的这个代码:

if TPlatformServices.Current.SupportsPlatformService(IFMXClipboardService, IInterface(ClipService)) then
  try
    s := ClipService.GetClipboard.ToString;
  finally
  end;

并没有找到如何把格式带进粘贴板中。
----------------------------------------------
--O, ye Magnificient Deity's Miracle!
--I'm yet Reniastyc de El Magnifico.
作者:
男 lordaeron (Terry) ★☆☆☆☆ -
禁用账号
2017/2/14 17:56:29
15楼: ……
被禁用帐号,帖子内容自动屏蔽!
……

----------------------------------------------
该账号是个傻逼
作者:
男 reniastyc (天道玄虚) ▲▲▲△△ -
普通会员
2017/2/14 19:20:18
16楼: 大哥,还是说中文吧……

我并不是使用的html格式,在粘贴板中存在的也只是TStringList格式,至于复制格式的实现,我其实是另外储存了,并不是储存在粘贴板中。只是在粘贴的时候校对一下文本,如果一致就调取另外储存的内容。

而且,我其实到现在还不是很清楚如何把HTML格式储存在粘贴板中,也不清楚如何校验格式什么的。

对于粘贴板,我了解的真的很少……
----------------------------------------------
--O, ye Magnificient Deity's Miracle!
--I'm yet Reniastyc de El Magnifico.
作者:
男 lordaeron (Terry) ★☆☆☆☆ -
禁用账号
2017/2/14 19:55:17
17楼: ……
被禁用帐号,帖子内容自动屏蔽!
……

----------------------------------------------
该账号是个傻逼
作者:
男 reniastyc (天道玄虚) ▲▲▲△△ -
普通会员
2017/2/14 21:49:49
18楼: 这……这样啊,看来是我想复杂了额

谢啦
----------------------------------------------
--O, ye Magnificient Deity's Miracle!
--I'm yet Reniastyc de El Magnifico.
作者:
男 iamdream (银河恒久远,梦想无止境!) ★☆☆☆☆ -
大贡献会员
2017/2/15 13:47:36
19楼: 也可以用RegisterClipboardFormat注册你自己的格式,然后粘贴时自己解析格式,可以参考一下Delphi里CF_COMPONENTS之类的自定义剪贴板格式。
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
男 reniastyc (天道玄虚) ▲▲▲△△ -
普通会员
2017/2/16 10:07:26
20楼: 这是一个系统定义的函数吗?需要引用哪个单元呢?
我这里显示没有定义这个函数诶。
----------------------------------------------
--O, ye Magnificient Deity's Miracle!
--I'm yet Reniastyc de El Magnifico.
作者:
男 reniastyc (天道玄虚) ▲▲▲△△ -
普通会员
2017/2/16 10:19:00
21楼: 可以详细地讲一下关于这一方面的格式注册吗?我不是很懂诶。

谢谢啦。

@iamdream (银河恒久远,梦想无止境!)
----------------------------------------------
--O, ye Magnificient Deity's Miracle!
--I'm yet Reniastyc de El Magnifico.
作者:
男 tianpanhaha (tianpanhaha) ▲▲▲▲△ -
普通会员
2017/2/16 11:39:51
22楼: 写个wps阿
----------------------------------------------
 QQ群:325010556 欢迎加入。
作者:
男 iamdream (银河恒久远,梦想无止境!) ★☆☆☆☆ -
大贡献会员
2017/2/16 12:23:14
23楼: {
网上找了些代码,自己试了下,可行。在D7/Delphi XE下编译通过。
}
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, RichEdit, Clipbrd;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    RichEdit1: TRichEdit;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
  CF_RTF: Word = 0;

procedure RTFtoClipboard(txt: string; rtf: Ansistring);
var
  Data: Cardinal;
begin
  with Clipboard do
  begin
    Data := GlobalAlloc(GHND or GMEM_SHARE, Length(rtf)*SizeOf(Char) + 1);
    if Data <> 0 then
      try
        StrPCopy(GlobalLock(Data), rtf);
        GlobalUnlock(Data);
        Open;
        try
          AsText := txt;
          SetAsHandle(CF_RTF, Data);
        finally
          Close;
        end;
      except
        GlobalFree(Data);
        ShowMessage('Unable to copy the selected RTF text');
      end
    else
      ShowMessage('Global Alloc failed during Copy to Clipboard!');
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  txt: string;
  rtf: string;
  ss: TStringStream;
begin
  txt := Self.RichEdit1.Text;
  ss := TStringStream.Create('');
  try
    Self.RichEdit1.Lines.SaveToStream(ss);
    rtf := ss.DataString;
  finally
    ss.Free;
  end;
  RTFtoClipboard(txt, rtf);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  rtf: Ansistring;
begin
  Clipboard.Open;
  try
    if Clipboard.HasFormat(CF_RTF) then begin
      rtf := StrPas(PAnsiChar(GlobalLock(Clipboard.GetAsHandle(CF_RTF))));
      Memo1.Lines.Add(rtf);
    end else begin
      ShowMessage('The clipboard does not contain RTF text!');
    end;
  finally
    Clipboard.Close;
  end;
end;

initialization
  CF_RTF := Windows.RegisterClipboardFormat(RichEdit.CF_RTF);

end.
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
男 wk_knife (wk_knife) ★☆☆☆☆ -
盒子活跃会员
2017/2/16 15:56:49
24楼: 楼主不畏艰难的决心还是值得钦佩的。不是说笑,做好了就是求伯君第二啊!
----------------------------------------------
-
作者:
男 reniastyc (天道玄虚) ▲▲▲△△ -
普通会员
2017/2/16 19:52:31
25楼: @iamdream (银河恒久远,梦想无止境!)

谢谢您费心,可是我这个核心作用平台是Firemonkey啊……也就是说,不能够使用WindowsAPI,也没有Richedit这个类可用啊……

这就是为什么强调这个是Firemonkey下的富文本核心的缘故。如果是VCL下,可以使用WindowsAPI和Richedit类,就方便很多了。

可能FIremonkey下也有类似的实现,我自己研究下好了。

谢谢楼上的肯定,不过还是过誉了吧。哪里达到了WPS这个程度啊。
----------------------------------------------
--O, ye Magnificient Deity's Miracle!
--I'm yet Reniastyc de El Magnifico.
作者:
男 iamdream (银河恒久远,梦想无止境!) ★☆☆☆☆ -
大贡献会员
2017/2/17 8:49:32
26楼: 哦,不好意思,没搞过Firemonkey……
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
男 reniastyc (天道玄虚) ▲▲▲△△ -
普通会员
2017/2/17 9:38:35
27楼: 没事,还是谢谢了。
----------------------------------------------
--O, ye Magnificient Deity's Miracle!
--I'm yet Reniastyc de El Magnifico.
作者:
男 abcjingtong (jingtong) ★☆☆☆☆ -
普通会员
2017/2/17 9:43:40
27楼: 关于FMX下的剪切板操作,见sample中的Object Pascal\Multi-Device Samples\User Interface\CopyPaste ,如果要处理自定义的格式,可使用FMX.Clipboard中的相关类
----------------------------------------------
18114532@qq.com
作者:
男 reniastyc (天道玄虚) ▲▲▲△△ -
普通会员
2017/2/17 19:45:07
28楼: 谢谢楼上,看到这个单元了。研究下应该能够实现。
----------------------------------------------
--O, ye Magnificient Deity's Miracle!
--I'm yet Reniastyc de El Magnifico.
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行132.8125毫秒 RSS