荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: Peter (小飞侠), 信区: Program
标 题: Delphi通用编辑器设计示例
发信站: BBS 荔园晨风站 (Thu Jan 21 22:42:15 1999), 转信
许多应用程序都要求有一个好的通用编辑器组件,而编写通用编辑
器往往是一件吃力不讨好的工作。现在Delphi2.0提供了一个很好的
编辑器控件——TRICHEDIT,它支持RTF(Ric Text Font)文件存储格式
,使用它可以使编辑器应用程序的设计工作大大简化。
在Delphi2.0\demos\richedit目录中有一个很好的示例程序,读
者可仔细研读,但把这个例子作为一个通用编辑器使用,功能还嫌不足
。读者可在此示例基础上按如下方法加以改进。
打开文件
如果要打开的文件是RTF格式,则只需使用其TRICHEDIT.LOADFROM
FILE方法即可。虽然将Trichedit.plaintext置为真可以显示英文纯
文本文件,但不能直接提供打开中文纯文本文件,想必没有哪个通用文
本编辑器不"认识"纯文本文件,所以必须自己编制转换程序。不过我
们不需要过于详细了解RTF文件存储格式。下面笔者将提供一种将文
本文件转换为宋体RTF格式文件的方法并调入编辑器。
1.将上文提到的Trichedit示例编译运行,然后将缺省字体改为宋
体,输入一字符,以MOA L.TXT存盘,然后在记事本中调入MODAL.TXT,删
去最后二行,加入一行:\pard\plain\f3\fs6\ cf0。
2.编写如下过程:
procedure convert;
var txtchar:char;
tmpstr:string;
size:integer;
tmpfile,txtfile:textfile;
begin
copyfile(‘modal.txt',‘convertf.tem',false);{拷贝文件头
}
assignfile(txtfile,opendialog.filename);{要转换的文本文
件}
assignfile(tmpfile,‘convertf.tem');{临时文件}
reset(txtfile);{以读方式打开文本文件}
append(tmpfile);{以添加方式打开临时文件}
while not eof(txtfile)do begin
read(txtfile,txtchar);
if ord(txtchar)=10 then read(txtfile,txtchar);
write(tmpfile,‘\par');{行首格式字符串}
while (ord(txtchar)<>13)and (not eof(txtfile))do begi
n
if ord(txtchar)>127 then{以汉字格式存储汉字字符}
write(tmpfile,‘\',char(39),bcdtohexhi(ord(txtch
ar)),bcdtohexlo(or( txtchar)))
else write(tmpfile,txtchar);{以普通方式存储英文字符
}
read(txtfile,txtchar);
end;
if ord(txtchar)=13 then
begin writeln(tmpfile,"");end;
else begin
if ord(txtchar)>127 then
writeln(tmpfile,‘\',char(39),bcdtohexhi(ord(txtcha
r)),bcdtohexlo(ordt xtchar)))
else writeln(tmpfile,txtchar);
end;
end;
write(tmpfile,‘\par}');
system.close(tmpfile);
system.close(txtfile);
end;
这样,转换后的结果存在convertf.tem中,bcdtohexhi和bcdtohex
lo将十进制数转换为6 进制数返回高位和低位字符。
存储文件
若想存为RTF格式,则直接用Trichedit.savetofile方法即可;若
想存为纯文本格式,则必须自己编程实现。
代码如下:
procedure saveastext;
var buffer:pchar;
filetosave:textfile;
textlenth:integer;
begin
textlenth:=richedit1.gettextlen+1;
getmem(buffer,textlenth);
richedit1.gettextbuf(buffer,textlenth);
assignfile(filetosave,‘filename.txt');
rewrite(filetosave);
writeln(filetosave,buffer);
system.close(filetosave);
end;
打印文件
Trichedit提供了print方法打印文件。打印时只需执行以下代码
即可:
if PrintDialog.Execute then RichEdit1.Print(FFileName)
;
为了提供丰富的打印能力,必须对Tprintdialog控件属性进行一
些设置:
Tprintdialog.options.popagenum:=true;{可打印选定页数范围
}
Tprintdialog.options.poselection:=true;{可打印选定文本}
Tprintdialog.maxpage:=100;{任一大值即可}
Tprintdialog.collate为真,则打印时自动按打印机纸宽排列字
符,反之则以屏幕显示为准。其它属性设为缺省值即可。
不过,如果想自己设置页边距,就得调用Windows API了。
查找字符串
TRICHEDIT提供了一个findtext方法,定义如下:
function FindText(const SearchStr:string;StartPos,Length
:Integer;Options:Te archTypes);Integer;
TSearchType定义如下:
TSearchType=set of (stWholeWord,stMatchCase);
TSearchTypes=set of TSearchType;
stWholeWord:全字匹配;stMatchCase:大小写匹配。
例如:我们想从文件头区别大小写查找一个‘abc’的字符串,则
加入以下代码:
strtosearch:‘abc';{string type}
selresult:=richedit1.findtext(strtosearch,1,richedit1.ge
ttextlen,[stMatchCs e]);
if selresult<>-1 then
begin
richedit.selstart:=selresult;
richedit.sellength:=length(strtosearch);
end;
请注意将HideSelection置为False。
另外,Trichedit.wordwrap若为真,则支持自动回车,反之则不支
持。
编制动态链接库
为了使通用编辑器能一劳永逸地在其它程序中使用,将程序编为
动态链接库是必要的。因为没有任何参数,所以这一动态链接库也可
以被C等调用。
具体方法如下:
①打开File|new...,在对话框中选定DLL模板。
②将已编制完成的编辑器FORM加入工程文件。
③编辑器FORM的implementation上加入一行过程说明:
procedure showeditform export;
④编辑器FORM的程序单元程序定义部分加入如下代码:
procedure showeditform
begin
editform:teditform.create(self);
editform.showmodal;
editform.destroy;
end;
⑤在工程定义文件中begin之前加入:
exports showeditform;
--
※ 来源:.BBS 荔园晨风站 bbs.szu.edu.cn.[FROM: 192.168.1.3]
[回到开始]
[上一篇][下一篇]
荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店