Delphi это мощная среда визуальной разработки программ сочетающая в себе весьма простой и эффективный язык программирования, удивительный по быстроте компилятор и подкупающую открытость (в состав Delphi входят исходные тексты стандартных модулей и практически всех компонент библиотеки VCL). Однако, как и на солнце, так и в Delphi существуют пятна (на солнце черные, а в Delphi белые), пятна недокументированных (или почти не документированных) возможностей. Одно из таких пятен это информация о типах времени исполнения и методы работы с ней.

 

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;

 

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

 Например: 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.

 I need to get a list of strings (like a StringList) with the possible values for a TBrushStyle property (bsSolid, bsClear, bsHorizontal, for example). I want to build a ComboBox with this options. How can I set the property Items of my ComboBox directly with all the values from the enumerated type TBrushStyle? My ComboBox will be alike the Property Editor for this type.

 You can use runtime type information (RTTI) to do that. Below is an example:

 

Копирование свойств одного компонента другому

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

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

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

 

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

 You may need to know at runtime what properties are available for a particular component at runtime. The list can be obtained by a call to GetPropList. The types, functions and procedures, including GetPropList, that allow access to this property information reside in the VCL source file TYPINFO.PAS.