窗体上有Edit、DBEdit、DBGrid等可编辑控件,我将这些控件的tag属性设为tag=2,
如何根据tag属性让这些控件的ReadOnly属性为true

解决方案 »

  1.   


    var
      iLoop : Integer;
    begin
      for iLoop := 0 to Self.ControlCount - 1 do
      begin
        if Self.Controls[iLoop].Tag = 2 then
        begin
          if Self.Controls[iLoop] Is TEdit then
            TEdit(Self.Controls[iLoop]).ReadOnly:= True;
          if Self.Controls[iLoop] Is TDBEdit then
            TDBEdit(Self.Controls[iLoop]).ReadOnly:= True;
          if Self.Controls[iLoop] Is TDBGrid then
            TDBGrid(Self.Controls[iLoop]).ReadOnly:= True;
        end;
      end;
    end;
      

  2.   

    var
      i : Integer;
    begin
      for i:= 0 to ControlCount - 1 do
      begin
        if Controls[i].Tag = 2 then
        begin
          if Controls[i] Is TEdit then
            TEdit(Controls[i]).ReadOnly:= True
          else if Controls[i] Is TDBEdit then
            TDBEdit(Controls[i]).ReadOnly:= True
          else if Controls[i] Is TDBGrid then
            TDBGrid(Controls[i]).ReadOnly:= True;
        end;
      end;
    end;
      

  3.   

    由于ReadOnly不是某个共同基类里的属性,所以是无法直接通用的。但是我有个方法,可以一试,首先遍历控件,找tag=2的(这个不难了)。然后判断它是不是TWinControl,是的话,就直接发送一个设置ReadOnly的消息。当然,有些控件是不处理它的,这就要你具体判断了。
      

  4.   

    procedure TForm1.Button1Click(Sender: TObject);
    begin
         tag_(1);
    end;-------------- 
      procedure tag_(str: integer);
    -------------------------------------------------
    procedure TForm1.tag_(str: integer);
    var 
      i : Integer; 
    begin 
      for i:= 0 to ControlCount - 1 do 
      begin 
        if Controls[i].Tag = 2 then 
        begin 
          if Controls[i] Is TEdit then 
            TEdit(Controls[i]).ReadOnly:= True 
          else if Controls[i] Is TDBEdit then 
            TDBEdit(Controls[i]).ReadOnly:= True 
          else if Controls[i] Is TDBGrid then 
            TDBGrid(Controls[i]).ReadOnly:= True; 
        end; 
      end; 
    end; 
      

  5.   

    uses TypInfo
    var 
      i : Integer;
    begin
      for i:= 0 to ControlCount - 1 do
      begin
        if Controls[i].Tag = 2 then
        begin
          if IsPublishedProp(Controls[i], 'ReadOnly') then
          begin
            SetPropValue(Controls[i], 'ReadOnly', true);
          end;
        end;
      end;
    end;
      

  6.   

    orz.. 忘记readonly是published属性了.. 该用rtti
      

  7.   

    Piao40993470的代码对选项卡和Panel上的控件无效,
    是这样吗?还是我写的不对!
      

  8.   

    把Controls换成Components就可以了
    高手啊...服了...