Search code examples
delphitobject

cast TObject using his ClassType?


how can i make my code to work ? :) i`ve tried to formulate this question but after several failed attempts i think you guys will spot the problem faster looking at the code than reading my 'explanations'. thank you.

setCtrlState([ memo1, edit1, button1], False);

_

procedure setCtrlState(objs: array of TObject; bState: boolean = True);
var
  obj: TObject;
  ct: TClass;
begin
  for obj in objs do
  begin
    ct := obj.ClassType;


    if (ct = TMemo) or (ct = TEdit) then
      ct( obj ).ReadOnly := not bState;        // error here :(

    if ct = TButton then
      ct( obj ).Enabled:= bState;        // and here :(

  end;
end;

Solution

  • It would be easier to use RTTI instead of explicit casting, ie:

    uses
      TypInfo;
    
    setCtrlState([ memo1, edit1, button1], False);
    
    procedure setCtrlState(objs: array of TObject; bState: boolean = True);
    var
      obj: TObject;
      PropInfo: PPropInfo;
    begin
      for obj in objs do
      begin
        PropInfo := GetPropInfo(obj, 'ReadOnly');
        if PropInfo <> nil then SetOrdProp(obj, PropInfo, not bState);
    
        PropInfo := GetPropInfo(obj, 'Enabled');
        if PropInfo <> nil then SetOrdProp(obj, PropInfo, bState);
      end;
    end;