RichViewEdit特殊操作

RichviewEdit 图文保存操作

首先要转换成stream后才能对RichviewEdit进行正确的读和写
function SaveRVFToField(rv: TCustomRichView; tbl: TTable;
const FieldName: String): Boolean;
var Stream: TStream;
begin
Stream :=TMemoryStream.Create;
try Result := rv.SaveRVFToStream(Stream, False);
Stream.Position := ;
TBlobField(tbl.FieldByName(FieldName)).LoadFromStream(Stream);
finally
Stream.Free;
end;
end; function LoadRVFFromField(rv: TCustomRichView; tbl: TTable;
const FieldName: String): Boolean;
var Stream: TStream;
begin
Stream := TMemoryStream.Create;
try
TBlobField(tbl.FieldByName(FieldName)).SaveToStream(Stream);
Stream.Position := ;
Result := rv.LoadRVFFromStream(Stream);
finally
Stream.Free;
end;
rv.Format;
end; 以上的两个函数是把RichviewEdit的内容保存到数据库里面的做法。但是, RichViewEdit的图片内容保存到数据库后,有些图片保存的时候看起来是正常的,但是再从数据库里面读出来就看不到图片了,但是这种状况并不是每张图片都会发生,有些图片放进去数据库后又能正常显示,百思不得其解!
后来在RichViewEdit的RVFOptions——rvfoSaveBinary设置成False,这样从数据库里面读取出来的图片就都能正常显示了。 让 RichviewEdit 内容转换成图片
procedure TSendDataFrm.btnR2BClick;
const
VERYLARGEVALUE = $FFFFFFF;
var
iWidth, iHeight: integer;
Canvas: TMetafileCanvas;
bmp: TBitmap;
wmf: TMetafile;
i, j, k: integer;
begin
RVE.HScrollPos := ;
RVE.VScrollPos := ;
RVE.Deselect;
RVE.Invalidate;
k := ;
for i := to RVE.LineCount - do
begin
j := RVE.Canvas.TextWidth(RVE.GetItemTextA(i)); //+RVE.GetItemTextR(i)图片长
if j > K then
k := j;
end;
iWidth := k;
iHeight := RVE.RVData.DocumentHeight - ; Image1.Picture.Bitmap.Width := iwidth;
Image1.Picture.Bitmap.Height := iHeight;
bitblt(Image1.Picture.Bitmap.Canvas.Handle, -, -
, RVE.Width, RVE.Height, GetWindowDC(RVE.Handle), , , SRCCOPY);
image1.Refresh; 让 RichviewEdit 支持中文
⑴ 设置RichViewEdit下面的几个属性:
① TRVRTFReaderProperties → ParaStyleMode → rvrsAddIfNeeded
② TRVRTFReaderProperties → TextStyleMode → rvrsAddIfNeeded
③ TRVRTFReaderProperties → UnicodeMode → rvruOnlyUnicode
⑵ 设置RVStyle:
双击该控件,在弹出的窗体里选定里面5个子项,然后在属性窗体里找到
Unicode属性,全部改为:True;

ichEdit的内容保存为图片

uses RichEdit;
{将RichEdit1的内容保存为图片,此函数也适合于RxRichEdit,即RichEdit: TRxRichEdit}
procedure RichEditToCanvas(RichEdit: TRichEdit; Canvas: TCanvas; PixelsPerInch: Integer);
var
ImageCanvas: TCanvas;
fmt: TFormatRange;
begin
ImageCanvas := Canvas;
with fmt do
begin
hdc:= ImageCanvas.Handle;
hdcTarget:= hdc;
rc:= Rect(, ,
ImageCanvas.ClipRect.Right * div PixelsPerInch,
ImageCanvas.ClipRect.Bottom * div PixelsPerInch);
rcPage:= rc;
chrg.cpMin := ;
chrg.cpMax := RichEdit.GetTextLen;
end;
SetBkMode(ImageCanvas.Handle, TRANSPARENT);
RichEdit.Perform(EM_FORMATRANGE, , Integer(@fmt));
RichEdit.Perform(EM_FORMATRANGE, , );
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
RichEditToCanvas(RichEdit1, Image1.Canvas, Self.PixelsPerInch);
Image1.Refresh;
end; TRichEdit的打印预览 Rich Edit控件(我们说的是标准的Windows控件,不是一个Delphi构件)包含内置的打印特性,可以使用这个特性向打印机传送格式化的文本,或是通过程序员稍微地努力就可将它的内容绘制到任何Canvas上。
当然,标准的Delphi TRichEdit构件封装了这一特性。我们可以使用这一可能性来制作一个快速的比例缩放的打印预览,或者将Rich Text绘制到任何Delphi控件上。
将Rich Edit控件绘制到任何Canvas上,涉及使用标准Rich Edit控件消息EM_FORMATRANGE。
这个消息的lParam参数是一个指向TFormatRange纪录的指针。在将消息传递给RichEdit之前,必须填充这个记录。
TFORMATRANGE记录包含一个rich edit控件用于格式化输出它的内容到特定设备的信息。这里的
hdc —— 要渲染的设备。
HdcTarget —— 要格式化的目标设备。
rc —— 要渲染的区域。使用的测量单位是缇。缇是一种不受屏幕约束(screen-independent)的单位,以确保屏幕元素的比例在所有显示系统上都相同。一缇被定义为一英寸的1/。
RcPage —— 渲染设备的整个区域。使用的测量单位是缇。
chrg —— TCHARRANGE记录指定了格式化文本的范围。
这个记录通常被EM_EXGETSEL和EM_EXSETSEL消息使用,它包含两个域:cpMin和cpMax。 cpMin 是一个字符位置索引,直接位于范围内第一个字符之前。
cpMax 是一个字符位置索引,直接位于范围内最后一个字符之后。
打印一个Rich Edit控件到一个位图上用于预览 完整页代码:
unit Unit1; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, ExtCtrls, RichEdit; type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Image1: TImage;
RichEdit1: TRichEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; var
Form1: TForm1; implementation {$R *.dfm} function PrintRTFToBitmap(ARichEdit : TRichEdit; ABitmap : TBitmap) : Longint;
var
range : TFormatRange;
begin
FillChar(Range, SizeOf(TFormatRange), );
// 渲染我们要测量的相同DC。
Range.hdc := ABitmap.Canvas.handle;
Range.hdcTarget := ABitmap.Canvas.Handle;
// 设定页。
Range.rc.left := ;
Range.rc.top := ;
Range.rc.right := ABitmap.Width * div Screen.PixelsPerInch;
Range.rc.Bottom := ABitmap.Height * div Screen.PixelsPerInch;
// 打印文本的缺省范围为整个文档。
Range.chrg.cpMax := -;
Range.chrg.cpMin := ;
// 格式化文本。
Result := SendMessage(ARichedit.Handle, EM_FORMATRANGE, , Longint(@Range));
// 释放缓冲信息。
SendMessage(ARichEdit.handle, EM_FORMATRANGE, ,);
//Image1.Refresh;
end;
// 接下来的实例显示了不只是如何将Rich Edit绘制到任何Canvas上,还包括如何只绘制选择的文本范围。
function PrintToCanvas(ACanvas : TCanvas; FromChar, ToChar : integer;
ARichEdit : TRichEdit; AWidth, AHeight : integer) : Longint;
var
Range : TFormatRange;
begin
FillChar(Range, SizeOf(TFormatRange), );
Range.hdc := ACanvas.handle;
Range.hdcTarget := ACanvas.Handle;
Range.rc.left := ;
Range.rc.top := ;
Range.rc.right := AWidth * div Screen.PixelsPerInch;
Range.rc.Bottom := AHeight * div Screen.PixelsPerInch;
Range.chrg.cpMax := ToChar;
Range.chrg.cpMin := FromChar;
Result := SendMessage(ARichedit.Handle, EM_FORMATRANGE, , Longint(@Range));
SendMessage(ARichEdit.handle, EM_FORMATRANGE, ,);
end;
{use PrintRTFToBitmap function}
procedure TForm1.Button1Click(Sender: TObject);
var
Bmp: TBitmap;
begin
Bmp := TBitmap.Create;
bmp.Width := RichEdit1.ClientWidth;
bmp.Height := RichEdit1.ClientHeight;
PrintRTFToBitmap(RichEdit1, Bmp);
Image1.Canvas.Draw(, , Bmp);
bmp.Free;
end; {use PrintToCanvas function}
procedure TForm1.Button2Click(Sender: TObject);
var
Bmp: TBitmap;
begin
Bmp := TBitmap.Create;
bmp.Width := RichEdit1.ClientWidth;
bmp.Height := RichEdit1.ClientHeight;
PrintToCanvas(bmp.Canvas, , Length(RichEdit1.Text), RichEdit1, Bmp.Width, Bmp.Height);
Image1.Canvas.Draw(, , Bmp);
bmp.Free;
end; end.

richviewedit表格设置

table.BorderStyle := rvtbRaisedColor;
table.CellBorderStyle := rvtbLoweredColor;
table.BorderLightColor := $00FAF1C9;
table.BorderColor := $00A98E10;
table.CellBorderLightColor := $00FAF1C9;
table.CellBorderColor := $00A98E10;
table.Color := $00EAC724;
table.BorderWidth := ;
table.CellBorderWidth := ;
table.CellPadding := ;
table.CellVSpacing := ;
table.CellHSpacing := ;
table.BorderVSpacing := ;
table.BorderHSpacing := ;

richviewedit弹出对话框插入链接

FrmUrl.Edit1.Text := Target;
if FrmUrl.ShowModal = mrOk then
begin
Target := FrmUrl.Edit1.Text;
if rve.SelectionExists then
begin
if Target = '' then
rve.ApplyStyleConversion(CONVERT_TO_NONHYPERTEXT)
else
rve.ApplyStyleConversion(CONVERT_TO_HYPERTEXT);
SetTargetToSelection(Target);
end
else if Target = '' then
Beep
else
begin
rve.CurTextStyleNo := GetHypertextStyleNo(rve.CurTextStyleNo);
rve.InsertStringTag(FrmUrl.Edit2.Text, Target);
end;
end;

richviewedit压缩保存更新

procedure TMDIChild.FormClose(Sender: TObject; var Action: TCloseAction);
var
query: TUniQuery;
UniConnection:TUniConnection;
mstream: TStream;
//Stream:TMemoryStream;
begin
if Self.Tag= then
begin
//需要对文本改变事件进行保存
query:=TUniQuery.Create(nil);
UniConnection:=TUniConnection.Create(nil);
IF Application.MessageBox('文本已经改变是否保存!','警告',MB_OKCANCEL)=ID_OK then
begin
try
try
if RichViewEdit1.Modified then //当已打开的文件被修改了以后
begin
mstream:=TMemoryStream.Create;
//des:= TStringStream.create('');
//Stream:=TMemoryStream.Create;
//RxRichEdit1.Lines.SaveToStream(mstream);//需要对这个流文件进行压缩
//RxRichEdit1.Lines.SaveToStream(Stream);//需要对这个流文件进行压缩
Sqlite_Open(Self.Hint,KeyPwd,UniConnection);
query.Connection:=uniConnection;
query.SQL.Text :='UPDATE Rich SET F_Con = :F_Con WHERE id = :id' ;
query.ParamByName('id').AsString := TitleLbl.Hint;
RichViewEdit1.SaveRTFToStream(mstream,false);
mStream.Position :=;
query.ParamByName('F_Con').LoadFromStream(mStream, DB.ftBlob);
//query.ParamByName('F_Con').LoadFromStream(CompressionStream(Stream), DB.ftBlob);
query.Execute;
mStream.Free;
end;
except
begin end
end;
finally
query.Free;
UniConnection.Free;
end;
end;
end;
Action := caFree; end;
procedure TMainForm.UpdateRich(Sender: TObject;ID,Title,DBPath:string);
var
query:TUniQuery;
Conn:TUniConnection;
Child: TMDIChild;
Stream:TStream;
begin
try
Child:=TMDIChild(Sender);
Conn:=TUniConnection.Create(nil);
Sqlite_Open(DBPath,KeyPwd,Conn);
query:=TUniQuery.create(nil);
query.Connection := Conn;
query.SQL.Clear;
query.SQL.Add('Select id,N_name,F_Con from Rich where id=:id');
query.ParamByName('id').AsString := ID;//NodeID;
query.Open;
if query.RecordCount> then
if not query.FieldByName('F_Con').IsNull then
begin
Child.TitleLbl.Caption:=query.FieldByName('N_name').AsString;
Child.RichViewEdit1.BeginUpdate;
Stream:=TMemoryStream.Create;
TBlobField(query.FieldByName('F_Con')).SaveToStream(Stream);
Stream.Position := ;
Child.RichViewEdit1.LoadRTFFromStream(Stream);
Child.RichViewEdit1.Format;
//Stream:=TMemoryStream.Create;
//TBlobField(query.FieldByName('F_Con')).SaveToStream(Stream);
//Child.rxRichEdit1.Lines.LoadFromStream(UnCompressionStream(Stream));
//Child.rxrichedit1.Lines.EndUpdate;
Child.RichViewEdit1.EndUpdate;
//Stream.Free;
End
else
begin
Child.TitleLbl.Caption:=Title;
//Child.rxrichedit1.Clear;
Child.RichViewEdit1.Clear;
end
else
begin
Child.TitleLbl.Caption:=Title;
//Child.rxrichedit1.Clear;
Child.RichViewEdit1.Clear;
end;
query.close;
query.Free;
Conn.Free;
except
end;
end;

查询表是否存在

cmd.CommandText = "SELECT COUNT(*) FROM sqlite_master where type='table' and name='DBInfo'";

RichViewEdit的更多相关文章

  1. delphi 解决RichViewEdit乱码问题

    ⑴ 设置RichViewEdit下面的几个属性: ① RTFReaderProperties → ParaStyleMode → rvrsAddIfNeeded ② RTFReaderProperti ...

  2. Delphi PDF

    llPDFLib,TPDFDocument 2016开始开源. procedure TForm2.Button1Click(Sender: TObject); var lPdf : TPdfDocum ...

  3. RichView

    TRichView中文文档 TRichView 是Delphi/C++Builder  控件,主要用于显示.编辑和打印超文本文档. 新版本解决多个兼容性问题,更新了字符串标签.剪贴板.RTF和DB组件 ...

  4. delphi RichView的使用介绍

    RichView 组件 由 9 个组件模块组成,分别是: 1.TRVStyle:主要是定义RICHVIEW样式,定义后,其它RIHCVIEW都可以引用此样式.  2.TRichView :主要用于显示 ...

随机推荐

  1. Mybatis基于XML配置SQL映射器(二)

    Mybatis之XML注解 之前已经讲到通过 mybatis-generator 生成mapper映射接口和相关的映射配置文件: 下面我们将详细的讲解具体内容 首先我们新建映射接口文档  sysUse ...

  2. [CSP-S模拟测试]:影魔(树状数组+线段树合并)

    题目背景 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄.每一个灵魂,都有着自己 ...

  3. 关于Extjs6.0 controller文件过大,实现模块化分离

    Extjs一般都是一个视图对应着一个controller 一旦碰到视图中逻辑过于繁琐造成controller文件过大不利于维护和修改,所以要通过混入mixins混入功能来实现模块化! 首先创建一个视图 ...

  4. 耗时十个月的德国APS,教会我的学习方法

    考过了准备了10个月的Aps ,想送给关注我的8175个粉丝,一份礼物,感谢你们看的起我,对我的支持和关注. 这份礼物,我就大言不惭的称之为:达令的学习方法. 我的考试经历:高考两次,中戏艺考三试,导 ...

  5. PHP面试 PHP基础知识 十一(开发环境及相关配置)

    开发环境及相关配置 版本控制软件 集中式和分布式 集中式:集中式版本控制工具,版本库集中存放在中央服务器,团队成员里的每个人工作时从中央服务器下载代码,个人修改后再提交到中央服务器 分布式:分布式版本 ...

  6. java入门经验分享——记面向对象先导课程学习感想

    选择在暑期学习面向对象先导课程的初衷是为大二下学期面向对象课程做一些铺垫,接触入门java语言.在接触java的过程中,就编程语言的学习方法而言,我从刚入学时的手慌脚乱四处寻求帮助到现在慢慢养成了自己 ...

  7. .net报错大全

    1.未能加载文件或程序集“Newtonsoft.Json, Version=4.5.0.0"[已解决] 解决方案:https://blog.csdn.net/mzl87/article/de ...

  8. 20140902 字符串拷贝函数 右旋转字符串 string类的编写

    1.strncpy字符串拷贝函数 //strncpy的程序 #include<stdio.h> #include<assert.h> char *strncpy1(char * ...

  9. Spring Boot国际化支持

    本章将讲解如何在Spring Boot和Thymeleaf中做页面模板国际化的支持,根据系统语言环境或者session中的语言来自动读取不同环境中的文字. 国际化自动配置 Spring Boot中已经 ...

  10. Python运维-获取当前操作系统的各种信息

    #通过Python的psutil模块,获取当前系统的各种信息(比如内存,cpu,磁盘,登录用户等),并将信息进行备份 # coding=utf-8 # 获取系统基本信息 import sys impo ...