2012-03-09 7 views
0

フォーム:ボタンがフォーム上に存在している間デルファイVCL:私はこれを持っているカスタムプロシージャ/ファンクションで宣言されていない要素

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

ものの、btCustomersを「宣言されていない識別子」宣言されています。私は何が欠けていますか?

P.S.私はこれがフォームOnCreateによって処理される必要があることを認識していますが、Welcomeプロシージャは外部フォームから呼び出されます。

+1

なぜあなたは、任意のクラスのメンバーではない手順を使用していますか? 'プロシージャTMyForm.Welcome'は、' btCustomers'が 'TMyForm'のメンバであれば、' btCustomers'にアクセスできます。オブジェクト指向プログラミング=良いアイデア。 –

答えて

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を直接更新する代わりに、新しい文字列を出力として返すようにします。フォームを呼び出すと、ローカルボタンを更新するなど、関数が終了したときにその出力で何をするかを決めることができます。そうすれば、関数は失敗する可能性が少なくなり、その使用方法を知らないようになり、必要に応じて他の目的に再利用することができます。 –

+0

これは非常に良い点です。 –

関連する問題