----問題二及解決方案
每一條導(dǎo)入表中的紀(jì)錄除了ISO文件中的內(nèi)容外,還需要有書的類型,期號,以及ID號,而TPgCSV在插入新紀(jì)錄時(shí)只處理了同文本文件中的數(shù)據(jù)相關(guān)的字段,因此,這些字段的內(nèi)容需要我們自己來加入。不用說,很自然的就會想到Table中的AfterInsert事件.但問題是,我的Table在DataModule單元中,我必須傳參數(shù)到AfterInsert事件中,麻煩!同時(shí),這樣的處理會帶來維護(hù)上的混亂,一個(gè)單元里面發(fā)生的事件應(yīng)該盡量由這個(gè)單元里面的函數(shù)或過程來處理。于是,我又想到了在當(dāng)前單元中寫一個(gè)處理過程,然后在程序運(yùn)行時(shí)把這個(gè)過程指派給Table的AfterInsert事件,導(dǎo)入結(jié)束后再禁止掉??尚校€是麻煩!既然大多數(shù)情況下都會遇到這樣的問題,那何不一了百了,把這個(gè)事件封裝起來呢.
同問題一一樣,這里我們還是需要一個(gè)事件處理過程AfterInsert.這一次應(yīng)該加在哪兒呢?大家肯定一眼就看出來了:
PRocedure TPgCSV.CSVToDataSet;
begin
…
FDataset.DisableControls;
while (not Eof(FFile)) and (not FStop) do
begin
//read from CSV
Readln(FFile,RecordString);
//xm4014's modification
if Assigned(FRegulateString) then
FRegulateString(self,RecordString);
//add new record
try
FDataset.Append;
//應(yīng)該加在這兒!
//xm4014's modification
if Assigned(FAfterInsert) then
AfterInsert(self,FDataset);
…
for i:=1 to CountMapItems do
…
end;
重新編譯控件,就可在AfterInsert事件中添加代碼對書的類型,期號,以及ID號進(jìn)行賦值了.
----問題三及解決方案
涉及到
數(shù)據(jù)庫的問題現(xiàn)在都已經(jīng)解決了.但是還有一個(gè)顯示問題.程序要求用ProgressBar顯示導(dǎo)入進(jìn)度.為了設(shè)置ProgressBar.Max的值,我需要在導(dǎo)入之前知道ISO文件中一共有多少條紀(jì)錄,即一個(gè)類似于RecordCount的屬性.但是TPgCSV中沒有這樣的一個(gè)屬性.
那么我們就來添加一個(gè)這樣的屬性
//xm4014's modification
property CSVRecordCount : integer read FCSVRecordCount write FCSVRecordCount default 0;
怎么樣給它賦值呢? 很簡單,可以用ReadLn(F)對ISO文件進(jìn)行掃描,然后將掃描的次數(shù)累加。
關(guān)鍵是在哪兒進(jìn)行這個(gè)處理.很顯然,對于同一個(gè)文件,這樣的工作只需要做一次就可以了。既然對于不同的文件才需要重新統(tǒng)計(jì),那么我們可以在每次設(shè)置文件名屬性的時(shí)候,對文本文件進(jìn)行掃描。
好,找到TPgCSV的文件名屬性
property CSVFile : string read FCSVFile write FCSVFile;
做一下小小的修改
新的屬性聲明
property CSVFile : string read FCSVFile write SetCSVFile;
按Ctrl+shift+c編寫SetCSVFile的方法代碼如下
procedure TPgCSV.SetFCSVFile(const Value: string);
var
F1:TextFile;
iCount:integer;
begin
if FCSVFile<>Value then
begin
FCSVFile := Value;
//文件名一換,就重新掃描,改變FCSVRecordCount的值
if FileExists(Value) then
begin
AssignFile(F1, Value);
Reset(F1);
iCount:=0;
while not Eof(F1) do
begin
ReadLn(F1);
Inc(iCount);
end;
FCSVRecordCount:=iCount;
end;
end;
end;
編譯之后我們就可以在導(dǎo)入操作進(jìn)行之前放心的調(diào)用CSVRecordCount屬性獲取紀(jì)錄個(gè)數(shù)值了:
ProgressBar1.Min :=0;
ProgressBar1.Max:=PgCSV1.CSVRecordCount;
以上程序在Delphi 6.0/Win98下調(diào)試通過
寫到這里基本上算是大功告成了.其實(shí)前前后后做的修改掰著指頭都可以數(shù)出來.可就是這么點(diǎn)小小的升級,讓我真正覺得用起來更加得心應(yīng)手,我想,下次我再用的時(shí)候,會越發(fā)體會到它的價(jià)值.而且經(jīng)過這么一番分析修改,我也長進(jìn)不少啊,比半瓢多了幾滴,呵呵!
需要指出的是,TPgCSV是一個(gè)簡單的控件,它既沒有很復(fù)雜的關(guān)系,也不涉及到對VCL核心內(nèi)容的調(diào)用,所以在修改的時(shí)候是不用有太多的顧慮的.一旦
源碼中涉及到很復(fù)雜的層次關(guān)系時(shí),就需要對你添加或修改的每一行代碼深思熟慮了,不然,可能會牽一發(fā)而動全身,最后想回頭都難了.因此,我所說的拿來用的原則實(shí)際上還是依托于控件本身的功能,而沒有實(shí)質(zhì)內(nèi)容上的變動。要達(dá)到隨心所欲的境界,各位(我也在內(nèi))還要繼續(xù)努力??!