Получить список свойств перечисляемого типа и список их значений
unit ListForm;
interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
ListBox1: TListBox;
Panel1: TPanel;
ComboBox1: TComboBox;
procedure ComboBox1Change(Sender: TObject);
procedure ListBox1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
SelPropName: string;
end;
var
Form1: TForm1;
implementation{$R *.DFM}uses
TypInfo;
procedure TForm1.ComboBox1Change(Sender: TObject);
var
PropInfo: PPropInfo;
ptd: PTypeData;
I: Integer;
PropValue: Integer;
begin// set the name of the current propertyif ComboBox1.Text <> '' then
SelPropName := ComboBox1.Text;
// add to the listbox the values// of the enumerated type
ListBox1.Items.Clear;
PropInfo := GetPropInfo (
ClassInfo, SelPropName);
// Note: ClassInfo refers to the form, self
ptd := GetTypeData (PropInfo.PropType^);
// list the valuesfor I := ptd.MinValue to ptd.MaxValue do
ListBox1.Items.Add (GetEnumName (
PropInfo.PropType^, I));
// select the current value
PropValue := GetOrdProp (self, PropInfo);
ListBox1.ItemIndex := ptd.MinValue + PropValue;
end;
procedure TForm1.ListBox1Click(Sender: TObject);
var
PropInfo: PPropInfo;
ptd: PTypeData;
itemIndex: Integer;
beginif SelPropName <> '' thenbegin
PropInfo := GetPropInfo (
ClassInfo, SelPropName);
// Note: ClassInfo refers to the form, self
ptd := GetTypeData(PropInfo.PropType^);
// save combo box index
itemIndex := ComboBox1.ItemIndex;
// select the current value
SetOrdProp (self, PropInfo,
ListBox1.ItemIndex - ptd.MinValue);
// restore combo box index
ComboBox1.OnChange := nil;
ComboBox1.ItemIndex := itemIndex;
ComboBox1.OnChange := ComboBox1Change;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
pProps: PPropList;
nTotProps, nProps, I: Integer;
begin// set the initial value
SelPropName := '';
// get the total number of properties
nTotProps := GetTypeData(ClassInfo).PropCount;
// allocate the required memory
GetMem (pProps, sizeof (PPropInfo) * nTotProps);
// protect the memory allocationtry// fill the pProps with a filtered list
nProps := GetPropList (ClassInfo,
[tkEnumeration], pProps);
// fill the combo boxfor I := 0 to nProps - 1 do
ComboBox1.Items.Add (pProps[I].Name);
finally// free the allocated memmory
FreeMem (pProps, sizeof (PPropInfo) * nTotProps);
end;
end;
end.
Программа на Delphi, предназначенная для отображения свойств конкретного типа и их значений. Программа состоит из формы с комбо-боксом, список-компоновкой и панелью.
Следующий процесс:
В процедуре FormCreate программа получает список всех свойств формы (которая является экземпляром класса TForm) типа перечисления.
Затем она заполняет комбо-бокс именами этих свойств.
Когда пользователь выбирает свойство из комбо-бокса и изменяет его значение, вызывается процедура ComboBox1Change.
Эта процедура получает значения для выбранного свойства, перебирая диапазон возможных значений (от MinValue до MaxValue) и добавляя каждое значение в список-компоновку.
Когда пользователь выбирает другое свойство или изменяет его значение, процедура ComboBox1Change вызывается снова с новым выбором.
Когда пользователь кликает на элементе списка-компоновки, вызывается процедура ListBox1Click.
Эта процедура получает индекс выбранного элемента и устанавливает соответствующее свойство в этом значении.
Чтобы получить список свойств и их значений:
Запустите программу
Нажмите на свойство в комбо-боксе
Значения для этого свойства будут отображены в списке-компоновке
Обратите внимание, что модуль TypInfo используется для получения информации о типах, таких как перечисленные свойства.
Получить список свойств перечисляемого типа и список их значений.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.