如何判断一个控件是否有某个属性,并对改属性进行赋值 ( 积分: 50 )

  • 主题发起人 主题发起人 青云
  • 开始时间 开始时间

青云

Unregistered / Unconfirmed
GUEST, unregistred user!
比如 Tbutton 有 caption 属性 ,但是 Tedit 就没有caption 属性,但是它有Text 属性,而Tbutton却没有;

现在假如 想把 Form1 里的所有带Caption 属性的Caption值改成'hello',
把所有带Text 属性的Text值全部修改成‘world';

要达到上面的要求,代码我是这样写的:
procedure Tform1.SetCaptionAndText(frm: TCustomForm);
var
I: integer;
begin
for I := 0 to frm.ComponentCount - 1 do
begin
if (Components has ‘Caption’属性 ) then
Components.Caption:='hello';
if (Components has 'Text'属性 ) then
Components.Text:='World';
end;
end;

当然上面的代码肯定是编译不了的。 我只是通过上面代码表达了我的意思。

不知道 上面的想法 该如何实现。
 
TypInfo.pas 中有你想要的
 
http://liwei.csdn.net/Forum/topic.aspx?topicid=726
http://bbs.2ccc.com/topic.asp?topicid=255235
 
不知道可不可以用TComponent中的MethodAddress(const Name: ShortString): Pointer方法,返回的是组件中方法的地址,然后调用,不知道行不行
 
你可以跟踪一下,控件的Caption设置函数都来自于哪里
直接调用那个函数即可
不行就发送VCL消息试试
 
一例:
uses TypInfo;
for i := 0 to Panel1.ControlCount - 1 do
begin
if IsPublishedProp(Panel1.Controls,'ReadOnly') then
SetPropValue(Panel1.controls,'ReadOnly',True);
end;
 
uses typinfo;
If IsPublishedProp(Components, 'Caption') then
begin
...
end;
 
根据楼上几位朋友的提示,我也做了一个
uses typinfo;

procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
for i := 0 to self.ComponentCount - 1 do
begin
if IsPublishedProp(Components, 'Caption') then
Memo1.Lines.Add(Components.Name)
end;
end;
但是 如何 设置caption ,我就不知道怎么搞了;
Components.Caption :='...'; 这句话delphi是不允许写的。
 
呵呵,可以了:

uses typinfo;

procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
for i := 0 to self.ComponentCount - 1 do
begin
if IsPublishedProp(Components, 'Caption') then
begin

Memo1.Lines.Add(Components.Name);
SetPropValue(Components,'Caption','123');
end;
end;
end;
 
type
TMyGraphicControl = class(TGraphicControl);
....

uses typinfo;


procedure TForm1.SetCaptionAndText(frm: TCustomForm);
var
I: integer;
begin
for I := 0 to frm.ComponentCount - 1 do
begin
If IsPublishedProp(Components, 'Caption') then
TMyGraphicControl(Components).Caption:='hello'
else if IsPublishedProp(Components, 'Text') then
TMyGraphicControl(Components).Text:='World';
end;
end;
 
呵呵,问题并没有完全解决
TLabeledEdit 也是一个常用的控件。
但是 LabeledEdit1 的Caption 不是 直接通过 LabeledEdit1.Caption 实现的
而是通过 LabeledEdit1.EditLabel.Caption 实现的。

假如现在窗体上有很多个TLabeledEdit 控件,我想 批量把它们的caption 批量修改成
'123',于是:
uses typinfo;

procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
for i := 0 to self.ComponentCount - 1 do
begin
Memo1.Lines.Add(Components.Name);
if IsPublishedProp(Components, 'EditLabel') then
begin
SetPropValue(Components,'EditLabel.Caption','123');
end;
end;

end;

结果报错 ,呵呵这个问题该如何处理?

当然可以直接用
TLabeledEdit(Components).EditLabel.Caption:='123';
来实现,但是这样做太不通用;

比如很多第三方控件,也有EditLabel.Caption 属性,那么上面写法就不好了;
所以上面的程序 不要出现具体的控件名;
 
这样试试
procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
v:longint;
c:tcomponent;
begin
for i := 0 to self.ComponentCount - 1 do
begin
Memo1.Lines.Add(Components.Name);
if IsPublishedProp(Components, 'EditLabel') then
begin
v:=GetPropValue(Components,'EditLabel');
c:=tcomponent(v);
if IsPublishedProp(c, 'Caption') then
SetPropValue(c,'Caption','123');
end;
end;
end;
 
楼上 TYZhang 朋友提供的方法 OK ,
问题解决 ,多谢楼上各位兄弟!

下面是 对带Db 的 TLabeledEdit 的caption 通用处理;
如果不确当的地方,希望朋友们提出。
procedure TForm.SetDbLabeledEditCaption(frm: TCustomForm);

var i: Integer;
v1, v2: longint;
c1, c2: tcomponent;
sDataField: string;
begin
for i := 0 to self.ComponentCount - 1 do
begin
if IsPublishedProp(Components, 'EditLabel')
and IsPublishedProp(Components, 'DataField')
and IsPublishedProp(Components, 'DataSource')
then
begin
sDataField := GetPropValue(Components, 'DataField');
v1 := GetPropValue(Components, 'EditLabel');
c1 := tcomponent(v1);
v2 := GetPropValue(Components, 'DataSource');
c2 := tcomponent(v2);
if (sDataField <> '') and ( TDataSource(c2).DataSet.FieldByName(sDataField)<>nil ) then
SetPropValue(c1, 'Caption', TDataSource(c2).DataSet.fieldByName(sDataField).DisplayLabel);
end;
end;

end;
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
638
import
I
后退
顶部