出于某种原因,我以前从未使用过操作列表。现在我看着它们,它们似乎是一件好事。
但是,我不确定是否可以将它们与TRadioGroup
.
如果我有一个有两个选项的无线电组,(如何)我可以TAction
为每个选项分配一个吗?
出于某种原因,我以前从未使用过操作列表。现在我看着它们,它们似乎是一件好事。
但是,我不确定是否可以将它们与TRadioGroup
.
如果我有一个有两个选项的无线电组,(如何)我可以TAction
为每个选项分配一个吗?
行动代表,好吧,行动。它们与导致操作的 UI 元素相关联:按钮和菜单项。
另一方面,无线电组不用于调用操作。单选组用于从一组互斥的选项中进行选择。无法为单选组中的各个项目分配操作。
然而,广播组确实经常与行动互动。但它们是通过与其他 UI 元素关联的操作的 OnUpdate 处理程序来实现的。
例如,考虑一个带有按钮和菜单项的表单,这些按钮和菜单项仅在单选组的 ItemIndex 等于 0 时可见。这将使用 OnUpdate 处理程序进行编码,用于如下所示的操作:
Action.Visible := RadioGroup.ItemIndex=0;
并且动作本身与按钮和菜单项相关联,但与单选组无关。只是动作的事件是指无线电组的状态。
此答案的有用性在很大程度上取决于选择此类单选按钮时必须执行的操作(如果有)。动作通常允许应用集中对用户命令的响应,而不是对用户偏好或用户选择的响应。
但是为了争论,我想象一个表单的双向布局,它由两个菜单项,两个按钮,或者在你的情况下,两个单选按钮控制。
简短的回答是: RadioGroup 没有Action
属性,也不能分配任何操作。
解决方法可以通过使用一个 common 来实现GroupBox
,其中填充两个单独的 RadioButtons,因为 commonRadioButton
确实有一个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
当您单击相应的单选按钮时,会立即调用此类事件处理程序。(这与更类似于默认的实现形成对比,其中选择在单击单独的确定按钮后生效。)如果这是您想要的;大胆试试吧。
动作通常与“可点击”控件相关联,例如按钮和菜单。在这种情况下,只有一个输入和一个(重新)动作。
使用列表框可以有多个选项。我假设您希望在单击时为每个单独的选项执行一个操作。如果是这种情况,您必须自己使用 OnClick 事件来完成。
procedure TForm3.RadioGroup1Click(Sender: TObject);
begin
case RadioGroup1.ItemIndex of
0 : Action1.Execute;
1 : Action2.Execute;
end;
end;
我不确定您的设计,但在这种情况下我不会使用单独的操作,而是走这条路:
创建一个 TAction.OnExecute 事件,如下所示:
procedure TForm1.Action1Execute(Sender: TObject);
begin
showmessage( inttostr( (Sender as TRadioGroup).ItemIndex ) );
end;
在 radioGroup 的 OnClick 事件中,下拉列表将显示该方法:“Action1Execute”。将其绑定到 RadioGroup.OnClick 事件 - radioGroup 将作为“Sender”传递到“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 并使用它们来处理表单上的所有事件管理。它们对编写简洁、结构良好的代码有很大帮助。
您可以将您的操作分配给隐形按钮...然后
TAction.ExecuteTarget(InvisibleButton);
在应用程序的任何位置使用:。