2009-12-12 38 views

回答

3

是的。每个普通的方法调用都包含一个隐藏的“Self”,它指向对象。但在事件处理程序中,“Self”是表单,而不是按钮。该按钮是发件人,你必须使用类似Sender as TButton的类型来对它进行类型转换。

+1

这不是一种转换吗?它更重要的是重新记忆记忆。 – 2009-12-12 12:29:52

+4

http://tech.turbu-rpg.com/56/as-sertion-casting **由于**是一个强制转换,而不是转换,但它会检查以确保您的类型正确并引发异常除此以外。 – 2009-12-12 12:35:04

2

您需要使用发件人。

(Sender as TButton).Enabled := False; 

禁用将此事件处理程序分配给其onclick事件的任何按钮。演员也可以做

TButton(Sender).Enabled := False; 

但在这种情况下,你需要100%该发件人是一个按钮。使用as作为在演员之前引入了一个检查,所以稍微慢一点,但是在这种类型的例子中我并不是真正的问题。

+1

As-casting基本上将链接列表从对象的实际类型移动到要投射的类型,以查找匹配项。如果你在一个紧密的循环中执行它,并且“类型”是高于实际类型的多个继承级别,它可以给予一定的性能影响,但除此之外,您可能永远不会注意到它。 – 2009-12-12 13:54:47

1

你可以做这样的事情:

procedure OnClickButton(Sender: TObject); 
var btn: TButton; 
begin 
    if Sender is TButton then btn := TButton(mycontrol) 
    else 
     exit; 
    //and then use btn as just another button control 
end; 

并指定同一事件不同的控制,你可以这样做:

if mycontrol is TButton then 
    TButton(mycontrol).OnClick := OnClickButton; 
0

考虑从按钮“断开”自己,用行动。在你的表格中填入一个动作列表,右键单击它并“添加”和动作。为它命名,为它添加标题(就像它是一个按钮,说),然后将其OnExecute事件连接到你的代码。最后,转到您的按钮并点击“操作”属性并提名您的新操作。当你点击按钮时,你的代码被执行。

为什么这很有用?嗯: 1.您不会失去对代码的访问权限,当您删除按钮并将其替换为TPopupMenu时,通常会发生这种情况。 2.一个动作可以从几个地方,多个按钮或菜单启动。 3.更好的是,填写行动的“的OnUpdate”事件的东西,如:

procedure TForm1.MyActionOnUpdate(ASender : TObject); 
begin 
    With Sender as TAction do 
    Enabled := ItsPossibleToRunMyCode; 
end; 

的代码将启用和禁用使用没有你需要做什么这个动作的任何控制这一点。