//00/06/02 午後 07:40 unit GridScrollBar; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls; procedure ScrollBarFitGrid(StrGrid: TStringGrid; ScrBar: TScrollBar); procedure GridSetScrollBox(StrGrid: TStringGrid; ScrBar: TScrollBar); procedure ScrollPosSetGridTopRow(StrGrid: TStringGrid; ScrBar: TScrollBar); implementation //////////////////////////////////////////////////////////// //普通のスクロールバーをGridにフィッティングする //Grid付属のスクロールバーが存在しなければ //普通のスクロールバーも消える procedure ScrollBarFitGrid(StrGrid: TStringGrid; ScrBar: TScrollBar); var Rect1: TRect; begin Rect1.Top := StrGrid.Top; Rect1.Left := StrGrid.Left + StrGrid.ClientWidth; Rect1.Right := StrGrid.BoundsRect.Right; Rect1.Bottom := StrGrid.BoundsRect.Bottom; if StrGrid.BorderStyle = bsNone then begin end else if StrGrid.Ctl3D = false then begin Rect1.Top := Rect1.Top + 1; Rect1.Left := Rect1.Left + 1; Rect1.Right := Rect1.Right - 1; Rect1.Bottom:= Rect1.Bottom - 1; end else begin Rect1.Top := Rect1.Top + 2; Rect1.Left := Rect1.Left + 2; Rect1.Right := Rect1.Right - 2; Rect1.Bottom:= Rect1.Bottom - 2; end; ScrBar.Ctl3D := StrGrid.Ctl3D; if Rect1.Right - Rect1.Left <= 0 then ScrBar.Visible := false else begin ScrBar.Visible := true; ScrBar.BoundsRect := Rect1; end; end; //////////////////////////////////////////////////////////// //Gridのデータからスクロールボックスの各値を決定づける procedure GridSetScrollBox(StrGrid: TStringGrid; ScrBar: TScrollBar); begin if ScrBar.PageSize <> StrGrid.VisibleRowCount then begin ScrBar.PageSize := 0; ScrBar.PageSize := StrGrid.VisibleRowCount; end; ScrBar.Min := StrGrid.FixedRows; ScrBar.Max := StrGrid.RowCount - 1; ScrBar.Position := StrGrid.TopRow; StrGrid.Refresh; end; //////////////////////////////////////////////////////////// //スクロールバーのPosition値からGridのTopRowに値を反映する procedure ScrollPosSetGridTopRow(StrGrid: TStringGrid; ScrBar: TScrollBar); begin if (StrGrid.GridHeight <> StrGrid.ClientHeight) and (StrGrid.TopRow < ScrBar.Position) then begin { 最下行にスクロールした場合 TOPROWを増加させる方向| つまりさらに下方向へのスクロールを要求される場合 何もしない } end else StrGrid.TopRow := ScrBar.Position; end; end.