高难!!200分,关于“name”(200分)

  • 主题发起人 主题发起人 yeskert1
  • 开始时间 开始时间
Y

yeskert1

Unregistered / Unconfirmed
GUEST, unregistred user!
问题是这样的:我开发了一个控件Tcomp1,从tpanel继承而来。这个控件内部有个自控件,
但看不到。当用户为Tcomp1指定名称的时候,我希望内部的控件的name跟随变化(的确需
要这样!),这样需要:当name改变时,触发一个事件。
要自己定义属性编辑器吗?难道没有别的巧妙的办法吗?
 
你定义name属性的时候可以这样
property Name:String read FName write setName;
在private里面增加
procedure setName(value:String);
然后实现这个方法
procedure TComp1.setName(value:String);
begin
FName:=Value;
内部控件.name=Value; (这里设置内部控件的name属性)
end;

搞定给分!
 
to叶孤城:
兄弟,问题远远不是这么简单,否则我也不问了。请注意,我是从tpanel继承而来的,
tpanel已经有个属性name,你能让你的代码正确执行吗?请试试看。
 
Tpanel.name=Tcustomcom.name .让两个组件同名呀?
 
下面是从我前年写的一个程序中分解出来的,改了一下,还没有调试过,你先试试看。

function TComp1.GetComponentID(AClassType: String): Integer;
//获取新增控件ID,以设置新增控件的名称
var CCount,I: Longint;
ClsName: String;
TC: TComponent;
begin
CCount := 0;
for i:=0 to ComponentCount-1 do
begin
ClsName := Components.ClassName;
//从类名中分解出控件名
ClsName := Copy(ClsName,2,Length(ClsName)-1);
if CompareText(ClsName,AClassType)=0 then
Inc(CCount,1); //控件名已存在,ID加1
end;
for i:=1 to CCount-1 do
begin
TC := FindComponent(Format('%s%d', [AClassType, i]));
if (TC = nil) then
break;
end;
Result := i; //i为控件的ID
end;

//设置控件名称(更正:SetName继承TComponent的SetName方法)
procedure TComp1.SetName(const NewName: TComponentName);
var ClsName: String;
i: Integer;
begin
inherited;
For i:=0 to ComponentCount-1 do
begin
ClsName := Component.ClassName; //Component是TComp的第i个字控件
//设置子控件名称,名称为:控件类名+子控件的最大ID号,例:Comp1SubPanel1
//子控件名称会被重新排序
Component.Name := Format('%sSub%s%d', [Value, ClsName,
GetComponentID(ClsName)]);
end;
end;
 
TComponent的Name属性设置过程可以覆盖,继承.
protected
{ protected declarations }
procedure SetName(const NewName: TComponentName); Override;
public

procedure TXXX.SetName(const NewName: TComponentName);
begin
inherited;
//....这里写你想干的
end;
 
谢谢各位,晚上我是一试
 
对不起,各位,因为一些事情一直没有试验。
现在散分!
感谢wr960204,感谢大家!
 
多人接受答案了。
 
后退
顶部