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ということになる。