荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: 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软件 网络书店