DBGridやStringGridのScrollBarをカスタマイズ


Bob  2009-03-14 21:34:01  No: 33657

しようと思って挫折。
そこでTScrollBarをカスタマイズして各種コンポーネントと同期させようと
試行錯誤したのですが挫折間近。
さしあたってはDBGridのスクロールバーとの同期をはかりたいのですが、
お知恵を拝借できないでしょうか?


挫折禁止(日曜・祝日を除く)  2009-03-15 22:46:06  No: 33658

真琴:「ハルコさん、こうすれば TScrollBarとTDBGridのスクロールが同期するよネ、もちろん、事前にTScrollBarのMax,Minを TableのRecord数に合わせておくんだけど」

type
  TScrollBar = class(StdCtrls.TScrollBar)
  private
   procedure WmLButtonDown(var Msg: TMessage); Message WM_LBUTTONDOWN;
  end;
  TDBGrid = class(DBGrids.TDBGrid)
  private
   procedure WmVScroll(var Msg: TWMScroll); Message WM_VSCROLL;
  end;
  TForm1 = class(TForm)
   DBGrid1: TDBGrid;
   ScrollBar1: TScrollBar;
   ........
  private
   procedure ScrollBar1Change(Sender: TObject);
   ..............
  end;
  ...............

var
  ScrBarMDown: Boolean;

procedure TForm1.ScrollBar1Change(Sender: TObject);
begin
  PostMessage(DBGrid1.Handle, WM_VSCROLL, MakeWParam(SB_THUMBPOSITION, ScrollBar1.Position), 0);
  PostMessage(DBGrid1.Handle, WM_VSCROLL, MakeWParam(SB_ENDSCROLL, 0), 0);
end;

procedure TScrollBar.WmLButtonDown(var Msg: TMessage);
begin
  ScrBarMDown := True;
  inherited;
end;

procedure TDBGrid.WmVScroll(var Msg: TWMScroll);
 function GetThumbVPos(wH: HWND): Integer;
 var
  SI: TScrollInfo;
 begin
  SI.cbSize := SizeOf(TScrollInfo);
  SI.fMask := SIF_POS;
  if GetScrollInfo(wH, SB_VERT, SI) then
   result := SI.nPos
  else
   result := -1;
 end;
var
  Pos: Integer;
begin
  inherited;
  case Msg.ScrollCode of
   SB_THUMBPOSITION,
   SB_THUMBTRACK: Pos := Msg.Pos;
   else           Pos := GetThumbVPos(Form1.DBGrid1.Handle);
  end;
  case Msg.ScrollCode of
   SB_LINEUP,
   SB_LINEDOWN,
   SB_THUMBTRACK: ScrBarMDown := False;
  end;
  Form1.ScrollBar1.OnChange := nil;
  if ScrBarMDown then Form1.Table1.RecNo := Pos
  else         Form1.ScrollBar1.Position := Pos;
  Form1.ScrollBar1.OnChange := Form1.ScrollBar1Change;
end;

春子:「そうね、でも、DBGridのセルをクリックした場合は、これだけじゃダメよ」
真琴:「あっ、そっか、それを忘れてた^^; じゃぁ、これを追加すればイイかな?」

procedure TDBGrid.WmLButtonDown(var Msg: TMessage);
begin
  inherited;
  // Cellをクリックした場合
  Form1.ScrollBar1.OnChange := nil;
  Form1.ScrollBar1.Position := Form1.Table1.RecNo;
  Form1.ScrollBar1.OnChange := Form1.ScrollBar1Change;
end;

春子:「うん、あとは、矢印キーでスクロールした場合よね」
真琴:「あ…それも忘れてた^^;; 完全にするのは手間がかかるよね、ハルコさん」
春子:「そういうコト、イイものには手間がかかってるの、だからお値段もそれなり」
真琴:「手間もエコ出来たらいいのにね、パソコンで電気使えばCO2も増えるんだから」
春子:「なら、コーディングを考えてる時はパソコンの電源切っておけばいいでしょ?」
真琴:「でも、考える度にイチイチそれをするのも面倒、それに、実行して試しながら手直しをしたいし」
春子:「まぁね、今はまだそこまでエコに徹しなくても大丈夫だと思うけど…」
真琴:「未来には、どうなるのかなぁ…」
春子:「それを知りたければ、行って見てきたら? マコト、出来るんだから」
真琴:「ハルコさん、そういう冗談もエコしたいよネ」
春子:「これは、ウルオイってものよ、エコだけじゃぁツマラナイって」


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

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






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