下面是从我前年写的一个程序中分解出来的,改了一下,还没有调试过,你先试试看。
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;