StringGridでホマウスイールでスクロールの際、選択セルを固定したままにする方法は?

解決


タロウ  2018-11-05 18:10:13  No: 49584

お願いします。エクセルのようにホイールでスクロールしても選択セルが変わらないようにしたいです。


igy  2018-11-06 00:20:23  No: 49585

ちょこっと試してみただけで、正しく動作するかわかりませんが・・・

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;


igy  2018-11-06 08:12:08  No: 49586

> 正しく動作するかわかりませんが・・・ 

上記のコードでは、TopRow を 1ずつ変化させてますが、
Excelの動作を見てみると、1行ずつスクロールしているわけではなさそうですね。
コードの見直し等が必要なようです。


Mr.XRAY  2018-11-07 23:28:34  No: 49587

TStringGrid のスクロールバーでスクロールする時は,
選択したセルの行と列の番号は変化しないようです.
これがエクセルの場合と同じかは分かりません.

その仕様でよければ,TStringGrid のクライアント領域 (セルをクリックした状態) での
マウスホイール操作をスクロールバーの動作と同じにするという方法が考えられますね.
実際の実装は継承クラスを作成するか,あるいはサブクラス化で行うかですね.


Mr.XRAY  2018-11-07 23:53:52  No: 49588

>マウスホイール操作をスクロールバーの動作と同じにするという方法が考えられますね.
>実際の実装は継承クラスを作成するか,あるいはサブクラス化で行うかですね.

もし,TStringGird に OnMouseWheel(イベントがあればそのイベントが使用できます.
少なくても Delphi 10.2.3 までの TStringGrid には OnMouseWheel イベントはないようです.


igy  2018-11-08 03:30:44  No: 49589

> 上記のコードでは、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;

とかも・・


タロウ  2018-11-10 08:47:58  No: 49590

なるほど!Handledを使えば良かったのですね!
自分の作りたかったプログラムが作れました!
ありがとうございました!


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加