"一个优秀的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;//计算文本数据字符串/映射字符串中的字段数目
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(文本数据导出)两个方法中.开发者可以在设计阶段直接将文本文件同要导入/出的数据库相连,然后在程序运行当中调用这两个方法就可以了,根本不用理会那些函数什么的,相当的方便.

转载于:https://www.cnblogs.com/tecsoon/archive/2009/03/04/1403069.html

Delphi控件的“拿来主义”相关推荐

  1. 计算机等级delphi取消,计算机二级DELPHI控件:DELPHI过滤记录的实现方法

    所谓过滤就是从表中选取满足特定条件的部分记录.过滤记录首先要通过Filter.属性设置过滤条件,然后将Filtered属性设置为True,即可从数据集组件连接的表中过滤出满足条件的记录. 1.Filt ...

  2. delphi 控件大全(确实很全)

    delphi 控件查询:Torry's Delphi Pages http://www.jrsoftware.org Tb97 最有名的工具条(ToolBar)控件库,仿Office97,如TDoCk ...

  3. Delphi控件-复合控件

    复合控件 复合控件是Delphi控件中非常重要的一种控件,复合控件就是将两个或两个以上的控件重新组合成一个新的控件.例如TspinEdit.TlabeledEdit.TDBNavigator等就是复合 ...

  4. delphi 控件大全

    delphi 控件查询:http://www.torry.net/ http://www.jrsoftware.org Tb97 最有名的工具条(ToolBar)控件库,仿Office97,如TDoC ...

  5. 如何隐藏TPageControl Delphi控件的选项卡

    The TPageControl Delphi control displays a set of pages used to make a multiple-page dialog box. Eac ...

  6. Delphi 控件开发步骤

    delphi 控件开发步骤 Delphi控件开发步骤 1.使用Delphi IDE的 Component -> New Component 菜单 2.按照向导逐步完成 3.控件工程文件 4.控件 ...

  7. Delphi控件开发浅入深出(一)

    有人说过"不会开发控件的Delphi程序员不是真正的程序员".Delphi正是由于高度的可扩展性和大量的第三方控件的支持才能吸引无数程序员挑剔的目光.即使是由于工作需要使用其他开发 ...

  8. 实现一个模拟CMD.exe命令编辑模式执行与显示的Delphi控件

    cmd.exe这个东西是Windows系统自带的执行Dos的一个灰常好的人机命令交互的执行方式,现在很多脚本语言也都带有这种即时解释的人机模式.当下由于工程的需要,也要做一个类似命令解释显示的编辑器, ...

  9. Delphi控件之---UpDown以及其与TEdit的配合使用(比如限制TEdit只能输入数字,还有Object Inspector之组件属性的介绍)...

    最近在开发中使用到了UpDown这个控件,但是因为之前没有使用过,所以很不熟悉,于是就编写了一个简单的demo来学习UpDown以及其结合TEdit的用法. 初步的常用功能的简介 目前(2015.08 ...

最新文章

  1. 第二章:2.8 通过Django 在web页面上面输出 “Hello word ”
  2. 量子计算: 1秒完成传统计算机100年的任务量
  3. win10默认浏览器不显示谷歌浏览器_win10系统谷歌浏览器怎么用不了?谷歌浏览器打不开网页的解决方法...
  4. 利用反射获得类的public static/const成员的值
  5. c语言锐龙,AMD官方:锐龙5000抗热可以达到95°C 没问题!
  6. 无心剑中译狄金森诗36首
  7. 马斯克在推特暗示将亲自负责一款社交媒体App开发
  8. python用http协议传数据_《Python网络爬虫》1.3 HTTP协议基础知识
  9. [机器学习]-K近邻-最简单的入门实战例子
  10. PKU 3273  PKU 3258  pku 1905 PKU 3122 二分运用题目
  11. 安装grid时找不到ASM共享磁盘
  12. Android教程 第四章 用户界面设计基础
  13. ISO9000和CMM
  14. SVN比较两个文件差异
  15. python制作3d相册代码_python中Matplotlib实现绘制3D图的示例代码
  16. Win7停服,引发国产操作系统“蝴蝶效应”
  17. python怎么隐藏输入法_用隐马尔科夫模型 python 实现简单拼音输入法
  18. PHP 编写“九九乘法表”
  19. 视频编码中的I帧、P帧、B帧的概念和特点
  20. 微信订阅号发送模板消息

热门文章

  1. Linux中打开文件管理器的命令
  2. 微机原理控制转移类指令
  3. java9-1.类,抽象类,接口的综合小练习
  4. org-mode入门教程
  5. redhat rpmforge epel 安装源配置
  6. 表单PostGet两个长度限制问题的分析
  7. flask上传excel文件,无须存储,直接读取内容
  8. 树形控件(CTreeCtrl和CTreeView)
  9. xcode多工程联编 - 详细教程
  10. D3D9 effect (hlsl)(转)