为自定义控件编制一"属性编辑器",不明白其“Edit,SetValue,GetValue”所实现的具体功能,谁能帮我? ( 积分: 100

  • 主题发起人 主题发起人 fengsizi
  • 开始时间 开始时间
F

fengsizi

Unregistered / Unconfirmed
GUEST, unregistred user!
为自定义控件编制一&quot;属性编辑器&quot;,不明白其“Edit,SetValue,GetValue”所实现的具体功能,谁能帮我? ( 积分: 100 )<br />兄弟们,我试着编制了一个组件,但为之做一“属性编辑器”时,却让propertyedit的过程或函数:Edit,SetValue,和GetValue给搞迷了,谁能告诉我它们的具体是实现的是什么功能啊?而其中要调用的窗体中的按钮的 Click 事件又要做什么呢?另外属性的值是怎么从被调用窗体传到 object inspector 的呀?
兄弟在此多谢啦!
 
兄弟们,我试着编制了一个组件,但为之做一“属性编辑器”时,却让propertyedit的过程或函数:Edit,SetValue,和GetValue给搞迷了,谁能告诉我它们的具体是实现的是什么功能啊?而其中要调用的窗体中的按钮的 Click 事件又要做什么呢?另外属性的值是怎么从被调用窗体传到 object inspector 的呀?
兄弟在此多谢啦!
 
你看一看DELPHI高手突破吧。说的很清楚了
 
另外属性的值是怎么从被调用窗体传到 object inspector 的呀?
&gt;&gt;在published定义的都会在Object Inspector出现.
如下面的IconFont的值就是FIconFont的值.当你在Object Inspector中更改这个值时就会调用SetIconFont函数
published
property IconFont: TFont read FIconFont write SetIconFont;
 
属性是这样声明的:
property 属性名:数据类型 read 函数名 write 过程名;

当给属性赋值时就是调用write后面的过程,当把属性赋给变量时就是调用read函数后的过程。。。。
 
上面几位朋友,请再仔细看看我的问题&lt;
 
我自己看源码解决了,原来是我在代码中删除了一行造成的
&lt;&lt;&lt;&lt; 可又出现了另一个问题:[gold]我写的这个控件是设计期的,可在属性编辑器编辑完属性后,直接引发一事件此自定义控件上生成几个 LabelEdit 呢[/gold]?&lt;&lt;&lt;&lt; 谁能帮我?
 
很想学习,如果方便把代码贴上来,很愿意帮你调试[:D][:D]
 
主要代码如下:
。。。
type
TTabBaseFieldsProperty=class(TStringProperty)
public
function GetAttributes:TPropertyAttributes;override;
procedure Edit;override;
end;//属性编辑器用
TRelatedTab = class(TPanel) //控件,继承自 panel
private
FDbgBase:TDBGrid;
。。。
FTabBaseFields:string;
procedure SetTabBaseFields(value:string);
protected
procedure CreateTab(Qry:TQuery;sqlstr:string);
procedure Create_B_Edits;
public
constructor create(AOwner:TComponent);override;
destructor destroy;override;
published
property TabBaseFields:string read FTabBaseFields write SetTabBaseFields;
end;
procedure Register;

implementation
uses
FieldsFrm;

procedure Register;
begin
RegisterComponents('RelatedTab', [TRelatedTab]);
RegisterPropertyEditor(TypeInfo(string),TRelatedTab,'TabBaseFields',TTabBaseFieldsProperty);
end;

procedure TRelatedTab.SetTabBaseFields(value:string);
begin
try
FTabBaseFields:=Value;
except
on Exception do
FTabBaseFields:=Value;
end;
end;

procedure TRelatedTab.Create_B_Edits; //动态生成 bF_count 个 LabelEdit
var jj:integer;
NewEdit:TLabeledEdit;
begin
for jj:=1 to bF_count do
begin
NewEdit:=TLabeledEdit.Create(self);///*************这里是否错了?
with NewEdit do
begin
Parent:=self;
Width:=75;
Height:=21;
Left:=jj*75;
Top:=screen.ActiveControl.Height*3 div 5 +6;
Name:='ed_B'+inttostr(jj);
end;
end;
end;

function TTabBaseFieldsProperty.GetAttributes: TPropertyAttributes;
begin
result:=[paDialog,paMultiselect];
end;

procedure TTabBaseFieldsProperty.Edit;//就是想在这里生成 LabelEdit*****
begin
FrmFields:=TFrmFields.Create(nil);
try
FrmFields.FieldsList:=TStringList(GetOrdValue);
if FrmFields.ShowModal=mrOK then
SetOrdValue(longint(FrmFields.FieldsList.Text));
//在这里完成功能:生成几个 LabelEdit
finally
FrmFields.FieldsList.Free;
FrmFields.Free;
end;
end;

//*************另外引用了另一个 。dfm 文件,如上面 implementation 后,附上
type
TFrmFields = class(TForm)
btConfirm: TRzBitBtn;
btCancel: TRzBitBtn;
tsgFields: TtsDBGrid;
procedure btConfirmClick(Sender: TObject);
procedure btCancelClick(Sender: TObject);
private
{ Private declarations }
public
FieldsList:TStringList;
_Count:integer;
end;
var
FrmFields: TFrmFields;

implementation

{$R *.dfm}

procedure TFrmFields.btConfirmClick(Sender: TObject);
var
iLoop,jLoop:integer;
begin
_count:=0;
FieldsList:=TStringList.Create;
try
for iLoop:=1 to tsgFields.Rows do
if tsgFields.Cell[1,iLoop]&lt;&gt;'' then
begin
for jLoop:=1 to tsgFields.Cols do
FieldsList.Add(tsgFields.Cell[jLoop,iLoop]);
_count:=_count+1;
end;
finally
//FieldsList:=nil;
//FieldsList.Free;
end;

ModalResult:=mrOK;
end;

谢谢!谢谢!
 
后退
顶部