打印本文 打印本文 关闭窗口 关闭窗口
Delphi控件的拿来主义(二)
作者:武汉SEO闵涛  文章来源:敏韬网  点击数2141  更新时间:2009/4/23 18:40:07  文章录入:mintao  责任编辑:mintao
p;           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(文本数据导出)两个方法中.开发者可以在设计阶段直接将文本文件同要导入/出的数据库相连,然后在程序运行当中调用这两个方法就可以了,根本不用理会那些函数什么的,相当的方便.

   那我是不是可以直接拿来使用呢?这里就出现问题了.

----问题一及解决方案

在该控件自带的Demo中,所使用的文本数据文件,格式如下


test.csv

"11","12","13","14"

"21","22","23","24"

"31","32","33","34"

...


 

而ISO文件中的数据格式(部分)为


sm01632.ISO

... a7507310175­b特精装­d¥1893"‑1 ­a毛泽东珍品典藏(上、下册)­f中共中央文献研究室编著‑c中献­d011200"...

...­a7119029193­b平装­ d¥20"‑1 ­a中国:加入WTO与经济改革­f王 梦 奎编著‑  ­c外文­d011200"‑ ... ­


 

我们看到,同test.csv相比,sm01632.ISO文件中的纪录很不规则。

我们所需要的是这样的纪录


sm01632.ISO

... 7507310175,特精装,1893,1,毛泽东珍品典藏(上、下册),中共中央文献研究室编著,中献,011200...

...­7119029193,平装,20,1,中国:加入WTO与经济改革,王 梦 奎编著,外文,011200‑ ... ­


 

   TPgCSV能否对这种情况进行自动的处理呢?哇噻,这种万能的控件好像不大可能有吧!(事实上也不需要)既然直接用TPgCSV处理无法实现正确导入的,我们就需要在每一条从文件中读取出来的纪录导入数据库之前,用程序对它们进行处理,转换之后再交由TPgCSV进行操作。怎么样处理这里就不赘述了。我们所关心的是TPgCSV有没有开放出这样一个处理的接口呢?

   我们来看DataSetToCSV方法的实现代码(主要是注释部分):

procedure TPgCSV.CSVToDataSet;

var

 RecordString,

 Temp          : string;

 i             : Integer;

 C             : LongInt;

 D             : Boolean;

 F             : Real;

 ErrorResponse : TPgCSVErrorResponse;

 Buffer        : Pointer;

begin

 //create field cache

 FFieldCache:=TList.Create;

 //initiate map items

 FMapItems:=0;

 //allocate buffer size

 GetMem(Buffer,FBufferSize);

 //assign and open CSV file

 AssignFile(FFile,FCSVFile);

 SetTextBuf(FFile,Buffer^,FBufferSize);

 Reset(FFile);

 //open table if nessecary

 if FAutoOpen then

  begin

   if Assigned(FBeforeOpenTable) then

    FBeforeOpenTable(Self);

   FDataset.Open;

   if Assigned(FAfterOpenTable) then

    FAfterOpenTable(Self);

  end;

 //export to table from CSV file

 if Assigned(FBefore

上一页  [1] [2] [3]  下一页

打印本文 打印本文 关闭窗口 关闭窗口