Dynamically access a property in a Delphi component

delphi, dynamic

Solution

You have to use the Run-Time Type Information features of Delphi to do this:

This blog describes exactly what you are trying to do: Run-Time Type Information In Delphi - Can It Do Anything For You?

Basically you have to get the property information, using `GetPropInfo` and then use `SetOrdProp` to set the value.

uses TypInfo;

var
  PropInfo: PPropInfo;
begin
  PropInfo := GetPropInfo(Comp.ClassInfo, 'Left');
  if Assigned(PropInfo) then
    SetOrdProp(Comp, PropInfo, 100);
end;

This is not as concise as your pseudo-code, but it still does the job. Also it gets more complicated with other stuff, like array properties.

Problem

I'm using Delphi 5, and we have a method to dynamically create certain controls based on the contents of a database table (we create TButtons mostly) and take action when those are clicked. This allows us to add simple controls to a form without having to recompile the application. I was wondering if it was possible to set a component's property based on a property name contained in a string so we could set further options. Pseudo-code: ``` Comp := TButton.Create(Self); // Something like this: Comp.GetProperty('Left').AsInteger := 100; // Or this: Comp.SetProperty('Left', 100); ``` Is this possible at all?

Original source