MMBmpLED.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:28k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. {========================================================================}
  2. {=                (c) 1995-98 SwiftSoft Ronald Dittrich                 =}
  3. {========================================================================}
  4. {=                          All Rights Reserved                         =}
  5. {========================================================================}
  6. {=  D 01099 Dresden             = Fax.: +49(0)351-8037944               =}
  7. {=  Loewenstr.7a                = info@swiftsoft.de                     =}
  8. {========================================================================}
  9. {=  Actual versions on http://www.swiftsoft.de/index.html               =}
  10. {========================================================================}
  11. {=  This code is for reference purposes only and may not be copied or   =}
  12. {=  distributed in any format electronic or otherwise except one copy   =}
  13. {=  for backup purposes.                                                =}
  14. {=                                                                      =}
  15. {=  No Delphi Component Kit or Component individually or in a collection=}
  16. {=  subclassed or otherwise from the code in this unit, or associated   =}
  17. {=  .pas, .dfm, .dcu, .asm or .obj files may be sold or distributed     =}
  18. {=  without express permission from SwiftSoft.                          =}
  19. {=                                                                      =}
  20. {=  For more licence informations please refer to the associated        =}
  21. {=  HelpFile.                                                           =}
  22. {========================================================================}
  23. {=  $Date: 03.11.98 - 14:57:52 $                                        =}
  24. {========================================================================}
  25. unit MMBmpLED;
  26. {$I COMPILER.INC}
  27. interface
  28. uses
  29.     Windows,
  30.     SysUtils,
  31.     Messages,
  32.     Classes,
  33.     Graphics,
  34.     Controls,
  35.     CommCtrl,
  36.     ExtCtrls,
  37.     Menus,
  38.     Forms,
  39.     MMObj,
  40.     MMUtils,
  41.     MMString,
  42.     MMBmpLst,
  43.     MMObsrv;
  44. type
  45.     {-- TMMCustomBitmapLEDDigit -----------------------------------------------}
  46.     TMMCustomBitmapLEDDigit = class(TMMCustomBitmapListControl);
  47.     TMMPaintImage       = procedure(Sender: TObject; Canvas: TCanvas; DstRect, SrcRect: TRect) of object;
  48.     {-- TMMBitmapLEDDigit ------------------------------------------------------}
  49.     TMMBitmapLEDDigit = class(TMMCustomBitmapLEDDigit)
  50.     private
  51.        FMinValue      : integer;
  52.        FMaxValue      : integer;
  53.        FValue         : Longint;
  54.        FDrawInactive  : Boolean;
  55.        FZeroBlank     : Boolean;
  56.        FEnabled       : Boolean;
  57.        FCascade       : Boolean;
  58.        FGlyphIndex    : integer;
  59.        FNumGlyphs     : integer;
  60.        FConnect       : TMMCustomBitmapLEDDigit;
  61.        FOnRollForward : TNotifyEvent;
  62.        FOnRollBackward: TNotifyEvent;
  63.        FOnPaint       : TMMPaintImage;
  64.        procedure SetNumGlyphs(aValue: integer);
  65.        procedure SetGlyphIndex(aValue: integer);
  66.        procedure SetEnabled(aValue: Boolean);
  67.        function  GetEnabled: Boolean; 
  68.        procedure SetMinValue(aValue: integer);
  69.        procedure SetMaxValue(aValue: integer);
  70.        procedure SetValue(aValue: Longint);
  71.        procedure SetZeroBlank(aValue: Boolean);
  72.        procedure SetCascade(aValue: Boolean);
  73.        procedure SetConnect(aControl: TMMCustomBitmapLEDDigit);
  74.     protected
  75.        procedure Paint; override;
  76.        procedure FastDraw; virtual;
  77.        procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  78.        procedure RollForward; dynamic;
  79.        procedure RollBackward; dynamic;
  80.        procedure BitmapChanged; override;
  81.     public
  82.        constructor Create (AOwner: TComponent); override;
  83.        procedure SetBounds(aLeft, aTop, aWidth, aHeight: integer); override;
  84.        procedure   Increase;
  85.        procedure   Decrease;
  86.     published
  87.        { Events }
  88.        property OnClick;
  89.        property OnDblClick;
  90.        property OnMouseDown;
  91.        property OnMouseMove;
  92.        property OnMouseUp;
  93.        property OnDragDrop;
  94.        property OnDragOver;
  95.        property OnEndDrag;
  96.        property OnStartDrag;
  97.        property OnRollForward: TNotifyEvent read FOnRollForward write FOnRollForward;
  98.        property OnRollBackward: TNotifyEvent read FOnRollBackward write FOnRollBackward;
  99.        property OnPaint: TMMPaintImage read FOnPaint write FOnPaint;
  100.        property Color default clBlack;
  101.        property ParentColor;
  102.        property ParentShowHint;
  103.        property DragCursor;
  104.        property ShowHint;
  105.        property Visible;
  106.        property Width default 11;
  107.        property Height default 21;
  108.        property PopupMenu;
  109.        property BitmapList;
  110.        property BitmapIndex;
  111.        property BitmapBackIndex;
  112.        property NumGlyphs: integer read FNumGlyphs write SetNumGlyphs;
  113.        property GlyphIndex: integer read FGlyphIndex write SetGlyphIndex default 0;
  114.        property Enabled: Boolean read GetEnabled write SetEnabled default True;
  115.        property MinValue: integer read FMinValue write SetMinValue default 0;
  116.        property MaxValue: integer read FMaxValue write SetMaxValue default 9;
  117.        property Value: Longint read FValue write SetValue default 0;
  118.        property ZeroBlank: Boolean read FZeroBlank write SetZeroBlank default False;
  119.        property CascadeValues: Boolean read FCascade write SetCascade default False;
  120.        property Connect: TMMCustomBitmapLEDDigit read FConnect write SetConnect;
  121.     end;
  122.     TMMScrollDirection = (sdLeft,sdRight);
  123.     {-- TMMBitmapLabel --------------------------------------------------------}
  124.     TMMBitmapLabel = class(TMMCustomBitmapListControl)
  125.     private
  126.        FRC_CharWidth : integer;         { the width of one digit          }
  127.        FRC_CharHeight: integer;         { the height of one digit         }
  128.        FAutoSize     : Boolean;
  129.        FCharSpace    : integer;
  130.        FNumChars     : integer;
  131.        FAutoScroll   : Boolean;
  132.        FTimer        : TTimer;
  133.        FSpeed        : integer;
  134.        FScrollDir    : TMMScrollDirection;
  135.        FStartStep    : integer;
  136.        FCurStep      : integer;
  137.        FOnChange,
  138.        FOnBegin,
  139.        FOnStep,
  140.        FOnEnd        : TNotifyEvent;
  141.        procedure AdjustControlSize(var W, H: integer);
  142.        procedure AdjustBounds;
  143.        procedure DrawLabel;
  144.        procedure SetAutoSize(aValue: Boolean);
  145.        procedure SetCharSpace(aValue: integer);
  146.        procedure SetNumChars(aValue: integer);
  147.        procedure SetCurStep(aValue: integer);
  148.        procedure SetStartStep(aValue: integer);
  149.        procedure SetSpeed(aValue: integer);
  150.        procedure SetAutoScroll(aValue: Boolean);
  151.        procedure SetScrollDir(aValue: TMMScrollDirection);
  152.        procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;
  153.     protected
  154.        procedure BitmapChanged; override;
  155.        procedure Paint; override;
  156.        procedure Loaded; override;
  157.        procedure TimerTick(Sender: TObject);
  158.        procedure Changed; override;
  159.        function  GetCharMapping(ch: Char): integer; virtual;
  160.     public
  161.        constructor Create (AOwner: TComponent); override;
  162.        destructor  Destroy; override;
  163.        procedure SetBounds(aLeft, aTop, aWidth, aHeight: integer); override;
  164.        procedure Start;
  165.        procedure Stop;
  166.     published
  167.        { Events }
  168.        property OnClick;
  169.        property OnDblClick;
  170.        property OnMouseDown;
  171.        property OnMouseMove;
  172.        property OnMouseUp;
  173.        property OnChange: TNotifyEvent read FOnChange write FOnChange;
  174.        property OnBegin: TNotifyEvent read FOnBegin write FOnBegin;
  175.        property OnStep: TNotifyEvent read FOnStep write FOnStep;
  176.        property OnEnd: TNotifyEvent read FOnEnd write FOnEnd;
  177.        property Align;
  178.        property Caption;
  179.        property ParentShowHint;
  180.        property PopupMenu;
  181.        property ShowHint;
  182.        property Visible;
  183.        property Width default 11;
  184.        property Height default 13;
  185.        property AutoSize: Boolean read FAutoSize write SetAutoSize default True;
  186.        property Enabled;
  187.        property BitmapList;
  188.        property BitmapIndex;
  189.        property NumChars: integer read FNumChars write SetNumChars default 12;
  190.        property CharSpace: integer read FCharSpace write SetCharSpace default 0;
  191.        property ScrollSpeed: integer read FSpeed write SetSpeed default 100;
  192.        property StartStep: integer read FStartStep write SetStartStep default 0;
  193.        property CurrentStep: integer read FCurStep write SetCurStep default 0;
  194.        property AutoScroll: Boolean read FAutoScroll write SetAutoScroll default False;
  195.        property ScrollDirection: TMMScrollDirection read FScrollDir write SetScrollDir default sdLeft;
  196.     end;
  197. implementation
  198. const
  199.      RC_NumDigits    = 11;     { number of digits in the digit bitmap  }
  200.      RC_CHARSPERROW  = 31;     { number of chars in the label bitmap   }
  201.      RC_CHARROWS     = 3;      { number of rows in the label bitmap    }
  202. {== TMMBitmapLEDDigit ==========================================================}
  203. constructor TMMBitmapLEDDigit.Create (AOwner: TComponent);
  204. begin
  205.    inherited Create (AOwner);
  206.    Width := 11;
  207.    Height := 21;
  208.    FCascade := False;
  209.    FConnect := Nil;
  210.    FEnabled := True;      { !!!!!!!! ev. wieder zu inherited 鋘dern }
  211.    FMinValue := 0;
  212.    FMaxValue := 9;
  213.    FDrawInactive := True;
  214.    FZeroBlank := False;
  215.    FNumGlyphs   := 1;
  216.    FGlyphIndex  := 0;
  217.    ErrorCode := ComponentRegistered(InitCode, Self, ClassName);
  218.    if (ErrorCode <> 0) then RegisterFailed(InitCode, Self , ClassName);
  219. end;
  220. {-- TMMBitmapLEDDigit ----------------------------------------------------------}
  221. procedure TMMBitmapLEDDigit.Notification(AComponent: TComponent; Operation: TOperation);
  222. begin
  223.    inherited Notification(AComponent, Operation);
  224.    if (Operation = opRemove) then
  225.    begin
  226.       if (AComponent = FConnect) then
  227.           FConnect := nil;
  228.    end;
  229. end;
  230. {-- TMMBitmapLEDDigit ----------------------------------------------------------}
  231. procedure TMMBitmapLEDDigit.BitmapChanged;
  232. begin
  233.    if BitmapValid then
  234.       SetBounds(Left, Top, Bitmap.Width, Bitmap.Height);
  235.    inherited BitmapChanged
  236. end;
  237. {-- TMMBitmapLEDDigit ----------------------------------------------------------}
  238. procedure TMMBitmapLEDDigit.SetGlyphIndex(aValue: integer);
  239. begin
  240.    if (aValue <> FGlyphIndex) then
  241.    begin
  242.       FGlyphIndex := MinMax(aValue,0,FNumGlyphs-1);
  243.       Invalidate;
  244.    end;
  245. end;
  246. {-- TMMBitmapLEDDigit ----------------------------------------------------------}
  247. procedure TMMBitmapLEDDigit.SetNumGlyphs(aValue: integer);
  248. begin
  249.    if (FNumGlyphs <> aValue) then
  250.    begin
  251.       FNumGlyphs := Max(aValue,1);
  252.       if BitmapValid then
  253.          SetBounds(Left, Top, Bitmap.Width, Bitmap.Height);
  254.    end;
  255. end;
  256. {-- TMMBitmapLEDDigit ----------------------------------------------------------}
  257. procedure TMMBitmapLEDDigit.RollForward;
  258. begin
  259.    if (csLoading in ComponentState) or
  260.       (csReading in ComponentState) then exit;
  261.    if assigned(FOnRollForward) then FOnRollForward(self);
  262. end;
  263. {-- TMMBitmapLEDDigit ----------------------------------------------------------}
  264. procedure TMMBitmapLEDDigit.RollBackward;
  265. begin
  266.    if (csLoading in ComponentState) or
  267.       (csReading in ComponentState) then exit;
  268.    if assigned(FOnRollBackward) then FOnRollBackward(self);
  269. end;
  270. {-- TMMBitmapLEDDigit ----------------------------------------------------------}
  271. procedure TMMBitmapLEDDigit.SetBounds(aLeft, aTop, aWidth, aHeight: integer);
  272. Var
  273.    DigitWidth: integer;
  274. begin
  275.    if BitmapValid then
  276.    begin
  277.       DigitWidth  := Bitmap.Width div RC_NumDigits;
  278.       inherited SetBounds(aLeft, aTop, DigitWidth, Bitmap.Height div FNumGlyphs);
  279.    end
  280.    else inherited SetBounds(aLeft, aTop, aWidth, aHeight);
  281. end;
  282. {-- TMMBitmapLEDDigit ----------------------------------------------------------}
  283. procedure TMMBitmapLEDDigit.SetZeroBlank(aValue: Boolean);
  284. begin
  285.    if (FZeroBlank <> aValue) then
  286.    begin
  287.       FZeroBlank := aValue;
  288.       Invalidate;
  289.    end;
  290.    {$IFDEF WIN32}
  291.    {$IFDEF TRIAL}
  292.    {$DEFINE _HACK2}
  293.    {$I MMHACK.INC}
  294.    {$ENDIF}
  295.    {$ENDIF}
  296. end;
  297. {-- TMMBitmapLEDDigit ----------------------------------------------------------}
  298. procedure TMMBitmapLEDDigit.SetCascade(aValue: Boolean);
  299. begin
  300.    if (aValue <> FCascade) then FCascade := aValue;
  301. end;
  302. {-- TMMBitmapLEDDigit ----------------------------------------------------------}
  303. procedure TMMBitmapLEDDigit.SetMinValue(aValue: integer);
  304. begin
  305.    if (aValue <> FMinValue) AND (aValue >= 0) AND (aValue < 10) then
  306.    begin
  307.       FMinValue := aValue;
  308.       if (FValue < FMinValue) then FValue := FMinValue;
  309.       Invalidate;
  310.    end;
  311. end;
  312. {-- TMMBitmapLEDDigit ----------------------------------------------------------}
  313. procedure TMMBitmapLEDDigit.SetMaxValue(aValue: integer);
  314. begin
  315.    if (aValue <> FMaxValue) AND (aValue >= 0) AND (aValue < 10) then
  316.    begin
  317.       FMaxValue := aValue;
  318.       if (FValue > FMaxValue) then FValue := FMaxValue;
  319.       Invalidate;
  320.    end;
  321. end;
  322. {-- TMMBitmapLEDDigit ----------------------------------------------------------}
  323. procedure TMMBitmapLEDDigit.SetValue(aValue: Longint);
  324. begin
  325.    if FCascade AND assigned(FConnect) then
  326.       TMMBitmapLEDDigit(FConnect).Value := aValue div 10;
  327.    aValue := aValue mod 10;
  328.    if (aValue <> FValue) AND (aValue >= FMinValue) AND (aValue <= FMaxValue) then
  329.    begin
  330.       FValue := aValue;
  331.       if (csDesigning in ComponentState) then
  332.          Refresh
  333.       else
  334.          FastDraw;
  335.    end;
  336. end;
  337. {-- TMMBitmapLEDDigit ----------------------------------------------------------}
  338. procedure TMMBitmapLEDDigit.Increase;
  339. begin
  340.    if (FValue = FMaxValue) then
  341.    begin
  342.       FValue := FMinValue;
  343.       if assigned(FConnect) then TMMBitmapLEDDigit(FConnect).Increase;
  344.       RollForward;
  345.    end
  346.    else inc(FValue);
  347.    Invalidate;
  348. end;
  349. {-- TMMBitmapLEDDigit ----------------------------------------------------------}
  350. procedure TMMBitmapLEDDigit.Decrease;
  351. begin
  352.    if (FValue = FMinValue) then
  353.    begin
  354.       FValue := FMaxValue;
  355.       if assigned(FConnect) then TMMBitmapLEDDigit(FConnect).Decrease;
  356.       RollBackward;
  357.    end
  358.    else dec(FValue);
  359.    Invalidate;
  360. end;
  361. {-- TMMBitmapLEDDigit ----------------------------------------------------------}
  362. procedure TMMBitmapLEDDigit.SetEnabled(aValue: Boolean);
  363. begin
  364.    {inherited Enabled := aValue;}
  365.    if (aValue <> FEnabled) then
  366.    begin
  367.       FEnabled := aValue;        { !!!!!!!! ev. wieder zu inherited 鋘dern }
  368.       Invalidate;
  369.    end;
  370. end;
  371. {-- TMMBitmapLEDDigit ----------------------------------------------------------}
  372. function  TMMBitmapLEDDigit.GetEnabled: Boolean;
  373. begin
  374.    {Result := inherited Enabled;}
  375.    Result := FEnabled;        { !!!!!!!! ev. wieder zu inherited 鋘dern }
  376. end;
  377. {-- TMMBitmapLEDDigit ----------------------------------------------------------}
  378. procedure TMMBitmapLEDDigit.SetConnect(aControl: TMMCustomBitmapLEDDigit);
  379. var
  380.   C: TMMCustomBitmapLEDDigit;
  381. begin
  382.    if FConnect <> aControl then
  383.    begin
  384.       C := aControl;
  385.       while (C <> nil) and (C <> Self) do
  386.       begin
  387.          if C is TMMBitmapLEDDigit then
  388.             C := TMMBitmapLEDDigit(C).Connect
  389.          else break;
  390.       end;
  391.       if C <> Self then
  392.          FConnect := aControl;
  393.   end;
  394. end;
  395. {-- TMMBitmapLEDDigit ----------------------------------------------------------}
  396. procedure TMMBitmapLEDDigit.FastDraw;
  397. var
  398.   DC: HDC;
  399.   Control: TWinControl;
  400. begin
  401.    Control := Parent;
  402.    if Visible and (Control <> nil) and Control.HandleAllocated then
  403.    begin
  404.       DC := GetDC(Control.Handle);
  405.       try
  406.         {$IFDEF DELPHI3}
  407.         Canvas.Lock;
  408.         {$ENDIF}
  409.         if RectVisible(DC, Rect(Left, Top, Left + Width, Top + Height)) then
  410.         begin
  411.            MoveWindowOrg(DC, Left, Top);
  412.            IntersectClipRect(DC, 0, 0, Width, Height);
  413.            Canvas.Handle := DC;
  414.            Paint;
  415.         end;
  416.       finally
  417.         ReleaseDC(Control.Handle, DC);
  418.         Canvas.Handle := 0;
  419.         {$IFDEF DELPHI3}
  420.         Canvas.Unlock;
  421.         {$ENDIF}
  422.       end;
  423.   end;
  424. end;
  425. {-- TMMBitmapLEDDigit ----------------------------------------------------------}
  426. procedure TMMBitmapLEDDigit.Paint;
  427. Var
  428.    MemDC: HDC;
  429.    oldBitmap: HBitmap;
  430.    BitmapOfs: integer;
  431.    Blank: Boolean;
  432.    X,Y: integer;
  433. begin
  434.    if BitmapValid then
  435.    begin
  436.       {$IFDEF DELPHI3}
  437.       Bitmap.Canvas.Lock;
  438.       {$ENDIF}
  439.       try
  440.          if FZeroBlank and (FValue = 0) then Blank := True
  441.          else Blank := False;
  442.          BitmapOfs := Width * ((Ord(FValue)+1) * Ord(Enabled)) * Ord(NOT Blank);
  443.          X := BitmapOfs;
  444.          Y := FGlyphIndex*Height;
  445.          if assigned(FOnPaint) then
  446.          begin
  447.             FOnPaint(Self,Canvas,ClientRect,Rect(X,Y,X+Width,Y+Height));
  448.          end
  449.          else
  450.          begin
  451.             MemDC := CreateCompatibleDC(0);
  452.             oldBitmap := SelectObject(MemDC, Bitmap.Handle);
  453.             BitBlt(Canvas.Handle,
  454.                    0, 0, Width, Height,
  455.                    MemDC,
  456.                    X, Y,
  457.                    SRCCOPY);
  458.             SelectObject(MemDC, oldBitmap);
  459.             DeleteDC(MemDC);
  460.          end;
  461.       finally
  462.          {$IFDEF DELPHI3}
  463.          Bitmap.Canvas.UnLock;
  464.          {$ENDIF}
  465.       end;
  466.    end
  467.    else if csDesigning in ComponentState then
  468.    begin
  469.       Canvas.Brush.Style := bsClear;
  470.       Canvas.Pen.Color   := clBlack;
  471.       Canvas.Pen.Style   := psDot;
  472.       Canvas.Rectangle(0,0,Width,Height);
  473.    end;
  474. end;
  475. {== TMMBitmapLabel ============================================================}
  476. constructor TMMBitmapLabel.Create (AOwner: TComponent);
  477. begin
  478.    inherited Create(AOwner);
  479.    FRC_CharWidth  := 1;
  480.    FRC_CharHeight := 1;
  481.    FAutoScroll    := False;
  482.    FSpeed         := 100;
  483.    FStartStep     := 0;
  484.    FCurStep       := 0;
  485.    FScrollDir     := sdLeft;
  486.    FTimer         := nil;
  487.    Width          := 11;
  488.    Height         := 13;
  489.    FAutoSize      := True;
  490.    NumChars       := 11;
  491.    FCharSpace     := 0;
  492.    Color          := clBlack;
  493.    ErrorCode := ComponentRegistered(InitCode, Self, ClassName);
  494.    if (ErrorCode <> 0) then RegisterFailed(InitCode, Self , ClassName);
  495. end;
  496. {-- TMMBitmapLabel ------------------------------------------------------------}
  497. destructor TMMBitmapLabel.Destroy;
  498. begin
  499.    if (FTimer <> nil) then FTimer.Free;
  500.    inherited Destroy;
  501. end;
  502. {-- TMMBitmapLabel ------------------------------------------------------------}
  503. procedure TMMBitmapLabel.BitmapChanged;
  504. begin
  505.    if BitmapValid then
  506.    begin
  507.       FRC_CharWidth := Bitmap.Width div RC_CHARSPERROW;
  508.       FRC_CharHeight:= Bitmap.Height div RC_CHARROWS;
  509.       AdjustBounds;
  510.    end;
  511.    inherited BitmapChanged
  512. end;
  513. {-- TMMBitmapLabel ------------------------------------------------------------}
  514. procedure TMMBitmapLabel.TimerTick(Sender: TObject);
  515. begin
  516.    if not FTimer.Enabled then exit;
  517.    if FScrollDir = sdLeft then
  518.       inc(FCurStep)
  519.    else
  520.       dec(FCurStep);
  521.    if Visible then DrawLabel;
  522.    if ((FScrollDir = sdLeft) and (FCurStep >= Length(Caption))) or
  523.       ((FScrollDir = sdRight) and (FCurStep <= 0)) then
  524.    begin
  525.       if FAutoScroll then FCurStep := FStartStep
  526.       else FTimer.Enabled := False;
  527.       if Assigned(FOnEnd) then FOnEnd(Self);
  528.    end
  529.    else if Assigned(FOnStep) then FOnStep(Self);
  530. end;
  531. {-- TMMBitmapLabel ------------------------------------------------------------}
  532. procedure TMMBitmapLabel.SetAutoScroll;
  533. begin
  534.    if (aValue <> FAutoScroll) then
  535.    begin
  536.       FAutoScroll := aValue;
  537.       if FAutoScroll then Start
  538.       else Stop;
  539.       FCurStep := FStartStep;
  540.       Invalidate;
  541.    end;
  542.    {$IFDEF WIN32}
  543.    {$IFDEF TRIAL}
  544.    {$DEFINE _HACK1}
  545.    {$I MMHACK.INC}
  546.    {$ENDIF}
  547.    {$ENDIF}
  548. end;
  549. {-- TMMBitmapLabel ------------------------------------------------------------}
  550. procedure TMMBitmapLabel.SetScrollDir(aValue: TMMScrollDirection);
  551. begin
  552.    if (aValue <> FScrollDir) then
  553.    begin
  554.       FScrollDir := aValue;
  555.       if csDesigning in ComponentState then
  556.         if FScrollDir = sdLeft then
  557.            if StartStep = NumChars then StartStep := 0 else
  558.         else
  559.           if StartStep = 0 then StartStep := NumChars;
  560.    end;
  561. end;
  562. {-- TMMBitmapLabel ------------------------------------------------------------}
  563. procedure TMMBitmapLabel.Start;
  564. begin
  565.    if (FTimer = nil) then
  566.    begin
  567.       FTimer         := TTimer.Create(Self);
  568.       with FTimer do
  569.       begin
  570.          Enabled     := False;
  571.          OnTimer     := TimerTick;
  572.          Interval    := FSpeed;
  573.       end;
  574.    end
  575.    else if FTimer.Enabled then exit;
  576.    if (FScrollDir = sdLeft) then
  577.    begin
  578.       if (FCurStep > Length(Caption)) then
  579.           FCurStep := FStartStep;
  580.    end
  581.    else
  582.    begin
  583.       if (FCurStep <= 0) then
  584.           FCurStep := FStartStep;
  585.    end;
  586.    if Assigned(FOnBegin) then FOnBegin(Self);
  587.    FTimer.Enabled := True;
  588. end;
  589. {-- TMMBitmapLabel ------------------------------------------------------------}
  590. procedure TMMBitmapLabel.Stop;
  591. begin
  592.    if (FTimer <> nil) then FTimer.Enabled := False;
  593. end;
  594. {-- TMMBitmapLabel ------------------------------------------------------------}
  595. procedure TMMBitmapLabel.SetCurStep(aValue: integer);
  596. begin
  597.    if (FCurStep <> aValue) AND (aValue >= 0) AND (aValue <= Length(Caption)) then
  598.    begin
  599.       FCurStep := aValue;
  600.       DrawLabel;
  601.    end;
  602. end;
  603. {-- TMMBitmapLabel ------------------------------------------------------------}
  604. procedure TMMBitmapLabel.SetStartStep(aValue: integer);
  605. begin
  606.    if (FStartStep <> aValue) AND (aValue >= 0) AND (aValue <= Length(Caption)) then
  607.    begin
  608.       FStartStep := aValue;
  609.       FCurStep := aValue;
  610.       DrawLabel;
  611.    end;
  612. end;
  613. {-- TMMBitmapLabel ------------------------------------------------------------}
  614. procedure TMMBitmapLabel.SetBounds(aLeft, aTop, aWidth, aHeight: integer);
  615. Var
  616.    W, H: integer;
  617. begin
  618.    W := aWidth;
  619.    H := aHeight;
  620.    AdjustControlSize(W,H);
  621.    inherited SetBounds(aLeft, aTop, W, H);
  622. end;
  623. {-- TMMBitmapLabel ------------------------------------------------------------}
  624. procedure TMMBitmapLabel.AdjustControlSize(Var W, H: integer);
  625. begin
  626.    if (csLoading in ComponentState) or (csReading in ComponentState) then exit;
  627.    if BitmapValid then
  628.    begin
  629.       if FAutoSize then FNumChars := Length(Caption)
  630.       else FNumChars := (W - (FCharSpace)) div (FRC_CharWidth + FCharSpace);
  631.       if (Align <> alTop) and (Align <> alBottom) then
  632.           W := FNumChars * (FRC_CharWidth + FCharSpace)-(FCharSpace);
  633.       H := Bitmap.Height div RC_CHARROWS;
  634.    end;
  635. end;
  636. {-- TMMBitmapLabel ------------------------------------------------------------}
  637. procedure TMMBitmapLabel.AdjustBounds;
  638. Var
  639.    W, H: integer;
  640. begin
  641.      W := Width;
  642.      H := Height;
  643.      AdjustControlSize(W, H);
  644.      if (W <> Width) or (H <> Height) then
  645.         inherited SetBounds(Left, Top, W, H)
  646.      else Invalidate;
  647. end;
  648. {-- TMMBitmapLabel ------------------------------------------------------------}
  649. procedure TMMBitmapLabel.Changed;
  650. begin
  651.    AdjustBounds;
  652. end;
  653. {-- TMMBitmapLabel ------------------------------------------------------------}
  654. procedure TMMBitmapLabel.SetAutoSize(aValue: Boolean);
  655. begin
  656.    if (FAutoSize <> aValue) then
  657.    begin
  658.       FAutoSize := aValue;
  659.       AdjustBounds;
  660.    end;
  661.    {$IFDEF WIN32}
  662.    {$IFDEF TRIAL}
  663.    {$DEFINE _HACK2}
  664.    {$I MMHACK.INC}
  665.    {$ENDIF}
  666.    {$ENDIF}
  667. end;
  668. {-- TMMBitmapLabel ------------------------------------------------------------}
  669. procedure TMMBitmapLabel.SetNumChars(aValue: integer);
  670. begin
  671.    if (FNumChars <> aValue) then
  672.    begin
  673.       FNumChars := aValue;
  674.       AdjustBounds;
  675.    end;
  676.    {$IFDEF WIN32}
  677.    {$IFDEF TRIAL}
  678.    {$DEFINE _HACK3}
  679.    {$I MMHACK.INC}
  680.    {$ENDIF}
  681.    {$ENDIF}
  682. end;
  683. {-- TMMBitmapLabel ------------------------------------------------------------}
  684. procedure TMMBitmapLabel.SetCharSpace(aValue: integer);
  685. begin
  686.    if (FCharSpace <> aValue) and (aValue >= 0) then
  687.    begin
  688.       FCharSpace := aValue;
  689.       AdjustBounds;
  690.    end;
  691. end;
  692. {-- TMMBitmapLabel ------------------------------------------------------------}
  693. procedure TMMBitmapLabel.SetSpeed(aValue: integer);
  694. begin
  695.    if (FSpeed <> aValue) then
  696.    begin
  697.       FSpeed := aValue;
  698.       if (FTimer <> nil) then FTimer.Interval := FSpeed;
  699.    end;
  700. end;
  701. {-- TMMBitmapLabel ------------------------------------------------------------}
  702. procedure TMMBitmapLabel.CMTextChanged(var Message: TMessage);
  703. begin
  704.    if AutoSize then
  705.       AdjustBounds
  706.    else
  707.       DrawLabel;
  708.    if assigned(FOnChange) then FOnChange(Self);
  709. end;
  710. {-- TMMBitmapLabel ------------------------------------------------------------}
  711. function TMMBitmapLabel.GetCharMapping(ch: Char): integer; 
  712. begin
  713.    Result := RC_CHARSPERROW*RC_CHARROWS-1;
  714.    if (Ord(ch) >= Ord('A')) and (Ord(ch) <= Ord('Z')) then
  715.    begin
  716.       Result := Ord(ch)-Ord('A');
  717.    end
  718.    else
  719.    if (Ord(ch) >= Ord('0')) and (Ord(ch) <= Ord('9')) then
  720.    begin
  721.       Result := RC_CHARSPERROW + (Ord(ch)-Ord('0'));
  722.    end
  723.    else case ch of
  724.         '"': Result := 26;                 // "
  725.         '@': Result := 27;                 // @
  726.         '.': Result := RC_CHARSPERROW+11;  // .
  727.         ':': Result := RC_CHARSPERROW+12;  // :
  728.         '(': Result := RC_CHARSPERROW+13;  // (
  729.         ')': Result := RC_CHARSPERROW+14;  // )
  730.         '-': Result := RC_CHARSPERROW+15;  // -
  731.        '''': Result := RC_CHARSPERROW+16;  // '
  732.         '!': Result := RC_CHARSPERROW+17;  // !
  733.         '_': Result := RC_CHARSPERROW+18;  // _
  734.         '+': Result := RC_CHARSPERROW+19;  // +
  735.         '': Result := RC_CHARSPERROW+20;  // 
  736.         '/': Result := RC_CHARSPERROW+21;  // /
  737.         '[': Result := RC_CHARSPERROW+22;  // [
  738.         ']': Result := RC_CHARSPERROW+23;  // ]
  739.         '^': Result := RC_CHARSPERROW+24;  // ^
  740.         '&': Result := RC_CHARSPERROW+25;  // &
  741.         '%': Result := RC_CHARSPERROW+26;  // %
  742.         ',': Result := RC_CHARSPERROW+27;  // ,
  743.         '=': Result := RC_CHARSPERROW+28;  // =
  744.         '$': Result := RC_CHARSPERROW+29;  // $
  745.         '#': Result := RC_CHARSPERROW+30;  // #
  746.         '