TAction радио пункт - PullRequest
       21

TAction радио пункт

1 голос
/ 06 октября 2011

В полосах действия есть компонент TAction.

Этот компонент содержит свойство с именем

GroupIndex: Integer;

однако поле

RadioItem: Boolean;

там нет.

  1. Почему это?
  2. Как я могу сделать так, чтобы флажок был?

Ориентация действия: ActionMainMenuBar и ActionManager.

Ответы [ 2 ]

7 голосов
/ 06 октября 2011

Хотя TAction происходит от TComponent, действие не является компонентом в смысле элемента GUI. Он предназначен для связи с элементом GUI, который, например, может быть переключателем, флажком или в вашем случае TActionClientItem на TActionMainMenuBar.

Что касается ваших вопросов:

  1. Свойство GroupIndex действия указывает, ведет ли действие себя как радиоэлемент. Помощь говорит:

    GroupIndex используется для определения групп действий, которые действуют как переключатели. Когда GroupIndex больше 0, он идентифицирует группу, к которой принадлежит действие. Если для свойства Checked любого действия в этой группе установлено значение true, для свойства Checked всех других действий в группе устанавливается значение false. Таким образом, только одно действие в группе может быть проверено за один раз. Примечание. Все действия в группе должны быть перечислены одним и тем же списком действий или менеджером действий.

  2. Чтобы отобразить элемент меню (TActionClientItem) в ActionMainMenuBar с флажком:

    • Создать действие,
    • Установите Checked в True,
    • Установить свойство Category,
    • Перетащите категорию в ActionMainMenuBar,
    • Это вуаля.
    • Переключить свойство Checked в обработчике события OnExecute действия.

    Чтобы отобразить обычный флажок, связанный с действием в ActionManager: не используйте ActionMainMenuBar, а используйте ActionToolBar, для которого можно удалить компонент флажка по умолчанию.

4 голосов
/ 06 октября 2011

Я не уверен, что вам нужны флажки или переключатели, но оба они просты: например, простое приложение 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 сложнее старых добрых списков действий.Этот DFM

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.

...