我希望使用Sender作为TObject作为我的case ...语句的选择标准
procedure TForm.ShowGUI (Sender: TObject);
begin
case sender of
ToolButton1: begin
do_something;
end;
ToolButton2: begin
///
end;
ToolButton3: begin
do_stufff_here;
end;
ToolButton3: begin
///
end;
else ;
end;
end;
Run Code Online (Sandbox Code Playgroud)
根据case语句的要求使发件人成为序数类型的技巧?
Cos*_*und 10
您可以Sender通过将其转换为整数来轻松地将其转换为序数(例如:NativeUInt(Sender)- 但这对您没有好处,因为case语句需要"分支"的常量表达式,并且ToolButton1.. ToolButton3不是常量,它们是变量.
例如,你可以在按钮的属性上做一个案例; 例如,为每个属性赋予它有意义ToolButton的Tag属性.然后你可以做这样的事情:
case (Sender as TToolButton).Tag of
1: ; // ToolButton1 was pressed
2: ; // ToolButton2 was pressed
end;
Run Code Online (Sandbox Code Playgroud)
正如David所建议的那样:除非您使用的控件具有与其函数直接相关的属性(非常不可能),否则简单的链式if语句可能更容易阅读.Tag我的第一个建议中的属性需要专门配置,这只是引入错误的另一种方式.示例:也许您复制粘贴按钮但忘记更改它的标记,您现在有两个具有相同标记的按钮.
首先,您应该从代码中重命名您正在使用的所有组件,为它们指定正确的名称.然后你可以这样写:
if (Sender = tbAlignTextLeft) then
begin
// The tool-button for left text alignment was pressed
end
else if (Sender = tbAlignTextCenter) then
begin
// Center-alignment button was pressed
end
else
begin
// This would be the default action. If it were me, I'd raise an exception here.
end
Run Code Online (Sandbox Code Playgroud)
考虑添加一些运行时支持以将枚举与控件相关联.
首先创建一个枚举类型:
type
TControlID = (cidAlignTextLeft, cidAlignTextRight, ....);
Run Code Online (Sandbox Code Playgroud)
然后在表单中添加字典:
FControlIDs: TDictionary<TControl, TControlID>;
Run Code Online (Sandbox Code Playgroud)
然后在表单的构造函数中创建并填充字典:
FControlIDs := TDictionary<TControl, TControlID>.Create;
FControlIDs.Add(tbAlignTextLeft, cidAlignTextLeft);
FControlIDs.Add(tbAlignTextRight, cidAlignTextRight);
....
Run Code Online (Sandbox Code Playgroud)
这部分代码应该放在一个单独的本地帮助函数中,而不是在表单的构造函数中内联.
现在您可以编写案例陈述:
case FControlIDs[Sender as TControl] of
cidAlignTextLeft:
....
cidAlignTextRight:
....
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3757 次 |
| 最近记录: |