2016-09-11 3 views
1

* 1のオプションが機能しない理由を説明できる人がいますか? TKSプロシージャー上のTColorプロパティーを変更する(機能しない)

私はコードは、私が

procedure TForm1.BitBtn1Click(Sender: TObject); 
    procedure ChangeColor(Value : TColor); 
    begin 
    //*1 
    Value := clRed; 
    end; 
begin 
    //*1 IT DOESN'T WORK 
    ChangeColor(Edit1.Color); 
    ChangeColor(ComboBox1.Color); 

//----------------------------------// 

    //*2 IT WORKS 
    Edit1.Color := clRed; 
    ComboBox1.Color := clRed; 
end; 

手順で命令のようなTColorのを渡す受け入れない理由を理解したいと思いますので、私はここに簡単なコードを入れては

+1

バイバイ・バイ・リファレンス・パラメータとリファレンス・パラメータを理解する必要があります。 –

+0

@KenWhite、いいえ、それは関連しています(他に何もしないで静かに何もしないで、読み書きプロパティのためにコンパイラエラーが発生します)。 –

+0

@KenWhite、実際はありません。誤った値のパラメータのために何もしません。これは、OPがプロシージャに文を抽出しようとしたときの中核的な問題です。 –

答えて

4

オプション1は動作しません。ありがとうございましたコードでコントロールのColorプロパティに何も割り当てられないためです。ネストされたプロシージャChangeColorにカラー値を渡すだけです。ネストしたプロシージャが行う唯一のことは、渡されたパラメータに値を割り当てることです。

プロシージャに渡されたパラメータがプロシージャの戻り後に変更されることが予想される場合は、約variable parametersと読んでください。

ネストされたプロシージャ自体でコントロールの色を変更する必要がある場合は、さらにpropertiesを参照してください。

+0

関数に渡されたvarパラメータの使用に関する解決策は、OPケースのColorがプロパティであり、既存の変数ではないため機能しません。 – SilverWarior

+1

@シルバー - どのような解決策について話していますか?私はちょうど質問に答え、コードがうまくいかなかった理由を説明しました。その後、OPが進行するための2つのドキュメンテーショントピックがリンクされています。「プロパティ」は1つです。私はdownvotingする前に答えを読むことをお勧めします。 –

3

Sertacによって注意制限の回避策ではなくprocedurefunctionを使用することです:

procedure TForm1.BitBtn1Click(Sender: TObject); 

    function ChangeColor: TColor; 
    begin 
    Result := clRed; 
    end; 

begin 
    Edit1.Color := ChangeColor; 
    ComboBox1.Color := ChangeColor; 
end; 

私はあなたが手順を使用する理由はなく、定数を割り当てることが、よりに起因していると仮定します複雑なロジックである。

0

あなたはRTTIで動作するように試みることができます。

uses System.TypInfo; 

procedure UpdateColorProperty(Ctrl : TControl; const aColor : Tcolor); 
var PropInfo : PPropinfo; 
begin 
    if aColor = clNone then Exit; 
    if Assigned(Ctrl) then begin 
    PropInfo := GetPropInfo(Ctrl, 'Color'); 
    if PropInfo <> nil then 
     SetPropValue(Ctrl, 'Color', aColor); 
    end; 
end; 
+4

これは無意味です。単に 'Color'プロパティを直接設定してください。 –

-2

あなたがこれを行うことができます:

procedure ChangeColor(aComponent : TComponent); 
    begin 
    If aComponent is TEdit then TEdit(aComponent).Color := clRed; 
    If aComponent is TComboBox then TComboBox(aComponent).Color := clRed; 
    end; 

それは限り、あなたは、事前にあなたがサポートするすべてのクラスを知っているように動作します。

+2

無意味です。 Askerはプロパティを直接設定できます。 –

関連する問題