三个问题.程式能否呼叫自己吗,如何呼叫,with的嵌套问题
procedure refreshreadonly(ltform1:tform;lreadonly:boolean);
var
i,ii:integer;
begin
with ltform1 do
begin
for i:=0 to ControlCount-1 do
begin
if pos(Controls[i].ClassName, 'TDBEdit TDBComboBox TDBMemo TDBGrid ')> 0 then controls[i].ReadOnly := lreadonly;
if Controls[i].ClassName = 'TcxDBDateEdit ' then
Controls[i].properties.readonly := lreadonly;
if Controls[i].ClassName = 'TPageControl ' then
begin
with controls[i] do
begin
for ii:=0 to ControlCount-1 do
tabsheetrefresh(controls[ii],lreadonly);
end;
end;
end;
end;
end;
[解决办法]
1.ReadOnly属性并不是所有的TControls都有
方法1:判断每个类,如if Controls[i] is TDBEdit then TDBEdit(Controls[i]).ReadOnly := ...
方法2:用RTTI
uses TypInfo;
//声明函数
procedure SetBooleanPropertyIfExists(AComp: TComponent; APropName: String;
AValue: Boolean);
var
PropInfo: PPropInfo;
begin
PropInfo := GetPropInfo(AComp.ClassInfo, APropName);
if PropInfo <> nil then
begin
if PropInfo^.PropType^.Kind = tkEnumeration then
SetOrdProp(AComp, PropInfo, Integer(AValue));
end;
end;
改
if pos(Controls[i].ClassName, 'TDBEdit TDBComboBox TDBMemo TDBGrid ')> 0 then controls[i].ReadOnly := lreadonly;
为
if pos(Controls[i].ClassName, 'TDBEdit TDBComboBox TDBMemo TDBGrid ')> 0 then
SetBooleanPropertyIfExists(controls[i], 'ReadOnly ',lreadonly);
2.
with controls[i] do
改为
if controls[i] is TWinControl then
with TWinControl(controls[i]) do
[解决办法]
Controls[i]只是TControl类,里面没有
ReadOnly属性,也没有ControlCount啊
[解决办法]
用Rtti判断是否有readonly属性