お願いします。エクセルのようにホイールでスクロールしても選択セルが変わらないようにしたいです。
編集 削除ちょこっと試してみただけで、正しく動作するかわかりませんが・・・
procedure TForm1.StringGrid1MouseWheelDown(Sender: TObject;
Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
begin
with StringGrid1 do
if TopRow < RowCount - VisibleRowCount then TopRow := TopRow + 1;
Handled := True;
end;
procedure TForm1.StringGrid1MouseWheelUp(Sender: TObject;
Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
begin
with StringGrid1 do
if TopRow > FixedRows then TopRow := TopRow - 1;
Handled := True;
end;
> 正しく動作するかわかりませんが・・・
上記のコードでは、TopRow を 1ずつ変化させてますが、
Excelの動作を見てみると、1行ずつスクロールしているわけではなさそうですね。
コードの見直し等が必要なようです。
TStringGrid のスクロールバーでスクロールする時は,
選択したセルの行と列の番号は変化しないようです.
これがエクセルの場合と同じかは分かりません.
その仕様でよければ,TStringGrid のクライアント領域 (セルをクリックした状態) での
マウスホイール操作をスクロールバーの動作と同じにするという方法が考えられますね.
実際の実装は継承クラスを作成するか,あるいはサブクラス化で行うかですね.
>マウスホイール操作をスクロールバーの動作と同じにするという方法が考えられますね.
>実際の実装は継承クラスを作成するか,あるいはサブクラス化で行うかですね.
もし,TStringGird に OnMouseWheel(イベントがあればそのイベントが使用できます.
少なくても Delphi 10.2.3 までの TStringGrid には OnMouseWheel イベントはないようです.
> 上記のコードでは、TopRow を 1ずつ変化させてますが、
別の方法だと
procedure TForm1.StringGrid1MouseWheelDown(Sender: TObject; Shift: TShiftState;
MousePos: TPoint; var Handled: Boolean);
begin
StringGrid1.Perform(WM_VSCROLL, SB_LINEDOWN, 0);
Handled := True;
end;
procedure TForm1.StringGrid1MouseWheelUp(Sender: TObject; Shift: TShiftState;
MousePos: TPoint; var Handled: Boolean);
begin
StringGrid1.Perform(WM_VSCROLL, SB_LINEUP, 0);
Handled := True;
end;
とかも・・
なるほど!Handledを使えば良かったのですね!
自分の作りたかったプログラムが作れました!
ありがとうございました!