Как получить значение свойства в виде варианта по тексту имени свойстваDelphi , Компоненты и Классы , RTTIКак получить значение свойства в виде варианта по тексту имени свойства
Автор: Ralph Friedman unit MorePropInfo; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TFrmMorePropInfo = class(TForm) Button1: TButton; Button2: TButton; ListBox1: TListBox; procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var FrmMorePropInfo: TFrmMorePropInfo; implementation {$R *.DFM} uses TypInfo; procedure GetPropertyValues(AObj: TObject; AValues: TStrings); var count: integer; data: PTypeData; default: string; i: integer; info: PTypeInfo; propList: PPropList; propInfo: PPropInfo; propName: string; value: variant; begin info := AObj.ClassInfo; data := GetTypeData(info); GetMem(propList, data^.PropCount * SizeOf(PPropInfo)); try count := GetPropList(info, tkAny, propList); for i := 0 to count - 1 do begin propName := propList^[i]^.Name; propInfo := GetPropInfo(info, propName); if propInfo <> nil then begin case propInfo^.PropType^.Kind of tkClass, tkMethod: value := '$' + IntToHex(GetOrdProp(AObj, propInfo), 8); tkFloat: value := GetFloatProp(AObj, propInfo); tkInteger: value := GetOrdProp(AObj, propInfo); tkString, tkLString, tkWString: value := GetStrProp(AObj, propInfo); tkEnumeration: value := GetEnumProp(AObj, propInfo); else value := '???'; end; if propInfo.default = longint($80000000) then default := 'none' else default := IntToStr(propInfo.default); AValues.Add(Format('%s: %s [default: %s]', [propName, value, default])); {$80000000 apparently indicates "no default"} end; end; finally FreeMem(propList, data^.PropCount * SizeOf(PPropInfo)); end; end; procedure TFrmMorePropInfo.Button2Click(Sender: TObject); var count: integer; data: PTypeData; i: integer; info: PTypeInfo; propList: PPropList; propInfo: PPropInfo; propName: string; propVal: variant; tmpS: string; begin info := Button2.ClassInfo; data := GetTypeData(info); GetMem(propList, data^.PropCount * SizeOf(PPropInfo)); try count := GetPropList(info, tkAny, propList); ListBox1.Clear; for i := 0 to count - 1 do begin propName := propList^[i]^.Name; propInfo := GetPropInfo(info, propName); if propInfo <> nil then begin case propInfo^.PropType^.Kind of tkClass, tkMethod: propVal := '$' + IntToHex(GetOrdProp(Button2, propInfo), 8); tkFloat: propVal := GetFloatProp(Button2, propInfo); tkInteger: propVal := GetOrdProp(Button2, propInfo); tkString, tkLString, tkWString: propVal := GetStrProp(Button2, propInfo); tkEnumeration: propVal := GetEnumProp(Button2, propInfo); else propVal := '...'; end; tmpS := propVal; ListBox1.Items.Add(Format('%s: %s [default: %s]', [propName, tmpS, '$' + IntToHex(propInfo.default, 8)])); {$80000000 apparently indicates "no default"} end; end; finally FreeMem(propList, data^.PropCount * SizeOf(PPropInfo)); end; end; end. Цель этого кода - получить значения свойств для указанного объекта (в этом случае, Чтобы получить значение свойства в виде варианта, можно использовать переменную Например, если Вот пример, как можно модифицировать код для достижения этого:
В этом модифицированном коде Как получить значение свойства в виде варианта по тексту имени свойства с помощью Delphi и компонента TForm. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |