Delphi控制元件的拿來主義(三) (轉)
----問題二及解決方案:namespace prefix = o ns = "urn:schemas--com::office" />
每一條匯入表中的紀錄除了ISO中的內容外,還需要有書的型別,期號,以及ID號,而TPgCSV在插入新紀錄時只處理了同文字檔案中的資料相關的欄位,因此,這些欄位的內容需要我們自己來加入。不用說,很自然的就會想到Table中的AfterInsert事件.但問題是,我的Table在DataModule單元中,我必須傳引數到AfterInsert事件中,麻煩!同時,這樣的處理會帶來維護上的混亂,一個單元裡面發生的事件應該儘量由這個單元裡面的或過程來處理。於是,我又想到了在當前單元中寫一個處理過程,然後在執行時把這個過程指派給Table的AfterInsert事件,匯入結束後再禁止掉。可行,但還是麻煩!既然大多數情況下都會遇到這樣的問題,那何不一了百了,把這個事件封裝起來呢.
同問題一一樣,這裡我們還是需要一個事件處理過程AfterInsert.這一次應該加在哪兒呢?大家肯定一眼就看出來了:
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;
//應該加在這兒!
//xm4014's modification
if Assigned(FAfterInsert) then
AfterInsert(self,FDataset);
…
for i:=1 to CountMtems do
…
end;
同樣,這裡需要定義新的事件宣告和事件屬性,因為需要將FDataSet的引數傳遞出去,宣告程式碼可參看的拿來主義(二)(/develop/read_article.?id=11855">http://www.csdn.net/develop/read_article.asp?id=11855).
重新編譯控制元件,就可在AfterInsert事件中新增程式碼對書的型別,期號,以及ID號進行賦值了.
----問題三及解決方案
涉及到的問題現在都已經解決了.但是還有一個顯示問題.程式要求用ProgressBar顯示匯入進度.為了設定ProgressBar.Max的值,我需要在匯入之前知道ISO檔案中一共有多少條紀錄,即一個類似於RecordCount的屬性.但是TPgCSV中沒有這樣的一個屬性.
那麼我們就來新增一個這樣的屬性
//xm4014's modification
property CSVRecordCount : integer read FCSVRecordCount write FCSVRecordCount default 0;
怎麼樣給它賦值呢? 很簡單,可以用ReadLn(F)對ISO檔案進行掃描,然後將掃描的次數累加。
關鍵是在哪兒進行這個處理.很顯然,對於同一個檔案,這樣的工作只需要做一次就可以了。既然對於不同的檔案才需要重新統計,那麼我們可以在每次設定檔名屬性的時候,對文字檔案進行掃描。
好,找到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;
編譯之後我們就可以在匯入操作進行之前放心的CSVRecordCount屬性獲取紀錄個數值了:
ProgressBar1.Min :=0;
ProgressBar1.Max:=PgCSV1.CSVRecordCount;
以上程式在Delphi 6.0/下透過
寫到這裡基本上算是大功告成了.其實前前後後做的修改掰著指頭都可以數出來.可就是這麼點小小的升級,讓我真正覺得用起來更加得心應手,我想,下次我再用的時候,會越發體會到它的價值.而且經過這麼一番分析修改,我也長進不少啊,比半瓢多了幾滴,呵呵!
需要指出的是,TPgCSV是一個簡單的控制元件,它既沒有很複雜的關係,也不涉及到對VCL核心內容的呼叫,所以在修改的時候是不用有太多的顧慮的.一旦原始碼中涉及到很複雜的層次關係時,就需要對你新增或修改的每一行程式碼深思熟慮了,不然,可能會牽一髮而動全身,最後想回頭都難了.因此,我所說的拿來用的原則實際上還是依託於控制元件本身的功能,而沒有實質內容上的變動。要達到隨心所欲的境界,各位(我也在內)還要繼續努力啊!
(附:TPgCSV的地址)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-993624/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- delphi 控制元件的拿來主義(一) (轉)控制元件
- Delphi控制元件的拿來主義(二) (轉)控制元件
- 對Delphi控制元件的一點改良(三) (轉)控制元件
- 拿來主義實用主義以人為本----現代人生存
- 國產軟體的“拿來主義”:開源軟體、主導權
- 原來的控制元件delphi7裡何處尋? (轉)控制元件
- [Android]轉-Android 中的拿來主義(編譯,反編譯,AXMLPrinter2,smali,baksmali)!Android編譯XML
- 對Delphi控制元件的一點改良 (轉)控制元件
- 改良控制元件-Delphi自帶控制元件Bug的消除 (轉)控制元件
- 對Delphi控制元件的一點改良(二) (轉)控制元件
- 相當於delphi的日曆控制元件 (轉)控制元件
- 在Delphi中使用IP控制元件 (轉)控制元件
- 在delphi中使用flash控制元件 (轉)控制元件
- 在Delphi中編寫控制元件的基本方法 (轉)控制元件
- Delphi的元件讀寫機制(三) (轉)元件
- 在Delphi中編寫控制元件的基本方法(1) (轉)控制元件
- DELPHI也可以實現控制元件陣列,用定義陣列變數實現控制元件陣列 (轉)控制元件陣列變數
- 告別理想主義,走向經驗主義 (轉)
- 實現控制元件的移動、改變大小(DELPHI實現) (轉)控制元件
- Delphi使用VB編寫的ActiveX控制元件全攻略 (轉)控制元件
- QT常用控制元件(三)——自定義控制元件封裝QT控制元件封裝
- 直接拿來用!最火的前端開源專案(三)前端
- 直接拿來用!最火的iOS開源專案(三)iOS
- Delphi與Word(三)取得Word檔案的資料 (轉)
- Delphi(BCB)中編譯器版本宏定義 (轉)編譯
- 直接拿來用!最火的Android開源專案(三)Android
- 自定義控制元件中的控制元件呼叫引用控制元件的頁面裡的函式 (轉)控制元件函式
- Delphi程式碼最佳化(三) 浮點篇 (轉)
- Delphi皮膚控制元件去NAG提示控制元件
- delphi 控制元件 LssCalendar V2.0 (支援農曆的月曆控制元件)控制元件
- 一個delphi控制元件的破解 (12千字)控制元件
- Delphi重定義的訊息結構
- C#自定義控制元件:如果定義控制元件的事件C#控制元件事件
- 《Mastering Delphi6》學習筆記之三 (轉)AST筆記
- 自定義控制元件(三) 原始碼分析measure流程控制元件原始碼
- 開發asp.net自定義控制元件(asp.net學習筆記三) (轉)ASP.NET控制元件筆記
- Delphi 開發ActiveX控制元件(非ActiveForm)控制元件ORM
- Delphi中用於讀寫(I/O)的三種檔案型別 (轉)型別