unit UnitFrmMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, RVStyle, RVScroll, RichView, RVEdit, ComCtrls;
type
TFormMain = class(TForm)
RvEdit: TRichViewEdit;
RVStyleCommon: TRVStyle;
BtnEditAddText: TButton;
RvView: TRichView;
BtnViewAddText: TButton;
BtnChangeLineSpacing: TButton;
BtnEditAddPicture: TButton;
BtnViewAddPicture: TButton;
SBarMain: TStatusBar;
BtnChangeBgImage: TButton;
procedure BtnEditAddTextClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure BtnViewAddTextClick(Sender: TObject);
procedure BtnChangeLineSpacingClick(Sender: TObject);
procedure BtnEditAddPictureClick(Sender: TObject);
procedure BtnViewAddPictureClick(Sender: TObject);
procedure RvEditJump(Sender: TObject; id: Integer);
procedure RvViewJump(Sender: TObject; id: Integer);
procedure BtnChangeBgImageClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FormMain: TFormMain;
implementation
{$R *.dfm}
uses
Math, GifImg, RVGifAnimate2007, CRVFData;
procedure RichViewAddPicture(RichView: TCustomRichView; const PicName: string;
Stream: TMemoryStream; IsGif: Boolean);
var
LGraphic: TGraphic;
begin
if IsGif then
begin
LGraphic := TGIFImage.Create;
end else
begin
LGraphic := TBitmap.Create;
end;
Stream.Position := 0;
LGraphic.LoadFromStream(Stream);
//在这里ParaNo=-1表示增加的还在上一个段落中
RichView.AddPictureEx(PicName, LGraphic, -1, rvvaBaseline);
end;
// 向RichView中增加单个文本对象
// 注意:此函数中S不能包含 (#13, #10, #9, #12)字符
procedure RichViewAddText(RV: TCustomRichView; const S: string;
FontInfo: TFontInfo; ParaNo: Integer; Tag: Integer);
const
RV_FIND_PROP: TRVFontInfoProperties =
[rvfiFontName, rvfiSize, rvfiBold, rvfiItalic,
rvfiUnderline, rvfiStrikeout, rvfiColor, rvfiUnicode, rvfiJump];
var
LStyleNo: Integer;
LNewFontInfo: TFontInfo;
begin
// 从关联的RVStyle中查找是否存在样式,这样能减小RvStyle中条目个数
LStyleNo := RV.Style.TextStyles.FindSuchStyle(0, FontInfo, RV_FIND_PROP);
if LStyleNo < 0 then
begin
LNewFontInfo := RV.Style.TextStyles.Add;
LNewFontInfo.Assign(FontInfo);
LNewFontInfo.Unicode := True;
LStyleNo := RV.Style.TextStyles.Count - 1;
end;
RV.AddNLWTag(S, LStyleNo, ParaNo, Tag);
end;
procedure RichViewAddTextEx(RV: TCustomRichView;
const S: string; const FontName: string; FontSize: Integer;
FontColor: TColor; FontStyle: TFontStyles; IsJump: Boolean;
ParaNo, Tag: Integer);
var
LFontInfo: TFontInfo;
begin
LFontInfo := TFontInfo.Create(nil);
try
LFontInfo.FontName := FontName;
LFontInfo.Size := FontSize;
LFontInfo.Color := FontColor;
LFontInfo.Style := FontStyle;
LFontInfo.Unicode := True;
LFontInfo.Jump := IsJump;
RichViewAddText(RV, S, LFontInfo, ParaNo, Tag);
finally
LFontInfo.Free;
end;
end;
procedure TFormMain.BtnChangeBgImageClick(Sender: TObject);
begin
// 注意:Load加载仅支持Bmp
RvView.BackgroundBitmap.LoadFromFile(ExtractFileDir(ParamStr(0)) + '\BgImage.BMP');
RvView.BackgroundStyle := bsTiled;
RvEdit.BackgroundBitmap.LoadFromFile(ExtractFileDir(ParamStr(0)) + '\BgImage.BMP');
RvEdit.BackgroundStyle := bsTiled;
end;
procedure TFormMain.BtnChangeLineSpacingClick(Sender: TObject);
begin
//改行距实际上是要改动RVStyle中的段落样式的值
//其中LineSpacingType还是其他值,可以参考帮助文档
RVStyleCommon.ParaStyles[0].LineSpacing := RandomRange(50, 200);
RVStyleCommon.ParaStyles[0].LineSpacingType := rvlsPercent;
//重新格式化一下会立即显示
RvEdit.Reformat;
RvView.Reformat;
end;
procedure TFormMain.BtnEditAddPictureClick(Sender: TObject);
var
LStream: TMemoryStream;
begin
LStream := TMemoryStream.Create;
try
LStream.LoadFromFile('Face.gif');
//注意:在Delphi2007下必须在RichViewEdit所在的Pas文件中,
// 加入RVGifAnimate2007单元引用,否则不会播放
//要设置动画格式为根据格式定义并启动动画
RvEdit.AnimationMode := rvaniOnFormat;
RvEdit.StartAnimation;
RichViewAddPicture(RvEdit, 'Face1', LStream, True);
RvEdit.Format;
finally
LStream.Free;
end;
end;
procedure TFormMain.BtnViewAddPictureClick(Sender: TObject);
var
LStream: TMemoryStream;
begin
LStream := TMemoryStream.Create;
try
LStream.LoadFromFile('Face.gif');
//注意:在Delphi2007下必须在RichViewEdit所在的Pas文件中,
// 加入RVGifAnimate2007单元引用,否则不会播放
//要设置动画格式为根据格式定义并启动动画
RvView.AnimationMode := rvaniOnFormat;
RvView.StartAnimation;
RichViewAddPicture(RvView, 'Face1', LStream, True);
//RichView必须格式化才能显示
RvView.Format;
finally
LStream.Free;
end;
end;
procedure TFormMain.BtnEditAddTextClick(Sender: TObject);
var
LNumStr: string;
begin
LNumStr := IntToStr(RandomRange(5000, 500000));
// 注意:插入和增加有区别,需要使用不同代码
// 如果要插入文本请参考下面代码
//将当前文本样式设置成随机值,段落样式设置成第1个
//RvEdit.ApplyTextStyle(LTextStyle);
//RvEdit.ApplyParaStyle(0);
//插入文本,然后加入一个换行符
//RvEdit.InsertTextW(LNumStr);
//RvEdit.InsertTextW(#13);
// 在后边增加文本用如下代码
RichViewAddTextEx(RvEdit, LNumStr, '宋体', 20, clRed, [fsBold, fsUnderline],
True, -1, Random(9999));
RvEdit.AddTextNLA(#13, 0, -1, 0);
// 只有在ReadOnly为True时才显示链接
RvEdit.ReadOnly := True;
RvEdit.Format;
end;
procedure TFormMain.BtnViewAddTextClick(Sender: TObject);
var
LNumStr: string;
begin
LNumStr := IntToStr(RandomRange(5000, 500000));
RichViewAddTextEx(RvView, LNumStr, '宋体', 20, clRed, [fsBold, fsUnderline],
True, -1, Random(9999));
RvView.AddTextNLA(#13, 0, -1, 0);
//RichView增加完成后需要调用Format或者FormatTail方法才能显示
RvView.Format;
//如果需要RichView增加完成后自动滚动到最底部有2种方法
// 第一种:
//RvView.Options = RvView.Options + [rvoScrollToEnd];
//RvView.FormatTail;
// 第二种
RvView.VScrollPos := RvView.VScrollMax;
end;
procedure TFormMain.FormCreate(Sender: TObject);
begin
Randomize;
end;
procedure TFormMain.RvEditJump(Sender: TObject; id: Integer);
var
LRVData: TCustomRVFormattedData;
LItemNo: Integer;
LTag: Integer;
LItemText: WideString;
begin
// 获取指定ID的文本项目的ItemNO
RvEdit.GetJumpPointLocation(id, LRVData, LItemNo);
// 获取Tag和项目文本
LTag := RvEdit.GetItemTag(LItemNo);
LItemText := RvEdit.GetItemTextW(LItemNo);
SBarMain.SimpleText := 'Text: ' + LItemText + '; Tag: ' + IntToStr(LTag);
end;
procedure TFormMain.RvViewJump(Sender: TObject; id: Integer);
var
LRVData: TCustomRVFormattedData;
LItemNo: Integer;
LTag: Integer;
LItemText: WideString;
begin
RvView.GetJumpPointLocation(id, LRVData, LItemNo);
LTag := RvView.GetItemTag(LItemNo);
LItemText := RvView.GetItemTextW(LItemNo);
SBarMain.SimpleText := 'Text: ' + LItemText + '; Tag: ' + IntToStr(LTag);
end;
end.