Delphi组件开发教程指南(2)简单扩充TEdit

简介:

   上一篇,介绍了组件开发的一般概述,以及组件类层次结构的各个类的大致信息!现在就开始通过实例进行来简单的讲述一下一般组件的开发过程!我这里先采用最基本的方式来创建一个组件!也就是使用Delphi自己的组件开发向导来建立一个新的组件。在这里,我以扩充TEdit为例进行讲解。

   那么首先,要介绍的就是如何使用Delphi的组件开发向导了!这个向导在Delphi IDE的Component菜单下的NewComponent打开就是向导了,可以参照如下:

从图上可以看到,我通过向导,我先选择了从组件Tedit往下继承,于是Delphi自动生成了新组件类TEdit1,然后我选择了将本组件注册到Standard这个控件面板上去,然后保存了单元文件到C:\Test这个目录下!然后点击下一步完成,delphi自动帮我们生成了一个Edit1.pas的单元文件。这样一个新的基本控件就完成了!此时,就可以在我们的工程中使用TEdit1.Create(nil)这样的语句来创建刚刚建立的新Edit组件了,只是现在的这个控件与TEdit没有任何功能上的区别,唯一的却别就是仅仅变了变组件的类名称而已!是一个没有任何意义的组件!下面,我要开始讲解的便是扩充一下这个Edit,使得这个控件具备一些Delphi的TEdit所不具备的功能!

    我想一想,扩充几个啥功能呢!貌似Delphi自己的Tedit没有Alignment这个属性哈,那么第一步,就来先为我们刚刚创建的那个新组件增加一个Alignment属性,可以让用户来设置Edit中文字的对齐方式吧!怎么能设置Edit编辑框的文字的对齐方式呢!这个网上有很多资料的,我们查查MSDN,可以发现Edit有几种样式ES_LEFT, ES_RIGHT, ES_CENTER分别用来设置文字的左对齐,右对齐和居中对齐!一般情况下,默认的是左对齐,如果要修改Edit的对齐方式为其他的对齐方式,那么,我们就需要设置编辑框的样式为新的样式,Windows有一个API函数,专门用于设置其控件的样式的函数为SetWindowLong,如果要在运行时直接对Delphi的Edit设置对齐方式,就可以用该函数来实现!比如

SetWindowLong(Edit1.Handle,GWL_STYLE,GetWindowLong(Edit1.Handle,GWL_STYLE) or ES_Right);

这一句就能让Edit1的对齐方式变成右对齐,于是,我们可以想象,我们可以在组件内部开放一个属性,用户一设置,就能调用这个代码来执行!所以,我先在我们刚刚生成的那个单元类TEdit1的Published域中添加上一个新的属性

published
    { Published declarations }
    property Alignment: TAlignment;

然后按住Ctrl+Shift+C,Delphi就会自动帮你把属性设置补全!变为

property Alignment: TAlignment read FAlignment write SetAlignment;

     此时,有必要来介绍一下Delphi的属性Property,delphi的属性由property关键字定义,后面跟上一个属性名称,以及属性的数据类型声明,然后跟上属性的读写来源,读写来源采用read和write关键字标记,那么当我们调用属性的数据的时候就会调用属性的读方法,如果向属性中写入值的时候,就会调用属性对应的写方法或者写的对应变量值!

   好,我们看一下Alignment这个属性的声明,read域指定的是FAlignment,这就表示当外部调用Alignment的时候,实际上就是直接调用的FAlignment的值了,而当我们外部向Alignment属性写入值的时候,那么此时,就是调用的Write域所对应的SetAlignment方法了!我们现在最主要最关键的就是要实现SetAlignment这个方法。当用户设置了这个属性的时候,就会直接触发改变编辑框的对齐方式!前面已经给出了代码SetWindowLong可以实现修改Edit的编辑框样式,那么我们这里也就用那个方法来实现一下这个改变对齐方式的属性

这个代码很简单,我就直接给出来算了

 

代码

我在里面写的代码比前面给的代码多了一个
style := style and (not ES_LEFT) and (not ES_CENTER) and (not ES_RIGHT);这样的东西,可以试着思考一下为什么要这样写!

 

然后在最后还添加了一个Invalidate;可以试着注释掉这个函数,然后试着改变属性,看看会有什么样的效果!为什么会这样?

最后,我再给一个不是用SetWindowLong这个API来实现改变这个属性的效果的方法代码,大家可以先参考参考,至于原理若何,后面再做介绍!

  那便是改写Edit控件的CreateParams方法,先在Protected域中声明

protected

     procedure CreateParams(var Params: TCreateParams); override;

之后实现如下

 

复制代码

  
  
procedure TEdit1.CreateParams( var Params: TCreateParams);
const
Alignments:
array [TAlignment] of DWORD = (ES_LEFT, ES_RIGHT, ES_CENTER);
begin
inherited CreateParams(Params);
with Params do
begin
ExStyle :
= Exstyle and not WS_EX_Transparent;
Style :
= Style and not WS_BORDER or Alignments[FAlignment];
end ;
end ;
复制代码

 

 

然后SetAlignment修改为

 

复制代码

  
  
procedure TEdit1.SetAlignment( const Value: TAlignment);
begin
if FAlignment <> Value then
begin
FAlignment :
= Value;
RecreateWnd;
end ;
end ;
复制代码

注意两者SetAlignment的实现方式!然后思考一下!

 

先看看效果

 

代码下载!


本文转自 不得闲 博客园博客,原文链接:http://www.cnblogs.com/DxSoft/archive/2010/04/27/1721711.html   ,如需转载请自行联系原作者


相关文章
|
存储 开发工具
游戏编程之十六 扩展(DDEX2和DDEX3)
游戏编程之十六 扩展(DDEX2和DDEX3)
64 0
|
3月前
|
定位技术 C# 图形学
从零开始的unity3d入门教程(二)----基本功能讲解
这是一篇Unity3D入门教程,详细介绍了Unity界面操作、游戏物体创建修改、场景搭建、玩家控制、音效添加以及游戏测试和导出的全过程。
从零开始的unity3d入门教程(二)----基本功能讲解
|
5月前
|
存储 机器学习/深度学习 API
程序与技术分享:COM组件设计与应用(一)(转载)
程序与技术分享:COM组件设计与应用(一)(转载)
|
6月前
|
开发工具 Swift iOS开发
利用SwiftUI构建动态用户界面:iOS开发新范式
【4月更文挑战第3天】 随着苹果不断推进其软件开发工具的边界,SwiftUI作为一种新兴的编程框架,已经逐渐成为iOS开发者的新宠。不同于传统的UIKit,SwiftUI通过声明式语法和强大的功能组合,为创建动态且响应式的用户界面提供了一种更加简洁高效的方式。本文将深入探讨如何利用SwiftUI技术构建具有高度自定义能力和响应性的用户界面,并展示其在现代iOS应用开发中的优势和潜力。
|
前端开发 C# Android开发
【Maui正式版】创建可跨平台的Maui程序,以及有关依赖注入、MVVM双向绑定的实现和演示
Maui终于在昨天(2022年8月9日)推送出来了。今儿就迫不及待来把玩一下先。
665 0
【Maui正式版】创建可跨平台的Maui程序,以及有关依赖注入、MVVM双向绑定的实现和演示
|
图形学 开发者 iOS开发
iOS开发CoreGraphics核心图形框架之二——深入理解图形上下文(一)
iOS开发CoreGraphics核心图形框架之二——深入理解图形上下文
410 0
iOS开发CoreGraphics核心图形框架之二——深入理解图形上下文(一)
|
Swift
Swift专题讲解二十——扩展
Swift专题讲解二十——扩展
127 0
|
API 数据安全/隐私保护 iOS开发
iOS开发CoreGraphics核心图形框架之二——深入理解图形上下文(二)
iOS开发CoreGraphics核心图形框架之二——深入理解图形上下文
386 0
|
测试技术 C# 图形学
Unity C#代码封装dll文件完美教程(Chinar-开发者必经之路)
Unity C#代码封装dll文件完美教程(Chinar-开发者必经之路) 将脚本封装为DLL库,本文提供全流程,中文翻译。 助力快速完成 Unity C#脚本文件封装为 DLL 库文件 DLL (Dynamic Link Library) —— 中文:动态链接库
5397 0
下一篇
无影云桌面