Delphi 7学习开发控件(继承TGraphicControl只画一条线)
我们知道使用Delphi快速开发,很大的一方面就是其强大的VCL控件,另外丰富的第三方控件也使得Delphi程序员更加快速的开发出所需要的程序。在此不特别介绍一些概念,只记录自己学习开发控件的步骤。假设我们要开发一个画直线的控件,那么我们从下面开始做:
1.菜单栏→Component→New Component,在弹出的对话框中按照提示添加:
Ancestor type 父类:TGraphicControl [Controls]
Class Name 类名:TLineTo
Palette Page 面板页:Samples
Unit file name 单元文件名:E:/练习/我做的控件/TLineTo.pas
Search path 搜索路径:E:/练习/我做的控件 (添加上面保存控件的路径)

按OK完成,系统自动帮我们创建好LineTo.pas文件,内容如下:
interface
uses
SysUtils, Classes, Controls;
type
TLineTo = class(TGraphicControl)
private
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Samples', [TLineTo]);
end;
end.
2.我们创建的TLineTo派生自TGraphicControl,而TGraphicControl又派生自TControl,那么图像控件TGraphicControl源代码又是什么呢,Ctrl按住并点击TGraphicControl,进入观看源代码:
private
FCanvas: TCanvas;
procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
protected
procedure Paint; virtual;
property Canvas: TCanvas read FCanvas;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;
可以看到父类TGraphicControl的Paint是虚函数,子类必须覆盖实现Paint函数方法。要做画线控件,我们简单来句MoveTo,LineTo就可以了,源代码如下:
interface
uses
SysUtils, Classes, Controls;
type
TLineTo = class(TGraphicControl)
private
{ Private declarations }
protected
procedure Paint; override;
public
{ Public declarations }
published
{ Published declarations }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Samples', [TLineTo]);
end;
procedure TLineTo.Paint;
begin
with Canvas do
begin
MoveTo(0, 0);
LineTo(Self.Width, Self.Height);
end;
end;
end.
保存文件,关闭文件。
3.接下来安装组件,菜单栏→Component→Install Component,弹出对话框,浏览加入刚才制作的组件全路径位置,记住第三项包文件名,以后卸载需要使用,点击“OK”安装。如下图所示:

弹出确认对话框,点“Yes”继续安装。安装完毕,弹出消息对话框,提示包已经安装完成,新组件LineTo.TlineTo已经注册完成。在面板Samples就可以看到新组件LineTo,如下图所示:

关闭dclusr.dpk文件,弹出对话框,询问是否保存(Save changes to project dclusr?)按“Yes”安装完成退出。
4.测试组件,菜单栏→File→New→Application,从Samples面板拖动LineTo控件到窗体上,可以看到控件上从左上角到右下角画出了一条直线,设计期和运行后的界面如下图所示:

5.默认的控件图标不具有其所代表的特点,我们使用Delphi 7下的Image Editor编辑控件图标,菜单栏→File→New→Component Resource File (.dcr),在Contents上右键→New→Bitmap,设置Bitmap属性,大小为24x24,VGA(16 colors),然后在生成的Bitmap1上右键→Rename,重命名跟控件类名一样,并且都大写,为TLINETO,然后双击它,就出现空白位图对话框,在里面绘制图标,如下图所示:


然后保存到跟制作的画线控件一样的路径下,名称为LineTo.dcr。
6.卸载控件,再重新安装以测试图标是否会更新。在菜单栏→File→Open...→dclusr.dpk,在其Contains下选中LineTo.pas,然后点上面的Remove,再选中LineTo,按“ok”,弹出确认移除对话框,单击”Yes“,再点击下Compile,那么面板Samples上的LineTo就消失了。保存dclusr.dpk退出。再重新安装一遍控件,安装完成后的图标如下图所示:

制作简单的画线控件先到这里,下次再加强此控件,接着学习。
http://blog.csdn.net/akof1314/article/details/6208097
Delphi 7学习开发控件(继承TGraphicControl只画一条线)的更多相关文章
- Delphi 7学习开发控件
我们知道使用Delphi快速开发,很大的一方面就是其强大的VCL控件,另外丰富的第三方控件也使得Delphi程序员更加快速的开发出所需要的程序.在此不特别介绍一些概念,只记录自己学习开发控件的步骤.假 ...
- Delphi 7学习开发控件(续)
继上次我们学习开发一个简单的画线控件后,基本的制作控件步骤已经清楚了,这次我们继续加深学习控件的制作.我们打开Delphi 7创建一个应用程序,拖动LineTo控件到窗体上,仔细看左边的对象设计器,可 ...
- Delphi中,indy控件实现收发邮件的几点学习记录( 可以考虑加入多线程,用多个邮箱做一个邮箱群发器) 转
关于用Delphi中的Indy控件实现收发邮件的几点学习记录 这几天心里颇不宁静,不是因为项目延期,而是因为自己几个月前做的邮件发送程序至今无任何进展,虽然一向谦虚的人在网上发 ...
- Delphi中的DBGrid控件
在Delphi中,DBGrid控件是一个开发数据库软件不能不使用的控件,其功能非常强大,可以配合SQL语句实现几乎所有数据报表的显示,操作也非常简单,属性.过程.事件等都非常直观,但是使用中,有时侯还 ...
- XMAL语法系列之-(2)---WPF控件继承图
WPF控件继承图 1 FrameworkElement 1.1 Panel(面板类元素) 1.1.1 Canvas 1.1.2 DockPanel 1.1.3 Grid 1.1.4 TabPanel ...
- JS调用Delphi编写的OCX控件
原文:http://www.mamicode.com/info-detail-471283.html 一.使用Delphi XE2编写OCX控件 生成OCX工程: 1.File-New-Other,在 ...
- Delphi中使用TXMLDocument控件应注意的问题 转
Delphi中使用TXMLDocument控件应注意的问题 delphiconstructorxmlclass今天写了一个类,其中用到了TXMLDocument控件.这个控件我是要动态生成的. 但是却 ...
- 过实现鹰眼图这个功能来进一步学习MapControl控件
我们通过实现鹰眼图这个功能来进一步学习MapControl控件.在实现鹰眼图之前,我们需 要接口有更深入的了解. 变主动为被动-出接口(OutBound interface) COM编程类似客户端和服 ...
- 关于c#(vs)dategridview控件继承不能修改的问题
问题描述:前几天写个小项目的时候,用到了一个父窗体,然后继承过来的dategridview控件不管是属性还是事件都不能修改. 如下图所示: 然后我就在网上找资料,但是有关这个问题的资源甚少,或许是我不 ...
随机推荐
- activity-alias详解及应用
activity-alias标签元素众所周知,AndroidManifest是一个xml文件,它包含很多标签元素,如application.activity.receiver等,其中有一个叫做acti ...
- Android在网络上分析获取图片(支持bmp格式)
Android学习系列 - 在网络上显示的图像(支持bmp格公式)) 参见例如,下面的代码: /** * 至Url地址上去照片.并返回Bitmap回来 * * @param i ...
- oracle常规任务
# su - oracle oracle> sqlplus "/as sysdba" SQL> exec dbms_scheduler.disable('MONDA ...
- Android源码分析-点击事件派发机制
转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/17339857 概述 一直想写篇关于Android事件派发机制的文章,却一直没 ...
- Method for performing cache coherency in a computer system
In a computing system, cache coherency is performed by selecting one of a plurality of coherency pro ...
- 对Java字符串的探究
问题的出发点 在网上看到一道题: 1 String str = new String("abc"); 以上代码执行过程中生成了多少个 String 对象? 答案写的是两个.&quo ...
- Asp.NetCore程序发布到CentOs(含安装部署netcore)--最佳实践
原文:Asp.NetCore程序发布到CentOs(含安装部署netcore)--最佳实践 环境 本地 win7 服务器:Virtual Box 上的Centos ssh工具: Xshell 文件传输 ...
- Codeforces 449 B. Jzzhu and Cities
堆优化dijkstra,假设哪条铁路能够被更新,就把相应铁路删除. B. Jzzhu and Cities time limit per test 2 seconds memory limit per ...
- STL序列式容器之list
一,list容器基本概念 1.list容器基本知识 list容器的底部数据结构为双向链表,可以高效的进行插入和删除元素. list因为底层数据结构是双向链表,因此不支持下标操作和.at()函数的操作. ...
- LeetCode: Generate Parentheses [021]
[称号] Given n pairs of parentheses, write a function to generate all combinations of well-formed pare ...