首先说下开发环境,Win10 , Embarcadero® Delphi 10.2
在用RxDBRichEdit之前,我是用OleContainer的,比如以下这段
OleContainer1.CreateObject('Word.document',False);
OleContainer1.DoVerb(ovPrimary);
OleContainer能够在程序中完整的显示出Word的界面,相当漂亮
但问题也很多
1、菜单经常无故消失,或者跑到别的界面上
2、用户环境不同对执行速度影响很大
3、用户使用不同版本的Office很要命
4、如果里面有图片,运行会更慢
我在开发消息系统时,虽然在自己的开发环境里运行一切正常,但使用者的电脑配置较低时,就会出现卡顿甚至假死,使用高版本Office时,有时会提示没有某个功能等等,总之问题很多,运行不稳定,最终我放弃了OleContainer。
最完美的结果是,用Richedit可以显示图片和文字,文字又可以排版,好处是稳定,速度快。但问题是直接将图片粘贴进Richedit后保存进数据库,再提取时图片没有了,后面的文字也没有了,经过我无数次尝试,终于找到了解决方法,现在分享给大家。
1、首先加入RichEx,来源http://www.delphitop.com/html/kongjian/1938.html
2、加入RxDBRichEdit,对应数据库字段类型为Image
3、在屏幕上截屏后,clipboard上面是图像
4、增加一个按钮,负责将clipboard上的图像导入RxDBRichEdit
5、写按钮的Click事件,如果写在KeyDown事件更好,处理Ctrl+V事件,我还没尝试过。
procedure TForm1.Button1Click(Sender: TObject);
var
map:tbitmap;
begin
inherited;
if clipboard.HasFormat(cf_bitmap) then
//判断剪切板中是否是图像
begin
map:=tbitmap.Create;
map.assign(clipboard);
image1.Picture.Assign(map);
InsertBitmap(RxDBRichEdit1.Handle,map);
map.Free;
end else
begin
ShowMessage('没有图片或不支持的图片格式');
end;
end;
消息编辑时,先截屏,再点击右上角的按钮,在文字中间导入图片
从数据库提取后显示,图片和文字显示正常
说明:
1、在导入前要用clipboard的HasFormat判断下是不是图像
2、InsertBitmap是RichEx里的函数
3、要引用Vcl.Clipbrd,RichEx