home *** CD-ROM | disk | FTP | other *** search
/ Chip 1999 March / Chip_1999-03_cd.bin / zkuste / delphi / D234C13 / RALIB.ZIP / RALib / Lib / RAScrollBar.pas < prev    next >
Pascal/Delphi Source File  |  1998-08-15  |  12KB  |  427 lines

  1. {***********************************************************
  2.                 R&A Library
  3.        Copyright (C) 1996-98 R&A
  4.  
  5.        component   : TRAScrollBar95
  6.        description : ScrollBar with Page property
  7.  
  8.        programer   : black
  9.        e-mail      : blacknbs@chat.ru
  10.        www         : www.chat.ru\~blacknbs\ralib
  11. ************************************************************}
  12.  
  13. {$INCLUDE RA.INC}
  14.  
  15. unit RAScrollBar;
  16.  
  17. interface
  18.  
  19. uses
  20.   Windows, Messages, SysUtils, Classes, Controls, Forms,
  21.   Graphics, StdCtrls, ExtCtrls;
  22.  
  23. type
  24.  
  25.   TRAScrollBar95 = class(TScrollBar)
  26.   protected
  27.     FPage : integer;
  28.     procedure SetPage(lPage : integer);
  29.     procedure SetPos(lPos : integer);
  30.     function GetPos : integer; {φσ ≡αßε≥ασ≥}
  31.     procedure CreateWnd; override;
  32.   public
  33.     constructor Create(AOwner: TComponent); override;
  34.     property Pos : integer read GetPos write SetPos;
  35.   published
  36.     property Page : integer read FPage write SetPage;
  37.   end;
  38.  
  39.   TRAControlScrollBar95 = class
  40.   private
  41.     FKind: TScrollBarKind;
  42.     FPosition: Integer;
  43.     FMin: Integer;
  44.     FMax: Integer;
  45.     FSmallChange: TScrollBarInc;
  46.     FLargeChange: TScrollBarInc;
  47.     FPage : integer;
  48.     FHandle : hWnd;
  49.     FOnScroll: TScrollEvent;
  50.    // FVisible : boolean;
  51.     procedure SetParam(index, Value: Integer);
  52.    // procedure SetVisible(Value : boolean);
  53.    // procedure SetLargeChange(Value: TScrollBarInc);
  54.   protected
  55.     procedure Scroll(ScrollCode: TScrollCode; var ScrollPos: Integer); dynamic;
  56.   public
  57.     constructor Create;
  58.     procedure SetParams(AMin, AMax, APosition, APage : integer);
  59.     procedure DoScroll(var Message: TWMScroll);
  60.  
  61.     property Kind: TScrollBarKind read FKind write FKind default sbHorizontal;
  62.     property SmallChange: TScrollBarInc read FSmallChange write FSmallChange default 1;
  63.     property LargeChange: TScrollBarInc read FLargeChange write FLargeChange default 1;
  64.     property Min  : Integer index 0 read FMin write SetParam default 0;
  65.     property Max  : Integer index 1 read FMax write SetParam default 100;
  66.     property Position : Integer index 2 read FPosition write SetParam default 0;
  67.     property Page : integer index 3 read FPage write SetParam;
  68.     property Handle : hWnd read FHandle write FHandle;
  69.     property OnScroll: TScrollEvent read FOnScroll write FOnScroll;
  70.    // property Visible : boolean read FVisible write SetVisible;
  71.   end;
  72.  
  73.   TRAScrollBar = class(TCustomPanel)
  74.   private
  75.     FMin, FMax : integer;
  76.     FPos  : integer;
  77.     FPage : integer;
  78.     Scroll : TPanel;
  79.     FDesignInteractive : boolean;
  80.     FInclusive : boolean;
  81.     FOnChange : TNotifyEvent;
  82.     FOnScroll : TNotifyEvent;
  83.     procedure SetParam(index, Value : integer);
  84.     procedure SetInclusive(Value : boolean);
  85.   protected
  86.     procedure CreateWnd; override;
  87.     procedure SetTrackBar;
  88.     procedure Loaded; override;
  89.     procedure Resize; override;
  90.   public
  91.     constructor Create(AOwner : TComponent); override;
  92.     procedure SetParams(const AMin, AMax, APage, APos : integer);
  93.     property Pos : integer index 3 read FPos write SetParam;
  94.     property DesignInteractive : boolean read FDesignInteractive write FDesignInteractive;
  95.     property Scroller : TPanel read Scroll;
  96.   published
  97.     property Color;
  98.     property Align;
  99.     property Min  : integer index 0 read FMin write SetParam;
  100.     property Max  : integer index 1 read FMax write SetParam;
  101.     property Page : integer index 2 read FPage write SetParam;
  102.     property Position : integer index 3 read FPos write SetParam;
  103.     property Inclusive : boolean read FInclusive write SetInclusive;
  104.     property OnChange : TNotifyEvent read FOnChange write FOnChange;
  105.     property OnScroll : TNotifyEvent read FOnScroll write FOnScroll;
  106.   end;
  107.  
  108. implementation
  109.  
  110. uses Consts, RAConst;
  111.  
  112. constructor TRAScrollBar95.Create(AOwner: TComponent);
  113. begin
  114.   inherited Create(AOwner);
  115.   FPage := 1;
  116. end;
  117.  
  118. procedure TRAScrollBar95.SetPage(lPage : integer);
  119. var
  120.   SCROLLINFO : TSCROLLINFO;
  121. begin
  122.  FPage := lPage;
  123.  if HandleAllocated then begin
  124.     with SCROLLINFO do begin
  125.       cbSize := sizeof(TSCROLLINFO);
  126.       fMask  := SIF_PAGE;
  127.       nPage  := FPage;
  128.     end;
  129.     SetScrollInfo(
  130.       Handle,         // handle of window with scroll bar
  131.       SB_CTL ,        // scroll bar flag
  132.       SCROLLINFO,     // pointer to structure with scroll parameters
  133.       true            // redraw flag
  134.     );
  135.   end;
  136. end;
  137.  
  138. procedure TRAScrollBar95.SetPos(lPos : integer);
  139. var
  140.   SCROLLINFO : TSCROLLINFO;
  141. begin
  142.  if HandleAllocated then begin
  143.     with SCROLLINFO do begin
  144.       cbSize := sizeof(TSCROLLINFO);
  145.       fMask  := SIF_POS;
  146.       nPos := lPos;
  147.     end;
  148.     SetScrollInfo(
  149.       Handle,         // handle of window with scroll bar
  150.       SB_CTL ,        // scroll bar flag
  151.       SCROLLINFO,     // pointer to structure with scroll parameters
  152.       true            // redraw flag
  153.     );
  154.   end;
  155.  Position := lPos;
  156. end;
  157.  
  158. function TRAScrollBar95.GetPos : integer;
  159. begin
  160.   Result := Position;
  161. end;
  162.  
  163. procedure TRAScrollBar95.CreateWnd;
  164. begin
  165.   inherited CreateWnd;
  166.   SetPage(FPage);
  167. end;
  168.  
  169. {************************* TRAControlScrollBar95 ****************************}
  170. constructor TRAControlScrollBar95.Create;
  171. begin
  172.   FPage := 1;
  173.   FSmallChange := 1;
  174.   FLargeChange := 1;
  175. end;
  176.  
  177. const
  178.   SBKIND : array[TScrollBarKind] of integer = (SB_HORZ, SB_VERT);
  179.  
  180. procedure TRAControlScrollBar95.SetParams(AMin, AMax, APosition, APage : integer);
  181. var
  182.   SCROLLINFO : TSCROLLINFO;
  183. begin
  184.   if AMax < AMin then
  185.     raise EInvalidOperation.Create(SScrollBarRange);
  186.   if APosition < AMin then APosition := AMin;
  187.   if APosition > AMax then APosition := AMax;
  188.   if Handle > 0 then begin
  189.     with SCROLLINFO do begin
  190.       cbSize := sizeof(TSCROLLINFO);
  191.       fMask := SIF_DISABLENOSCROLL;
  192.       if (AMin >= 0) or (AMax >= 0) then fMask := fMask or SIF_RANGE;
  193.       if APosition >= 0 then fMask := fMask or SIF_POS;
  194.       if APage >= 0 then fMask := fMask or SIF_PAGE;
  195.       nPos := APosition;
  196.       nMin := AMin;
  197.       nMax := AMax;
  198.       nPage := APage;
  199.     end;
  200.     SetScrollInfo(
  201.       Handle,         // handle of window with scroll bar
  202.       SBKIND[Kind] ,  // scroll bar flag
  203.       SCROLLINFO,     // pointer to structure with scroll parameters
  204.       true            // redraw flag
  205.     );
  206.   end;
  207. end;
  208.  
  209. procedure TRAControlScrollBar95.SetParam(index, Value: Integer);
  210. begin
  211.   case index of
  212.     0 : FMin := Value;
  213.     1 : FMax := Value;
  214.     2 : FPosition := Value;
  215.     3 : FPage := Value;
  216.   end;
  217.   if FMax < FMin then
  218.     raise EInvalidOperation.Create(SScrollBarRange);
  219.   if FPosition < FMin then FPosition := FMin;
  220.   if FPosition > FMax then FPosition := FMax;
  221.   SetParams(FMin, FMax, FPosition, FPage);
  222. end;
  223.  
  224. {
  225. procedure TRAControlScrollBar95.SetVisible(Value : boolean);
  226. begin
  227.   if FVisible <> Value then
  228.   begin
  229.     FVisible := Value;
  230.     if Handle <> 0 then
  231.  
  232.   end;
  233. end;
  234. }
  235.  
  236. procedure TRAControlScrollBar95.DoScroll(var Message: TWMScroll);
  237. var
  238.   ScrollPos: Integer;
  239.   NewPos: Longint;
  240.   ScrollInfo: TScrollInfo;
  241. begin
  242.   with Message do
  243.   begin
  244.     NewPos := FPosition;
  245.     case TScrollCode(ScrollCode) of
  246.       scLineUp:
  247.         Dec(NewPos, FSmallChange);
  248.       scLineDown:
  249.         Inc(NewPos, FSmallChange);
  250.       scPageUp:
  251.         Dec(NewPos, FLargeChange);
  252.       scPageDown:
  253.         Inc(NewPos, FLargeChange);
  254.       scPosition, scTrack:
  255.         with ScrollInfo do
  256.         begin
  257.           cbSize := SizeOf(ScrollInfo);
  258.           fMask := SIF_ALL;
  259.           GetScrollInfo(Handle, SBKIND[Kind], ScrollInfo);
  260.           NewPos := nTrackPos;
  261.         end;
  262.       scTop:
  263.         NewPos := FMin;
  264.       scBottom:
  265.         NewPos := FMax;
  266.     end;
  267.     if NewPos < FMin then NewPos := FMin;
  268.     if NewPos > FMax then NewPos := FMax;
  269.     ScrollPos := NewPos;
  270.     Scroll(TScrollCode(ScrollCode), ScrollPos);
  271.   end;
  272.   Position := ScrollPos;
  273. end;
  274.  
  275. procedure TRAControlScrollBar95.Scroll(ScrollCode: TScrollCode; var ScrollPos: Integer);
  276. begin
  277.   if Assigned(FOnScroll) then FOnScroll(Self, ScrollCode, ScrollPos);
  278. end;
  279. {######################### TRAControlScrollBar95 #########################}
  280.  
  281.  
  282.  
  283. {************************* TRAControlScrollBar95 *************************}
  284.  
  285. type
  286.  
  287.   TScroller = class(TPanel)
  288.   private
  289.     Yy : integer;
  290.     procedure CMDesignHitTest(var Message: TCMDesignHitTest); message CM_DESIGNHITTEST;
  291.   protected
  292.     procedure MouseDown(Button : TMouseButton; Shift : TShiftState; X, Y : Integer); override;
  293.     procedure MouseMove(Shift : TShiftState; X, Y : Integer); override;
  294.   end;
  295.  
  296. procedure TScroller.MouseDown(Button : TMouseButton; Shift : TShiftState; X, Y : Integer);
  297. begin
  298.   if (Button = mbLeft) then
  299.     Yy := Y;
  300. end;
  301.  
  302. procedure TScroller.MouseMove(Shift : TShiftState; X, Y : Integer);
  303. var
  304.   Sm, T, OldPos : integer;
  305. begin
  306.   if Shift = [ssLeft] then
  307.   begin
  308.     Sm := Yy - Y;
  309.     T := Top;
  310.     if (Sm <> 0) then
  311.     begin
  312.       with Parent as TRAScrollBar do
  313.       begin
  314.         OldPos := Pos;
  315.         Pos := Pos - Round(Sm * (FMax - FMin + 1) / ClientHeight);
  316.         if (Pos <> OldPos) and Assigned(FOnScroll) then
  317.           FOnScroll(Parent);
  318.       end;
  319.     end;
  320.     Yy := Y - Top + T;
  321.   end;
  322. end;
  323.  
  324. procedure TScroller.CMDesignHitTest(var Message: TCMDesignHitTest);
  325. begin
  326.   with (Owner as TRAScrollBar) do
  327.     Message.Result := integer(FDesignInteractive and (FPage <> FMax - FMin + 1)) ;
  328. end;
  329.  
  330. constructor TRAScrollBar.Create(AOwner : TComponent);
  331. begin
  332.   inherited Create(AOwner);
  333.   BevelOuter := bvLowered;
  334.   Color := clAppWorkSpace;
  335.   Caption := '';
  336.   ControlStyle := ControlStyle - [csSetCaption, csAcceptsControls];
  337.   Scroll := TScroller.Create(Self);
  338.   Scroll.Parent := Self;
  339.   Scroll.Caption := '';
  340.   Scroll.ControlStyle := ControlStyle - [csSetCaption, csAcceptsControls];
  341.   FMax := 100;
  342.   FPage := 10;
  343.   Width := 20;
  344.   Height := 100;
  345. end;
  346.  
  347. procedure TRAScrollBar.Loaded;
  348. begin
  349.   inherited Loaded;
  350.   Resize;
  351. end;
  352.  
  353. procedure TRAScrollBar.Resize;
  354. begin
  355.   inherited Resize;
  356.   with Scroll do begin
  357.     Top := BevelWidth;
  358.     Left := BevelWidth;
  359.     Width := Self.Width - 2*BevelWidth;
  360.   end;
  361.   SetTrackBar;
  362. end;
  363.  
  364. procedure TRAScrollBar.SetTrackBar;
  365. var
  366.   CH, H, T : integer;
  367.   L, FP, P, P1 : integer;
  368. begin
  369.  {∩σ≡σΣ Φτ∞σφσφΦσ∞ ΩεΣα εß τα≥σδⁿφε ±ΣσδαΘ≥σ Ωε∩Φ■!}
  370.   if FMin > FMax then FMin := FMax;
  371.   if FPage > FMax-FMin+1 then FPage := FMax-FMin+1;
  372.   if FInclusive then P := FPage else P := 0;
  373.   P1 := FPage - P;
  374.   if FPos > FMax-P then FPos := FMax-P;
  375.   if FPos < FMin then FPos := FMin;
  376.   L := FMax - FMin +1;
  377.   CH := Height - 2*BevelWidth;
  378.   H := Trunc(CH * FPage / L) +1;
  379.   FP := Trunc((FPos-FMin) / L * (L - P1)) +1;
  380.   T := Round(CH * FP / L);
  381.   if H < 7 then H := 7;
  382.   if H > CH then H := CH;
  383.   if T < BevelWidth then T := BevelWidth;
  384.   if T + H > Height - BevelWidth then
  385.     T := Height - BevelWidth - H;
  386.   if FPos = FMax - P then T := Height - BevelWidth - H;
  387.  
  388.   with Scroll do
  389.     SetBounds(Left, T, Width, H);
  390. end;
  391.  
  392. procedure TRAScrollBar.SetParam(index, Value : integer);
  393. begin
  394.   case index of
  395.     0 : FMin  := Value;
  396.     1 : FMax  := Value;
  397.     2 : FPage := Value;
  398.     3 : FPos  := Value;
  399.   end;
  400.   SetParams(FMin, FMax, FPage, FPos);
  401. end;
  402.  
  403. procedure TRAScrollBar.SetParams(const AMin, AMax, APage, APos : integer);
  404. begin
  405.   FMin  := AMin ;
  406.   FMax  := AMax ;
  407.   FPage := APage;
  408.   FPos  := APos ;
  409.   if Assigned(FOnChange) then FOnChange(Self);
  410.   SetTrackBar;
  411. end;
  412.  
  413. procedure TRAScrollBar.SetInclusive(Value : boolean);
  414. begin
  415.   FInclusive := Value;
  416.   SetTrackBar;
  417. end;
  418.  
  419. procedure TRAScrollBar.CreateWnd;
  420. begin
  421.   inherited CreateWnd;
  422.   SetTrackBar;
  423. end;
  424.  
  425.  
  426. end.
  427.