ウィキのコピーミラー

これは pascal.chat のウィキのミラーです。編集、履歴、ログインはそちらで行います。

TComboBox/ja

Deutsch · English · Español · Français · Suomi · 日本語

A TComboBox is a combination of an edit box and a (drop-down) list allowing one of several options to be chosen.

使い方

TComboBoxは、エディットボックスと(ドロップダウン)リストの組み合わせで、いくつかのオプションの中から一つを選択できるようにするものである。

フォーム上でTComboBoxを使用するには、Component Palette/jaのStandard tab/jaタブからそれを選択し、フォーム上でクリックして配置するだけである。

ComboBox内に保存された文字列は、TStrings型のプロパティItemsに保存される。そのため、TStringListやその親クラスであるTStringsで行うように、ComboBox内の文字列を割り当てたり削除したりすることができる。

フォームForm1上のcombobox ComboBox1を使用するいくつかの例を紹介する:

コンボボックスを埋める

オブジェクトインスペクタによって

フォームを作るときにコードから

pascal
procedure TForm1.FormCreate(Sender: TObject);  
begin
  ComboBox1.Items.Clear;             //存在しているすべての選択を解除
  ComboBox1.Items.Add('Red');        //選択を加える
  ComboBox1.Items.Add('Green');
  ComboBox1.Items.Add('Blue');
  ComboBox1.Items.Add('Random Color');  
end;

選択したときに何かを起こさせる

すべてのコンポーネントと同様に、TComboBoxもさまざまなイベントを提供しており、これらはユーザーがコンボボックスを使用したときに呼び出される。ComboBoxでの選択の変更に応答するには、OnChangeイベントを使用できる:

pascal
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  case ComboBox1.ItemIndex of  //どれが(どのアイテムが)現在選択されているか
    0: Color:=clRed;
    1: Color:=clGreen;
    2: Color:=clBlue;
    3: Color:=Random($1000000);
  end;
end;

イベント

OnGetItemsイベントは、ウィジェットセットのアイテムリストを作成できる場合に呼び出される。そのため、コンボボックスのボタンが押されたときにトリガーされる。

所有者によって描かれたコンボボックス

一般的には、ユーザーが設定で選択したテーマをComboBoxに表示させる方が有利だ。しかし、場合によっては(例えば、カラフルな表面のゲームをプログラムする場合など)、この標準から逸脱し、独自の選択に基づいて描画することもできる。その方法は次の通りである:

Note: ComboBoxDrawItemのパラメータ :

Control:
もし複数のコントロール(例えば、複数のコンボボックス)がこのイベントハンドルにアクセスするなら、どのコントロールがイベントを引き起こしているか知ることになる。この例ではComboBox1.Canvas.FillRect(ARect)の代わりに、と書けるTComboBox(Control).Canvas.FillRect(ARect)。しかし、それがTComboBoxか否か、事前に確認すべきである:

pascal
if Control is TComboBox then
  TComboBox(Control).Canvas.FillRect(ARect);

Index: アイテムの場所を特定する。そこで文字列、<ComboBox>.Items[Index].にアクセスできる
ARect: 四角形を述べる。それは背景を描くときに必要である。
State: アイテムの状態、通常、フォーカスされている、選択されているなど

塗りつぶされた四角形を描く

pascal
procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
  ARect: TRect; State: TOwnerDrawState);
var
  ltRect: TRect;

  procedure FillColorfulRect(aCanvas: TCanvas; myRect: TRect);              //任意の色で塗る
  // Fills the rectangle with random colours
  var
    y: Integer;
  begin
    for y:=myRect.Top to myRect.Bottom - 1 do begin
      aCanvas.Pen.Color:=Random($1000000);
      aCanvas.Line(myRect.Left, y, myRect.Right, y);
    end;
  end;

begin
  ComboBox1.Canvas.FillRect(ARect);                                         //最初の通常の背景
  ComboBox1.Canvas.TextRect(ARect, 22, ARect.Top, ComboBox1.Items[Index]);  //アイテムテキストを塗る

  ltRect.Left   := ARect.Left   + 2;                                        //四角形のための色
  ltRect.Right  := ARect.Left   + 20;
  ltRect.Top    := ARect.Top    + 1;
  ltRect.Bottom := ARect.Bottom - 1;

  ComboBox1.Canvas.Pen.Color:=clBlack;
  ComboBox1.Canvas.Rectangle(ltRect);                                       //縁を描く

  if InflateRect(ltRect, -1, -1) then                                       //1ピクセル四角形の大きさを変更する
    if Index = 3 then
      FillColorfulRect(ComboBox1.Canvas, ltRect)                            //任意の色を塗る
    else begin
      case Index of
        0: ComboBox1.Canvas.Brush.Color := clRed;
        1: ComboBox1.Canvas.Brush.Color := clGreen;
        2: ComboBox1.Canvas.Brush.Color := clBlue;
      end;
      ComboBox1.Canvas.FillRect(ltRect);                                    //選択に応じて色を塗る
    end;
end;

->

前に画像を置く

この例では、TImageListにいくつかの画像を読み込み、それらをコンボボックスのアイテムの前に描画する。これは、一般的にできることを示すシンプルな例だ。この例では、対応する画像が存在するかどうかなどの詳細を明示的に実行しない。必要に応じてそれらは行われるべきである。

pascal
procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
  ARect: TRect; State: TOwnerDrawState);
begin
  ComboBox1.Canvas.FillRect(ARect);                                         //はじめ通常の背景で塗る
  ComboBox1.Canvas.TextRect(ARect, 20, ARect.Top, ComboBox1.Items[Index]);  //アイテムテキストを塗る
  ImageList1.Draw(ComboBox1.Canvas, ARect.Left + 1, ARect.Top + 1, Index);  //キャンバスのインデクスに従って画像を描く
end;

->

スタイル

csSimple

csSimpleは、下にリストボックスがある単純な編集ボックスを表す。十分な高さが割り当てられている場合にのみリストボックスが表示される。デフォルトでは、編集ボックスのみが表示される高さに設定されている。

リストボックスを表示するためのドロップダウンアイコンがある。キーボード(矢印キーを)使用するか、コントロールがアイテムリストを表示するのに十分な高さがある場合にアイテムをクリックしてアイテムを変更できる。

csSimpleスタイルはWindowsに固有のものです。非Windowsのウィジェットセットは、おそらく実装されておらず、代わりにcsDropDownにフォールバックするだろう。

以下は、異なるウィジェットセットで(自動サイズ調整されていない)csSimple ComboBoxの例だ(Lazarus 2.0.8現在):

Win32

Gtk2

提案されている特徴

読み取り専用

ReadOnlyプロパティは2017年以来非推奨となり、現時点で削除されている。

ただし、ReadOnlyプロパティをTEditのreadonly機能のミラーとして復活させることは可能である。

ComboBoxの複雑さは、それがListBoxとEditの両方の機能を持っていることだ(ただし、いずれの派生クラスでもない)。 ComboBoxは選択を変更する手段を提供しており(TEditと同様に)、編集ボックスを読み取り専用にすることも有益かもしれない(これはcsDropDownListとは異なる。csDropDownListは通常、ドロップダウンをボタンとして実装する)。

ReadOnlyプロパティが期待どおり機能する方法は次のとおりである:

テキストヒント

ComboBoxがTEditの特性を持っているため、値が空の場合にTextHintをcomboBoxに設定することができるはずだ。

以下のように、TextHintプロパティを導入する。

以下も参照のこと


From the Free Pascal wiki, page "TComboBox/ja", as it stood on 2024-03-24 after a change by Ariben, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.

第2版、最終更新:WikiArchive 。