在深入到下面的內容之前,有必要對該控件的類聲明部分作一定了解
//中文部分為筆者所作的注釋
//注意:
//在該控件中,Export代表將文本數據導入到數據庫,Import代表從數據庫導出到文本。??? 怎麼和我理解的
//導入導出概念剛好是反的 :)
type
//在處理數據產生異常時,可選擇繼續還是中止
TPgCSVErrorResponse = (pgcsvAbort, pgcsvIgnore);
//進程監控事件聲明,可以將導入/導出的進度作為參數傳出
TPgCSVProgressEvent = procedure (Sender : TObject; AProgress: LongInt; var StopIt: Boolean) of object;
//發生異常時的事件處理聲明,異常信息通過該接口傳給程序員。
TPgCSVExportErrorEvent = procedure (Sender : TObject; Mess: string; RecNo: LongInt; var Response:TPgCSVErrorResponse) of object;
TPgCSV = class(TComponent)
private
FDataset : TDataset;
FCSVMap,
FCSVFile,
FDateFormat,
FIgnoreStr : string;
FSeprator,
FDelimiter,
FFIEldIndicator : Char;
FAutoOpen,
FUseDelimiter,
FSilentExport,
FTrimData,
FStop,
FEmptyTable : Boolean;
FBeforeOpenTable,
FAfterOpenTable,
FBeforeCloseTable,
FAfterCloseTable,
FBeforeEmptyTable,
FAfterEmptyTable,
FBeforeExport,
FAfterExport,
FBeforeImport,
FAfterImport,
FOnAddRecord : TNotifyEvent;
FExportProgress,
FImportProgress : TPgCSVProgressEvent;
FExportError : TPgCSVExportErrorEvent;
FMapItems,
FDefaultInt : Integer;
FBufferSize : LongInt;
FFIEldCache : TList;
protected
FFile : TextFile;
//以下就是我所說的希望封裝的部分
function CountMapItems:Integer;//計算映射字符串的字段個數
function GetMapItem(ItemIndex:Integer;var AFIEld:Boolean):string;//提取映射字符串的字段
function GetCSVRecordItem(ItemIndex:Integer;CSVRecord:string):string;//提取CSV文件字符串中的某一字段
function BuildMap:string;//自動創建映射,如果CSVMap一欄為空的話,會由它來產生映射字符串
function ExtractWord(Item: Integer;S, WordDelim: string): string;//提取文本數據字符串/映射字符串中的某一字段
function WordCount(const S ,WordDelim: string): Integer;//計算文本數據字符串/映射字符串中的字段數目
function WordPosition(Item: Integer; const S, SubStr: string): Integer;//計算子字符串在字符串中的位置
public
constructor Create(AOwner: TComponent); override;
published
//propertIEs
property Dataset : TDataset read FDataset write FDataset;
//設置要導入或導出的目標數據集.
property CSVMap : string read FCSVMap write FCSVMap;
//CSV 文本數據文件到數據庫字段值的映射字符串.控件通過該映射決定文本中的哪些數據要導入及要導入哪個字段.
property CSVFile : string read FCSVFile write FCSVFile;
//CSV 文件格式,其實就是文本數據文件。CSV代表什麼意思?呵呵,我也不知道
property Seprator : Char read FSeprator write FSeprator;
//分隔符,可以是空格,也可以是,、;、#等符號
property FieldIndicator : Char read FFieldIndicator write FFIEldIndicator;
//字段標識符.
property AutoOpen : Boolean read FAutoOpen write FAutoOpen;
//將AutoOpen設為True可以在處理數據前自動打開要導入的數據表並在操作完畢後自動關掉它。
property IgnoreString : string read FIgnoreStr write FIgnoreStr;
//忽略紀錄的標識串.
//舉例來說
//IgnoreString:='(ignore)';
//CSVMap:='$Name,(ignore),$Age';
//在這種情況下,CSVToDataSet方法,即導入數據方法將忽略文本文件中的第二列的字段。
property Delimiter : Char read FDelimiter write FDelimiter;
//在某些CSV文檔中標識字符串紀錄的標識符,比如,"john","boy",12中的",在這種情況下,TPgCSV
//會忽略這些標識符。
property EmptyTable : Boolean read FEmptyTable write FEmptyTable;
//只在從數據庫導出(DataSetToCSV)方法中有效,作用是創建一個新的CSV文件。
property UseDelimiter : Boolean read FUseDelimiter write FUseDelimiter;
//是否有Delimiter。
property SilentExport : Boolean read FSilentExport write FSilentExport;
//若該屬性為True,應用程序將不顯示數據操作時的異常,而將異常信息通過一個接口傳給程序員處理.
property DateFormat : string read FDateFormat write FDateFormat;
//設定CSV文件中日期數據的格式。
property TrimData : Boolean read FTrimData write FTrimData;
//是否去掉數據頭尾的空格.
property DefaultInt : Integer read FDefaultInt write FDefaultInt;
//整/實形數據轉換出錯後的默認值
property BufferSize : LongInt read FBufferSize write FBufferSize;
//CSV 文件的緩沖值,以字節為單位,可以加快導入和導出數據的速度。
//events
property BeforeOpenTable : TNotifyEvent read FBeforeOpenTable write FBeforeOpenTable;
property AfterOpenTable : TNotifyEvent read FAfterOpenTable write FAfterOpenTable;
property BeforeCloseTable : TNotifyEvent read FBeforeCloseTable write FBeforeCloseTable;
property AfterCloseTable : TNotifyEvent read FAfterCloseTable write FAfterCloseTable;
property BeforeEmptyTable : TNotifyEvent read FBeforeEmptyTable write FBeforeEmptyTable;
property AfterEmptyTable : TNotifyEvent read FAfterEmptyTable write FAfterEmptyTable;
property BeforeImport : TNotifyEvent read FBeforeImport write FBeforeImport;
property AfterImport : TNotifyEvent read FAfterImport write FAfterImport;
property BeforeExport : TNotifyEvent read FBeforeExport write FBeforeExport;
property AfterExport : TNotifyEvent read FAfterExport write FAfterExport;
property ExportProgress : TPgCSVProgressEvent read FExportProgress write FExportProgress;
//進程監控事件。每完成一條文本數據的導入就觸發該事件。
property ImportProgress : TPgCSVProgressEvent read FImportProgress write FImportProgress;
property OnAddRecord : TNotifyEvent read FOnAddRecord write FOnAddRecord;
property ExportError : TPgCSVExportErrorEvent read FExportError write FExportError;
//發生異常時交由該事件處理,異常信息通過該接口傳給程序員。
//methodes
//整個控件的核心內容
procedure CSVToDataset;//將文本導入到數據集的方法
procedure DatasetToCSV;//將數據集的數據導入到文本的方法
end;
procedure Register;
{略}
implementation
{略}
end.
從聲明部分中我們可以看到,TPgCSV將文本數據的導入導出全部封裝到了CSVToDataSet(文本數據導入)和DataSetToCSV(文本數據導出)兩個方法中.開發者可以在設計階段直接將文本文件同要導入/出的數據庫相連,然後在程序運行當中調用這兩個方法就可以了,根本不用理會那些函數什麼的,相當的方便.