Delphi控件的拿来主义(三)
----问题二及解决方案
每一条导入表中的纪录除了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);
//xm4014s modification
if Assigned(FRegulateString) then
FRegulateString(self,RecordString);
//add new record
try
FDataset.Append;
//应该加在这儿!
//xm4014s modification
if Assigned(FAfterInsert) then
AfterInsert(self,FDataset);
…
for i:=1 to CountMapItems do
…
end;
同样,这里需要定义新的事件声明和事件属性,因为需要将FDataSet的参数传递出去,声明代码可参看Delphi控件的拿来主义(二)(http://www.csdn.net/develop/read_article.asp?id=11855).
重新编译控件,就可在AfterInsert事件中添加代码对书的类型,期号,以及ID号进行赋值了.
----问题三及解决方案
涉及到数据库的问题现在都已经解决了.但是还有一个显示问题.程序要求用ProgressBar显示导入进度.为了设置ProgressBar.Max的值,我需要在导入之前知道ISO文件中一共有多少条纪录,即一个类似于RecordCount的属性.但是TPgCSV中没有这样的一个属性.
那么我们就来添加一个这样的属性