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

Delphi控件源码

开发平台:

Delphi

  1. {*******************************************************************}
  2. {                                                                   }
  3. {       Almediadev Visual Component Library                         }
  4. {       DynamicSkinForm                                             }
  5. {       Version 5.60                                                }
  6. {                                                                   }
  7. {       Copyright (c) 2000-2003 Almediadev                          }
  8. {       ALL RIGHTS RESERVED                                         }
  9. {                                                                   }
  10. {       Home:  http://www.almdev.com                                }
  11. {       Support: support@almdev.com                                 }
  12. {                                                                   }
  13. {*******************************************************************}
  14. {$P+,S-,W-,R-}
  15. {$WARNINGS OFF}
  16. {$HINTS OFF}
  17. unit SkinHint;
  18. interface
  19. uses
  20.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  21.   SkinData, ExtCtrls;
  22. type
  23.   TspSkinHint = class;
  24.   TspSkinHintWindow = class(THintWindow)
  25.   private
  26.     NewClRect: TRect;
  27.     NewLTPoint, NewRTPoint,
  28.     NewLBPoint, NewRBPoint: TPoint;
  29.     FspHint: TspSkinHint;
  30.     DrawBuffer: TBitMap;
  31.     FSD:  TspSkinData;
  32.     SI: TBitMap;
  33.     FRgn: HRGN;
  34.     OldAlphaBlend: Boolean;
  35.     OldAlphaBlendValue: Integer;
  36.     procedure WMNCPaint(var Message: TMessage); message WM_NCPAINT;
  37.     procedure WMEraseBkGnd(var Msg: TWMEraseBkgnd); message WM_EraseBkgnd;
  38.     function FindHintComponent: TspSkinHint;
  39.     procedure CalcHintSize(Cnvs: TCanvas; S: String; var W, H: Integer);
  40.   protected
  41.     procedure SetHintWindowRegion;
  42.     procedure CreateParams(var Params: TCreateParams); override;
  43.     procedure Paint; override;
  44.   public
  45.     constructor Create(AOwner: TComponent); override;
  46.     destructor Destroy; override;
  47.     procedure ActivateHint(Rect: TRect; const AHint: string); override;
  48.   end;
  49.   TspSkinHint = class(TComponent)
  50.   private
  51.     FOnShowHint: TShowHintEvent;
  52.     FActive: Boolean;
  53.     FSD: TspSkinData;
  54.     HW: TspSkinHintWindow;
  55.     FAlphaBlendSupport: Boolean;
  56.     FDefaultFont: TFont;
  57.     FUseSkinFont: Boolean;
  58.     HintTimer: TTimer;
  59.     HintText: String;
  60.     procedure SetDefaultFont(Value: TFont);
  61.     procedure SetActive(Value: Boolean);
  62.     procedure SetAlphaBlendSupport(Value: Boolean);
  63.     procedure HintTime1(Sender: TObject);
  64.     procedure HintTime2(Sender: TObject);
  65.   protected
  66.     FAlphaBlend: Boolean;
  67.     FAlphaBlendValue: Byte;
  68.     procedure Notification(AComponent: TComponent;
  69.       Operation: TOperation); override;
  70.     procedure SetSkinData(Value: TspSkinData);
  71.     procedure SelfOnShowHint(var HintStr: string;
  72.                              var CanShow: Boolean; var HintInfo: THintInfo);
  73.   public
  74.     constructor Create(AOwner: TComponent); override;
  75.     destructor Destroy; override;
  76.     function GetCursorHeightMargin: Integer;
  77.     procedure ActivateHint(P: TPoint; const AHint: string);
  78.     procedure ActivateHint2(const AHint: string);
  79.     procedure HideHint;
  80.     function IsVisible: Boolean; 
  81.   published
  82.     property DefaultFont: TFont read FDefaultFont write SetDefaultFont;
  83.     property UseSkinFont: Boolean read FUseSkinFont write FUseSkinFont;
  84.     property AlphaBlendSupport: Boolean read FAlphaBlendSupport
  85.                                         write SetAlphaBlendSupport;
  86.     property AlphaBlend: Boolean read FAlphaBlend write FAlphaBlend;
  87.     property AlphaBlendValue: Byte
  88.       read FAlphaBlendValue write FAlphaBlendValue;
  89.     property SkinData: TspSkinData read FSD write SetSkinData;
  90.     property Active: Boolean read FActive write SetActive;
  91.     property OnShowHint: TShowHintEvent read FOnShowHint write FOnShowHint;
  92.   end;
  93. implementation
  94.   Uses spUtils, spEffBmp;
  95. constructor TspSkinHintWindow.Create(AOwner: TComponent);
  96. begin
  97.   inherited Create(AOwner);
  98.   SI := TBitMap.Create;
  99.   FRgn := 0;
  100.   OldAlphaBlend := False;
  101.   OldAlphaBlendValue := 0;
  102. end;
  103. destructor TspSkinHintWindow.Destroy;
  104. begin
  105.   SI.Free;
  106.   inherited Destroy;
  107.   if FRgn <> 0 then DeleteObject(FRgn);
  108. end;
  109. procedure TspSkinHintWindow.WMNCPaint(var Message: TMessage);
  110. begin
  111. end;
  112. procedure TspSkinHintWindow.SetHintWindowRegion;
  113. var
  114.   TempRgn: HRgn;
  115.   MaskPicture: TBitMap;
  116. begin
  117.   if (FSD <> nil) and (FSD.HintWindow.MaskPictureIndex <> -1)
  118.   then
  119.     begin
  120.       TempRgn := FRgn;
  121.       with FSD.HintWindow do
  122.       begin
  123.         MaskPicture := TBitMap(FSD.FActivePictures[MaskPictureIndex]);
  124.         CreateSkinRegion
  125.           (FRgn, LTPoint, RTPoint, LBPoint, RBPoint, ClRect,
  126.            NewLTPoint, NewRTPoint, NewLBPoint, NewRBPoint, NewClRect,
  127.            MaskPicture, Width, Height);
  128.       end;
  129.       SetWindowRgn(Handle, FRgn, False);
  130.       if TempRgn <> 0 then DeleteObject(TempRgn);
  131.     end
  132.   else
  133.     if FRgn <> 0 then
  134.     begin
  135.       SetWindowRgn(Handle, 0, False);
  136.       DeleteObject(FRgn);
  137.       FRgn := 0;
  138.     end;
  139. end;
  140. procedure TspSkinHintWindow.CalcHintSize(Cnvs: TCanvas; S: String; var W, H: Integer);
  141. var
  142.   R: TRect;
  143.   PW, PH, OX, OY: Integer;
  144. begin
  145.   R := Rect(0, 0, 0, 0);
  146.   DrawText(Cnvs.Handle, PChar(S), -1, R, DT_CALCRECT or DT_LEFT);
  147.   W := RectWidth(R);
  148.   H := RectHeight(R);
  149.   if FSD <> nil
  150.   then
  151.     begin
  152.       with FSD.HintWindow do
  153.       begin
  154.         PW := TBitMap(FSD.FActivePictures[WindowPictureIndex]).Width;
  155.         PH := TBitMap(FSD.FActivePictures[WindowPictureIndex]).Height;
  156.         W := W + ClRect.Left + (PW - ClRect.Right);
  157.         H := H + ClRect.Top + (PH - ClRect.Bottom);
  158.         if W < PW then W := PW;
  159.         if H < PH then H := PH;
  160.         OX := W - PW;
  161.         OY := H - PH;
  162.         NewClRect := ClRect;
  163.         Inc(NewClRect.Right, OX);
  164.         Inc(NewClRect.Bottom, OY);
  165.         NewLTPoint := LTPoint;
  166.         NewRTPoint := Point(RTPoint.X + OX, RTPoint.Y);
  167.         NewLBPoint := Point(LBPoint.X, LBPoint.Y + OY);
  168.         NewRBPoint := Point(RBPoint.X + OX, RBPoint.Y + OY);
  169.       end;
  170.     end
  171.   else
  172.     begin
  173.       Inc(W, 4);
  174.       Inc(H, 4);
  175.     end;
  176. end;
  177. function TspSkinHintWindow.FindHintComponent;
  178. var
  179.   i: Integer;
  180. begin
  181.   Result := nil;
  182.   if (Application.MainForm <> nil) and
  183.      (Application.MainForm.ComponentCount > 0)
  184.   then
  185.     with Application.MainForm do
  186.       for i := 0 to ComponentCount - 1 do
  187.        if (Components[i] is TspSkinHint) and
  188.           (TspSkinHint(Components[i]).Active)
  189.        then
  190.          begin
  191.            Result := TspSkinHint(Components[i]);
  192.            Break;
  193.          end;
  194. end;
  195. procedure TspSkinHintWindow.ActivateHint(Rect: TRect; const AHint: string);
  196. const
  197.   WS_EX_LAYERED = $80000;
  198. var
  199.   HintWidth, HintHeight: Integer;
  200.   CanSkin: Boolean;
  201. begin
  202.   FspHint := FindHintComponent;
  203.   if FspHint = nil then Exit;
  204.   if not FspHint.Active then Exit;
  205.   CanSkin := (FspHint.FSD <> nil) and (not FspHInt.FSD.Empty) and
  206.              (FspHint.FSD.HintWindow.WindowPictureIndex <> -1);
  207.   //
  208.   if CanSkin then FSD := FspHint.FSD else FSD := nil; 
  209.   if FSD <> nil
  210.   then
  211.     begin
  212.       with Canvas, FSD.HintWindow do
  213.       begin
  214.         if FspHint.UseSkinFont
  215.         then
  216.           begin
  217.             Font.Height := FontHeight;
  218.             Font.Name := FontName;
  219.             Font.Style := FontStyle;
  220.             Font.CharSet := FspHint.DefaultFont.CharSet;
  221.           end
  222.         else
  223.           Font.Assign(FspHint.FDefaultFont);
  224.       end;
  225.     end
  226.   else
  227.     with Canvas do
  228.     begin
  229.       Font.Assign(FspHint.FDefaultFont);
  230.     end;
  231.     
  232.   Caption := AHint;
  233.   CalcHintSize(Canvas, Caption, HintWidth, HintHeight);
  234.   Rect.Right := Rect.Left + HintWidth;
  235.   Rect.Bottom := Rect.Top + HIntHeight;
  236.   //
  237.   if (Rect.Right > Screen.Width) then OffsetRect(Rect, -HintWidth-2, 0);
  238.   if (Rect.Bottom > Screen.Height) then OffsetRect(Rect, 0, -HintHeight-2);
  239.   //
  240.   BoundsRect := Rect;
  241.   if (OldAlphaBlend <> FspHint.AlphaBlend) and FSpHint.AlphaBlendSupport
  242.   then
  243.     begin
  244.       if OldAlphaBlend
  245.       then
  246.        SetWindowLong(Handle, GWL_EXSTYLE,
  247.             GetWindowLong(Handle, GWL_EXSTYLE) and (not WS_EX_LAYERED))
  248.       else
  249.         begin
  250.           SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE)
  251.                         or WS_EX_LAYERED);
  252.           SetAlphaBlendTransparent(Handle, FspHint.AlphaBlendValue);
  253.         end;
  254.       OldAlphaBlend := FspHint.AlphaBlend;
  255.     end;
  256.   if (OldAlphaBlendValue <> FspHint.AlphaBlendValue) and FSpHint.AlphaBlendSupport and
  257.      FspHint.AlphaBlend
  258.   then
  259.     begin
  260.       SetAlphaBlendTransparent(Handle, FspHint.AlphaBlendValue);
  261.       OldAlphaBlendValue := FspHint.AlphaBlendValue;
  262.     end;
  263.   //
  264.   if FspHint.AlphaBlend and not FspHint.AlphaBlendSupport
  265.   then
  266.     begin
  267.       SI.Width := Width;
  268.       SI.Height := Height;
  269.       GetScreenImage(Rect.Left, Rect.Top, SI);
  270.     end;
  271.   //
  272.   SetHintWindowRegion;
  273.   //
  274.   SetWindowPos(Handle, HWND_TOPMOST, Rect.Left, Rect.Top, 0,
  275.     0, SWP_SHOWWINDOW or SWP_NOACTIVATE or SWP_NOSIZE);
  276.   Visible := True;
  277. end;
  278. procedure TspSkinHintWindow.CreateParams(var Params: TCreateParams);
  279. begin
  280.   inherited CreateParams(Params);
  281.   Params.Style := Params.Style - WS_BORDER;
  282. end;
  283. procedure TspSkinHintWindow.Paint;
  284. var
  285.   R: TRect;
  286.   kf: Double;
  287.   EB1, EB2: TspEffectBmp;
  288.   B: TBitMap;
  289.   W, H, X, Y: Integer;
  290. begin
  291.   //
  292.   if (Width <= 0) or (Height <= 0) then Exit;
  293.   DrawBuffer := TBitMap.Create;
  294.   DrawBuffer.Width := Width;
  295.   DrawBuffer.Height := Height;
  296.   //
  297.   if FSD <> nil
  298.   then
  299.     with DrawBuffer.Canvas, FSD.HintWindow do
  300.     begin
  301.       B := TBitMap(FSD.FActivePictures[WindowPictureIndex]);
  302.       CreateSkinImageBS(LTPoint, RTPoint, LBPoint, RBPoint,
  303.       CLRect, NewLTPoint, NewRTPoint, NewLBPoint, NewRBPoint,
  304.       NewClRect, DrawBuffer, B,
  305.       Rect(0, 0, B.Width, B.Height), Width, Height, True,
  306.       FSD.HintWindow.LeftStretch, FSD.HintWindow.TopStretch,
  307.       FSD.HintWindow.RightStretch, FSD.HintWindow.BottomStretch);
  308.     end
  309.   else
  310.     with DrawBuffer.Canvas do
  311.     begin
  312.       Brush.Color := clInfoBk;
  313.       FillRect(ClientRect);
  314.       R := ClientRect;
  315.       Frame3D(DrawBuffer.Canvas, R, clBtnShadow, clBtnShadow, 1);
  316.     end;
  317.   //
  318.   if FSD <> nil
  319.   then
  320.     with DrawBuffer.Canvas, FSD.HintWindow do
  321.     begin
  322.       Brush.Style := bsClear;
  323.       if FspHint.UseSkinFont
  324.       then
  325.         begin
  326.           Font.Height := FontHeight;
  327.           Font.Style := FontStyle;
  328.           Font.Name := FontName;
  329.           Font.CharSet := FspHint.DefaultFont.CharSet;
  330.         end
  331.       else
  332.         Font.Assign(FspHint.FDefaultFont);
  333.       Font.Color := FontColor;
  334.       R := Rect(0, 0, 0, 0);
  335.       DrawText(Handle, PChar(Caption), -1, R, DT_CALCRECT or DT_LEFT);
  336.       W := RectWidth(R);
  337.       H := RectHeight(R);
  338.       X := NewClRect.Left + RectWidth(NewClRect) div 2 - W div 2;
  339.       Y := NewClRect.Top + RectHeight(NewClRect) div 2 - H div 2;
  340.       R := Rect(X, Y, X + W, Y + H);
  341.       DrawText(Handle, PChar(Caption), -1, R, DT_LEFT);
  342.     end
  343.   else
  344.     with DrawBuffer.Canvas do
  345.     begin
  346.       Font.Assign(FspHint.FDefaultFont);
  347.       Font.Color := clInfoText;
  348.       Brush.Style := bsClear;
  349.       R := Rect(2, 2, Width - 2, Height - 2);
  350.       DrawText(Handle, PChar(Caption), -1, R, DT_LEFT);
  351.     end;
  352.   //
  353.   if FspHint.AlphaBlend and not FspHint.AlphaBlendSupport
  354.   then
  355.     begin
  356.       EB1 := TspEffectBmp.CreateFromhWnd(DrawBuffer.Handle);
  357.       SI.Width := DrawBuffer.Width;
  358.       EB2 := TspEffectBmp.CreateFromhWnd(SI.Handle);
  359.       kf := 1 - FspHint.AlphaBlendValue / 255;
  360.       EB1.Morph(EB2, kf);
  361.       EB1.Draw(DrawBuffer.Canvas.Handle, 0, 0);
  362.       EB1.Free;
  363.       EB2.Free;
  364.     end;
  365.   //
  366.   Canvas.Draw(0, 0, DrawBuffer);
  367.   DrawBuffer.Free;
  368. end;
  369. procedure TspSkinHintWindow.WMEraseBkGnd(var Msg: TWMEraseBkgnd);
  370. begin
  371.   Msg.Result := 1;
  372. end;
  373. constructor TspSkinHint.Create(AOwner: TComponent);
  374. begin
  375.   inherited Create(AOwner);
  376.   HintTimer := nil;
  377.   FDefaultFont := TFont.Create;
  378.   FUseSkinFont := True;
  379.   FAlphaBlend := False;
  380.   FAlphaBlendValue := 200;
  381.   FAlphaBlendSupport := True;
  382.   FSD := nil;
  383.   FActive := True;
  384.   HW := TspSkinHintWindow.Create(Self);
  385.   HW.Visible := False;
  386.   if not (csDesigning in ComponentState)
  387.   then
  388.     begin
  389.       HintWindowClass := TspSkinHintWindow;
  390.       with Application do begin
  391.         ShowHint := not ShowHint;
  392.         ShowHint := not ShowHint;
  393.         OnShowHint := SelfOnShowHint;
  394.         Application.HintShortPause := 100;
  395.       end;
  396.     end;
  397. end;
  398. destructor TspSkinHint.Destroy;
  399. begin
  400.   HW.Free;
  401.   FDefaultFont.Free;
  402.   if HintTimer <> nil then HintTimer.Free;
  403.   inherited Destroy;
  404. end;
  405. function TspSkinHint.IsVisible: Boolean;
  406. begin
  407.   Result := (HW <> nil) and HW.Visible;
  408. end;
  409. function TspSkinHint.GetCursorHeightMargin: Integer;
  410.   var
  411.     IconInfo: TIconInfo;
  412.     BitmapInfoSize, BitmapBitsSize, ImageSize: DWORD;
  413.     Bitmap: PBitmapInfoHeader;
  414.     Bits: Pointer;
  415.     BytesPerScanline: Integer;
  416.       function FindScanline(Source: Pointer; MaxLen: Cardinal;
  417.         Value: Cardinal): Cardinal; assembler;
  418.       asm
  419.               PUSH    ECX
  420.               MOV     ECX,EDX
  421.               MOV     EDX,EDI
  422.               MOV     EDI,EAX
  423.               POP     EAX
  424.               REPE    SCASB
  425.               MOV     EAX,ECX
  426.               MOV     EDI,EDX
  427.       end;
  428.   begin
  429.     { Default value is entire icon height }
  430.     Result := GetSystemMetrics(SM_CYCURSOR);
  431.     if GetIconInfo(GetCursor, IconInfo) then
  432.     try
  433.       GetDIBSizes(IconInfo.hbmMask, BitmapInfoSize, BitmapBitsSize);
  434.       Bitmap := AllocMem(DWORD(BitmapInfoSize) + BitmapBitsSize);
  435.       try
  436.       Bits := Pointer(DWORD(Bitmap) + BitmapInfoSize);
  437.       if GetDIB(IconInfo.hbmMask, 0, Bitmap^, Bits^) and
  438.         (Bitmap^.biBitCount = 1) then
  439.       begin
  440.         { Point Bits to the end of this bottom-up bitmap }
  441.         with Bitmap^ do
  442.         begin
  443.           BytesPerScanline := ((biWidth * biBitCount + 31) and not 31) div 8;
  444.           ImageSize := biWidth * BytesPerScanline;
  445.           Bits := Pointer(DWORD(Bits) + BitmapBitsSize - ImageSize);
  446.           { Use the width to determine the height since another mask bitmap
  447.             may immediately follow }
  448.           Result := FindScanline(Bits, ImageSize, $FF);
  449.           { In case the and mask is blank, look for an empty scanline in the
  450.             xor mask. }
  451.           if (Result = 0) and (biHeight >= 2 * biWidth) then
  452.             Result := FindScanline(Pointer(DWORD(Bits) - ImageSize),
  453.             ImageSize, $00);
  454.           Result := Result div BytesPerScanline;
  455.         end;
  456.         Dec(Result, IconInfo.yHotSpot);
  457.       end;
  458.       finally
  459.         FreeMem(Bitmap, BitmapInfoSize + BitmapBitsSize);
  460.       end;
  461.     finally
  462.       if IconInfo.hbmColor <> 0 then DeleteObject(IconInfo.hbmColor);
  463.       if IconInfo.hbmMask <> 0 then DeleteObject(IconInfo.hbmMask);
  464.     end;
  465. end;
  466. procedure TspSkinHint.SetDefaultFont(Value: TFont);
  467. begin
  468.   FDefaultFont.Assign(Value);
  469. end;
  470. procedure TspSkinHint.SetAlphaBlendSupport(Value: Boolean);
  471. begin
  472.   if Value
  473.   then
  474.     begin
  475.       if not CheckW2KWXP and not (csDesigning in ComponentState)
  476.       then
  477.         Value := False;
  478.     end;
  479.   FAlphaBlendSupport := Value;
  480. end;
  481. procedure TspSkinHint.SetSkinData;
  482. begin
  483.   FSD := Value;
  484. end;
  485. procedure TspSkinHint.Notification;
  486. begin
  487.   inherited Notification(AComponent, Operation);
  488.   if (Operation = opRemove) and (AComponent = FSD) then FSD := nil;
  489. end;
  490. procedure TspSkinHint.SetActive(Value: Boolean);
  491. var
  492.   i: Integer;
  493. begin
  494.   FActive := Value;
  495.   if FActive and (Application.MainForm <> nil)
  496.   then
  497.     with Application.MainForm do
  498.       for i := 0 to ComponentCount-1 do
  499.         if (Components[i] is TspSkinHint) and (Components[i] <> Self)
  500.         then
  501.           if TspSkinHint(Components[i]).Active
  502.           then TspSkinHint(Components[i]).Active := False;
  503.   if not (csDesigning in ComponentState) and FActive
  504.   then Application.OnShowHint := SelfOnShowHint;
  505. end;
  506. procedure TspSkinHint.SelfOnShowHint(var HintStr: string;
  507.                                  var CanShow: Boolean; var HintInfo: THintInfo);
  508. begin
  509.   if Assigned(FOnShowHint) then FOnShowHint(HintStr, CanShow, HintInfo);
  510. end;
  511. procedure TspSkinHint.HintTime1(Sender: TObject);
  512. var
  513.   R: TRect;
  514.   P: TPoint;
  515. begin
  516.   if HintTimer = nil then Exit;
  517.   GetCursorPos(P);
  518.   P.Y := P.Y + GetCursorHeightMargin;
  519.   R := Rect(P.X, P.Y, P.X, P.Y);
  520.   HW.ActivateHint(R, HintText);
  521.   HW.Visible := True;
  522.   HintTimer.Enabled := False;
  523.   HintTimer.Interval := Application.HintHidePause;
  524.   HintTimer.OnTimer := HintTime2;
  525.   HintTimer.Enabled := True;
  526. end;
  527. procedure TspSkinHint.HintTime2(Sender: TObject);
  528. begin
  529.   HideHint;
  530. end;
  531. procedure TspSkinHint.ActivateHint2(const AHint: string);
  532. begin
  533.   if HintTimer <> nil
  534.   then
  535.     begin
  536.       HintTimer.Enabled := False;
  537.       HintTimer.Free;
  538.       HintTimer := nil;
  539.     end;
  540.   HintText := AHint;
  541.   HintTimer := TTimer.Create(Self);
  542.   HintTimer.Enabled := False;
  543.   HintTimer.Interval := Application.HintPause;
  544.   HintTimer.OnTimer := HintTime1;
  545.   HintTimer.Enabled := True;
  546. end;
  547. procedure TspSkinHint.ActivateHint(P: TPoint; const AHint: string);
  548. var
  549.   R: TRect;
  550. begin
  551.   R := Rect(P.X, P.Y, P.X, P.Y);
  552.   HW.ActivateHint(R, AHint);
  553.   HW.Visible := True;
  554. end;
  555. procedure TspSkinHint.HideHint;
  556. begin
  557.   if HintTimer <> nil
  558.   then
  559.     begin
  560.       HintTimer.Enabled := False;
  561.       HintTimer.Free;
  562.       HintTimer := nil;
  563.     end;
  564.   if HW.Visible
  565.   then
  566.     begin
  567.       HW.Visible := False;
  568.       SetWindowPos(HW.Handle, HWND_TOPMOST, 0, 0, 0,
  569.         0, SWP_HideWINDOW or SWP_NOACTIVATE or SWP_NOSIZE);
  570.     end;    
  571. end;
  572. end.