TComboBox/ja: what changed
Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.
Title: TComboBox/ja
| Old | New | Line | |
|---|---|---|---|
| 1 | + | A **TComboBox**  is a combination of an edit box and a (drop-down) list allowing one of several options to be chosen. | |
| 2 | + | ||
| 3 | + | # 使い方 | |
| 4 | + | ||
| 5 | + | TComboBoxは、エディットボックスと(ドロップダウン)リストの組み合わせで、いくつかのオプションの中から一つを選択できるようにするものである。 | |
| 6 | + | ||
| 7 | + | フォーム上で[[doc:lcl/stdctrls/tcombobox.html|TComboBoxを]]使用するには、[[Component Palette/ja|Component Palette/jaの]][[Standard tab/ja|Standard tab/jaタブからそれを]]選択し、フォーム上でクリックして配置するだけである。 | |
| 8 | + | ||
| 9 | + | ComboBox内に保存された文字列は、[[TStringList-TStrings Tutorial|TStrings]]型のプロパティ*Items*に保存される。そのため、[[TStringList-TStrings Tutorial|TStringListやその]]親クラスであるTStringsで行うように、ComboBox内の文字列を割り当てたり削除したりすることができる。 | |
| 10 | + | ||
| 11 | + | フォーム*Form1*上のcombobox *ComboBox1*を使用するいくつかの例を紹介する: | |
| 12 | + | ||
| 13 | + | ## コンボボックスを埋める | |
| 14 | + | ||
| 15 | + | ### オブジェクトインスペクタによって | |
| 16 | + | ||
| 17 | + | - フォーム上のComboBoxをクリックで選択する。 | |
| 18 | + | - オブジェクトインスペクタでプロパティタブに移動し、プロパティ*Items*を選択する。 | |
| 19 | + | - 3つのドットがあるボタンをクリックする。すると、文字列エディタが開く。 | |
| 20 | + | - テキストを入力し、*OK*で作業を確定する。 | |
| 21 | + | ||
| 22 | + | ### フォームを作るときにコードから | |
| 23 | + | ||
| 24 | + | - フォームのOnCreateイベントハンドラを作成するには、まずフォームをクリックし、オブジェクトインスペクタでイベントタブを選択する。*OnCreate*イベントを見つけ、\[...\]ボタンをクリックするか、フォーム内のどこかをダブルクリックする。 | |
| 25 | + | - ソースエディタに移動したら、望む選択テキストを挿入することになる。例えば、以下のように記述することになる: | |
| 26 | + | ||
| 27 | + | ``` pascal | |
| 28 | + | procedure TForm1.FormCreate(Sender: TObject); | |
| 29 | + | begin | |
| 30 | + | ComboBox1.Items.Clear; //存在しているすべての選択を解除 | |
| 31 | + | ComboBox1.Items.Add('Red'); //選択を加える | |
| 32 | + | ComboBox1.Items.Add('Green'); | |
| 33 | + | ComboBox1.Items.Add('Blue'); | |
| 34 | + | ComboBox1.Items.Add('Random Color'); | |
| 35 | + | end; | |
| 36 | + | ``` | |
| 37 | + | ||
| 38 | + | ## 選択したときに何かを起こさせる | |
| 39 | + | ||
| 40 | + | すべてのコンポーネントと同様に、TComboBoxもさまざまな[[Event order|イベントを]]提供しており、これらはユーザーがコンボボックスを使用したときに呼び出される。ComboBoxでの選択の変更に応答するには、*OnChange*イベントを使用できる: | |
| 41 | + | ||
| 42 | + | - フォーム上のComboBoxをダブルクリックするか、オブジェクトインスペクタで*OnChange*イベントを選択し、\[...\]ボタンをクリックする。 | |
| 43 | + | - イベントハンドラが作成される。ここで、必要なソースコードを挿入できる。私たちの例では、フォームの背景色を変更したいと考えている: | |
| 44 | + | ||
| 45 | + | ``` pascal | |
| 46 | + | procedure TForm1.ComboBox1Change(Sender: TObject); | |
| 47 | + | begin | |
| 48 | + | case ComboBox1.ItemIndex of //どれが(どのアイテムが)現在選択されているか | |
| 49 | + | 0: Color:=clRed; | |
| 50 | + | 1: Color:=clGreen; | |
| 51 | + | 2: Color:=clBlue; | |
| 52 | + | 3: Color:=Random($1000000); | |
| 53 | + | end; | |
| 54 | + | end; | |
| 55 | + | ``` | |
| 56 | + | ||
| 57 | + | - アプリケーションを起動すると、によりフォームの背景色が変更される。 | |
| 58 | + | ||
| 59 | + | ## イベント | |
| 60 | + | ||
| 61 | + | *OnGetItems*イベントは、ウィジェットセットのアイテムリストを作成できる場合に呼び出される。そのため、コンボボックスのボタンが押されたときにトリガーされる。 | |
| 62 | + | ||
| 63 | + | ## 所有者によって描かれたコンボボックス | |
| 64 | + | ||
| 65 | + | 一般的には、ユーザーが設定で選択したテーマをComboBoxに表示させる方が有利だ。しかし、場合によっては(例えば、カラフルな表面のゲームをプログラムする場合など)、この標準から逸脱し、独自の選択に基づいて描画することもできる。その方法は次の通りである: | |
| 66 | + | ||
| 67 | + | > **Note:** **ComboBoxDrawItemのパラメータ :**\ | |
| 68 | + | > \ | |
| 69 | + | > **Control:**\ | |
| 70 | + | > もし複数のコントロール(例えば、複数のコンボボックス)がこのイベントハンドルにアクセスするなら、どのコントロールがイベントを引き起こしているか知ることになる。この例では**`ComboBox1.Canvas.FillRect(ARect)`**の代わりに、と書ける**`TComboBox(Control).Canvas.FillRect(ARect)`**。しかし、それがTComboBoxか否か、事前に確認すべきである: | |
| 71 | + | > | |
| 72 | + | > ``` pascal | |
| 73 | + | > if Control is TComboBox then | |
| 74 | + | > TComboBox(Control).Canvas.FillRect(ARect); | |
| 75 | + | > ``` | |
| 76 | + | > | |
| 77 | + | > **Index:** アイテムの場所を特定する。そこで文字列、**`<ComboBox>.Items[Index]`**.にアクセスできる\ | |
| 78 | + | > **ARect:** 四角形を述べる。それは背景を描くときに必要である。\ | |
| 79 | + | > **State:** アイテムの状態、通常、フォーカスされている、選択されているなど | |
| 80 | + | ||
| 81 | + | ### 塗りつぶされた四角形を描く | |
| 82 | + | ||
| 83 | + | - フォームを作成する際に、[[TComboBox/ja|フォームを作るときにコードからの]]例をを変更することができる。 | |
| 84 | + | - オブジェクトインスペクタで、ComboBox1のプロパティStyleをcsOwnerDrawFixedに変更する。 | |
| 85 | + | - オブジェクトインスペクタで、イベントOnDrawItemのイベントハンドラを作成するために、\[...\]ボタンをクリックする。 | |
| 86 | + | - 次のコードをハンドラに追加する: | |
| 87 | + | ||
| 88 | + | ``` pascal | |
| 89 | + | procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer; | |
| 90 | + | ARect: TRect; State: TOwnerDrawState); | |
| 91 | + | var | |
| 92 | + | ltRect: TRect; | |
| 93 | + | ||
| 94 | + | procedure FillColorfulRect(aCanvas: TCanvas; myRect: TRect); //任意の色で塗る | |
| 95 | + | // Fills the rectangle with random colours | |
| 96 | + | var | |
| 97 | + | y: Integer; | |
| 98 | + | begin | |
| 99 | + | for y:=myRect.Top to myRect.Bottom - 1 do begin | |
| 100 | + | aCanvas.Pen.Color:=Random($1000000); | |
| 101 | + | aCanvas.Line(myRect.Left, y, myRect.Right, y); | |
| 102 | + | end; | |
| 103 | + | end; | |
| 104 | + | ||
| 105 | + | begin | |
| 106 | + | ComboBox1.Canvas.FillRect(ARect); //最初の通常の背景 | |
| 107 | + | ComboBox1.Canvas.TextRect(ARect, 22, ARect.Top, ComboBox1.Items[Index]); //アイテムテキストを塗る | |
| 108 | + | ||
| 109 | + | ltRect.Left := ARect.Left + 2; //四角形のための色 | |
| 110 | + | ltRect.Right := ARect.Left + 20; | |
| 111 | + | ltRect.Top := ARect.Top + 1; | |
| 112 | + | ltRect.Bottom := ARect.Bottom - 1; | |
| 113 | + | ||
| 114 | + | ComboBox1.Canvas.Pen.Color:=clBlack; | |
| 115 | + | ComboBox1.Canvas.Rectangle(ltRect); //縁を描く | |
| 116 | + | ||
| 117 | + | if InflateRect(ltRect, -1, -1) then //1ピクセル四角形の大きさを変更する | |
| 118 | + | if Index = 3 then | |
| 119 | + | FillColorfulRect(ComboBox1.Canvas, ltRect) //任意の色を塗る | |
| 120 | + | else begin | |
| 121 | + | case Index of | |
| 122 | + | 0: ComboBox1.Canvas.Brush.Color := clRed; | |
| 123 | + | 1: ComboBox1.Canvas.Brush.Color := clGreen; | |
| 124 | + | 2: ComboBox1.Canvas.Brush.Color := clBlue; | |
| 125 | + | end; | |
| 126 | + | ComboBox1.Canvas.FillRect(ltRect); //選択に応じて色を塗る | |
| 127 | + | end; | |
| 128 | + | end; | |
| 129 | + | ``` | |
| 130 | + | ||
| 131 | + | - このように見えるだろう: | |
| 132 | + | ||
| 133 | + |  -\>  | |
| 134 | + | ||
| 135 | + | ### 前に画像を置く | |
| 136 | + | ||
| 137 | + | この例では、TImageListにいくつかの画像を読み込み、それらをコンボボックスのアイテムの前に描画する。これは、一般的にできることを示すシンプルな例だ。この例では、対応する画像が存在するかどうかなどの詳細を明示的に実行しない。必要に応じてそれらは行われるべきである。 | |
| 138 | + | ||
| 139 | + | - フォームを作成する際に、コードで例と同様のアプリケーションを作成します。 | |
| 140 | + | - オブジェクトインスペクタで、ComboBox1のプロパティStyleを*csOwnerDrawFixed*に変更する。 | |
| 141 | + | - コンポーネントパレットのCommon controlsからTImageListを追加する。 | |
| 142 | + | - ImageList1の高さと幅は16ピクセルに設定されている。これを許可する。画像をコンボボックスにきれいに収めるために、ComboBox1のプロパティItemHeightをオブジェクトインスペクタで18に設定する。 | |
| 143 | + | - ImageListに4つの画像を追加する: | |
| 144 | + | - ImageList1をダブルクリックするか、*ImageList1*を左クリックして*ImageList Editor*を選択する。 | |
| 145 | + | - \[Add\]をクリックして画像を選択します(\<Lazarusディレクトリ\>/images/...にはさまざまな16x16pxサイズの画像やアイコンがある)。 | |
| 146 | + | - 4つの画像を追加したら、\[OK\]で作業を確定する。 | |
| 147 | + | - オブジェクトインスペクタで、イベントOnDrawItemのイベントハンドラを作成します。\[...\]ボタンをクリックする。 | |
| 148 | + | - 次のコードをハンドラに追加する: | |
| 149 | + | ||
| 150 | + | ``` pascal | |
| 151 | + | procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer; | |
| 152 | + | ARect: TRect; State: TOwnerDrawState); | |
| 153 | + | begin | |
| 154 | + | ComboBox1.Canvas.FillRect(ARect); //はじめ通常の背景で塗る | |
| 155 | + | ComboBox1.Canvas.TextRect(ARect, 20, ARect.Top, ComboBox1.Items[Index]); //アイテムテキストを塗る | |
| 156 | + | ImageList1.Draw(ComboBox1.Canvas, ARect.Left + 1, ARect.Top + 1, Index); //キャンバスのインデクスに従って画像を描く | |
| 157 | + | end; | |
| 158 | + | ``` | |
| 159 | + | ||
| 160 | + | - このように見えるだろう: | |
| 161 | + | ||
| 162 | + |  -\>  | |
| 163 | + | ||
| 164 | + | ## スタイル | |
| 165 | + | ||
| 166 | + | ### csSimple | |
| 167 | + | ||
| 168 | + | **csSimple**は、下にリストボックスがある単純な編集ボックスを表す。十分な高さが割り当てられている場合にのみリストボックスが表示される。デフォルトでは、編集ボックスのみが表示される高さに設定されている。 | |
| 169 | + | ||
| 170 | + | リストボックスを表示するためのドロップダウンアイコンがある。キーボード(矢印キーを)使用するか、コントロールがアイテムリストを表示するのに十分な高さがある場合にアイテムをクリックしてアイテムを変更できる。 | |
| 171 | + | ||
| 172 | + | **csSimple**スタイルはWindowsに固有のものです。非Windowsのウィジェットセットは、おそらく実装されておらず、代わりに**csDropDown**にフォールバックするだろう。 | |
| 173 | + | ||
| 174 | + | 以下は、異なるウィジェットセットで(自動サイズ調整されていない)csSimple ComboBoxの例だ(Lazarus 2.0.8現在): | |
| 175 | + | ||
| 176 | + | Image:cssimple_win.png\|Win32 Image:cssimple_gtk2.png\|Gtk2 | |
| 177 | + | ||
| 178 | + | # 提案されている特徴 | |
| 179 | + | ||
| 180 | + | ## 読み取り専用 | |
| 181 | + | ||
| 182 | + | ReadOnlyプロパティは2017年以来非推奨となり、現時点で削除されている。 | |
| 183 | + | ||
| 184 | + | ただし、ReadOnlyプロパティをTEditのreadonly機能のミラーとして復活させることは可能である。 | |
| 185 | + | ||
| 186 | + | ComboBoxの複雑さは、それがListBoxとEditの両方の機能を持っていることだ(ただし、いずれの派生クラスでもない)。 ComboBoxは選択を変更する手段を提供しており(TEditと同様に)、編集ボックスを読み取り専用にすることも有益かもしれない(これはcsDropDownListとは異なる。csDropDownListは通常、ドロップダウンをボタンとして実装する)。 | |
| 187 | + | ||
| 188 | + | ReadOnlyプロパティが期待どおり機能する方法は次のとおりである: | |
| 189 | + | ||
| 190 | + | - 任意のComboBoxスタイルで利用可能であるはずだ。 | |
| 191 | + | - それはComboBoxの選択されたスタイルに影響を与えず、また影響されるべきではない(以前のReadOnlyの実装とは異なる)。 | |
| 192 | + | - trueに設定された場合: | |
| 193 | + | - 編集ボックス(ウィジェットセットのComboBoxスタイルでサポートされている場合)は、TEditと同様に読み取り専用になる。つまり、テキストの編集、貼り付け、テキストのドラッグなどのテキスト入力アクションでコンテンツを変更できない。 | |
| 194 | + | - ただし、コンボボックスの値は、ドロップダウンから別のアイテムを選択することで変更できます。これはマウスを使用するか、対応するキーの組み合わせ(上下矢印など)を使用して行える。 | |
| 195 | + | ||
| 196 | + | ## テキストヒント | |
| 197 | + | ||
| 198 | + | ComboBoxがTEditの特性を持っているため、値が空の場合にTextHintをcomboBoxに設定することができるはずだ。 | |
| 199 | + | ||
| 200 | + | 以下のように、TextHintプロパティを導入する。 | |
| 201 | + | ||
| 202 | + | - TextHintプロパティはTEditと同様に機能する。 | |
| 203 | + | - コンボボックスのテキスト値が空の場合、TextHintが表示される(現在のウィジェットセットのテーマに適用可能な色とフォントスタイルで表示される)。 | |
| 204 | + | ||
| 205 | + | # 以下も参照のこと | |
| 206 | + | ||
| 207 | + | - [[doc:lcl/stdctrls/tcombobox.html|TComboBox]] | |
| 208 | + | - [[TEdit]] | |
| 209 | + | - [[TListBox]] | |
| 210 | + | - [[TDBComboBox]] | |
| 211 | + | - [[TDBLookupComboBox]] | |
| 212 | + | ||
| 213 | + | --- | |
| 214 | + | *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](/wiki-contact).* |
