程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi實現同類型文檔自動合並

Delphi實現同類型文檔自動合並

編輯:Delphi

1.引言

最近,買了一張英語900句的學習光盤,因為沒有相應的書面文字材料,就想自己將光盤中的文檔提取出來,可一打開光盤,發現雖然每一句都有相應的詳細文字材料,但每一句都單獨存放在一個獨立的RTF文檔中(Sentence001.rtf至Sentence900.rtf),使用起來非常麻煩,於是就想將所有900句句型的文字材料合並到一起,即將900個獨立的文檔合並為一個文檔。

2.解決方法

2.1 常規方法

首先想到的方法就是利用Word的文檔合並功能,即將另一篇 Word 文檔插入到當前打開的文檔中的方法。具體操作步驟為:

① 打開sentence001(在打開文件的對話中,文件類型選RTF格式)。

② 將光標定位到文檔末尾。

③ 單擊"插入"菜單中的"文件…"菜單項。

④ 在打開的插入文件對話框中,"文件名"框中輸入要插入文件的名稱:如sentence002.rtf

這樣就將前兩句句型所在的兩個文檔合並成一個文檔,並以sentence001.rtf存在。顯然,只要不斷地重復上述過程,最終肯定會將分散在900個文檔中的900句句型合並在一個文檔中。過程雖然簡單,卻非常費時,因此只適用於少數文檔的合並操作。

2.2 Delphi在文檔合並中的應用

考慮到:

(1) 要合並的每個文件名均以"sentence"開頭,後分別接001、002,…,900,非常有規律。

(2) 合並時,每次都是將新文檔的內容添加在原文檔的末尾,也即插入在原文檔的最後,插入位置固定。

於是就思考有沒有更快捷的辦法,而且最好讓計算機自動幫助完成整個合並過程。

①思路:在Delphi中,選擇一個能接受和處理多行文本的控件,首先將sentence001.rtf的內容讀入到其中,然後循環,依次將sentence002.rtf、sentence003.rtf中內容讀入並追加到末尾,最後再將該控件的內容保存到另一個文件中。

由於要合並的每個文檔內容均為多行文本,且使用了多種字體和格式,Standard頁上的Memo組件顯然不合適,於是選用Win32頁上RichEdit組件。

RichEdit組件的主要特性和方法如下:

屬性Lines

聲明:property Lines:Tstrings;

可以通過這個屬性訪問每一行,它是一個Tstrings對象,TStrings 類的方法,如Count、 Add、Delete 、Replace、LoadFromFile 、SaveToFile都可以用於Lines文本行的處理。其中:

LoadFromFile方法的聲明為:procedure LoadFromFile(const FileName: string); virtual;

其作用是從FileName指定的文件中讀取列表。

SaveToFile方法的聲明為:procedure SaveToFile(const FileName: string); virtual;

其作用為將列表中的串保存到FileName 指定的文件中。

屬性PlainText

聲明:property PlainText:Boolean;

用於設置從文件中讀取文本或把文本寫到文件時以哪種格式進行,設為False表示RTF格式,設為True表示普通文本格式。

方法Clear

聲明:procedure Clear; override;

清除所有文本(用空串替換所有文本)。若僅清除被選擇的部分文本,要用ClearSelection方法。

方法SelectAll

聲明:procedure SelectAll;

選擇組件中的所有文本,若只選擇部分文本,使用SelStart和SelLength 屬性。

方法CopyToClipboard

聲明:procedure CopyToClipboard;

調用CopyToClipboard方法是用被選擇的文本替換剪貼板內容。如果沒有選擇任何文本, CopyToClipbard方法什麼也不做,也不會清除剪貼板內容。

方法PasteFromClipboard

聲明:procedure PasteFromClipboard;

調用PasteFromClipboard方法是用剪貼板內容替換被選擇的文本或在光標處插入剪貼板內容,若剪貼板無內容,則該方法什麼也不做。

②具體實現(運行環境:Delphi5.0+Windows98):

首先新建一個Delphi Project,在默認的Form1上放置兩個RichEdit控件:RichEdit1和RichEdit2,將RichEdit2的ScrollBars屬性置為ssBoth。再在Form1上放置一個按扭Button1,將其Caption屬性置為"開始合並",如圖1所示。

圖1 Delphi下的Project

按扭Button1的單擊事件處理如下:

procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
filename,rear:string;
begin
richedit1.clear;
richedit2.Clear;
filename:='f:\ce900\text\sentence';
{設要合並的900個RTF文檔以文件名"sentence***.rtf"存放在F:\ce900\text文件夾中,***代表001~900}
for i:=1 to 900 do
begin
if i<10 then rear:='00'+inttostr(i)
else if i<100 then rear:='0'+inttostr(i)
else rear:=inttostr(i);
Richedit1.Lines.LoadFromFile(filename+rear+'.rtf');
RichEdit1.SelectAll;
RichEdit1.CopyToClipboard;
Richedit2.PasteFromClipboard;
RichEdit1.SetFocus;
end;
Richedit2.Lines.SaveToFile('f:\ce900\ce900.rtf');
{合並後的整個文檔以文件名ce900.rtf保存在F:\ce900文件夾中}
end;

運行實例如圖2所示。

圖2 合並文檔演示實例

若要合並的多個文檔是無格式的文本文件,文件名毫無規律,且要合並的對象由用戶選擇(連續或不連續),則可用下面的程序段來實現,合並結果由用戶指定文件名以文本文件形式保存。

procedure TForm1.Button1Click(Sender: TObject);
var
I: integer;
F: TextFile;
content: string;
begin
OpenDialog1.Options := [ofAllowMultiSelect, ofFileMustExist];
OpenDialog1.Filter := 'Text files (*.txt)|*.txt|All files (*.*)|*.*';
OpenDialog1.FilterIndex := 2; { start the dialog showing all files }
if OpenDialog1.Execute then
with OpenDialog1.Files do
for I := 0 to Count - 1 do
begin
AssignFile(F, Strings[I]);
Reset(F);
while not Eof(F) do
begin
Readln(F, FirstLine);
Memo1.Lines.Append(FirstLine);
end;
CloseFile(F);
end;
if savedialog1.Execute then
Memo1.Lines.SaveToFile (Savedialog1.Filename);
end;

3.結束語

本文給出了文本格式文件和一般文本文件的批量合並方法,其思路對其它類似的任務也有一定的參考價值。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved