Delphiのコンポーネント、ValueListEditorは、行の追加や削除も簡単にでき、気軽に使えるなかなか良いコンポーネントだと思います。
ただ、この辺のドキュメントってあんまりないので、ちょっと手間取りました。
手間取ったというのはValueListEditorのValue(右側)の部分。ここにドロップダウンリストや、参照ボタンをつける方法です。実は何のことはなく、最初からそういう機能が備わってるのですが、それを使う方法がなかなか見つからない。
見つかった少ない情報を元に、まとめてみました。
esEllipse
EditStyleプロパティは、ValueListEditorのItemPropプロパティより参照できる、TItemPropというクラスのメンバです。
これを設定することにより、セルを選択したときに、ドロップダウンリストを出したり、参照ボタンを出したりすることができます。
設定の仕方は以下の通り。
ValueListEditor.ItemProp[0].EditStyle := esEllipse;
上の場合は、0行目(ヘッダ行を抜かした行数であることに注意)――見た目上の一行目のValue部分を選択したとき、右に参照ボタンが現れるようになります。このボタンを押すとOnEditButtonClickイベントが発生するので、それを処理してあげればOK
var fn: String; begin fn := ValueListEditor.Cells[1, ValueListEditor.Row]; if PromptForFileName(fn, sAllFilter) then ValueListEditor.Cells[1, ValueListEditor.Row] := fn; end;
こんな感じかな。なお、このボタンをキーボードからクリックさせる方法はないようです。Enterキーを押したらここに行くように設定するのも良いかも。
esPickList
こっちは、あらかじめリストを作っておく方法と、イベントで設定する方法の二つ。わたしはイベントで設定する方法を選びましたが、一応両方やったのでメモ。
なお、この方法で設定したドロップダウンリストは、コンボボックスと同様にAlt+下キーで表示させられます。
TItemPropクラスを作っておく方法
あらかじめコンストラクタなどで、TItemPropクラスを作っておき、必要になったらAssignするという方法。見た目こっちの方が効率がいいですね。
begin (ItemPropはクラス変数) ItemProp := TItemProp.Create(ValueListEditor); ItemProp.EditStyle := esPickList; ItemProp.PickListt.Add('TEXT1'); ItemProp.PickListt.Add('TEXT2'); end;
で、適用したいときに、これをAssign
var i: Integer; begin i := ValueListEditor.InsertRow('', MoveFilter, True); ValueListEditor.ItemProps[i - 1].EditStyle.Assign(esPickList); // 行のキーを選択させる ValueListEditor.Row := i; ValueListEditor.Col := 0; end;
InsertRowで返ってくる値はヘッダを含んだ行数、ItemPropsで指定するのはヘッダを含まない行数。この辺が分かりづらいですね。間違えるとポインタ参照エラーになったりするので、場所によっては原因が突き止めづらくなります。
OnGetPickListを使用する方法
こっちはあんまり難しくないですね。追加した行のItemProps.EditStyleプロパティをesPickListに、あとはOnGetPickListイベントで、引数Valuesに値を設定します。
var i: Integer; begin i := ValueListEditor.InsertRow('', MoveFilter, True); ValueListEditor.ItemProps[i - 1].EditStyle := esPickList;
ただ、こっちはどうやら、キー文字列が空っぽの時にはイベントが発生しないようですね。KeyOptionsプロパティにkeyEditがある時は注意です。
新しい行にこれらを適用するには?
KeyOptionsプロパティにkeyAddがある場合、Insertキーで行を追加できますが、この新しい行にこれらItemPropを設定するには?調べてみたのですが、これといったものが見つかりませんでした。
まあ、あり得るとしたらOnDrawCellイベントで、ItemPropsに設定がない行だったら、設定を追加するとか、そんなくらいしかなさそうです。できれば他の方法で行を追加できるようにするべきでしょうね。