2012-03-09 33 views
0

未申报我有这样的:德尔福VCL:表单元素自定义过程/函数

procedure Welcome(user: string; accesslevel: integer); 
begin 
    if accesslevel>= 10 then btCustomers.Text = 'Customer overview'; 
end; 

虽然,在窗体上存在按钮,BTCUSTOMERS被宣布为“未声明的标识符”。我错过了什么?

P.S.我知道这应该由窗体OnCreate处理,但欢迎程序从外部窗体调用。

+1

你为什么要使用一个程序,不属于任何类的成员?如果'btCustomers'是'TMyForm'的成员,'procedure TMyForm.Welcome'将有权访问'btCustomers'。面向对象编程=好主意。 – 2012-03-09 19:12:13

回答

5

,你可以到引用传递到形式,使得按钮可以反过来引用。

procedure Welcome(form: TMyForm; user: string; accesslevel: integer); 
begin 
    if accesslevel>= 10 then form.btCustomers.Text = 'Customer overview'; 
end; 

但是,你有作为它的第一个参数的对象引用全局范围功能的时候,你该对象的方法的候选者。所以,请将方法添加到TMyForm

procedure TMyForm.Welcome(user: string; accesslevel: integer); 
begin 
    if accesslevel>= 10 then btCustomers.Text = 'Customer overview'; 
end; 

,并调用它是这样的:

MyForm.Welcome(user, accesslevel); 
+3

如果你使用全局函数,那么我会让它返回新的字符串作为输出,而不是直接更新Button。调用窗体然后可以决定在函数退出时如何处理该输出,例如更新其本地按钮。这样一来,函数就不太可能失败,并且不了解它的使用方式,所以如果需要的话,它可以重用于其他目的。 – 2012-03-09 22:36:59

+0

这是一个很好的观点。 – 2012-03-09 22:40:18