如何在类里取对象的名字???(20分)

  • 主题发起人 主题发起人 txh_edo
  • 开始时间 开始时间
T

txh_edo

Unregistered / Unconfirmed
GUEST, unregistred user!
不知道上面的表达是否准确,我的意思是:
我自己建立了一个新组件(new component),继承Tdbgrid,重载了Create构造函数,如下:
constructor TTxhDbGrid.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ShowMessage(Self.Name);
end;
我想在程序运行时能够取到放在窗体上的控件的名字,但是取不到,是什么问题?如何取?
 
procedure TForm1.Button1Click(Sender: TObject);
begin
Caption := Self.Components[0].Name;
end;
这里的Self是指Form1窗口,窗口里面只有一个Button1,结果是显示'Button1'
 
可以用Self.ComponentCount遍历每一个控件,然后通过ClassName来筛选你要的控件
 
你这样是在窗体里取,我是想在类本身的构造函数create里面取,就像我的例子那样
 
因为在create里还没有给name赋值,所以这时你取不到name
 
如果真的这样就太不方便了,有很多功能封装到类本身里会很方便,这样只能写到窗体里了
 
不是的,你只要不在create里取就是了,或者在create里等你給name賦值後再取就能取到了
 
那什么时候才能取呢,我在AfterConstruction里面也取不到,创建对象时,name属性是什么时候被赋值的呢?
 
type
TMyClass = class(TButton)
private
public
constructor Create(AOwner: TComponent
ComponentName: TComponentName);
end;
-----
constructor TMyClass.Create(AOwner: TComponent
ComponentName: TComponentName);
begin
inherited Create(AOwner);
Name := ComponentName;
ShowMessage(Name);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
MyClass: TMyClass;
begin
MyClass := TMyClass.Create(Self, 'YourName');
try
;
finally
MyClass.Free;
end;
end;
 
我是把自己的控件放在控件栏上,在设计期放在窗体上的,而不是运行时动态创建的,也就是要取得设计期控件的名字,不知这种情况是否可以实现?
 
晕,你在设计期也得给它赋个名呀!!!
 
大哥,当然已经赋名了,问题就是取不到啊
 
用递归. 直到控件的parent is Tform为真.还要加判断.
 
name值默认为空。不能在Create中给name赋非空值,否则创建两个就会出已存在name为XXX的控件错误。在设计期控件的名字是有设计器给控件赋值,并保证Form内唯一。控件应有他的创建者给name赋值,并保证在传入参数Owner包含的控件列表中唯一
 
重载控件的Loaded方法:
TMyClass = class(TButton)
private
procedure Loaded;override;
public
constructor Create(AOwner: TComponent
ComponentName: TComponentName);
end;

procedure TMyClass.Loaded;
begin
inherited Loaded;
ShowMessage('我悟到了:' + Name);
end;
 
重载loaded好用,不过,有没有和loaded对应的方法,比如Unload ?
 
看一下BeforeDestructor能不能满足你的要求?
 
BeforeDestructor试过了,取不到
 
接受答案了.
 
后退
顶部