在自定义的控件里如何加入自己的属性、方法、事件?(50分)

  • 主题发起人 主题发起人 ucan1
  • 开始时间 开始时间
U

ucan1

Unregistered / Unconfirmed
GUEST, unregistred user!
在自定义的控件里如何加入自己的属性、方法、事件?
(要求最好能有一个比较详细的例子加以说明)


我要在方法里读属性值,就是取不到,不知道为什么?
Property Color:String read GetColor write SetColor;
 
看DELPHI的原码
Property Color:String read GetColor write SetColor;
你还要加GetColor和SetColor两个方法才可以
 
看DELPHI的原码
或者卖本书看吧
 
GetColor和SetColor两个方法怎么加?
我找了很多资料都没有找到合适的呀,各位大虾请出招!
 
加在了哪里?
private,public or protected?
 
你们就当我什么东西都没写,
全部你们自己来帮我写吧,这样你们就不需要分析是不是我写的代码有问题了。

现在我要的是有一个比较详细的例子加以说明如何在自定义的控件里如何加入自己的属性、方法、事件?
 
给你一个例子应该明白了
unit LookUpComboBox;

interface

uses
Windows, Messages, SysUtils, Classes, Controls, StdCtrls,
DB, DBTables;

type
TLookUpComboBox = class(TComboBox)
private
FlpSQL: TStrings;
procedure SetQuery(Value: TStrings);
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
published
property lpSQL: TStrings read FlpSQL write SetQuery;
constructor Create(AOwner: TComponent)
override;
destructor Destroy
override;
{ Published declarations }
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('xhw', [TLookUpComboBox]);
end;

{ TLookUpComboBox }

constructor TLookUpComboBox.Create(AOwner: TComponent);
begin
inherited;
FHasAll:=false;
FlpSQL := TStringList.Create

end;


destructor TLookUpComboBox.Destroy;
begin
lpSQL.Free;
inherited;
end;



procedure TLookUpComboBox.SetQuery(Value: TStrings);
begin
if lpSQL.Text <> Value.Text then
begin
lpSQL.BeginUpdate;
try
lpSQL.Assign(Value);
finally
lpSQL.EndUpdate;
end;
end;
end;

end.
 
To:hongwei
谢谢
在方法里如何引用属性,我就是在这里出问题了;
还有如何定义事件;
 
一般把对用户开放的属性和事件声明为published,把方法声明为public或protected。
在自定义构件中,事件被当做属性来处理,且事件必须定义为过程类型,实际上相当于一个隐蔽指针,指向某个潜在的过程。 当你为事件编写了处理程序以后,事件便成为指向该处理程序的指针。事件的定义方式如下:
type
private
FOnClick:TNotifyEvent;{声明事件变量以保存过程指针}
published
propertyOnClick:TNotifyEvent
read FOnClick write FOnClick;
end;
此例正是Delphi标准控件中Click事件的定义方式。可以看
出,除了OnClick被定义为过程类型外,其定义格式与一般属性的
直接访问格式几乎完全相同。Delphi预定义了所有标准事件的过
程类型及标准事件所引发的虚方法。其中,Click事件将引发如下
虚方法:
procedureTControl.Click;
begin
ifAssigned(OnClick)thenOnClick(Self);
{以下是默认处理部分}
end;
其中,Assigned函数检验OnClick是否已分配了事件处理过
程。如果返回值为True,则调用用户指定的事件处理过程。通过
重载此虚方法,可以修改Click事件的处理方式。在重载的方法中,
一般应先调用用户处理程序,然后再安排后续处理。在本例中,首
行代码应当是inheritedClick。
需要注意的是,构件用户不一定会给事件指定处理程序,因此
事件不能定义为函数类型,否则可能会指向返回值类型不定的空函
数。如果需要事件处理过程返回某个值,可以借助var参数。调用
用户程序之前应确保此参数包含有效返回值,以免用户未指定事件
处理过程时出错。
如果Delphi标准事件不能满足需要,也可以自己定义事件。
其核心思想是选择适当的Windows消息来引发构件中的事件过程。
 
To:hongwei:
我发现在Edit---Add to interface...命令弹出的对话框中输入
property lpSQL: TStrings;竟然提示说Invalid type.那你的代码又怎么行呢?

还有利用上面这种添加属性的方法(Edit---Add to interface...)所自动生成的代码
跟我们手工在里面添加的不一样,系统只在protected处添加了以下代码:
function Get_count: Integer
safecall;
procedure Set_count(Value: Integer)
safecall;

它还加了一个safecall;
而我们手工添加的方法,往往是这样写的;
private
FCount:Integer;
Published
Property Count:Integer read FCount write SetCount;

各位大虾;这到底是怎么回事?
 
呵,,一般都手工添加吧,,,关键字是可以任意加的啊!

TStrings 类型是 Delphi 的VCL 类,向导所能定义的是WINDOWS平台支持的通用类型。
如果需要定义你就要手工添加了。

事件定义方法:

1、首先定义相应的过程类型

TMyEvent = procedure (HelloObj: TObject
var ReturnValue: string
buflen: integer) of object;
// 上面就定义了一个方法类型了。。
// of object 一定要加

2、在你的控件中加入相应的属性

TMyFirstComponent = Class(TComponent)
private
FMyEvent: TMyEvent;
public
constructor Create(AOwner: TComponent;);
destructor Destroy;
published
property OnMyEvent: TMyEvent read FMyEvent write FMyEvent;
end


3、激发事件
在要触发事件的地方加入代码:

if Assigned(FMyEvent) then
FMyEvent(self, Str, Len)
// 对应于TMyEvent的参数定义。
 
多人接受答案了。
 
后退
顶部