Delphi VCLコンポーネントの「タグ」プロパティに特定の目的はありますか?たとえば、「color」プロパティとして使用したり、値をポインタアドレスとして使用したりする例をいくつかグーグルで検索しましたが、これを使用するのは「良い習慣」ですか、それとも「悪い習慣」と見なされます。 UIへのプログラムロジック?
8 に答える
「タグ」プロパティは、それを使って何をしたいかの「貨物コンテナー」として存在します。
よく使用されるのは、1 つのイベント ハンドラーを共有する類似のコンポーネントが多数ある場合のイベント ハンドラーです。イベント ハンドラーは呼び出し元を見つけ、そのタグ値を照会して、動作するはずの対象に関する詳細情報を取得できます。
編集:
例: 電卓アプリは、数字ボタンにそれぞれの数字をタグ付けする場合があります... ばかげた不完全な例ですが、アイデアはわかります。その後、イベント ハンドラーは、どのボタンが何をするのかを理解する代わりに、ディスプレイとアキュムレータに追加する数値をタグから引き出すことができます。
コンポーネントのソースがなくても、コンポーネントに情報を追加する場所です。コンポーネントごとに 1 つの目的にしか使用できないため、慎重に使用する必要があります。そのため、ライブラリは決して使用しないでください。
他の方もおっしゃっていますが、何でも置ける場所です。通常、これは、オブジェクト参照またはポインターを介して 2 つのオブジェクトを関連付ける場合に便利です。タグはたまたまポインターを保持するのに最適なサイズになっているため、たとえば、オブジェクトをリストボックス内のアイテムに結び付けておく必要がある場合は、非常に簡単になります。
それは素晴らしい!景品。オブジェクトに関連付けられた 1 つの追加情報を保存するために、私は常にそれを使用しています。
多くの場合、関連付けられたデータ構造へのポインターを格納したり、他の配列へのインデックスである可能性のある整数を格納したりすることがあります。
オブジェクトがアクセスされた回数などのカウンターとして使用できます。
唯一の欠点は、プログラムが大量のメモリを使用し、何百万ものオブジェクトがある場合、特にタグを使用していない場合、各タグの 4 バイトが加算されることです。その場合、最も多作なオブジェクト タイプについては、タグなしで独自のバージョンを作成することをお勧めします。
フォームに 2 つのボタンがあり、1 つは Tag = 1 を設定し、もう 1 つは Tag = 2 を設定します。次に、同じOnClick イベントを両方のボタンに割り当て、次のようにコードを記述します。
procedure TForm28.Button1Click(Sender: TObject);
begin
case (Sender as TButton).Tag of
1: Caption := 'you pressed button 1';
2: Caption := 'you pressed button 2';
end;
end;
またはよりコンパクト:
procedure TForm28.Button1Click(Sender: TObject);
begin
Caption := 'you pressed button ' + IntToStr((Sender as TButton).Tag);
end;
基本的に、Tag を使用すると、イベントを発生させたコントロールを識別できます。動的に作成されたボタンを持つフォームがあるとします...データベースからのユーザーのリストで、各レコードに「ユーザーの削除」ボタンを配置します。この状況では、ボタンごとにイベントを作成することはできません。すべてのボタンに割り当てられる 1 つのイベントを作成します。たとえば、ユーザー ID をタグに入れることができます。そうすれば、すべてのボタンを処理するイベントを実装すると、削除するユーザーがわかります。
また、コンポーネントのタイプに関係なく、特定のタグ値を持つすべてのコンポーネントにアクセスしたいなど、グループ化の目的にも使用できます。
いつもタグ使ってます。下記は用例です;
簡単なサンプル: ノートブック (タブのない pagecontroll のようなもの) があるので、ボタンをタブとして定義して書き込むことができます
NoteBook.ActivePage := TButton(Sender).Tag;
より複雑なサンプル。整数は 16 個のビット単位のボリアンを保持できます。その後、送信者を最大 16 条件までチェックして、価格設定を続行する方法を決定できます。
If (BitCheck (Bit2,TButton(sender).tag=True) And BitCheck(bit12,TButton(Sender).Tag=False) Then
Begin
end;
If (BitCheck (Bit9,TButton(sender).tag=True) Or BitCheck(bit14,TButton(Sender).Tag=True) Then
Begin
end;
あなたはアイデアを得る