如何检测TWinControl是否具有FONT属性

有视觉控件都有一个Font属性,但它protected位于该TControl层,并非所有派生控件都将其提升为published。 


 uses
   ..., TypInfo;

var
   Ctrl: TControl;
   i: Integer;
begin
   for i := 0 to ContainerControl.ControlCount - 1 do
   begin   
    Ctrl := ContainerControl.Controls[i];
    if IsPublishedProp(Ctrl, 'Font') then
      TFont(GetObjectProp(Ctrl, 'Font', TFont)).Size := 8;
   end;
end;




或者:


 uses
   ..., TypInfo;

var
   Ctrl: TControl;
   Prop: PPropInfo;
   i: Integer;
begin
   for i := 0 to ContainerControl.ControlCount - 1 do
   begin   
    Ctrl := ContainerControl.Controls[i];
    Prop := GetPropInfo(Ctrl, 'Font', [tkClass]);
    if Prop <> nil then
      TFont(GetObjectProp(Ctrl, Prop, TFont)).Size := 8;
   end;
end;





或者,仅在Delphi 2010和更高版本中:


 uses
  ..., System.Rtti;

var
  Ctrl: TControl;
  Ctx: TRttiContext;
  Prop: TRttiProperty;
  i: Integer;
begin
  Ctx := TRttiContext.Create;
  try
    for i := 0 to ContainerControl.ControlCount - 1 do
    begin  
      Ctrl := ContainerControl.Controls[i];
      Prop := Ctx.GetType(Ctrl.ClassType).GetProperty('Font');
      if (Prop <> nil) and (Prop.Visibility = TMemberVisibility.mvPublished) then
        TFont(Prop.GetValue(Ctrl).AsObject).Size := 8;
    end;
  finally
    Ctx.Free;
  end;
end;


联系电话:
020-00000000
联系电话:
020-00000000
联系电话:
020-12345678