[在线等]关于函数或方法中传递控件实例作参数的问题 ( 积分: 100 )

  • 主题发起人 主题发起人 冰冷的雨
  • 开始时间 开始时间

冰冷的雨

Unregistered / Unconfirmed
GUEST, unregistred user!
我写了一个方法:
procedure MyProc(Parent: TComponent,Status: boolean);
var
i:integer;
begin
for i:=0 to Parent.ComponentCount-1;do
//遍历容器Parent中的子控件,如果是TEdit则设置其Enabled属性为Status
....
end;

然后调用:
MyProc(GroupBox1)
//GroupBox1里有10个TEdit控件

结果所有TEdit控件的Enabled属性都没变化,通过跟踪发现,在MyProc方法里面,
Parent参数的值并不是GroupBox1,而是FComponentStyle:[csInheritable];
Parent.ComponentCount的值却是0
请问是什么原因,怎么做才正确?
 
我写了一个方法:
procedure MyProc(Parent: TComponent,Status: boolean);
var
i:integer;
begin
for i:=0 to Parent.ComponentCount-1;do
//遍历容器Parent中的子控件,如果是TEdit则设置其Enabled属性为Status
....
end;

然后调用:
MyProc(GroupBox1)
//GroupBox1里有10个TEdit控件

结果所有TEdit控件的Enabled属性都没变化,通过跟踪发现,在MyProc方法里面,
Parent参数的值并不是GroupBox1,而是FComponentStyle:[csInheritable];
Parent.ComponentCount的值却是0
请问是什么原因,怎么做才正确?
 
procedure MyProc(AParent: TWinControl
Status: boolean);
var
I: Integer;
begin
with AParent do
for I :=0 to ControlCount - 1 do
begin
if Controls is TEdit then
Controls.Enabled := Status;
if Controls is TWinControl then
MyProc(TWinControl(Controls), Status);
end;
end;
 
TO LSUPER:把您的函数扩展为(设置容器内所有控件实例的特定属性):
procedure TfrmAdminMain.SetComponentProp(AParent: TWinControl
APropName: String
AProp: Variant);
var
I: Integer;
begin
// with AParent do
for I :=0 to ControlCount - 1 do
begin
SetPropValue(AParent.Components,APropName,AProp);

//if Controls is TWinControl then
if AParent.Components.ComponentCount>0 then
SetComponentProp(TWinControl(AParent.Components),APropName,AProp);
end;
end;

调用:
....
SetComponentProp(grpOrgInfo,'Enabled',False)

....

结果不管用哪一个IF语句,都会触发“List index out of bounds(0)”
错误。请再指教,谢谢
 
问题解决了[:D][:D]
 
=^0^= rtti 更灵活啊 ...
 
后退
顶部