当前位置:主页>销售管理软件> 列表

引用类的祖先类,动态创建控件 找免费财务软件

记账软件版1楼: 源程序片段
==========================
type
TConClass=class of TControl;//声明类
TForm1 = class(TForm)
rg: TRadioGroup;
btn: TButton;
lbl: TLabel;
procedure btnClick(Sender: TObject);
private
procedure createControlObj(ConClass:TConClass);
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.createControlObj(ConClass:TConClass);
var
A:TControl;
begin
A:=TControl.Create(self);
A.Parent:=self;
A.Name:=A.ClassName;
A.SetBounds(20,20,250,150);//<<--这里有问题
lbl.Caption:=A.ClassName;
end;

procedure TForm1.btnClick(Sender: TObject);
const
AOfarray:array[0..2] of TConClass=(TMonthCalendar,TMemo,TColorBox);
var
i:integer;
begin
for i:=0 to controlcount-1 do
begin
if(Controls[i] is TMonthCalendar) or (Controls[i] is TMemo)or (Controls[i] is TColorBox) then
Controls[i].Free;

createControlObj(AOfarray[rg.itemIndex]);
end;
end;
==================
现象:
1、选择rg: TRadioGroup;(rg控件中有这三个单选按钮TMonthCalendar,TMemo,TColorBox)中的一个单选按钮;然后,再执行btnClick时间就出错!
2、错误类型是“A component named TControl already exists”大概是意思是说A的这个名称已经有了!
3、 停留到这个行代码:A.SetBounds(20,20,250,150);//<<--这里有问题

我对这个TControl继承下来的属性不是很了解。尤其是.SetBounds(L,T,W,H)属性;请熟悉的朋友给我讲解一下,感激!
4、另外:这个rg.itemIndex属性,在非运行期为什么不可见!是这个类的数据域封装在私有的保护域中了吗?

再次谢谢!

2楼: A.Name:=A.ClassName 如销售管理软件破解版

3楼: to 凤舞九天
什么意思?我不懂!

4楼: 错误在这句,A.Name:=A.ClassName
你创建两个控件,name不能相同,即(A component named TControl already exists)

A.SetBounds(20,20,250,150)
这句话是设置控件A的left ,top,width,height

5楼: A.Name = ''Ctrl''+IntToStr(GetTickCount);

6楼: 错误出在A.Name:=A.ClassName;这句,就是创建的控件名已经存在。而真正的原因是


你的按钮事件。
procedure TForm1.btnClick(Sender: TObject);
const
AOfarray:array[0..2] of TConClass=(TMonthCalendar,TMemo,TColorBox);
var
i:integer;
begin
for i:=0 to controlcount-1 do
begin
if(Controls[i] is TMonthCalendar) or (Controls[i] is TMemo) or (Controls[i]
is TColorBox) then
Controls[i].Free;
createControlObj(AOfarray[rg.itemIndex]);
end;
end;
在这里面可以看到,在for循环里面你实际上重复创建了控件,因而会出现同名现象。即
假如控件个数(controlcount)为3个,那么循环里面会重复调用createControlObj方法,
3次创建类型为TControl的对象(你的定义中是A:TControl;),而实际当第二次创建时就已
经出错了(第二个和第一个同名,Name都为"TControl")。
我想你是想实现这个效果吧:?
if(Controls[i] is TMonthCalendar) or (Controls[i] is TMemo)or (Controls[i]
is TColorBox) then
begin //在这里将一下两个语句括起来,就保证释放后再次只创建一次
Controls[i].Free;
createControlObj(AOfarray[rg.itemIndex]);
end;

记账软件版7楼: 你一没有引用祖先类,二也没有动态创建什么鸟控件。我看到的是你在怀疑那些写出Delphi
语言的人的智商是否都象你那样的低下。

8楼: procedure TForm1.createControlObj(ConClass:TConClass);
中,A用完后应该释放。

9楼: 在一个Form中Name应该是唯一的
否则你让系统怎么区分它们呢

10楼: 路过

11楼: Jonson_sunshine已经指出了问题的原因
这段代码太有问题了,不知道实际中是不是就这么用?
问题一:
if(Controls[i] is TMonthCalendar) or (Controls[i] is TMemo)or (Controls[i]
is TColorBox) then
begin
Controls[i].Free;//这句会导致把排在后面的那个Control漏过
createControlObj(AOfarray[rg.itemIndex]);//这里创建的会排在Controls的最后,将重复创建一次.
end;
应该使用downto
for i:=controlcount-1 downto 0 do
if(Controls[i] is TMonthCalendar) or (Controls[i] is TMemo)or (Controls[i] is TColorBox) then
begin
Controls[i].Free;
createControlObj(AOfarray[rg.itemIndex]);
end;
问题二:
createControlObj(AOfarray[rg.itemIndex]);这句不管Free掉的是什么类型,创建的都是rg中选定了,如果有两个以上的TMonthCalendar或TMemo或TColorBox都将产生错误

12楼: end 如免费财务软件