高見知英のかいはつにっし(β)

高見知英のアプリケーション開発日誌 のほか、地域活動などの活動報告ブログ。

ValueListEditor

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に設定がない行だったら、設定を追加するとか、そんなくらいしかなさそうです。できれば他の方法で行を追加できるようにするべきでしょうね。