TATION радио пункт
В полосах действия есть компонент TAction.
Этот компонент содержит свойство с именем
GroupIndex: Integer;
Однако поле
RadioItem: Boolean;
не там.
- Это почему?
- Как я могу сделать так, чтобы флажок был?
Ориентация действия - ActionMainMenuBar и ActionManager.
2 ответа
Хотя TAction происходит от TComponent, действие не является компонентом в смысле элемента GUI. Он предназначен для связи с элементом GUI, который, например, может быть переключателем, флажком или, в вашем случае, TActionClientItem на TActionMainMenuBar.
Что касается ваших вопросов:
GroupIndex
свойство действия указывает, ведет ли действие себя как радиоэлемент. Помощь говорит:GroupIndex используется для определения групп действий, которые действуют как переключатели. Когда GroupIndex больше 0, он идентифицирует группу, к которой относится действие. Если для свойства Checked любого действия в этой группе установлено значение true, для свойства Checked всех других действий в группе устанавливается значение false. Таким образом, только одно действие в группе может быть проверено за один раз. Примечание. Все действия в группе должны быть перечислены одним и тем же списком действий или менеджером действий.
Чтобы показать пункт меню (TActionClientItem) в ActionMainMenuBar с флажком:
- Создать действие,
- Задавать
Checked
Правда, - Установить
Category
имущество, - Перетащите категорию в ActionMainMenuBar,
- И вуаля.
- Переключить
Checked
свойство в обработчике события OnExecute.
Чтобы отобразить обычный флажок, связанный с действием в ActionManager: не используйте ActionMainMenuBar, а используйте ActionToolBar, для которого можно удалить компонент флажка по умолчанию.
Я не уверен, хотите ли вы установить флажки или переключатели, но оба они просты: например, простое приложение VCL со следующим Form1.dfm:
object Form1: TForm1
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 251
ClientWidth = 588
Color = clBtnFace
ParentFont = True
Menu = MainMenu1
OldCreateOrder = False
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object CheckBox1: TCheckBox
Left = 216
Top = 32
Width = 97
Height = 17
Action = Action1
TabOrder = 0
end
object RadioGroup1: TRadioGroup
Left = 336
Top = 32
Width = 185
Height = 121
Caption = 'RadioGroup1'
Items.Strings = (
'1'
'2'
'3')
TabOrder = 1
end
object ActionList1: TActionList
Left = 184
Top = 120
object Action1: TAction
Caption = 'Action1'
OnExecute = Action1Execute
end
object Action2: TAction
Caption = 'Action2'
GroupIndex = 1
OnExecute = Action1Execute
end
object Action3: TAction
Caption = 'Action3'
GroupIndex = 1
OnExecute = Action1Execute
end
object Action4: TAction
Caption = 'Action4'
GroupIndex = 1
OnExecute = Action1Execute
end
end
object MainMenu1: TMainMenu
Left = 224
Top = 120
object miTest: TMenuItem
Caption = 'Test'
object miAction1: TMenuItem
Action = Action1
AutoCheck = True
end
object miSep: TMenuItem
Caption = '-'
end
object miAction2: TMenuItem
Action = Action2
AutoCheck = True
GroupIndex = 1
RadioItem = True
end
object miAction3: TMenuItem
Action = Action3
AutoCheck = True
GroupIndex = 1
RadioItem = True
end
object miAction4: TMenuItem
Action = Action4
AutoCheck = True
GroupIndex = 1
RadioItem = True
end
end
end
end
с этими обработчиками событий:
procedure TForm1.Action1Execute(Sender: TObject);
var
actn: TAction absolute Sender;
begin
Assert(Sender is TAction);
actn.Checked := not actn.Checked;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
begin
// Hardcoded association for test purposes:
for i := 0 to Pred(RadioGroup1.ControlCount) do
RadioGroup1.Controls[i].Action := ActionList1.Actions[i + 1];
end;
работает так, как и следовало ожидать для меня.
Чтобы действия выглядели как радиоэлементы в меню, необходимо установить RadioItem в пунктах меню, а не в действии. Я не знаю, почему это не по умолчанию, если GroupIndex равен <> 0.
Обновление: материал ActionManager хитрее старых добрых списков действий. Это дфм
object Form1: TForm1
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 271
ClientWidth = 588
Color = clBtnFace
ParentFont = True
OldCreateOrder = False
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object CheckBox1: TCheckBox
Left = 200
Top = 48
Width = 97
Height = 17
Action = Action1
TabOrder = 0
end
object RadioGroup1: TRadioGroup
Left = 336
Top = 32
Width = 185
Height = 121
Caption = 'RadioGroup1'
ItemIndex = 1
Items.Strings = (
'1'
'2'
'3')
TabOrder = 1
end
object ActionMainMenuBar1: TActionMainMenuBar
Left = 0
Top = 0
Width = 588
Height = 24
UseSystemFont = False
ActionManager = ActionManager1
Caption = 'ActionMainMenuBar1'
ColorMap.HighlightColor = clWhite
ColorMap.BtnSelectedColor = clBtnFace
ColorMap.UnusedColor = clWhite
ParentFont = True
PersistentHotKeys = True
Spacing = 0
end
object ActionManager1: TActionManager
ActionBars = <
item
Items = <
item
Items = <
item
Action = Action1
Caption = '&Action1'
end
item
Caption = '-'
end
item
Action = Action2
Caption = 'A&ction2'
end
item
Action = Action3
Caption = 'Ac&tion3'
end
item
Action = Action4
Caption = 'Act&ion4'
end>
Caption = 'T&est'
end>
ActionBar = ActionMainMenuBar1
end>
Left = 184
Top = 160
StyleName = 'XP Style'
object Action1: TAction
Category = 'Test'
AutoCheck = True
Caption = 'Action1'
end
object Action2: TAction
Category = 'Test'
AutoCheck = True
Caption = 'Action2'
GroupIndex = 1
end
object Action3: TAction
Category = 'Test'
AutoCheck = True
Caption = 'Action3'
Checked = True
GroupIndex = 1
end
object Action4: TAction
Category = 'Test'
AutoCheck = True
Caption = 'Action4'
GroupIndex = 1
end
end
end
с этим обработчиком
procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
begin
for i := 0 to Pred(ActionManager1.ActionCount) do
TAction(ActionManager1.Actions[i]).DisableIfNoHandler := False;
for i := 0 to Pred(RadioGroup1.ControlCount) do
RadioGroup1.Controls[i].Action := ActionManager1.Actions[i + 1];
end;
работает. Однако я не могу заставить работать радио без использования AutoCheck.