Мне необходима функция, которая возвращала бы имя класса компонента и имя модуля, где определен данный класс.

 Например: xxx('TPanel') возвращала бы 'ExtCtrls'

 Также мне необходима функция, возвращающая список имен страниц палитры компонентов.

 

Code:

Uses TypInfo;

 

Function ObjectsUnit (Obj: TClass): String;

Begin

Result := GetTypeData (PTypeInfo(Obj.ClassInfo))^.UnitName

end;

 

Для создания описанной вами функции "Какой модуль" могут использоваться описанные в TOOLINTF.INT методы GetModuleCount, GetModuleName, GetComponentCount и GetComponentName.

Для получения представления о формате палитры компонентов обратитесь к файлу DELPHI.INI.

Предмет данной статьи - инспектор объектов как средство, доступное конечному пользователю некоторой прикладной программы. Само понятие "инспектор" трактуется в данном случае очень широко: инспектор - это инструмент прикладной программы, с помощью которого пользователь может посмотреть и изменить свойства тех объектов, с которыми он работает. Отметим, что речь идет о любых объектах прикладного уровня, а не только о визуальных компонентах (как в Delphi).

I would like to change the font color on all components on a form at runtime (and the components owned by the components etc). I devised a recursive algorithm using RTTI that accepts a TComponent as a parameter. It works to some extent, but I still have to use 'if' statements to cast the object to a particular descendant, resulting in about 30 lines of code to test for all of the components I use. Also, some objects (TColumnTitle), are not descended from TComponent, even though they have a font property.

 This may do the trick (with D6 and maybe D5):

 

Как определить, насдледовано ли свойство от определённого класса?

Ниже представлен пример кода:

 

Как выяснить имеет ли объект определённое свойство?

Ниже представлен пример кода:

If I am given a TPersistent object, and a method name, is there a way to determine if the name is an event of TNotifyEvent type? For example, given a TPersistent lMyObj and an event name, "OnDataChanged", how can I determine if OnDataChanged is a TNotifyEvent?

 

Как получить значение свойства в виде варианта по тексту имени свойства?

Ниже представлен пример кода:

 

Code:

function GetProperty(AControl: TPersistent; AProperty: String): PPropInfo;

var

i: Integer;

props: PPropList;

typeData: PTypeData;

begin

Result := nil;

if (AControl = nil) or (AControl.ClassInfo = nil) then

   Exit;

typeData := GetTypeData(AControl.ClassInfo);

if (typeData = nil) or (typeData^.PropCount = 0) then

   Exit;

GetMem(props, typeData^.PropCount * SizeOf(Pointer));

try

   GetPropInfos(AControl.ClassInfo, props);

   for i := 0to typeData^.PropCount - 1do

   begin

     with Props^[i]^ do

       if (Name = AProperty) then

         result := Props^[i];

   end;

finally

   FreeMem(props);

end;

end;

 

 

procedure TForm1.Button1Click(Sender: TObject);

var

propInfo: PPropInfo;

begin

PropInfo := GetProperty(Button1.Font, 'Name');

if PropInfo <> nilthen

   SetStrProp(Button1.Font, PropInfo, 'Arial');

end;

 

Как получить контекст свойства по его целочисленному значению?

Ниже представлен пример кода: