Delphiメモ

No033:ValueListEditorをマウスホイールでスクロールする

ValueListEditorはデフォルトだとマウスホイールでアイテムのフォーカスが変わるというよく分からない仕様になっている。
これをただのスクロール動作にするにはちょっとした小細工が必要になってくる。

まず、ValueListEditorにはOnSelectCellというイベントがある。
これはグリッド内のセルが選択される前に発生するイベントで、
引数にあるBoolean型のCanSelectパラメーターにFalseを代入すれば選択を阻止できる。
そしてこのイベントはOnMouseWheelDown、およびOnMouseWheelUpイベントの後に発生するので、
以下のようにしてやればいい。

var
〜省略〜
  CC: Boolean;

implementation

〜省略〜

procedure TForm1.VLEMouseWheelDown(Sender: TObject; Shift: TShiftState; MousePos: TPoint;
  var Handled: Boolean);
begin
  CC:= False;
  if VLE.TopRow < VLE.RowCount - VLE.VisibleRowCount - 1 then
  begin
    VLE.TopRow:= VLE.TopRow + 3;
  end;
end;

procedure TForm1.VLEMouseWheelUp(Sender: TObject; Shift: TShiftState; MousePos: TPoint;
 var Handled: Boolean);
begin
  CC:= False;
  if VLE.TopRow > 3 then
  begin
    VLE.TopRow:= VLE.TopRow - 3;
  end
  else
  begin
    VLE.TopRow:= 1;
  end;
end;

procedure TForm1.VLESelectCell(Sender: TObject; ACol, ARow: Integer;
 var CanSelect: Boolean);
begin
  CanSelect:= CC;
  CC:= True;
end;

Form1というフォームとVLEというValueListEditorがあるとして、
まずBoolean型のグローバル変数CCを宣言する。
次にマウスホイールイベント2つでCCにFalseを代入する。
そしてVLEのOnSelecetCellイベントの冒頭でCanSelectにCCを代入してやれば、
マウスホイール動作時にはフォーカスの移動が無くなる。
次の行でCCにTrueを代入しているのは、
他のイベント(OnKeyDownやOnClickなど)が発生した際にちゃんとセルが選択されるようにするためである。

スクロール処理は大体ホイールのデフォルト設定が3行ずつスクロールなので、それに準じてみた。
TopRowというプロパティは現在表示されているアイテムの一番上にあるアイテムの行番号である。
ちなみに最初の固定行が0なので、先頭の行は1ということになる。

トップに戻る

関連ページ