首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

三个有关问题.程式能否呼叫自己吗,怎么呼叫,with的嵌套有关问题

2012-02-11 
三个问题.程式能否呼叫自己吗,如何呼叫,with的嵌套问题procedurerefreshreadonly(ltform1:tformlreadonly

三个问题.程式能否呼叫自己吗,如何呼叫,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属性

热点排行