Delphi控件的“拿来主义”_开发者网络_Delphi

2008-04-09 04:19:18来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

  "一个优秀的Delphi程序员,不仅要会写控件,还要会使用控件。"

  我还是一个半瓢水的程序员,因此目前为止我所能努力达到的境界是:

  一个半瓢水的程序员,管他会不会写控件,只要能拿来改就可以了。

  使用过Delphi的朋友都知道,我们在设计Delphi应用程序的某一功能时总是希望能够有现成的第三方免费控件可以拿来使用。但实际情况往往是,网上的控件确实种类繁多,优秀作品也数不胜数,但真正完全能够符合设计者具体要求的控件却很少。究其原因,不外乎以下几条

  1、国人开发的应用程序大多具有中国特色,而优秀的第三方控件往往是国外程序开发人员开发的(大名鼎鼎的Rxlib,知道吧,俄罗斯人的作品)。功能定义上的差别导致了控件的不可用性,看看QuickReport就知道了(当然,QuickReport编的也很烂)。

  2、真正优秀的第三方控件总是从大局上把握控件所能达到的功能,细节问题考虑的不多。而我们设计的程序通常要考虑到很多操作细节上的问题(一般是客户的要求,有时会有些变态)

  3、对于许多很有特色的控件,我们所需要的只是其中一部分功能,但是它被整合到了某一个大的方法中,无法为我们所用。

  4、优秀和免费总是两个矛盾,天下没有免费的午餐。

  种种原因,限制了开发者对控件资源的充分利用。其实,很多控件的代码都提供了开放的接口。只要大家对控件的原理有一定的了解,然后对别人的控件代码作一捏捏的修改,就可以无缝的添加自己需要的功能,或剔除冗余的功能。既达到了开发的目的,又避免了重写代码的麻烦,一举两得(好像很不负责任啊,没办法了,半瓢水嘛)。关于控件的原理,应该有很多文章介绍过了,在这里我想通过一个具体的实例来介绍一下怎样将别人的控件"拿来"为我所用。

  这个例子是关于如何将一个文本数据导入导出控件作一些简单的修改之后拿来使用的。

  ◆程序功能

  将图书馆的ISO文件中的部分数据转到Oracle8数据库中。

  ◆设计要求

  1.显示导入进度条。

  2.在导入过程中,如果某条纪录导入失败,不显示异常,而将导入失败的纪录记入日志。

  ◆设计思路

  程序的关键在文本数据字段的分离。通常的做法,都是先将字符串进行处理(RegulateString),然后把串中每个字符同分割符(可以是空格,逗号等)比较,将不是分割符的字符追加到一个串中(GetRecordItem),得到一个字段的内容。通过一个循环(循环次数由GetItemNum来定),就可以将一个字符串分成几个字段。最后的工作就是将分离出来的数据对号入座加入数据库。

  按照上面的思路,利用Delphi提供的已有函数和过程,实现起来应该不难,但问题是,我可不想每次编文本导入程序的时候,都把什么这啊那的函数过程重新定义一遍,哎,最烦的就是重复性的工作了.那么有没有现成的控件将上述过程都封装起来呢?PS:又不用我编呢?

  答案是肯定的!前几天刚刚下了一个免费控件TPgCSV,据说可以实现文本的导入和导出.翻出来一看,正是我想要的。

  在深入到下面的内容之前,有必要对该控件的类声明部分作一定了解

//中文部分为笔者所作的注释

//注意:

//在该控件中,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;//计算文本数据字符串/映射字符串中的字段数目

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Delphi设计PhotoShop型弹出菜单_开发者网络_Delphi

下一篇:Delphi编程调用指定的Windows程序

热门词条
热门标签