如何为自己的控件添加一个关于属性(100分)

  • 主题发起人 主题发起人 zhlfdm
  • 开始时间 开始时间
//要做的控件
unit QLB;

interface

uses
SysUtils, Classes, QControls, QStdCtrls;

type
TLB = class(TLabel)
private
FAbout: String;
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
property About:String read FAbout write FAbout;

end;



implementation

end.


//关于窗体

unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm2 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation

{$R *.dfm}

end.


//注册窗体
unit Unit3;

interface
uses DesignEditors, DesignIntf, Classes,unit2,qlb;
procedure Register;

implementation

procedure Register;
begin
RegisterComponents('aa', [TLb]);
RegisterPropertyEditor(TypeInfo(string), Tlb, 'About',Tform2);
RegisterComponentEditor(Tlb,Tform2);
end;

end.
//你看我写的对不。
怎么还是那个错误
 
在吗??牛X
 
unit UnitAbout;

{$I Asta.inc}

interface

uses classes,
{$ifdef Delphi6AndUp}
DesignEditors, DesignIntf
{$else}
DsgnIntf
{$endif};

Type

TfcAboutPropertyEditor = class(TPropertyEditor)
public
procedure Edit; override;
function GetAttributes: TPropertyAttributes; override;
function GetValue:string; override;
end;

implementation

uses UnitAboutBox;

procedure TfcAboutPropertyEditor.Edit;
begin
AboutBox:=TAboutBox.Create(nil);//这才是关于窗体
AboutBox.ShowModal;
AboutBox.Free;
end;

function TfcAboutPropertyEditor.GetAttributes: TPropertyAttributes;
begin
GetAttributes := [paDialog, paReadOnly];
end;

function TfcAboutPropertyEditor.GetValue: String;
begin
GetValue := 'Version 1.0';
end;


end.
 
//这个是点击About执行的动作
procedure Edit; override;
//设个设置属性,设置是否弹出窗体,是否只读等
function GetAttributes: TPropertyAttributes; override;
//设置About属性显示的值
function GetValue:string; override;
 
我再转帖一点知识
以下为转帖:
★★★如何自定义属性编辑器

一、派生出一个属性编辑器对象:
Delphi的DsgnIntf.pas(D5)单元中声明了几个属性编辑器,它们都是从一个共同的基类
TPropertyEditor继承下来的。当创建一个属性编辑器时,属性编辑器必须继承于TPropertyEditor
或它的派生类。
至于究竟需要选择哪个编辑器,这取决于需要编辑哪些属性。如需要编辑一个整型的属性,
就可用TIntegerProperty作为属性编辑器。如要在编辑属性的同时加入其他功能,则需要以
TIntegerProperty为祖先类,派生出一个新的属性编辑器。

二、覆盖方法:
当派生一个属性编辑器对象时,必须覆盖GetValue()和SetValue()这两个方法。GetValue()是
获得属性值以供在Object Inspector中显示,这个值以字符串的形式返回; SetValue()的作用是
根据输入到Object Inspect上的字符串来设置属性的值;
如果需要获取属性的枚举值供编辑时选择,还需要覆盖GetValues()方法;
如果需要用对话框来编辑属性,需要覆盖GetAttributes()方法,以便让Object Inspector知道
这个属性可以用一个对话框来编辑。GetAttributes()方法的返值用于设定属性编辑器的特性。
paValueList 可以从下拉列表中选择属性值,适用于枚举型的属性诸如TForm.BorderStyle和
整型变量如TColor、TCharSet;
paSubProperties 包含子属性,子属性右缩进显示。适用于集合类型的属性,如TOpenDialog.Option和TForm.Font;
paDialog 在Object Inspector上将出现一个省略号按钮,单击这个按钮,将调用属性编辑器的
Edit()方法打开一个对话框用于TForm.Font这样的属性;
paMultiSelect 允许为多个组件选择属性值,有的属性没有这个功能,如Name属性;
paAutoUpdate 当属性的值有变化,就调用SetValue()把值写到.DFM文件中,适用用于TForm.Caption等属性;
paFullWidthName 告诉Object Inspector这值不需要交付,名称应以Object Inspector的全宽交付;
paSortList 按字母顺序排列属性值的列表;
paReadOnly 属性是只读的;
paRevertable 属性的值可以恢复为以前的值。TFont等嵌套的属性不应恢复;
如果GetAttributes()方法的返值包括paDialog,则还要覆盖Edit()方法以调对话框;

三、注册新的属性编辑器:
可以调用RegisterPropertyEditor()来注册一个属性编辑器,这个过程是这样声明的:
procedure RegisterPropertyEditor(PropertyType: PTypeInfo; ComponentClass: TClass;
const PropertyName: string; EditorClass: TPropertyEditorClass);
第一个参数叫PropertyType,它是一个指针,指向要编辑的属性的运行期类型信息。
ComponentClass参数用于指定这个属性编辑器所适用的组件类。
PropertyName参数用于指定属性的名称。
EditorClass参数用于指定属性编辑器的类型。

具体实例可以参考C:/Program Files/Borland/Delphi5/Source/Property Editors下的单元。
 
你把我所说的TfcAboutPropertyEditor理解错了,可能是我没说清楚
 
现在行了
但是牛x大哥
给小弟讲讲如何做控件
或能给小弟关于delphi的一些学习资料吗??
我正在学习delphi
对于概念和函数等用法还不是很清楚
望赐教
QQ:448919877
 
不客气,我的QQ:3828884
 
多人接受答案了。
 
后退
顶部