二つのTStringGridの縦スクロール連動

解決


kaden  2020-01-06 11:49:09  No: 148427

フォームにStringGridを2つ貼り付け、それぞれ10行分の値を設定した状態でスクロール(マウスホイール)したときに2つのStringGridを連動させる動きを作りたいです。
(StringGrid1,StringGrid2それぞれ同じ動きをさせたいです。)
このような連動動作は実現可能でしょうか?
もしわかる方がいましたら宜しくお願いします!


take  2020-01-06 12:21:02  No: 148428

TStringGridにマウスホイールイベントはないのでメッセージで処理
でも何か他に良い方法があるかと。
設計を見直してみては?

参考URL
https://www.petitmonte.com/bbs/answers?question_id=8885

xxx =class(TStringGrid)
  private
      procedure WMMousewheel(var Msg: TMessage); message WM_MOUSEWHEEL;

procedure xxx.WMMousewheel(var Msg: TMessage);
begin
  if (Msg.WParam > 0) then
  begin
    { ホイールを奥に動かした時の処理 }
    StringGrid1.Perform(WM_VSCROLL, SB_LINEDOWN, 0);
    StringGrid2.Perform(WM_VSCROLL, SB_LINEDOWN, 0);    
  end
  else
  begin
    { ホイールを手前に動かした時の処理 }
    StringGrid1.Perform(WM_VSCROLL, SB_LINEUP, 0);
    StringGrid2.Perform(WM_VSCROLL, SB_LINEUP, 0);
  end;
end;


kaden  2020-01-06 14:28:11  No: 148429

回答ありがとうございます。
回答の方を参考に以下のようなコードでマウスホイールでの動作は実現できました。

procedure TForm1.StringGrid1MouseWheelDown(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
begin
  StringGrid1.Perform(WM_VSCROLL, SB_LINEDOWN, 0);
  StringGrid2.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);
  StringGrid1.Perform(WM_VSCROLL, SB_LINEUP, 0);
  Handled := True;
end;

スクロールバーを直接操作の場合でも同じ動きにすることは可能でしょうか?
もし、方法をご存じならご教授お願いします。


kaden  2020-01-06 15:02:52  No: 148431

上記の投稿の最後の2文は誤りですので、質問は以上で解決いたしました。
ありがとうございました。


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








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