Title: Displaying Enumerated Properties in a Selectable List - Run-Time Enum Selection in Delphi
Properties are the most visible parts of a Delphi control / component. When designing the user interface of your Delphi, at design-time, application you use the Object Inspector to set control properties.
Properties can be simple (string, boolean and integer values, for example) or can be of a more complex type, like enumerations, sets or arrays.
Enum / Enumerated properties at Run-Time
At design-time properties of enumerated types (including Boolean) appear as editable strings. You can also cycle through the possible values by double-clicking the value column, and there is a drop-down list that shows all possible values.
ListView's ViewStyles in RadioGroup
For example, let's consider the ViewStyle property of the TListView control. ViewStyle determines the visual display of items in a list view. The items can be displayed as a set of movable icons, or as columns of text.
If you need to allow a user of your application to change the display of the ListView at run-time, you need to provide some sort of "selectable" user interface. Controls like ComboBox, RadioGroup or ListBox can be used - they all display a collection of selectable items.
For this example, we'll use a TRadioGroup control (group of radio buttons). When the user checks a radio button, all other radio buttons in its group become unchecked. If each radio button represents one enum value from an enumerated type property of a control - when the item is selected - the enum value can be assigned.
Here's how to populate a radio group control with the possible values for the ViewStyle ListView's property:
uses TypInfo, ...
//List ListView VievStyle's in a Radio Button List
var
vs : TViewStyle;
vss : string;
begin
for vs in [Low(TViewStyle) .. High(TViewStyle)] do
begin
//get enum name as string
vss := GetEnumName(TypeInfo(TViewStyle), integer(vs)) ;
//add enum to a radio button list
RadioGroup.Items.AddObject(vss, TObject(vs)) ;
end;
end;
You first iterate over the set of possible enum values for ViewStyle. Next, Delphi's RTTI function GetEnumName is used to convert an enum to its string representation.
Finally, the enum as string is added to the radio group's Items collection, by using the AddObject method which adds a string to the list, and associates an object with the string.
The object associated is the actual enum value.
When any of the radio group option buttons is selected / clicked we need to handle the RadioButton.OnClick event.
procedure TForm.RadioGroupClick(Sender: TObject) ;
var
vs : TViewStyle;
begin
//get the enum value
vs := TViewStyle(RadioGroup.Items.Objects[RadioGroup.ItemIndex]) ;
//change the enumerated property of a control
ListView1.ViewStyle := vs;
end;
We extract the enum value from the selected option button by type casting the object to the actual enum value.
Finally, the ListView's ViewStyle is set to the new value.
That's it. As simple as it should be with Delphi :)