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

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: 04.01.99 - 16:58:05 $                                        =}
  24. {========================================================================}
  25. unit MMBmpLst;
  26. {$I COMPILER.INC}
  27. interface
  28. uses
  29.     Windows,
  30.     Messages,
  31.     SysUtils,
  32.     Classes,
  33.     Controls,
  34.     Graphics,
  35.     Buttons,
  36.     Forms,
  37.     MMObj,
  38.     MMUtils,
  39.     MMString,
  40.     MMObsrv;
  41. const
  42.     CM_TRANSCOLORCHANGED = CM_BASE + 250;
  43. type
  44.     {$IFNDEF DELPHI3}
  45.     TTransparentMode  = (tmAuto, tmFixed);
  46.     TBitmapHandleType = (bmDIB, bmDDB);
  47.     {$ENDIF}
  48.     TEncodeEvent  = procedure(Sender: TObject; Buffer: PChar; Length: DWORD) of object;
  49.     TLoadedEvent  = procedure(Sender: TObject; Bmp: TBitmap) of object;
  50.     {-- TMMBitmapList ---------------------------------------------------------}
  51.     TMMBitmapList = class(TMMNonVisualComponent)
  52.     private
  53.        FList       : TList;
  54.        FUpdateCount: Integer;
  55.        FObservable : TMMObservable;
  56.        FCompressed : Boolean;
  57.        FHandleType : TBitmapHandleType;
  58.        FOnChange   : TNotifyEvent;
  59.        FOnChanging : TNotifyEvent;
  60.        FOnEncode   : TEncodeEvent;
  61.        FOnDecode   : TEncodeEvent;
  62.        FOnLoaded   : TLoadedEvent;
  63.        function  GetCount: integer;
  64.        function  GetEmpty: Boolean;
  65.        procedure Put(Index: integer; Item: TBitmap);virtual;
  66.        function  Get(Index: integer): TBitmap; virtual;
  67.        procedure BMPChanged(Sender: TObject);
  68.        procedure SaveCompressedStream(Src, Target: TStream; Size: Longint);
  69.        procedure LoadCompressedStream(Src, Target: TStream);
  70.     protected
  71.        procedure Changed; virtual;
  72.        procedure Changing; virtual;
  73.        procedure ReadData(Stream: TStream); virtual;
  74.        procedure WriteData(Stream: TStream); virtual;
  75.        procedure DefineProperties(Filer: TFiler); override;
  76.        procedure SetUpdateState(Updating: Boolean); virtual;
  77.        procedure LoadFromStreamEx(Stream: TStream; Replace: Boolean);
  78.     public
  79.        constructor Create(aOwner: TComponent); override;
  80.        destructor Destroy; override;
  81.        procedure AddObserver(O: TMMObserver);
  82.        procedure RemoveObserver(O: TMMObserver);
  83.        procedure BeginUpdate;
  84.        procedure EndUpdate;
  85.        procedure Assign(Source: TPersistent); override;
  86.        procedure LoadFromStream(Stream: TStream);
  87.        procedure ReplaceFromStream(Stream: TStream);
  88.        procedure SaveToStream(Stream: TStream);
  89.        procedure LoadFromFile(const FName: TFileName);
  90.        procedure ReplaceFromFile(const FName: TFileName);
  91.        procedure SaveToFile(const FName: TFileName);
  92.        procedure AddListFromFile(const FName: TFileName);
  93.        function  First: TBitmap;
  94.        function  Last: TBitmap;
  95.        procedure Clear;
  96.        procedure AddFromFile(const FName: TFileName);
  97.        procedure ExtractToFile(index: integer; const FName: TFileName);
  98.        function  Add(Item: TBitmap): integer;
  99.        procedure AddList(List: TMMBitmapList);
  100.        procedure Insert(Index: integer; Item: TBitmap);
  101.        procedure Move(OldIndex, NewIndex: integer);
  102.        procedure Exchange(Index1, Index2: integer);
  103.        procedure Delete(index: integer);
  104.        function  Remove(Item: TBitmap): integer;
  105.        function IndexOf(Item: TBitmap): integer;
  106.        property Count: integer read GetCount;
  107.        property Empty: Boolean read GetEmpty;
  108.        property Items[Index: integer]: TBitmap read Get write Put; default;
  109.     published
  110.        property OnChange: TNotifyEvent read FOnChange write FOnChange;
  111.        property OnChanging: TNotifyEvent read FOnChanging write FOnChanging;
  112.        property OnDecode: TEncodeEvent read FOnDecode write FOnDecode;
  113.        property OnEncode: TEncodeEvent read FOnEncode write FOnEncode;
  114.        property OnBmpLoaded: TLoadedEvent read FOnLoaded write FonLoaded;
  115.        property Compressed: Boolean read FCompressed write FCompressed default False;
  116.        property HandleType: TBitmapHandleType read FHandleType write FHandleType default bmDDB;
  117.     end;
  118.     {-- TMMCustomBitmapListControl --------------------------------------------}
  119.     TMMCustomBitmapListControl = class(TMMGraphicControl)
  120.     private
  121.        FTag2           : Longint;
  122.        FBitmapIndex    : integer;
  123.        FBitmaps        : TMMBitmapList;
  124.        FObserver       : TMMObserver;
  125.        FTransColor     : TColor;
  126.        FTransMode      : TTransparentMode;
  127.        FBitmapBackIndex: integer;
  128.        procedure SetBitmaps(aValue: TMMBitmapList);
  129.        procedure BitmapsNotify(Sender, Data: TObject);
  130.        procedure SetBitmapIndex(aValue: integer);
  131.        procedure SetBitmapBackIndex(aValue: integer);
  132.        function  GetBitmap: TBitmap;
  133.        procedure SetTransparentColor(aValue: TColor);
  134.        procedure SetTransparentMode(aValue: TTransparentMode);
  135.        function  TransparentColorStored: Boolean;
  136.        procedure CMTransColorChanged(var Message: TMessage); message CM_TRANSCOLORCHANGED;
  137.     protected
  138.        function  FindTransparentColor: TColor; virtual;
  139.        function  GetTransparentColor: TColor; virtual;
  140.        procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  141.        function  GetPalette: HPALETTE; override;
  142.        procedure BitmapChanged; virtual;
  143.     public
  144.        constructor Create(AOwner: TComponent); override;
  145.        destructor  Destroy; override;
  146.        function BitmapValid: Boolean;
  147.        property Bitmap: TBitmap read GetBitmap;
  148.        property BitmapList: TMMBitmapList read FBitmaps write SetBitmaps;
  149.        property BitmapIndex: Integer read FBitmapIndex write SetBitmapIndex default -1;
  150.        property BitmapBackIndex: Integer read FBitmapBackIndex write SetBitmapBackIndex default -1;
  151.        property TransparentColor: TColor read GetTransparentColor write SetTransparentColor stored TransparentColorStored;
  152.        property TransparentMode: TTransparentMode read FTransMode write SetTransparentMode default tmAuto;
  153.     published
  154.        property Tag2: Longint read FTag2 write FTag2 default 0;
  155.     end;
  156.     TMMGlyphOrientation = (goHorizontal,goVertical);
  157.     TMMPaintImage       = procedure(Sender: TObject; Canvas: TCanvas; DstRect, SrcRect: TRect) of object;
  158.     {-- TMMBitmapListImage ----------------------------------------------------}
  159.     TMMBitmapListImage  = class(TMMCustomBitmapListControl)
  160.     private
  161.        FAutoSize   : Boolean;
  162.        FNumGlyphs  : integer;
  163.        FGlyphIndex : integer;
  164.        FGlyphOrient: TMMGlyphOrientation;
  165.        FHorizMargin: integer;
  166.        FVertMargin : integer;
  167.        FOnPaint    : TMMPaintImage;
  168.        procedure SetAutoSize(aValue: Boolean);
  169.        procedure SetNumGlyphs(aValue: integer);
  170.        procedure SetGlyphIndex(aValue: integer);
  171.        procedure SetGlyphOrient(aValue: TMMGlyphOrientation);
  172.        procedure PaintBitmap;
  173.     protected
  174.        function  GetSrcRect(index: integer): TRect; virtual;
  175.        procedure FastDraw; virtual;
  176.        procedure DoAutoSize; virtual;
  177.        procedure Paint; override;
  178.        procedure BitmapChanged; override;
  179.     public
  180.        constructor Create(AOwner: TComponent); override;
  181.     published
  182.        property OnClick;
  183.        property OnDblClick;
  184.        property OnDragDrop;
  185.        property OnDragOver;
  186.        property OnEndDrag;
  187.        property OnStartDrag;
  188.        property OnMouseDown;
  189.        property OnMouseMove;
  190.        property OnMouseUp;
  191.        property OnPaint: TMMPaintImage read FOnPaint write FOnPaint;
  192.        property Align;
  193.        property Enabled;
  194.        property PopupMenu;
  195.        property ParentShowHint;
  196.        property ShowHint;
  197.        property Visible;
  198.        property DragCursor;
  199.        property DragMode;
  200.        property BitmapList;
  201.        property BitmapIndex;
  202.        property BitmapBackIndex;
  203.        property AutoSize: Boolean read FAutoSize write SetAutoSize default False;
  204.        property NumGlyphs: integer read FNumGlyphs write SetNumGlyphs;
  205.        property GlyphOrientation: TMMGlyphOrientation read FGlyphOrient write SetGlyphOrient default goHorizontal;
  206.        property GlyphIndex: integer read FGlyphIndex write SetGlyphIndex default 0;
  207.     end;
  208. implementation
  209. const
  210.      STREAMKENNUNG      : Longint = $4C4D424D; { 'MBML' }
  211.      STREAMKENNUNG_COMP : Longint = $434D424D; { 'MBMC' }
  212. {== TMMBitmapList =============================================================}
  213. constructor TMMBitmapList.Create(aOwner: TComponent);
  214. begin
  215.    inherited Create(aOwner);
  216.    FList        := TList.Create;
  217.    FOnChange    := nil;
  218.    FOnChanging  := nil;
  219.    FUpdateCount := 0;
  220.    FObservable  := TMMObservable.Create;
  221.    FCompressed  := False;
  222.    FHandleType  := bmDDB;
  223.    ErrorCode := ComponentRegistered(InitCode, Self, ClassName);
  224.    if (ErrorCode <> 0) then RegisterFailed(InitCode, Self , ClassName);
  225. end;
  226. {-- TMMBitmapList -------------------------------------------------------------}
  227. destructor TMMBitmapList.Destroy;
  228. begin
  229.    FOnChange := nil;
  230.    FOnChanging := nil;
  231.    Clear;
  232.    Flist.Free;
  233.    FObservable.Free;
  234.    FObservable:= nil;
  235.    inherited Destroy;
  236. end;
  237. {-- TMMBitmapList -------------------------------------------------------------}
  238. procedure TMMBitmapList.AddObserver(O: TMMObserver);
  239. begin
  240.    FObservable.AddObserver(O);
  241. end;
  242. {-- TMMBitmapList -------------------------------------------------------------}
  243. procedure TMMBitmapList.RemoveObserver(O: TMMObserver);
  244. begin
  245.    if (FObservable <> nil) then
  246.        FObservable.RemoveObserver(O);
  247. end;
  248. {-- TMMBitmapList -------------------------------------------------------------}
  249. procedure TMMBitmapList.BeginUpdate;
  250. begin
  251.   if FUpdateCount = 0 then SetUpdateState(True);
  252.   inc(FUpdateCount);
  253. end;
  254. {-- TMMBitmapList -------------------------------------------------------------}
  255. procedure TMMBitmapList.EndUpdate;
  256. begin
  257.    dec(FUpdateCount);
  258.    if FUpdateCount = 0 then SetUpdateState(False);
  259. end;
  260. {-- TMMBitmapList -------------------------------------------------------------}
  261. procedure TMMBitmapList.SetUpdateState(Updating: Boolean);
  262. begin
  263.   if Updating then Changing else Changed;
  264. end;
  265. {-- TMMBitmapList -------------------------------------------------------------}
  266. procedure TMMBitmapList.Changed;
  267. begin
  268.    if (FUpdateCount = 0) then
  269.    begin
  270.       inc(FUpdateCount);
  271.       try
  272.          FObservable.NotifyObservers(Self);
  273.          if Assigned(FOnChange) then FOnChange(Self);
  274.       finally
  275.          dec(FUpdateCount);
  276.       end;
  277.    end;
  278. end;
  279. {-- TMMBitmapList -------------------------------------------------------------}
  280. procedure TMMBitmapList.Changing;
  281. begin
  282.    if (FUpdateCount = 0) and Assigned(FOnChanging) then FOnChanging(Self);
  283. end;
  284. {-- TMMBitmapList -------------------------------------------------------------}
  285. procedure TMMBitmapList.BMPChanged(Sender: TObject);
  286. begin
  287.    Changed;
  288. end;
  289. {-- TMMBitmapList -------------------------------------------------------------}
  290. function TMMBitmapList.GetCount: integer;
  291. begin
  292.    Result := FList.Count;
  293. end;
  294. {-- TMMBitmapList -------------------------------------------------------------}
  295. function TMMBitmapList.GetEmpty: Boolean;
  296. begin
  297.    Result := (Flist.Count = 0)
  298. end;
  299. {-- TMMBitmapList -------------------------------------------------------------}
  300. procedure TMMBitmapList.Assign(Source: TPersistent);
  301. begin
  302.    if (Source = nil) then
  303.    begin
  304.       Clear;
  305.    end
  306.    else if (Source is TMMBitmapList) then
  307.    begin
  308.       BeginUpdate;
  309.       try
  310.          {$IFDEF WIN32}
  311.          {$IFDEF TRIAL}
  312.          {$DEFINE _HACK1}
  313.          {$I MMHACK.INC}
  314.          {$ENDIF}
  315.          {$ENDIF}
  316.          Clear;
  317.          AddList(TMMBitmapList(Source));
  318.          Compressed := TMMBitmapList(Source).Compressed;
  319.       finally
  320.          EndUpdate;
  321.       end;
  322.    end
  323.    else inherited Assign(Source)
  324. end;
  325. {-- TMMBitmapList -------------------------------------------------------------}
  326. function TMMBitmapList.Add(Item: TBitmap): integer;
  327. begin
  328.    Result := Count;
  329.    Insert(Result, Item);
  330. end;
  331. {-- TMMBitmapList -------------------------------------------------------------}
  332. procedure TMMBitmapList.AddList(List: TMMBitmapList);
  333. var
  334.    i: integer;
  335. begin
  336.    BeginUpdate;
  337.    try
  338.       for i := 0 to List.Count-1 do Add(List[i]);
  339.    finally
  340.       EndUpdate;
  341.    end;
  342. end;
  343. {-- TMMBitmapList -------------------------------------------------------------}
  344. procedure TMMBitmapList.Insert(Index: integer; Item: TBitmap);
  345. var
  346.    BMP: TBitmap;
  347. begin
  348.    Changing;
  349.    BMP := TBitmap.Create;
  350.    BMP.Assign(Item);
  351.    BMP.OnChange := BMPChanged;
  352.    FList.Insert(Index,BMP);
  353.    Changed;
  354. end;
  355. {-- TMMBitmapList -------------------------------------------------------------}
  356. procedure TMMBitmapList.AddFromFile(const FName: TFileName);
  357. var
  358.    BMP: TBitmap;
  359. begin
  360.    BMP := TBitmap.Create;
  361.    try
  362.       BMP.LoadFromFile(FName);
  363.       Add(Bmp);
  364.    finally
  365.       BMP.Free;
  366.    end;
  367. end;
  368. {-- TMMBitmapList -------------------------------------------------------------}
  369. procedure TMMBitmapList.ExtractToFile(index: integer; const FName: TFileName);
  370. begin
  371.    TBitmap(Flist[index]).SaveToFile(FName);
  372. end;
  373. {-- TMMBitmapList -------------------------------------------------------------}
  374. procedure TMMBitmapList.Clear;
  375. var
  376.    i: integer;
  377. begin
  378.    BeginUpdate;
  379.    {$IFDEF WIN32}
  380.    {$IFDEF TRIAL}
  381.    {$DEFINE _HACK2}
  382.    {$I MMHACK.INC}
  383.    {$ENDIF}
  384.    {$ENDIF}
  385.    try
  386.       for i := Count-1 downto 0 do Delete(i);
  387.    finally
  388.       EndUpdate;
  389.    end;
  390. end;
  391. {-- TMMBitmapList -------------------------------------------------------------}
  392. function TMMBitmapList.Remove(Item: TBitmap): integer;
  393. begin
  394.    Result := IndexOf(Item);
  395.    if Result <> -1 then Delete(Result);
  396. end;
  397. {-- TMMBitmapList -------------------------------------------------------------}
  398. procedure TMMBitmapList.Delete(Index: integer);
  399. var
  400.    BMP: TBitmap;
  401. begin
  402.    Changing;
  403.    BMP := Flist[index];
  404.    FList.Delete(index);
  405.    BMP.Free;
  406.    Changed;
  407. end;
  408. {-- TMMBitmapList -------------------------------------------------------------}
  409. function TMMBitmapList.First: TBitmap;
  410. begin
  411.    Result := FList[0];
  412. end;
  413. {-- TMMBitmapList -------------------------------------------------------------}
  414. function TMMBitmapList.Last: TBitmap;
  415. begin
  416.    Result := FList[Count-1];
  417. end;
  418. {-- TMMBitmapList -------------------------------------------------------------}
  419. function TMMBitmapList.Get(Index: integer): TBitmap;
  420. begin
  421.    Result := FList[Index];
  422.    {$IFDEF DELPHI3}
  423.    { prevent change events ! }
  424.    inc(FUpdateCount);
  425.    try
  426.       { make all Bitmaps compatible with previous versions of Delphi }
  427.       if (HandleType = bmDDB) then
  428.           Result.HandleType := bmDDB
  429.       else
  430.           Result.HandleType := bmDIB;
  431.    finally
  432.       dec(FUpdateCount);
  433.    end;
  434.    {$ENDIF}
  435. end;
  436. {-- TMMBitmapList -------------------------------------------------------------}
  437. function TMMBitmapList.IndexOf(Item: TBitmap): integer;
  438. begin
  439.    Result := FList.IndexOf(Item);
  440. end;
  441. {-- TMMBitmapList -------------------------------------------------------------}
  442. procedure TMMBitmapList.Exchange(Index1, Index2: integer);
  443. begin
  444.    Changing;
  445.    FList.Exchange(Index1,Index2);
  446.    Changed;
  447. end;
  448. {-- TMMBitmapList -------------------------------------------------------------}
  449. procedure TMMBitmapList.Move(OldIndex, NewIndex: integer);
  450. begin
  451.    Changing;
  452.    FList.Move(OldIndex,NewIndex);
  453.    Changed;
  454. end;
  455. {-- TMMBitmapList -------------------------------------------------------------}
  456. procedure TMMBitmapList.Put(Index: integer; Item: TBitmap);
  457. begin
  458.    Changing;
  459.    FList[Index] := Item;
  460.    Changed;
  461. end;
  462. {-- TMMBitmapList -------------------------------------------------------------}
  463. procedure TMMBitmapList.DefineProperties(Filer: TFiler);
  464. begin
  465.    inherited DefineProperties(Filer);
  466.    Filer.DefineBinaryProperty('ListItems', ReadData, WriteData, Count > 0);
  467. end;
  468. {------------------------------------------------------------------------------}
  469. { compression routines, basing on routines from SWAG                           }
  470. {------------------------------------------------------------------------------}
  471. const
  472.   MaxBufferSize  =32767;
  473.   MaxBufferIndex = MaxBufferSize+14;
  474. const
  475.   FLAG_Copied    = $80;
  476.   FLAG_Compress  = $40;
  477. type
  478.   TBufferSize    = 0..MaxBufferSize;
  479.   TBufferIndex   = 0..MaxBufferIndex;
  480.   PBuffer        = ^TABuffer;
  481.   TABuffer       = array[TBufferIndex] of Byte;
  482.   PLZTable       = ^LZTable;
  483.   LZTable        = array[0..4096-1] of SmallInt;
  484. {$R-}
  485. {------------------------------------------------------------------------------}
  486. function LZRWCompress(Source, Dest: PBuffer; SourceSize: TBufferSize): TBufferSize;
  487. var
  488.   Hash: PLZTable;
  489.   Key,Bit,Command,Size: integer;
  490.   X,Y,Z,Pos: integer;
  491.   function FindMatch(Source: PBuffer; X: TBufferIndex; SourceSize: TBufferSize;
  492.                      Hash: PLZTable; var iSize, Pos: integer): Boolean;
  493.   var
  494.      TmpHash: SmallInt;
  495.      HashValue: Word;
  496.   begin
  497.      HashValue:=(40543*((((Source^[X] shl 4) xor Source^[X+1]) shl 4) xor Source^[X+2]) shr 4) and $0FFF;
  498.      Result := False;
  499.      TmpHash:= Hash^[HashValue];
  500.      if (TmpHash <> -1) and (X - TmpHash < 4096) then
  501.      begin
  502.         Pos  := TmpHash;
  503.         iSize:= 0;
  504.         while((iSize < 18) and (Source^[X+iSize] = Source^[Pos+iSize]) and (X+iSize<SourceSize)) do Inc(iSize);
  505.         Result := (iSize >= 3)
  506.      end;
  507.      Hash^[HashValue] := X
  508.   end;
  509. begin
  510.    try
  511.       Getmem(Hash,Sizeof(LZTable));
  512.    except
  513.       raise EInvalidPointer.Create('LZRW Error!');
  514.       exit;
  515.    end;
  516.    FillChar(Hash^, SizeOf(LZTable), $FF);
  517.    Dest^[0] := FLAG_Compress;
  518.    X := 0;
  519.    Y := 3;
  520.    Z := 1;
  521.    Bit := 0;
  522.    Command := 0;
  523.    while (X < SourceSize) and (Y <= SourceSize) do
  524.    begin
  525.       if (Bit > 15) then
  526.       begin
  527.          Dest^[Z] := Hi(Command);
  528.          Dest^[Z+1] := Lo(Command);
  529.          Z:=Y;
  530.          Bit := 0;
  531.          Inc(Y,2)
  532.       end;
  533.       Size:=1;
  534.       while ((Source^[X] = Source^[X+Size]) and (Size<$FFF) and (X+Size<SourceSize)) do Inc(Size);
  535.       if (Size >= 16) then
  536.       begin
  537.          Dest^[Y]:= 0;
  538.          Dest^[Y+1]:= Hi(Size-16);
  539.          Dest^[Y+2]:= Lo(Size-16);
  540.          Dest^[Y+3]:= Source^[X];
  541.          Inc(Y,4);
  542.          Inc(X,Size);
  543.          Command:=(Command shl 1) + 1;
  544.       end
  545.       else if (FindMatch(Source,X,SourceSize,Hash,Size,Pos)) then
  546.       begin
  547.          Key := ((X-Pos) shl 4) + (Size-3);
  548.          Dest^[Y] := Hi(Key);
  549.          Dest^[Y+1] := Lo(Key);
  550.          Inc(Y,2);
  551.          Inc(X,Size);
  552.          Command := (Command shl 1) + 1
  553.       end
  554.       else
  555.       begin
  556.          Dest^[Y] := Source^[X];
  557.          Inc(Y);
  558.          Inc(X);
  559.          Command := Command shl 1
  560.       end;
  561.       Inc(Bit);
  562.    end;
  563.    Command := Command shl (16-Bit);
  564.    Dest^[Z] := HI(Command);
  565.    Dest^[Z+1] := LO(Command);
  566.    if (Y > SourceSize) then
  567.    begin
  568.       Move(Source^[0],Dest^[1],SourceSize);
  569.       Dest^[0] := FLAG_Copied;
  570.       Y := Succ(SourceSize)
  571.    end;
  572.    Result := Y;
  573.    if (Hash <> nil) then FreeMem(Hash, Sizeof(LZTable));
  574. end;
  575. {------------------------------------------------------------------------------}
  576. function LZRWDecompress(Source,Dest: PBuffer; Size: TBufferSize): TBufferSize;
  577. var
  578.    X,Y,SaveY,Pos: TBufferIndex;
  579.    BSize,K,Command: Word;
  580.    Bit: Byte;
  581. begin
  582.    SaveY := 0;
  583.    if (Source^[0] = FLAG_Copied) then
  584.    begin
  585.       for y := 1 to Pred(Size) do
  586.       begin
  587.          Dest^[Pred(Y)] := Source^[Y];
  588.          SaveY := Y;
  589.       end;
  590.       Y := SaveY;
  591.    end
  592.    else
  593.    begin
  594.       y := 0;
  595.       X := 3;
  596.       Command := (Source^[1] shl 8) + Source^[2];
  597.       Bit := 16;
  598.       while (X < Size) do
  599.       begin
  600.          if (Bit = 0) then
  601.          begin
  602.             Command := (Source^[X] shl 8) + Source^[X+1];
  603.             Bit := 16;
  604.             Inc(X,2)
  605.          end;
  606.          if ((Command and $8000) = 0) then
  607.          begin
  608.             Dest^[Y] := Source^[X];
  609.             inc(X); inc(Y)
  610.          end
  611.          else
  612.          begin
  613.             Pos:=((Source^[X] shl 4)+(Source^[X+1] shr 4));
  614.             if (Pos = 0) then
  615.             begin
  616.                BSize := (Source^[X+1] shl 8) + Source^[X+2] + 15;
  617.                for k := 0 to BSize do
  618.                    Dest^[Y+K] := Source^[X+3];
  619.                Inc(X,4);
  620.                Inc(Y,BSize+1)
  621.             end
  622.             else
  623.             begin
  624.                BSize := (Source^[X+1] and $0F)+2;
  625.                for k := 0 to BSize do
  626.                    Dest^[Y+K] := Dest^[Y-Pos+K];
  627.                Inc(X,2);
  628.                Inc(Y,BSize+1)
  629.             end;
  630.          end;
  631.          Command := Command shl 1;
  632.          Dec(Bit);
  633.       end;
  634.    end;
  635.    Result := Y
  636. end;
  637. {------------------------------------------------------------------------------}
  638. procedure TMMBitmapList.SaveCompressedStream(Src, Target: TStream; Size: Longint);
  639. var
  640.    bi, bo: PBuffer;
  641.    OldPos, NewPos, c, r,s: Longint;
  642. begin
  643.    c := 0;
  644.    OldPos := Target.Position;
  645.    Target.Position := Oldpos+sizeOf(c);
  646.    bi := nil;
  647.    bo := nil;
  648.    try
  649.       GetMem(bi, MaxBufferIndex);
  650.       GetMem(bo, MaxBufferIndex);
  651.       while (Size > 0) do
  652.       begin
  653.          r := Src.Read(bi^, MaxBufferIndex);
  654.          s := LZRWCompress(bi, bo, r);
  655.          Target.Write(s, SizeOf(s));
  656.          if assigned(FOnEncode) then
  657.             FOnEncode(Self,PChar(bo),s);
  658.          Target.WriteBuffer(bo^, s);
  659.          inc(c, s+SizeOf(s));
  660.          dec(Size, r);
  661.       end;
  662.       NewPos := Target.Position;
  663.       Target.Position := OldPos;
  664.       Target.Write(c, SizeOf(c));
  665.       Target.Position := NewPos;
  666.    finally
  667.       FreeMem(bi, MaxBufferIndex);
  668.       FreeMem(bo, MaxBufferIndex);
  669.    end;
  670. end;
  671. {------------------------------------------------------------------------------}
  672. procedure TMMBitmapList.LoadCompressedStream(Src, Target: TStream);
  673. var
  674.    c, s, SrcSize: LongInt;
  675.    bi, bo: PBuffer;
  676. begin
  677.    bi := nil;
  678.    bo := nil;
  679.    try
  680.       GetMem(bi, MaxBufferIndex);
  681.       GetMem(bo, MaxBufferIndex);
  682.       Src.Read(SrcSize, SizeOf(SrcSize));
  683.       while (SrcSize > 0) do
  684.       begin
  685.          Src.Read(c, SizeOf(c));
  686.          Src.ReadBuffer(bi^, c);
  687.          if assigned(FOnDecode) then FOnDecode(Self,PChar(bi),c);
  688.          s := LZRWDecompress(bi, bo, c);
  689.          Target.WriteBuffer(bo^, s);
  690.          dec(SrcSize, c+sizeOf(c));
  691.       end;
  692.    finally
  693.       FreeMem(bi, MaxBufferIndex);
  694.       FreeMem(bo, MaxBufferIndex);
  695.    end;
  696. end;
  697. {-- TMMBitmapList -------------------------------------------------------------}
  698. procedure TMMBitmapList.LoadFromStreamEx(Stream: TStream; Replace: Boolean);
  699. var
  700.    i: integer;
  701.    Kennung,BmpCount,Size: Longint;
  702.    MemStream: TMemoryStream;
  703.    Bmp: TBitmap;
  704. begin
  705.    BeginUpdate;
  706.    try
  707.       {$IFDEF WIN32}
  708.       {$IFDEF TRIAL}
  709.       {$DEFINE _HACK3}
  710.       {$I MMHACK.INC}
  711.       {$ENDIF}
  712.       {$ENDIF}
  713.       { load stream items }
  714.       if not Replace then Clear;
  715.       Stream.ReadBuffer(Kennung,sizeOf(STREAMKENNUNG));
  716.       if (Kennung <> STREAMKENNUNG) and (Kennung <> STREAMKENNUNG_COMP) then
  717.           raise EStreamError.Create('Invalid BitmapList stream');
  718.       Stream.ReadBuffer(BmpCount, SizeOf(BmpCount));
  719.       MemStream := TMemoryStream.Create;
  720.       try
  721.          Bmp := TBitmap.Create;
  722.          try
  723.             for i := 0 to BmpCount-1 do
  724.             begin
  725.                MemStream.Position := 0;
  726.                if (Kennung = STREAMKENNUNG_COMP) then
  727.                begin
  728.                   LoadCompressedStream(Stream, MemStream);
  729.                   MemStream.Position := 0;
  730.                end
  731.                else
  732.                begin
  733.                   Stream.ReadBuffer(Size, SizeOf(Size));
  734.                   MemStream.SetSize(Size);
  735.                   MemStream.Position := 0;
  736.                   Stream.ReadBuffer(MemStream.Memory^, Size);
  737.                end;
  738.                if not Replace or (i >= Count) then
  739.                begin
  740.                   Bmp.LoadFromStream(MemStream);
  741.                   Add(Bmp);
  742.                end
  743.                else
  744.                begin
  745.                   Items[i].LoadFromStream(MemStream);
  746.                end;
  747.                if assigned(FonLoaded) then
  748.                   FOnLoaded(Self,Items[i]);
  749.             end;
  750.          finally
  751.             Bmp.Free;
  752.          end;
  753.       finally
  754.          MemStream.Free;
  755.       end;
  756.    finally
  757.       EndUpdate;
  758.    end;
  759. end;
  760. {-- TMMBitmapList -------------------------------------------------------------}
  761. procedure TMMBitmapList.LoadFromStream(Stream: TStream);
  762. begin
  763.    LoadFromStreamEx(Stream,False);
  764. end;
  765. {-- TMMBitmapList -------------------------------------------------------------}
  766. procedure TMMBitmapList.ReplaceFromStream(Stream: TStream);
  767. begin
  768.    LoadFromStreamEx(Stream,True);
  769. end;
  770. {-- TMMBitmapList -------------------------------------------------------------}
  771. procedure TMMBitmapList.SaveToStream(Stream: TStream);
  772. var
  773.    i: integer;
  774.    Size,OldPos,Pos: Longint;
  775.    MemStream: TMemoryStream;
  776. begin
  777.    BeginUpdate;
  778.    try
  779.       { Write list to Stream }
  780.       if FCompressed then
  781.          Stream.WriteBuffer(STREAMKENNUNG_COMP,SizeOf(STREAMKENNUNG_COMP))
  782.       else
  783.          Stream.WriteBuffer(STREAMKENNUNG,SizeOf(STREAMKENNUNG));
  784.       Size := Count;
  785.       Stream.WriteBuffer(Size,SizeOf(Size));
  786.       for i := 0 to Count-1 do
  787.       begin
  788.          if Compressed then
  789.          begin
  790.             // TODO: optimieren ???
  791.             MemStream := TMemoryStream.Create;
  792.             try
  793.                Items[i].SaveToStream(MemStream);
  794.                MemStream.Position := 0;
  795.                SaveCompressedStream(MemStream, Stream, MemStream.Size);
  796.             finally
  797.                MemStream.Free;
  798.             end;
  799.          end
  800.          else
  801.          begin
  802.             OldPos := Stream.Position;
  803.             Stream.WriteBuffer(Size,SizeOf(Size));
  804.             //Items[i].PixelFormat := pf16Bit;// wieder weg...
  805.             Items[i].SaveToStream(Stream);
  806.             Size := Stream.Position - (OldPos + SizeOf(Size));
  807.             Pos := Stream.Position;
  808.             Stream.Position := OldPos;
  809.             Stream.Write(Size, SizeOf(Size));
  810.             Stream.Position := Pos;
  811.          end;
  812.       end;
  813.    finally
  814.       EndUpdate;
  815.    end;
  816. end;
  817. {-- TMMBitmapList -------------------------------------------------------------}
  818. procedure TMMBitmapList.ReadData(Stream: TStream);
  819. begin
  820.    LoadFromStream(Stream);
  821. end;
  822. {-- TMMBitmapList -------------------------------------------------------------}
  823. procedure TMMBitmapList.WriteData(Stream: TStream);
  824. begin
  825.    SaveToStream(Stream);
  826. end;
  827. {-- TMMBitmapList -------------------------------------------------------------}
  828. procedure TMMBitmapList.LoadFromFile(const FName: TFileName);
  829. var
  830.   Stream: TStream;
  831. begin
  832.    Stream := TFileStream.Create(FName, fmOpenRead);
  833.    try
  834.       LoadFromStream(Stream);
  835.    finally
  836.       Stream.Free;
  837.    end;
  838. end;
  839. {-- TMMBitmapList -------------------------------------------------------------}
  840. procedure TMMBitmapList.ReplaceFromFile(const FName: TFileName);
  841. var
  842.   Stream: TStream;
  843. begin
  844.    Stream := TFileStream.Create(FName, fmOpenRead);
  845.    try
  846.       ReplaceFromStream(Stream);
  847.    finally
  848.       Stream.Free;
  849.    end;
  850. end;
  851. {-- TMMBitmapList -------------------------------------------------------------}
  852. procedure TMMBitmapList.SaveToFile(const FName: TFileName);
  853. var
  854.   Stream: TStream;
  855. begin
  856.    Stream := TFileStream.Create(FName, fmCreate);
  857.    try
  858.       SaveToStream(Stream);
  859.    finally
  860.       Stream.Free;
  861.    end;
  862. end;
  863. {-- TMMBitmapList -------------------------------------------------------------}
  864. procedure TMMBitmapList.AddListFromFile(const FName: TFileName);
  865. var
  866.    BML: TMMBitmapList;
  867. begin
  868.    BML := TMMBitmapList.Create(nil);
  869.    try
  870.       BML.LoadFromFile(FName);
  871.       AddList(BML);
  872.    finally
  873.       BML.Free;
  874.    end;
  875. end;
  876. {== TMMCustomBitmapListControl ================================================}
  877. constructor TMMCustomBitmapListControl.Create(AOwner: TComponent);
  878. begin
  879.    inherited Create(AOwner);
  880.    ControlStyle      := ControlStyle - [csOpaque];
  881.    FBitmapIndex      := -1;
  882.    FBitmapBackIndex  := -1;
  883.    FBitmaps          := nil;
  884.    FObserver         := TMMObserver.Create;
  885.    FObserver.OnNotify:= BitmapsNotify;
  886.    FTag2             := 0;
  887.    FTransColor       := clDefault;
  888.    ErrorCode := ComponentRegistered(InitCode, Self, ClassName);
  889.    if (ErrorCode <> 0) then RegisterFailed(InitCode, Self , ClassName);
  890.    {$IFDEF WIN32}
  891.    {$IFDEF TRIAL}
  892.    {$DEFINE _HACK1}
  893.    {$I MMHACK.INC}
  894.    {$ENDIF}
  895.    {$ENDIF}
  896. end;
  897. {-- TMMCustomBitmapListControl ------------------------------------------------}
  898. destructor TMMCustomBitmapListControl.Destroy;
  899. begin
  900.    BitmapList := nil;
  901.    FObserver.Free;
  902.    inherited Destroy;
  903. end;
  904. {-- TMMCustomBitmapListControl ------------------------------------------------}
  905. procedure TMMCustomBitmapListControl.Notification(AComponent: TComponent; Operation: TOperation);
  906. begin
  907.    inherited Notification(AComponent, Operation);
  908.    if (Operation = opRemove) then
  909.    begin
  910.       if (aComponent = BitmapList) then BitmapList := nil;
  911.    end;
  912. end;
  913. {-- TMMCustomBitmapListControl ------------------------------------------------}
  914. procedure TMMCustomBitmapListControl.BitmapChanged;
  915. begin
  916.    if (csDesigning in ComponentState) then
  917.        Refresh
  918.    else if (Parent <> nil) and (Parent.HandleAllocated) then
  919.        Paint;
  920.    Refresh;
  921. end;
  922. {-- TMMCustomBitmapListControl ------------------------------------------------}
  923. procedure TMMCustomBitmapListControl.BitmapsNotify(Sender, Data: TObject);
  924. begin
  925.    BitmapChanged;
  926. end;
  927. {-- TMMCustomBitmapListControl ------------------------------------------------}
  928. procedure TMMCustomBitmapListControl.SetBitmaps(aValue: TMMBitmapList);
  929. begin
  930.   { bug fix for AX Controls }
  931.   if integer(aValue) = integer(Self) then exit;
  932.   if (FBitmaps <> nil) then FBitmaps.RemoveObserver(FObserver);
  933.   FBitmaps := aValue;
  934.   if (FBitmaps <> nil) then
  935.   begin
  936.      FBitmaps.AddObserver(FObserver);
  937.      {$IFNDEF BUILD_ACTIVEX}
  938.      if aValue <> nil then aValue.FreeNotification(Self);
  939.      {$ENDIF}
  940.   end;
  941.   BitmapChanged;
  942. end;
  943. {-- TMMCustomBitmapListControl ------------------------------------------------}
  944. procedure TMMCustomBitmapListControl.SetBitmapIndex(aValue: integer);
  945. begin
  946.    if (FBitmapIndex <> aValue) then
  947.    begin
  948.       FBitmapIndex := Max(aValue,-1);
  949.       BitmapChanged;
  950.    end;
  951. end;
  952. {-- TMMCustomBitmapListControl ------------------------------------------------}
  953. procedure TMMCustomBitmapListcontrol.SetBitmapBackIndex(aValue: integer);
  954. begin
  955.    if (FBitmapBackIndex <> aValue) then
  956.    begin
  957.       FBitmapBackIndex := Max(aValue,-1);
  958.       Invalidate;
  959.    end;
  960. end;
  961. {-- TMMCustomBitmapListControl ------------------------------------------------}
  962. function TMMCustomBitmapListControl.BitmapValid: Boolean;
  963. begin
  964.    Result := (FBitmaps <> nil) and (FBitmapIndex >= 0) and (FBitmapIndex <  FBitmaps.Count);
  965. end;
  966. {-- TMMCustomBitmapListControl ------------------------------------------------}
  967. function TMMCustomBitmapListControl.GetBitmap: TBitmap;
  968. begin
  969.    if BitmapValid then
  970.       Result := FBitmaps[BitmapIndex]
  971.    else
  972.       Result := nil;
  973. end;
  974. {-- TMMCustomBitmapListControl ------------------------------------------------}
  975. function TMMCustomBitmapListControl.FindTransparentColor: TColor;
  976. begin
  977.    Result := clDefault;
  978.    if BitmapValid then
  979.       Result := MMUtils.GetTransparentColor(Bitmap.Handle);
  980. end;
  981. {-- TMMCustomBitmapListControl ------------------------------------------------}
  982. function TMMCustomBitmapListControl.GetTransparentColor: TColor;
  983. begin
  984.    if (FTransColor = clDefault) then
  985.       Result := FindTransparentColor
  986.    else
  987.       Result := ColorToRGB(FTransColor);
  988. end;
  989. {-- TMMCustomBitmapListControl ------------------------------------------------}
  990. procedure TMMCustomBitmapListControl.SetTransparentColor(aValue: TColor);
  991. begin
  992.    if (aValue <> FTransColor) then
  993.    begin
  994.       if (aValue = clDefault) then
  995.           FTransMode := tmAuto
  996.       else
  997.           FTransMode := tmFixed;
  998.       FTransColor := aValue;
  999.       Perform(CM_TRANSCOLORCHANGED, 0, 0);
  1000.   end;
  1001.   {$IFDEF WIN32}
  1002.   {$IFDEF TRIAL}
  1003.   {$DEFINE _HACK2}
  1004.   {$I MMHACK.INC}
  1005.   {$ENDIF}
  1006.   {$ENDIF}
  1007. end;
  1008. {-- TMMCustomBitmapListControl ------------------------------------------------}
  1009. procedure TMMCustomBitmapListControl.SetTransparentMode(aValue: TTransparentMode);
  1010. begin
  1011.    if (aValue <> FTransMode) then
  1012.    begin
  1013.       if (aValue = tmAuto) then
  1014.           SetTransparentColor(clDefault)
  1015.       else
  1016.           SetTransparentColor(GetTransparentColor);
  1017.    end;
  1018. end;
  1019. {-- TMMCustomBitmapListControl ------------------------------------------------}
  1020. function TMMCustomBitmapListControl.TransparentColorStored: Boolean;
  1021. begin
  1022.    Result := FTransMode = tmFixed;
  1023. end;
  1024. {-- TMMCustomBitmapListControl ------------------------------------------------}
  1025. procedure TMMCustomBitmapListControl.CMTransColorChanged(var message: TMessage);
  1026. begin
  1027.    Invalidate;
  1028. end;
  1029. {-- TMMCustomBitmapListControl ------------------------------------------------}
  1030. function TMMCustomBitmapListControl.GetPalette: HPALETTE;
  1031. begin
  1032.    if BitmapValid then
  1033.       Result := Bitmap.Palette
  1034.    else
  1035.       Result := 0;
  1036. end;
  1037. {== TMMBitmapListImage ========================================================}
  1038. constructor TMMBitmapListImage.Create(AOwner: TComponent);
  1039. begin
  1040.    inherited Create(AOwner);
  1041.    FNumGlyphs   := 1;
  1042.    FAutoSize    := False;
  1043.    FGlyphOrient := goHorizontal;
  1044.    FGlyphIndex  := 0;
  1045.    FHorizMargin := 0;
  1046.    FVertMargin  := 0;
  1047.    Width        := 80;
  1048.    Height       := 80;
  1049.    {$IFDEF WIN32}
  1050.    {$IFDEF TRIAL}
  1051.    {$DEFINE _HACK1}
  1052.    {$I MMHACK.INC}
  1053.    {$ENDIF}
  1054.    {$ENDIF}
  1055. end;
  1056. {-- TMMBitmapListImage --------------------------------------------------------}
  1057. procedure TMMBitmapListImage.BitmapChanged;
  1058. begin
  1059.    DoAutoSize;
  1060. end;
  1061. {-- TMMBitmapListImage --------------------------------------------------------}
  1062. procedure TMMBitmapListImage.DoAutoSize;
  1063. var
  1064.    W,H: integer;
  1065. begin
  1066.    if (csLoading in ComponentState) or
  1067.       (csReading in ComponentState) or
  1068.       (csDestroying in ComponentState) then exit;
  1069.    if BitmapValid and FAutosize then
  1070.    begin
  1071.       if (FGlyphOrient = goHorizontal) then
  1072.       begin
  1073.          W := Bitmap.Width div FNumGlyphs;
  1074.          if (W > 0) and (Bitmap.Height > 0) then
  1075.              SetBounds(Left, Top, W, Bitmap.Height);
  1076.       end
  1077.       else
  1078.       begin
  1079.          H := Bitmap.Height div FNumGlyphs;
  1080.          if (H > 0) and (Bitmap.Width > 0) then
  1081.              SetBounds(Left, Top, Bitmap.Width, H);
  1082.       end;
  1083.    end;
  1084.    Invalidate;
  1085. end;
  1086. {-- TMMBitmapListImage --------------------------------------------------------}
  1087. procedure TMMBitmapListImage.SetNumGlyphs(aValue: integer);
  1088. begin
  1089.    if (FNumGlyphs <> aValue) then
  1090.    begin
  1091.       FNumGlyphs := Max(aValue,1);
  1092.       DoAutosize;
  1093.    end;
  1094. end;
  1095. {-- TMMBitmapListImage --------------------------------------------------------}
  1096. procedure TMMBitmapListImage.SetGlyphOrient(aValue: TMMGlyphOrientation);
  1097. begin
  1098.    if (FGlyphOrient <> aValue) then
  1099.    begin
  1100.       FGlyphOrient := aValue;
  1101.       DoAutoSize;
  1102.    end;
  1103. end;
  1104. {-- TMMBitmapListImage --------------------------------------------------------}
  1105. procedure TMMBitmapListImage.SetAutoSize(aValue: Boolean);
  1106. begin
  1107.    if (aValue <> FAutoSize) then
  1108.    begin
  1109.       FAutoSize := aValue;
  1110.       DoAutoSize;
  1111.    end;
  1112. end;
  1113. {-- TMMBitmapListImage --------------------------------------------------------}
  1114. procedure TMMBitmapListImage.SetGlyphIndex(aValue: integer);
  1115. begin
  1116.    if (aValue <> FGlyphIndex) then
  1117.    begin
  1118.       FGlyphIndex := aValue;
  1119.       if (csDesigning in ComponentState) then
  1120.          Refresh
  1121.       else
  1122.          FastDraw;
  1123.    end;
  1124. end;
  1125. {-- TMMBitmapListImage --------------------------------------------------------}
  1126. function TMMBitmapListImage.GetSrcRect(index: integer): TRect;
  1127. begin
  1128.    index := Min(index,FNumGlyphs-1);
  1129.    if (FGlyphOrient = goHorizontal) then
  1130.    begin
  1131.       Result.Left := index * (Bitmap.Width div FNumGlyphs);
  1132.       Result.Top := 0;
  1133.       Result.Right := (index+1) * (Bitmap.Width div FNumGlyphs);
  1134.       Result.Bottom := Bitmap.Height;
  1135.    end
  1136.    else
  1137.    begin
  1138.       Result.Left := 0;
  1139.       Result.Top := index * (Bitmap.Height div FNumGlyphs);
  1140.       Result.Right := Bitmap.Width;
  1141.       Result.Bottom := Min((index+1) * (Bitmap.Height div FNumGlyphs),Bitmap.Height);
  1142.    end;
  1143. end;
  1144. {-- TMMBitmapListImage --------------------------------------------------------}
  1145. procedure TMMBitmapListImage.FastDraw;
  1146. var
  1147.   DC: HDC;
  1148.   Control: TWinControl;
  1149. begin
  1150.    Control := Parent;
  1151.    if Visible and (Control <> nil) and Control.HandleAllocated then
  1152.    begin
  1153.       DC := GetDC(Control.Handle);
  1154.       try
  1155.         {$IFDEF DELPHI3}
  1156.         Canvas.Lock;
  1157.         {$ENDIF}
  1158.         if RectVisible(DC, Rect(Left, Top, Left + Width, Top + Height)) then
  1159.         begin
  1160.            MoveWindowOrg(DC, Left, Top);
  1161.            IntersectClipRect(DC, 0, 0, Width, Height);
  1162.            Canvas.Handle := DC;
  1163.            PaintBitmap;
  1164.         end;
  1165.       finally
  1166.         Canvas.Handle := 0;
  1167.         ReleaseDC(Control.Handle, DC);
  1168.         {$IFDEF DELPHI3}
  1169.         Canvas.Unlock;
  1170.         {$ENDIF}
  1171.       end;
  1172.   end;
  1173. end;
  1174. {-- TMMBitmapListImage --------------------------------------------------------}
  1175. procedure TMMBitmapListImage.PaintBitmap;
  1176. begin
  1177.    if (Visible or (csDesigning in ComponentState)) and BitmapValid then
  1178.    begin
  1179.       {$IFDEF DELPHI3}
  1180.       Bitmap.Canvas.Lock;
  1181.       {$ENDIF}
  1182.       try
  1183.          if not (csDesigning in ComponentState) and assigned(FOnPaint) then
  1184.             FOnPaint(Self,Canvas,Rect(0,0,Width,Height),GetSrcRect(FGlyphIndex))
  1185.          else
  1186.             Canvas.CopyRect(Rect(0,0,Width,Height),
  1187.                             Bitmap.Canvas,
  1188.                             GetSrcRect(FGlyphIndex));
  1189.       finally
  1190.          {$IFDEF DELPHI3}
  1191.          Bitmap.Canvas.UnLock;
  1192.          {$ENDIF}
  1193.       end;
  1194.    end
  1195.    else if csDesigning in ComponentState then
  1196.    begin
  1197.       Canvas.Brush.Style := bsClear;
  1198.       Canvas.Pen.Color   := clBlack;
  1199.       Canvas.Pen.Style   := psDot;
  1200.       Canvas.Rectangle(0,0,Width,Height);
  1201.    end;
  1202. end;
  1203. {-- TMMBitmapListImage --------------------------------------------------------}
  1204. procedure TMMBitmapListImage.Paint;
  1205. begin
  1206.    PaintBitmap;
  1207. end;
  1208. end.