出于某种原因,我以前从未使用过动作列表。现在,我看着他们,他们似乎是一件好事。
但是,我不确定我是否可以将它们与TRadioGroup
一起使用。
如果我有一个有两个选项的广播组,(如何)我可以为每个选项分配一个TAction
?
答案 0 :(得分:3)
行动代表行动。它们与导致操作的UI元素相关联:按钮和菜单项。
另一方面,无线电组不用于调用操作。无线电组用于从互斥的选项集中进行选择。无线电组中的各个项目无法分配操作。
然而,无线电组经常与行动互动。但是他们通过与其他UI元素相关联的操作的OnUpdate处理程序来实现。
例如,考虑一个带有按钮和菜单项的表单,只有当无线电组的ItemIndex等于0时才可见。这将使用OnUpdate处理程序进行编码,其操作如下所示:
Action.Visible := RadioGroup.ItemIndex=0;
动作本身与按钮和菜单项相关联,但不与广播组相关联。只是动作的事件指的是无线电组的状态。
答案 1 :(得分:2)
这个答案的用处在很大程度上取决于当你选择这样的单选按钮时必须采取什么样的行动。操作通常允许应用程序将响应集中到用户命令,而不是用户首选项或用户选择。
但是为了论证,我想象一个表单的双向布局,它由两个菜单项,两个按钮或两个单选按钮控制。
简短的回答是:RadioGroup没有Action
属性,也无法分配任何操作。
可以使用共同的GroupBox
来填充两个单独的RadioButton,因为常见的RadioButton
dóes具有Action
属性。要使操作的行为类似于无线电项,请将它们的GroupIndex
属性设置为相同的值。
示例DFM:
object GroupBoxLayout: TGroupBox
Left = 7
Top = 7
Width = 99
Height = 71
Caption = 'Form Layout'
TabOrder = 0
object RadioButton1: TRadioButton
Left = 14
Top = 21
Width = 113
Height = 17
Action = ActionLayoutHorz
TabOrder = 0
TabStop = True
end
object RadioButton2: TRadioButton
Left = 14
Top = 42
Width = 113
Height = 17
Action = ActionLayoutVert
TabOrder = 1
end
end
object Actions: TActionList
Left = 119
Top = 7
object ActionLayoutHorz: TAction
Category = 'Layout'
Caption = 'Horizontal'
Checked = True
GroupIndex = 1
OnExecute = ActionLayoutHorzExecute
end
object ActionLayoutVert: TAction
Category = 'Layout'
Caption = 'Vertical'
GroupIndex = 1
OnExecute = ActionLayoutVertExecute
end
end
示例代码:
procedure TForm1.ActionLayoutHorzExecute(Sender: TObject);
begin
FormLayout := flHorizontal;
end;
procedure TForm1.ActionLayoutVertExecute(Sender: TObject);
begin
FormLayout := flVertical;
end;
请注意,单击相应的单选按钮时会立即调用此OnExecute
事件处理程序。 (这与更默认的实现形成对比,其中选择在单击单独的OK按钮后生效。)如果这是你想要的;去吧。
答案 2 :(得分:1)
操作通常与“可点击”控件相关联,例如按钮和菜单。在这种情况下,有一个输入和一个(重新)动作。
使用列表框可以有多个选项。我假设您在点击时希望为每个单独的选项执行操作。如果是这种情况,则必须使用OnClick事件自行完成。
procedure TForm3.RadioGroup1Click(Sender: TObject);
begin
case RadioGroup1.ItemIndex of
0 : Action1.Execute;
1 : Action2.Execute;
end;
end;
答案 3 :(得分:1)
我不确定你的设计,但在这种情况下我不会使用单独的动作,但是走这条路:
创建一个TAction.OnExecute事件,例如:
procedure TForm1.Action1Execute(Sender: TObject);
begin
showmessage( inttostr( (Sender as TRadioGroup).ItemIndex ) );
end;
在radioGroup的OnClick事件中,下拉列表将显示该方法:' Action1Execute'。将其绑定到RadioGroup.OnClick事件 - 将通过radioGroup作为发送者'进入' Action1Execute'。通过检查itemindex属性:
(Sender as TRadioGroup).ItemIndex
您可以根据itemIndex执行您喜欢的任何操作,它会告诉您单击了哪个单选按钮。 (itemIndex基于0)。
一般来说,最简洁的方法如下:
procedure TForm1.Action1Execute(Sender: TObject);
var index:integer;
begin
index:=(Sender as TRadioGroup).ItemIndex;
case index of:
0: MyFunction1;
1: MyFunction2;
2: MyFunction3;
end;
end;
最好不要将程序逻辑绑定到事件处理程序 - 通过调用其他函数来使用间接。
如果您确实需要单独的操作,请使用其onExecute事件处理程序创建每个操作,然后按如下方式调用它们:
procedure TForm1.Action1Execute(Sender: TObject);
var index:integer;
begin
index:=(Sender as TRadioGroup).ItemIndex;
case index of:
0: Action2Execute(sender);
1: Action3Execute(sender);
2: Action4Execute(sender);
end;
end;
这两种方法的缺点是Action1.OnExecute事件处理程序绑定到无线电组。你可以围绕这个谈判:
if sender is TRadioGroup then
.....
else
....
但这不干净。
最佳解决方案IMO是Toon Krijthe的
procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
case RadioGroup1.ItemIndex of
0 : Action1.Execute(sender);
1 : Action2.Execute(sender);
end;
end;
即使在radioGroup的OnClick事件中,action.OnExecute并不比该事件处理程序中的任何其他函数调用更好,在所有情况下,操作项也可用于绑定到其他组件 - 所以您可以利用表单上其他组件中可以绑定到操作的操作的强大功能。
正如其他人所说,也许按照你在此描述的方式使用行动项目并不合适。我只是向您解释可以将action.OnExecute事件处理程序分配给radioGroup onClick事件。
话虽如此,我鼓励我们更多地使用Actions和ActionLists,并使用它们来处理表单上的所有事件管理。它们有助于编写简洁,结构良好的代码。
答案 4 :(得分:0)
您可以将动作分配给隐形按钮......
然后使用:
TAction.ExecuteTarget(InvisibleButton);
在申请的任何地方。