Sign in Join
Wiki copytemporary

TComboBox/ja: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11A **TComboBox** ![](/wiki-images/7/75/Tcombobox.png) is a combination of an edit box and a (drop-down) list allowing one of several options to be chosen.
22
33# 使い方
44
55TComboBoxは、エディットボックスと(ドロップダウン)リストの組み合わせで、いくつかのオプションの中から一つを選択できるようにするものである。
66
77フォーム上で[[doc:lcl/stdctrls/tcombobox.html|TComboBoxを]]使用するには、[[Component Palette/ja|Component Palette/jaの]][[Standard tab/ja|Standard tab/jaタブからそれを]]選択し、フォーム上でクリックして配置するだけである。
88
99ComboBox内に保存された文字列は、[[TStringList-TStrings Tutorial|TStrings]]型のプロパティ*Items*に保存される。そのため、[[TStringList-TStrings Tutorial|TStringListやその]]親クラスであるTStringsで行うように、ComboBox内の文字列を割り当てたり削除したりすることができる。
1010
1111フォーム*Form1*上のcombobox *ComboBox1*を使用するいくつかの例を紹介する:
1212
1313## コンボボックスを埋める
1414
1515### オブジェクトインスペクタによって
1616
1717- フォーム上のComboBoxをクリックで選択する。
1818- オブジェクトインスペクタでプロパティタブに移動し、プロパティ*Items*を選択する。
1919- 3つのドットがあるボタンをクリックする。すると、文字列エディタが開く。
2020- テキストを入力し、*OK*で作業を確定する。
2121
2222### フォームを作るときにコードから
2323
2424- フォームのOnCreateイベントハンドラを作成するには、まずフォームをクリックし、オブジェクトインスペクタでイベントタブを選択する。*OnCreate*イベントを見つけ、\[...\]ボタンをクリックするか、フォーム内のどこかをダブルクリックする。
2525- ソースエディタに移動したら、望む選択テキストを挿入することになる。例えば、以下のように記述することになる:
2626
2727``` pascal
2828procedure TForm1.FormCreate(Sender: TObject);
2929begin
3030 ComboBox1.Items.Clear; //存在しているすべての選択を解除
3131 ComboBox1.Items.Add('Red'); //選択を加える
3232 ComboBox1.Items.Add('Green');
3333 ComboBox1.Items.Add('Blue');
3434 ComboBox1.Items.Add('Random Color');
3535end;
3636```
3737
3838## 選択したときに何かを起こさせる
3939
4040すべてのコンポーネントと同様に、TComboBoxもさまざまな[[Event order|イベントを]]提供しており、これらはユーザーがコンボボックスを使用したときに呼び出される。ComboBoxでの選択の変更に応答するには、*OnChange*イベントを使用できる:
4141
4242- フォーム上のComboBoxをダブルクリックするか、オブジェクトインスペクタで*OnChange*イベントを選択し、\[...\]ボタンをクリックする。
4343- イベントハンドラが作成される。ここで、必要なソースコードを挿入できる。私たちの例では、フォームの背景色を変更したいと考えている:
4444
4545``` pascal
4646procedure TForm1.ComboBox1Change(Sender: TObject);
4747begin
4848 case ComboBox1.ItemIndex of //どれが(どのアイテムが)現在選択されているか
4949 0: Color:=clRed;
5050 1: Color:=clGreen;
5151 2: Color:=clBlue;
5252 3: Color:=Random($1000000);
5353 end;
5454end;
5555```
5656
5757- アプリケーションを起動すると、によりフォームの背景色が変更される。
5858
5959## イベント
6060
6161*OnGetItems*イベントは、ウィジェットセットのアイテムリストを作成できる場合に呼び出される。そのため、コンボボックスのボタンが押されたときにトリガーされる。
6262
6363## 所有者によって描かれたコンボボックス
6464
6565一般的には、ユーザーが設定で選択したテーマをComboBoxに表示させる方が有利だ。しかし、場合によっては(例えば、カラフルな表面のゲームをプログラムする場合など)、この標準から逸脱し、独自の選択に基づいて描画することもできる。その方法は次の通りである:
6666
6767> **Note:** **ComboBoxDrawItemのパラメータ :**\
6868> \
6969> **Control:**\
7070> もし複数のコントロール(例えば、複数のコンボボックス)がこのイベントハンドルにアクセスするなら、どのコントロールがイベントを引き起こしているか知ることになる。この例では**`ComboBox1.Canvas.FillRect(ARect)`**の代わりに、と書ける**`TComboBox(Control).Canvas.FillRect(ARect)`**。しかし、それがTComboBoxか否か、事前に確認すべきである:
7171>
7272> ``` pascal
7373> if Control is TComboBox then
7474> TComboBox(Control).Canvas.FillRect(ARect);
7575> ```
7676>
7777> **Index:** アイテムの場所を特定する。そこで文字列、**`<ComboBox>.Items[Index]`**.にアクセスできる\
7878> **ARect:** 四角形を述べる。それは背景を描くときに必要である。\
7979> **State:** アイテムの状態、通常、フォーカスされている、選択されているなど
8080
8181### 塗りつぶされた四角形を描く
8282
8383- フォームを作成する際に、[[TComboBox/ja|フォームを作るときにコードからの]]例をを変更することができる。
8484- オブジェクトインスペクタで、ComboBox1のプロパティStyleをcsOwnerDrawFixedに変更する。
8585- オブジェクトインスペクタで、イベントOnDrawItemのイベントハンドラを作成するために、\[...\]ボタンをクリックする。
8686- 次のコードをハンドラに追加する:
8787
8888``` pascal
8989procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
9090 ARect: TRect; State: TOwnerDrawState);
9191var
9292 ltRect: TRect;
9393
9494 procedure FillColorfulRect(aCanvas: TCanvas; myRect: TRect); //任意の色で塗る
9595 // Fills the rectangle with random colours
9696 var
9797 y: Integer;
9898 begin
9999 for y:=myRect.Top to myRect.Bottom - 1 do begin
100100 aCanvas.Pen.Color:=Random($1000000);
101101 aCanvas.Line(myRect.Left, y, myRect.Right, y);
102102 end;
103103 end;
104104
105105begin
106106 ComboBox1.Canvas.FillRect(ARect); //最初の通常の背景
107107 ComboBox1.Canvas.TextRect(ARect, 22, ARect.Top, ComboBox1.Items[Index]); //アイテムテキストを塗る
108108
109109 ltRect.Left := ARect.Left + 2; //四角形のための色
110110 ltRect.Right := ARect.Left + 20;
111111 ltRect.Top := ARect.Top + 1;
112112 ltRect.Bottom := ARect.Bottom - 1;
113113
114114 ComboBox1.Canvas.Pen.Color:=clBlack;
115115 ComboBox1.Canvas.Rectangle(ltRect); //縁を描く
116116
117117 if InflateRect(ltRect, -1, -1) then //1ピクセル四角形の大きさを変更する
118118 if Index = 3 then
119119 FillColorfulRect(ComboBox1.Canvas, ltRect) //任意の色を塗る
120120 else begin
121121 case Index of
122122 0: ComboBox1.Canvas.Brush.Color := clRed;
123123 1: ComboBox1.Canvas.Brush.Color := clGreen;
124124 2: ComboBox1.Canvas.Brush.Color := clBlue;
125125 end;
126126 ComboBox1.Canvas.FillRect(ltRect); //選択に応じて色を塗る
127127 end;
128128end;
129129```
130130
131131- このように見えるだろう:
132132
133133![](/wiki-images/1/1d/ComboBoxBsp1.png) -\> ![](/wiki-images/7/70/ComboBoxBsp2.png)
134134
135135### 前に画像を置く
136136
137137この例では、TImageListにいくつかの画像を読み込み、それらをコンボボックスのアイテムの前に描画する。これは、一般的にできることを示すシンプルな例だ。この例では、対応する画像が存在するかどうかなどの詳細を明示的に実行しない。必要に応じてそれらは行われるべきである。
138138
139139- フォームを作成する際に、コードで例と同様のアプリケーションを作成します。
140140- オブジェクトインスペクタで、ComboBox1のプロパティStyleを*csOwnerDrawFixed*に変更する。
141141- コンポーネントパレットのCommon controlsからTImageListを追加する。
142142- ImageList1の高さと幅は16ピクセルに設定されている。これを許可する。画像をコンボボックスにきれいに収めるために、ComboBox1のプロパティItemHeightをオブジェクトインスペクタで18に設定する。
143143- ImageListに4つの画像を追加する:
144144 - ImageList1をダブルクリックするか、*ImageList1*を左クリックして*ImageList Editor*を選択する。
145145 - \[Add\]をクリックして画像を選択します(\<Lazarusディレクトリ\>/images/...にはさまざまな16x16pxサイズの画像やアイコンがある)。
146146 - 4つの画像を追加したら、\[OK\]で作業を確定する。
147147- オブジェクトインスペクタで、イベントOnDrawItemのイベントハンドラを作成します。\[...\]ボタンをクリックする。
148148- 次のコードをハンドラに追加する:
149149
150150``` pascal
151151procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
152152 ARect: TRect; State: TOwnerDrawState);
153153begin
154154 ComboBox1.Canvas.FillRect(ARect); //はじめ通常の背景で塗る
155155 ComboBox1.Canvas.TextRect(ARect, 20, ARect.Top, ComboBox1.Items[Index]); //アイテムテキストを塗る
156156 ImageList1.Draw(ComboBox1.Canvas, ARect.Left + 1, ARect.Top + 1, Index); //キャンバスのインデクスに従って画像を描く
157157end;
158158```
159159
160160- このように見えるだろう:
161161
162162![](/wiki-images/1/1d/ComboBoxBsp1.png) -\> ![](/wiki-images/c/ca/ComboBoxBsp3.png)
163163
164164## スタイル
165165
166166### csSimple
167167
168168**csSimple**は、下にリストボックスがある単純な編集ボックスを表す。十分な高さが割り当てられている場合にのみリストボックスが表示される。デフォルトでは、編集ボックスのみが表示される高さに設定されている。
169169
170170リストボックスを表示するためのドロップダウンアイコンがある。キーボード(矢印キーを)使用するか、コントロールがアイテムリストを表示するのに十分な高さがある場合にアイテムをクリックしてアイテムを変更できる。
171171
172172**csSimple**スタイルはWindowsに固有のものです。非Windowsのウィジェットセットは、おそらく実装されておらず、代わりに**csDropDown**にフォールバックするだろう。
173173
174174以下は、異なるウィジェットセットで(自動サイズ調整されていない)csSimple ComboBoxの例だ(Lazarus 2.0.8現在):
175175
176-Image:cssimple_win.png\|Win32 Image:cssimple_gtk2.png\|Gtk2
176+![](/wiki-images/0/08/Cssimple_win.png)
177+
178+Win32
179+
180+![](/wiki-images/5/58/Cssimple_gtk2.png)
181+
182+Gtk2
177183
178184# 提案されている特徴
179185
180186## 読み取り専用
181187
182188ReadOnlyプロパティは2017年以来非推奨となり、現時点で削除されている。
183189
184190ただし、ReadOnlyプロパティをTEditのreadonly機能のミラーとして復活させることは可能である。
185191
186192ComboBoxの複雑さは、それがListBoxとEditの両方の機能を持っていることだ(ただし、いずれの派生クラスでもない)。 ComboBoxは選択を変更する手段を提供しており(TEditと同様に)、編集ボックスを読み取り専用にすることも有益かもしれない(これはcsDropDownListとは異なる。csDropDownListは通常、ドロップダウンをボタンとして実装する)。
187193
188194ReadOnlyプロパティが期待どおり機能する方法は次のとおりである:
189195
190196- 任意のComboBoxスタイルで利用可能であるはずだ。
191197- それはComboBoxの選択されたスタイルに影響を与えず、また影響されるべきではない(以前のReadOnlyの実装とは異なる)。
192198- trueに設定された場合:
193199 - 編集ボックス(ウィジェットセットのComboBoxスタイルでサポートされている場合)は、TEditと同様に読み取り専用になる。つまり、テキストの編集、貼り付け、テキストのドラッグなどのテキスト入力アクションでコンテンツを変更できない。
194200- ただし、コンボボックスの値は、ドロップダウンから別のアイテムを選択することで変更できます。これはマウスを使用するか、対応するキーの組み合わせ(上下矢印など)を使用して行える。
195201
196202## テキストヒント
197203
198204ComboBoxがTEditの特性を持っているため、値が空の場合にTextHintをcomboBoxに設定することができるはずだ。
199205
200206以下のように、TextHintプロパティを導入する。
201207
202208- TextHintプロパティはTEditと同様に機能する。
203209- コンボボックスのテキスト値が空の場合、TextHintが表示される(現在のウィジェットセットのテーマに適用可能な色とフォントスタイルで表示される)。
204210
205211# 以下も参照のこと
206212
207213- [[doc:lcl/stdctrls/tcombobox.html|TComboBox]]
208214- [[TEdit]]
209215- [[TListBox]]
210216- [[TDBComboBox]]
211217- [[TDBLookupComboBox]]
212218
213219---
214220*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).*

Back to history