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

Delphi控件源码

开发平台:

Delphi

  1. unit fcImager;
  2. {
  3. //
  4. // Components : TfcImager
  5. //
  6. // Copyright (c) 1999 by Woll2Woll Software
  7. // 4/21/99 - RSW - Added CopyToClipboard method
  8. // 8/2/99 - Check if parent is nil in BitmapChange event.
  9. }
  10. interface
  11. uses
  12.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  13.   fcCommon, fcBitmap, fcChangeLink, db, dbctrls, stdctrls;
  14. {$i fcIfDef.pas}
  15. type
  16.   TfcImagerDrawStyle = (dsNormal, dsCenter, dsStretch, dsTile, dsProportional);
  17.   TfcBitmapOptions = class;
  18.   TfcRotate = class(TPersistent)
  19.   private
  20.     FBitmapOptions: TfcBitmapOptions;
  21.     FCenterX: Integer;
  22.     FCenterY: Integer;
  23.     FAngle: Integer;
  24.     procedure SetAngle(Value: Integer);
  25.     procedure SetCenterX(Value: Integer);
  26.     procedure SetCenterY(Value: Integer);
  27.   public
  28.     constructor Create(BitmapOptions: TfcBitmapOptions);
  29.   published
  30.     property CenterX: Integer read FCenterX write SetCenterX;
  31.     property CenterY: Integer read FCenterY write SetCenterY;
  32.     property Angle: Integer read FAngle write SetAngle;
  33.   end;
  34.   TfcAlphaBlend = class(TPersistent)
  35.   private
  36.     FBitmapOptions: TfcBitmapOptions;
  37.     FAmount: Byte;
  38.     FBitmap: TfcBitmap;
  39.     FChanging: Boolean;
  40.     function GetTransparent: Boolean;
  41.     procedure SetAmount(Value: Byte);
  42.     procedure SetBitmap(Value: TfcBitmap);
  43.     procedure SetTransparent(Value: Boolean);
  44.   protected
  45.     procedure BitmapChanged(Sender: TObject); virtual;
  46.   public
  47.     constructor Create(BitmapOptions: TfcBitmapOptions);
  48.     destructor Destroy; override;
  49.   published
  50.     property Amount: Byte read FAmount write SetAmount;
  51.     property Bitmap: TfcBitmap read FBitmap write SetBitmap;
  52.     property Transparent: Boolean read GetTransparent write SetTransparent;
  53.   end;
  54.   TfcWave = class(TPersistent)
  55.   private
  56.     FBitmapOptions: TfcBitmapOptions;
  57.     FXDiv, FYDiv, FRatio: Integer;
  58.     FWrap: Boolean;
  59.     procedure SetXDiv(Value: Integer);
  60.     procedure SetYDiv(Value: Integer);
  61.     procedure SetRatio(Value: Integer);
  62.     procedure SetWrap(Value: Boolean);
  63.   public
  64.     constructor Create(BitmapOptions: TfcBitmapOptions);
  65.   published
  66.     property XDiv: Integer read FXDiv write SetXDiv;
  67.     property YDiv: Integer read FYDiv write SetYDiv;
  68.     property Ratio: Integer read FRatio write SetRatio;
  69.     property Wrap: Boolean read FWrap write SetWrap;
  70.   end;
  71.   TfcBitmapOptions = class(TPersistent)
  72.   private
  73.     FComponent: TComponent;
  74.     FAlphaBlend: TfcAlphaBlend;
  75.     FColor: TColor;
  76.     FContrast: Integer;
  77.     FEmbossed: Boolean;
  78.     FTintColor: TColor;
  79.     FGaussianBlur: Integer;
  80.     FGrayScale: Boolean;
  81.     FHorizontallyFlipped: Boolean;
  82.     FInverted: Boolean;
  83.     FLightness: Integer;
  84.     FRotation: TfcRotate;
  85.     FSaturation: Integer;
  86.     FSharpen: Integer;
  87.     FSponge: Integer;
  88.     FTile: Boolean;
  89.     FVerticallyFlipped: Boolean;
  90.     FWave: TfcWave;
  91.     FOnChange: TNotifyEvent;
  92.     FOrigPicture: TPicture;
  93.     FDestBitmap: TfcBitmap;
  94.     FUpdateLock: Integer;
  95.     // Property Access methods;
  96.     procedure SetColor(Value: TColor);
  97.     procedure SetBooleanProperty(Index: Integer; Value: Boolean);
  98.     procedure SetTintColor(Value: TColor);
  99.     procedure SetIntegralProperty(Index: Integer; Value: Integer);
  100.   public
  101.     constructor Create(AComponent: TComponent);
  102.     destructor Destroy; override;
  103.     procedure BeginUpdate; virtual;
  104.     procedure Changed; virtual;
  105.     procedure EndUpdate;
  106.     property DestBitmap: TfcBitmap read FDestBitmap write FDestBitmap;
  107.     property OrigPicture: TPicture read FOrigPicture write FOrigPicture;
  108.     property Tile: Boolean read FTile write FTile;
  109.     property OnChange: TNotifyEvent read FOnChange write FOnChange;
  110.   published
  111.     property AlphaBlend: TfcAlphaBlend read FAlphaBlend write FAlphaBlend;
  112.     property Color: TColor read FColor write SetColor;
  113.     property Contrast: Integer index 4 read FContrast write SetIntegralProperty;
  114.     property Embossed: Boolean index 0 read FEmbossed write SetBooleanProperty;
  115.     property TintColor: TColor read FTintColor write SetTintColor;
  116.     property GaussianBlur: Integer index 3 read FGaussianBlur write SetIntegralProperty;
  117.     property GrayScale: Boolean index 2 read FGrayScale write SetBooleanProperty;
  118.     property HorizontallyFlipped: Boolean index 3 read FHorizontallyFlipped write SetBooleanProperty;
  119.     property Inverted: Boolean index 1 read FInverted write SetBooleanProperty;
  120.     property Lightness: Integer index 0 read FLightness write SetIntegralProperty;
  121.     property Rotation: TfcRotate read FRotation write FRotation;
  122.     property Saturation: Integer index 1 read FSaturation write SetIntegralProperty;
  123.     property Sharpen: Integer index 5 read FSharpen write SetIntegralProperty;
  124.     property Sponge: Integer index 2 read FSponge write SetIntegralProperty;
  125.     property VerticallyFlipped: Boolean index 4 read FVerticallyFlipped write SetBooleanProperty;
  126.     property Wave: TfcWave read FWave write FWave;
  127.   end;
  128.   TfcCustomImager = class(TGraphicControl)
  129.   private
  130.     { Private declarations }
  131.     FAutoSize: Boolean;
  132.     FBitmapOptions: TfcBitmapOptions;
  133.     FDrawStyle: TfcImagerDrawStyle;
  134.     FEraseBackground: Boolean;
  135.     FPreProcess: Boolean;
  136.     FWorkBitmap: TfcBitmap;
  137.     FPicture: TPicture;
  138.     FChangeLinks: TList;
  139.     FRespectPalette: boolean;
  140.     FTransparent: boolean;  // Keep track in component instead of in picture
  141.                             // This helps databound case support transparency
  142.     FWinControl: TWinControl;
  143.     FFocusable: boolean;
  144.     FOnKeyPress: TKeyPressEvent;
  145.     FOnKeyDown, FOnKeyUp: TKeyEvent;
  146.     FTabStop: boolean;
  147.     procedure SetTabStop(value: boolean);
  148.     function GetRespectPalette: Boolean;
  149.     function GetSmoothStretching: Boolean;
  150.     function GetTransparent: Boolean;
  151.     function GetTransparentColor: TColor;
  152.     procedure SetAutoSize(Value: Boolean);
  153.     procedure SetDrawStyle(Value: TfcImagerDrawStyle);
  154.     procedure SetEraseBackground(Value: Boolean);
  155.     procedure SetPreProcess(Value: Boolean);
  156.     procedure SetPicture(Value: TPicture);
  157.     procedure SetRespectPalette(Value: Boolean);
  158.     procedure SetSmoothStretching(Value: Boolean);
  159.     procedure SetTransparent(Value: Boolean);
  160.     procedure SetTransparentColor(Value: TColor);
  161.     function GetDrawRect: TRect;
  162.     procedure NotifyChanges;
  163.     procedure SetFocusable(Value: boolean);
  164.   protected
  165.     Function CreateImagerWinControl: TWinControl; virtual;
  166.     procedure SetParent(Value: TWinControl); override;
  167.     procedure BitmapOptionsChange(Sender: TObject); virtual;
  168.     procedure BitmapChange(Sender: TObject); virtual;
  169.     procedure UpdateAutoSize; virtual;
  170.     procedure Loaded; override;
  171.     procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  172.     procedure Paint; override;
  173.     procedure WndProc(var Message: TMessage); override;
  174.     procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
  175.       X, Y: Integer); override;
  176.     procedure KeyUp(var Key: Word; Shift: TShiftState); virtual;
  177.     procedure KeyDown(var Key: Word; Shift: TShiftState); virtual;
  178.     procedure KeyPress(var Key: Char); virtual;
  179.     procedure DoEnter; virtual;
  180.     procedure DoExit; virtual;
  181.     property EraseBackground: Boolean read FEraseBackground write SetEraseBackground default True;
  182.   public
  183.     UpdatingAutoSize: Boolean;
  184.     InSetBounds: boolean;
  185.     Patch: Variant;
  186.     constructor Create(AOwner: TComponent); override;
  187.     destructor Destroy; override;
  188.     function PictureEmpty: Boolean; virtual;
  189.     procedure Invalidate; override;
  190.     procedure RegisterChanges(ChangeLink: TfcChangeLink); virtual;
  191.     procedure Resized; virtual;
  192.     procedure UpdateWorkBitmap; virtual;
  193.     procedure UnRegisterChanges(ChangeLink: TfcChangeLink); virtual;
  194.     procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
  195.     procedure CopyToClipboard; virtual;
  196.     procedure PasteFromClipboard; virtual;
  197.     procedure CutToClipboard; virtual;
  198.     property Align;
  199.     property AutoSize: Boolean read FAutoSize write SetAutoSize;
  200.     property BitmapOptions: TfcBitmapOptions read FBitmapOptions write FBitmapOptions;
  201.     property DrawStyle: TfcImagerDrawStyle read FDrawStyle write SetDrawStyle;
  202.     property PreProcess: Boolean read FPreProcess write SetPreProcess;
  203.     property Picture: TPicture read FPicture write SetPicture;
  204.     property RespectPalette: Boolean read GetRespectPalette write SetRespectPalette default True;
  205.     property SmoothStretching: Boolean read GetSmoothStretching write SetSmoothStretching;
  206.     property Transparent: Boolean read GetTransparent write SetTransparent;
  207.     property TransparentColor: TColor read GetTransparentColor write SetTransparentColor;
  208.     property WorkBitmap: TfcBitmap read FWorkBitmap;
  209.     property Focusable: boolean read FFocusable write SetFocusable;
  210.     property TabStop: boolean read FTabStop write SetTabStop;
  211.     property OnKeyPress : TKeyPressEvent read FOnKeyPress write FOnKeyPress;
  212.     property OnKeyDown : TKeyEvent read FOnKeyDown write FOnKeyDown;
  213.     property OnKeyUp : TKeyEvent read FOnKeyUp write FOnKeyUp;
  214.   end;
  215.   TfcImager = class(TfcCustomImager)
  216.   published
  217.     { Published declarations }
  218.     property Align;
  219.     property AutoSize;
  220.     property BitmapOptions;
  221.     property DrawStyle;
  222.     property Picture;
  223.     property PreProcess;
  224.     property RespectPalette;
  225.     property SmoothStretching;
  226.     property Transparent;
  227.     property TransparentColor;
  228.     property Visible;
  229.     property Focusable;
  230.     property Anchors;
  231.     property Constraints;
  232.     property OnEndDock;
  233.     property OnStartDock;
  234.     property OnClick;
  235.     property OnDblClick;
  236.     property OnDragDrop;
  237.     property OnDragOver;
  238.     property OnEndDrag;
  239.     property OnMouseDown;
  240.     property OnMouseMove;
  241.     property OnMouseUp;
  242.     property OnStartDrag;
  243.     property TabStop;
  244.     property OnKeyPress;
  245.     property OnKeyDown;
  246.     property OnKeyUp;
  247.   end;
  248.   TfcDBImager = class(TfcCustomImager)
  249.   private
  250.     FDataLink: TFieldDataLink;
  251.     FPictureLoaded: boolean;
  252.     FAutoDisplay: Boolean;
  253.     procedure CMGetDataLink(var Message: TMessage); message CM_GETDATALINK;
  254.     procedure DataChange(Sender: TObject);
  255.     function GetDataField: string;
  256.     function GetDataSource: TDataSource;
  257.     function GetField: TField;
  258.     function GetReadOnly: Boolean;
  259.     procedure SetReadOnly(Value: Boolean);
  260.     procedure UpdateData(Sender: TObject);
  261.     procedure SetDataField(const Value: string);
  262.     procedure SetDataSource(Value: TDataSource);
  263.     procedure SetAutoDisplay(Value: Boolean);
  264.   protected
  265.     procedure Notification(AComponent: TComponent;
  266.       Operation: TOperation); override;
  267.     procedure LoadPicture; virtual;
  268.     procedure KeyPress(var Key: Char); override;
  269.     procedure DoExit; override;
  270.     procedure Paint; override;
  271.     procedure BitmapChange(Sender: TObject); override;
  272.   public
  273.     constructor Create(AOwner: TComponent); override;
  274.     destructor Destroy; override;
  275.     procedure CopyToClipboard; override;
  276.     procedure PasteFromClipboard; override;
  277.     procedure CutToClipboard; override;
  278.   published
  279.     property DataField: string read GetDataField write SetDataField;
  280.     property DataSource: TDataSource read GetDataSource write SetDataSource;
  281.     property AutoDisplay: Boolean read FAutoDisplay write SetAutoDisplay default True;
  282.     property TabStop;
  283.     property Focusable;
  284.     property OnKeyPress;
  285.     property OnKeyDown;
  286.     property OnKeyUp;
  287.   end;
  288. implementation
  289. uses clipbrd;
  290. constructor TfcRotate.Create(BitmapOptions: TfcBitmapOptions);
  291. begin
  292.   inherited Create;
  293.   FCenterX := -1;
  294.   FCenterY := -1;
  295.   FBitmapOptions := BitmapOptions;
  296. end;
  297. procedure TfcRotate.SetCenterX(Value: Integer);
  298. begin
  299.   if FCenterX <> Value then
  300.   begin
  301.     FCenterX := Value;
  302.     FBitmapOptions.Changed;
  303.   end;
  304. end;
  305. procedure TfcRotate.SetCenterY(Value: Integer);
  306. begin
  307.   if FCenterY <> Value then
  308.   begin
  309.     FCenterY := Value;
  310.     FBitmapOptions.Changed;
  311.   end;
  312. end;
  313. procedure TfcRotate.SetAngle(Value: Integer);
  314. begin
  315.   if FAngle <> Value then
  316.   begin
  317.     FAngle := Value;
  318.     FBitmapOptions.Changed;
  319.   end;
  320. end;
  321. constructor TfcAlphaBlend.Create(BitmapOptions: TfcBitmapOptions);
  322. begin
  323.   inherited Create;
  324.   FBitmapOptions := BitmapOptions;
  325.   FBitmap := TfcBitmap.Create;
  326. //  FBitmap.OnChange := BitmapChanged;
  327. end;
  328. destructor TfcAlphaBlend.Destroy;
  329. begin
  330.   FBitmap.Free;
  331.   inherited;
  332. end;
  333. procedure TfcAlphaBlend.BitmapChanged(Sender: TObject);
  334. begin
  335.   if FChanging then Exit;
  336.   FChanging := True;
  337.   FBitmapOptions.Changed;
  338.   FChanging := False;
  339. end;
  340. function TfcAlphaBlend.GetTransparent: Boolean;
  341. begin
  342.   result := Bitmap.Transparent;
  343. end;
  344. procedure TfcAlphaBlend.SetTransparent(Value: Boolean);
  345. begin
  346.   Bitmap.Transparent := Value;
  347. end;
  348. procedure TfcAlphaBlend.SetAmount(Value: Byte);
  349. begin
  350.   if FAmount <> Value then
  351.   begin
  352.     FAmount := Value;
  353.     FBitmapOptions.Changed;
  354.   end;
  355. end;
  356. procedure TfcAlphaBlend.SetBitmap(Value: TfcBitmap);
  357. begin
  358.   FBitmap.Assign(Value);
  359. end;
  360. constructor TfcWave.Create(BitmapOptions: TfcBitmapOptions);
  361. begin
  362.   inherited Create;
  363.   FBitmapOptions := BitmapOptions;
  364. end;
  365. procedure TfcWave.SetXDiv(Value: Integer);
  366. begin
  367.   if FXDiv <> Value then
  368.   begin
  369.     FXDiv := Value;
  370.     FBitmapOptions.Changed;
  371.   end;
  372. end;
  373. procedure TfcWave.SetYDiv(Value: Integer);
  374. begin
  375.   if FYDiv <> Value then
  376.   begin
  377.     FYDiv := Value;
  378.     FBitmapOptions.Changed;
  379.   end;
  380. end;
  381. procedure TfcWave.SetRatio(Value: Integer);
  382. begin
  383.   if FRatio <> Value then
  384.   begin
  385.     FRatio := Value;
  386.     FBitmapOptions.Changed;
  387.   end;
  388. end;
  389. procedure TfcWave.SetWrap(Value: Boolean);
  390. begin
  391.   if FWrap <> Value then
  392.   begin
  393.     FWrap := Value;
  394.     FBitmapOptions.Changed;
  395.   end;
  396. end;
  397. constructor TfcBitmapOptions.Create(AComponent: TComponent);
  398. begin
  399.   inherited Create;
  400.   FComponent := AComponent;
  401.   FAlphaBlend := TfcAlphaBlend.Create(self);
  402.   FRotation := TfcRotate.Create(self);
  403.   FColor := clNone;
  404.   FTintColor := clNone;
  405.   FSaturation := -1;
  406.   FWave := TfcWave.Create(self);
  407. end;
  408. destructor TfcBitmapOptions.Destroy;
  409. begin
  410.   FAlphaBlend.Free;
  411.   FRotation.Free;
  412.   FWave.Free;
  413.   inherited;
  414. end;
  415. procedure TfcBitmapOptions.Changed;
  416. var TmpBitmap: TfcBitmap;
  417. begin
  418.   if (csLoading in FComponent.ComponentState) or DestBitmap.Empty or ((OrigPicture.Graphic = nil) or OrigPicture.Graphic.Empty) or (FUpdateLock > 0) then Exit;
  419.   if (DestBitmap.Width = OrigPicture.Width) and (DestBitmap.Height = OrigPicture.Height) then
  420.     DestBitmap.Assign(OrigPicture.Graphic)
  421.   else begin
  422.     if Tile then fcTileDraw(OrigPicture.Graphic, DestBitmap.Canvas, Rect(0, 0, DestBitmap.Width, DestBitmap.Height))
  423.     else begin
  424.       TmpBitmap := TfcBitmap.Create;
  425.       TmpBitmap.Assign(OrigPicture.Graphic);
  426.       TmpBitmap.SmoothStretching := TfcCustomImager(FComponent).SmoothStretching;
  427.       try
  428.         DestBitmap.Canvas.StretchDraw(Rect(0, 0, DestBitmap.Width, DestBitmap.Height), TmpBitmap);
  429.       finally
  430.         TmpBitmap.Free;
  431.       end;
  432.     end;
  433.   end;
  434.   if FGrayScale then DestBitmap.GrayScale;
  435.   if FLightness <> 0 then DestBitmap.Brightness(FLightness);
  436.   if (FAlphaBlend.Amount <> 0) and not FAlphaBlend.Bitmap.Empty then
  437.     DestBitmap.AlphaBlend(FAlphaBlend.Bitmap, FAlphaBlend.Amount, True);
  438.   if FColor <> clNone then with fcGetColor(ColorToRGB(FColor)) do
  439.     DestBitmap.Colorize(r, g, b);
  440.   if FTintColor <> clNone then with fcGetColor(ColorToRGB(FTintColor)) do
  441.     DestBitmap.ColorTint(r div 2, g div 2, b div 2);
  442.   if FSponge <> 0 then DestBitmap.Sponge(FSponge);
  443.   if FSaturation <> -1 then DestBitmap.Saturation(FSaturation);
  444.   if FGaussianBlur <> 0 then DestBitmap.GaussianBlur(FGaussianBlur);
  445.   if FEmbossed then DestBitmap.Emboss;
  446.   if FInverted then DestBitmap.Invert;
  447.   if FContrast <> 0 then DestBitmap.Contrast(FContrast);
  448.   if FSharpen <> 0 then DestBitmap.Sharpen(FSharpen);
  449.   if FHorizontallyFlipped then DestBitmap.Flip(True);
  450.   if FVerticallyFlipped then DestBitmap.Flip(False);
  451.   with FWave do if (Ratio <> 0) and (XDiv <> 0) and (YDiv <> 0) then
  452.     DestBitmap.Wave(XDiv, YDiv, Ratio, Wrap);
  453.   if FRotation.Angle <> 0 then with Rotation do
  454.     DestBitmap.Rotate(Point(CenterX, CenterY), Angle);
  455.   if Assigned(FOnChange) then FOnChange(self);
  456. end;
  457. procedure TfcBitmapOptions.BeginUpdate;
  458. begin
  459.   inc(FUpdateLock);
  460. end;
  461. procedure TfcBitmapOptions.EndUpdate;
  462. begin
  463.   if FUpdateLock > 0 then dec(FUpdateLock);
  464.   Changed;
  465. end;
  466. procedure TfcBitmapOptions.SetColor(Value: TColor);
  467. begin
  468.   if FColor <> Value then
  469.   begin
  470.     FColor := Value;
  471.     Changed;
  472.   end;
  473. end;
  474. procedure TfcBitmapOptions.SetTintColor(Value: TColor);
  475. begin
  476.   if FTintColor <> Value then
  477.   begin
  478.     FTintColor := Value;
  479.     Changed;
  480.   end;
  481. end;
  482. procedure TfcBitmapOptions.SetIntegralProperty(Index: Integer; Value: Integer);
  483.   procedure DoCheck(StorageVar: PInteger);
  484.   begin
  485.     if StorageVar^ <> Value then
  486.     begin
  487.       StorageVar^ := Value;
  488.       Changed;
  489.     end;
  490.   end;
  491. begin
  492.   case Index of
  493.     0: DoCheck(@FLightness);
  494.     1: DoCheck(@FSaturation);
  495.     2: DoCheck(@FSponge);
  496.     3: DoCheck(@FGaussianBlur);
  497.     4: DoCheck(@FContrast);
  498.     5: DoCheck(@FSharpen);
  499.   end;
  500. end;
  501. type PBoolean = ^Boolean;
  502. procedure TfcBitmapOptions.SetBooleanProperty(Index: Integer; Value: Boolean);
  503.   procedure DoCheck(StorageVar: PBoolean);
  504.   begin
  505.     if StorageVar^ <> Value then
  506.     begin
  507.       StorageVar^ := Value;
  508.       Changed;
  509.     end;
  510.   end;
  511. begin
  512.   case Index of
  513.     0: DoCheck(@FEmbossed);
  514.     1: DoCheck(@FInverted);
  515.     2: DoCheck(@FGrayScale);
  516.     3: DoCheck(@FHorizontallyFlipped);
  517.     4: DoCheck(@FVerticallyFlipped);
  518.   end;
  519. end;
  520. constructor TfcCustomImager.Create(AOwner: TComponent);
  521. begin
  522.   inherited Create(AOwner);
  523. //  FBitmap := TfcBitmap.Create;
  524. //  FBitmap.OnChange := BitmapChange;
  525.   FEraseBackground:= True;
  526.   FPicture := TPicture.Create;
  527.   FPicture.OnChange := BitmapChange;
  528.   FWorkBitmap := TfcBitmap.Create;
  529.   FRespectPalette:= True;
  530.   FWorkBitmap.RespectPalette := True;
  531.   FWorkBitmap.UseHalftonePalette:= True;
  532.   FBitmapOptions := TfcBitmapOptions.Create(self);
  533.   FBitmapOptions.OnChange := BitmapOptionsChange;
  534.   FBitmapOptions.DestBitmap := FWorkBitmap;
  535.   FBitmapOptions.OrigPicture := FPicture;
  536.   ControlStyle := ControlStyle + [csOpaque];
  537.   FPreProcess := True;
  538.   FChangeLinks := TList.Create;
  539.   Width := 100;
  540.   Height := 100;
  541. end;
  542. destructor TfcCustomImager.Destroy;
  543. begin
  544.   FPicture.Free;
  545.   FPicture:= nil;
  546.   FBitmapOptions.Free;
  547.   FWorkBitmap.Free;
  548.   FChangeLinks.Free;
  549.   inherited Destroy;
  550. end;
  551. function TfcCustomImager.GetDrawRect: TRect;
  552. begin
  553.   case DrawStyle of
  554.     dsNormal: result := Rect(0, 0, Picture.Width, Picture.Height);
  555.     dsCenter: with Point(Width div 2 - FWorkBitmap.Width div 2,
  556.         Height div 2 - FWorkBitmap.Height div 2) do
  557.       result := Rect(x, y, Width - x, Height - y);
  558.     dsTile, dsStretch: result := Rect(0, 0, Width, Height);
  559.     dsProportional: result := fcProportionalRect(Rect(0, 0, Width, Height), FWorkBitmap.Width, FWorkBitmap.Height);
  560.   end
  561. end;
  562. procedure TfcCustomImager.SetDrawStyle(Value: TfcImagerDrawStyle);
  563. begin
  564.   if FDrawStyle <> Value then
  565.   begin
  566.     FDrawStyle := Value;
  567.     BitmapOptions.Tile := FDrawStyle = dsTile;
  568.     Resized;
  569.     Invalidate;
  570.   end;
  571. end;
  572. procedure TfcCustomImager.SetEraseBackground(Value: Boolean);
  573. var r: TRect;
  574. begin
  575.   if FEraseBackground <> Value then
  576.   begin
  577.     FEraseBackground := Value;
  578.     if Parent <> nil then begin
  579.        r:= BoundsRect;
  580.        InvalidateRect(Parent.Handle, @r, True);
  581. //       Parent.Invalidate;
  582.     end
  583.   end;
  584. end;
  585. procedure TfcCustomImager.SetParent(Value: TWinControl);
  586. begin
  587.   inherited;
  588. end;
  589. procedure TfcCustomImager.BitmapOptionsChange(Sender: TObject);
  590. var r: TRect;
  591. begin
  592.   if Parent <> nil then
  593.   begin
  594.     r := BoundsRect;
  595.     InvalidateRect(Parent.Handle, @r, Transparent);
  596.   end;
  597.   NotifyChanges;
  598. end;
  599. procedure TfcCustomImager.NotifyChanges;
  600. var i: Integer;
  601. begin
  602.   for i := 0 to FChangeLinks.Count - 1 do with TfcChangeLink(FChangeLinks[i]) do
  603.   begin
  604.     Sender := WorkBitmap;
  605.     Change;
  606.   end;
  607. end;
  608. procedure TfcCustomImager.BitmapChange(Sender: TObject);
  609. var r: TRect;
  610. begin
  611.   Resized;
  612.   r := BoundsRect;
  613.   if Parent<>nil then { 8/2/99 }
  614.      InvalidateRect(Parent.Handle, @r, True);
  615.   NotifyChanges;
  616. end;
  617. procedure TfcCustomImager.Resized;
  618. begin
  619. //  if (not InSetBounds) and EraseBackground and not Transparent and not PictureEmpty and not WorkBitmap.Empty and (Parent <> nil) then
  620. //    SendMessage(Parent.Handle, WM_ERASEBKGND, Canvas.Handle, 0);
  621.   if csLoading in ComponentState then Exit;
  622.   if not PreProcess and not (DrawStyle in [dsNormal, dsCenter]) then
  623.     FWorkBitmap.SetSize(Width, Height)
  624.   else begin
  625.      if BitmapOptions.Rotation.Angle <> 0 then { 10/5/99 }
  626.         FWorkBitmap.SetSize(fcMax(Picture.Width, Picture.Height), fcMax(Picture.Height, Picture.Width))
  627.      else
  628.         FWorkBitmap.SetSize(Picture.Width, Picture.Height)
  629.   end;
  630.   UpdateWorkBitmap;
  631.   UpdateAutoSize;
  632. end;
  633. procedure TfcCustomImager.UpdateAutoSize;
  634. begin
  635.   if FAutoSize and not PictureEmpty and not (csLoading in ComponentState) and (Align = alNone) then
  636.   begin
  637.     UpdatingAutosize := True;
  638. {    if DrawStyle = dsProportional then
  639.     begin
  640.       with fcProportionalRect(Rect(0, 0, Width, Height), Bitmap.Width, Bitmap.Height) do
  641.         if (Width <> Right - Left) or (Height <> Bottom - Top) then
  642.           SetBounds(self.Left, self.Top, self.Left + (Right - Left), self.Top + (Bottom - Top))
  643.     end else }if (Width <> Picture.Width) or (Height <> Picture.Height) then
  644.       SetBounds(Left, Top, Picture.Width, Picture.Height);
  645.     UpdatingAutosize := False;
  646.   end;
  647. end;
  648. procedure TfcCustomImager.UpdateWorkBitmap;
  649. begin
  650.   if not PictureEmpty and not (csLoading in ComponentState) then
  651.   begin
  652.     if FWorkBitmap.Empty then Resized;
  653.     BitmapOptions.Changed;
  654.   end;
  655. end;
  656. procedure TfcCustomImager.SetPicture(Value: TPicture);
  657. begin
  658.   FPicture.Assign(Value);
  659. end;
  660. procedure TfcCustomImager.SetPreProcess(Value: Boolean);
  661. begin
  662.   if FPreProcess <> Value then
  663.   begin
  664.     FPreProcess := Value;
  665.     Resized;
  666.   end;
  667. end;
  668. procedure TfcCustomImager.SetTransparent(Value: Boolean);
  669. begin
  670.   FTransparent:=Value;
  671.   if not PictureEmpty then Picture.Graphic.Transparent := Value;
  672.   Invalidate;
  673. end;
  674. procedure TfcCustomImager.SetTransparentColor(Value: TColor);
  675. begin
  676.   WorkBitmap.TransparentColor := Value;
  677.   UpdateWorkBitmap;
  678.   Invalidate;
  679.   ColorToString(clNone);
  680. end;
  681. function TfcCustomImager.GetRespectPalette;
  682. begin
  683. //  result := WorkBitmap.RespectPalette;
  684.   result:= FRespectPalette;
  685. end;
  686. function TfcCustomImager.GetSmoothStretching: Boolean;
  687. begin
  688.   result := WorkBitmap.SmoothStretching;
  689. end;
  690. function TfcCustomImager.GetTransparent: Boolean;
  691. begin
  692.   result:= FTransparent;
  693. //  result := False;
  694. //  if not PictureEmpty then result := Picture.Graphic.Transparent;
  695. end;
  696. function TfcCustomImager.GetTransparentColor: TColor;
  697. begin
  698.   result := WorkBitmap.TransparentColor;
  699. end;
  700. procedure TfcCustomImager.SetAutoSize(Value: Boolean);
  701. begin
  702.   if FAutoSize <> Value then
  703.   begin
  704.     FAutoSize := Value;
  705.     UpdateAutoSize;
  706.   end;
  707. end;
  708. {
  709. procedure TfcCustomImager.SetBitmap(Value: TfcBitmap);
  710. begin
  711.   FBitmap.Assign(Value);
  712. end;
  713. }
  714. function TfcCustomImager.PictureEmpty: Boolean;
  715. begin
  716.   result := (FPicture=Nil) or (FPicture.Graphic = nil) or (FPicture.Graphic.Empty);
  717. end;
  718. procedure TfcCustomImager.Invalidate;
  719. var r: TRect;
  720. begin
  721.   if InSetBounds then exit;
  722.   r := BoundsRect;
  723.   if Parent <> nil then InvalidateRect(Parent.Handle, @r, True);
  724. end;
  725. procedure TfcCustomImager.RegisterChanges(ChangeLink: TfcChangeLink);
  726. begin
  727.   FChangeLinks.Add(ChangeLink);
  728. end;
  729. procedure TfcCustomImager.UnRegisterChanges(ChangeLink: TfcChangeLink);
  730. begin
  731.   FChangeLinks.Remove(ChangeLink);
  732. end;
  733. procedure TfcCustomImager.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
  734. var SizeChanged: Boolean;
  735.     OldControlStyle: TControlStyle;
  736. begin
  737.   SizeChanged := (AWidth <> Width) or (AHeight <> Height);
  738.   if SizeChanged and not UpdatingAutosize then begin
  739.      InSetBounds:= True; { RSW - Don't erase background when resizing }
  740.      { 5/7/99 - Setting parent to opaque so it doesn't clear background.
  741.        This allows imager to not flicker when resizing imager }
  742.      if Parent<>nil then
  743.      begin
  744.         OldControlStyle:= Parent.ControlStyle;
  745.         Parent.ControlStyle:= Parent.ControlStyle + [csOpaque];
  746.      end;
  747.      inherited;
  748.      if Parent<>nil then Parent.ControlStyle:= OldControlStyle;
  749.      if Visible then Update;
  750.      Resized;
  751.      InSetBounds:= False;
  752.   end
  753.   else inherited;
  754. end;
  755. procedure TfcCustomImager.SetRespectPalette(Value: Boolean);
  756. begin
  757.   FRespectPalette:= Value;
  758.   WorkBitmap.RespectPalette := Value;
  759.   if value then
  760.      if (BitmapOptions.Color<>clNone) or (BitmapOptions.TintColor<>clNone) then
  761.         WorkBitmap.RespectPalette:= False;
  762.   Invalidate;
  763. end;
  764. procedure TfcCustomImager.SetSmoothStretching(Value: Boolean);
  765. begin
  766.   WorkBitmap.SmoothStretching := Value;
  767.   UpdateWorkBitmap;
  768.   Invalidate;
  769. end;
  770. procedure TfcCustomImager.Paint;
  771. begin
  772.   inherited;
  773.   if csDestroying in ComponentState then exit;
  774.   if FWorkBitmap.Empty and not PictureEmpty then
  775.   begin
  776.     UpdateWorkBitmap;
  777.     Exit;
  778.   end;
  779.   if (csDesigning in ComponentState) and FWorkBitmap.Empty then with Canvas do
  780.   begin
  781.     Pen.Style := psDash;
  782.     Pen.Color := clBlack;
  783.     Brush.Color := clWhite;
  784.     Rectangle(0, 0, Width, Height);
  785.     Exit;
  786.   end;
  787.   if FWorkBitmap.Empty then Exit;
  788.   try
  789.     with GetDrawRect do
  790.       if PreProcess then
  791.         case DrawStyle of
  792.           dsNormal: Canvas.Draw(Left, Top, FWorkBitmap);
  793.           dsCenter: Canvas.Draw(Left, Top, FWorkBitmap);
  794.           dsTile: FWorkBitmap.TileDraw(Canvas, Rect(Left, Top, Right, Bottom));
  795.           dsStretch: Canvas.StretchDraw(Rect(Left, Top, Right, Bottom), FWorkBitmap);
  796.           dsProportional: Canvas.StretchDraw(Rect(Left, Top, Right, Bottom), FWorkBitmap);
  797.         end
  798.       else Canvas.Draw(Left, Top, FWorkBitmap);
  799.   finally
  800. {    if Transparent then fcTransparentDraw(Canvas, Rect(0, 0, Width, Height), DrawBitmap, DrawBitmap.Canvas.Pixels[0, 0])
  801.     else Canvas.Draw(0, 0, DrawBitmap);}
  802.   end;
  803. end;
  804. (*procedure TfcCustomImager.ParentMessages(var Message: TMessage; var ProcessMessage: Boolean);
  805. var s: TfcCustomImager;
  806. begin
  807.   if csDestroying in ComponentState then exit;
  808.   if not PictureEmpty and ((not EraseBackground) or InSetBounds) and
  809. {     not (csDesigning in ComponentState) and}  { 4/27/99 - Comment out - RSW }
  810.      (Message.Msg = WM_ERASEBKGND) then//and not (DrawStyle in [dsNormal, dsProportional]) {and (Align = alClient) }then { 3/19/99 - Comment out alClient to prevent flicker of form}
  811.   begin
  812.     with TWMEraseBkGnd(Message) do
  813.     begin
  814.       Result := 1;
  815.       ProcessMessage := False;
  816.     end;
  817.   end
  818. end;
  819. *)
  820. procedure TfcCustomImager.Loaded;
  821. begin
  822.   inherited;
  823.   UpdateAutoSize;
  824.   FBitmapOptions.Changed;
  825. end;
  826. procedure TfcCustomImager.Notification(AComponent: TComponent; Operation: TOperation);
  827. begin
  828.   inherited Notification(AComponent, Operation);
  829. end;
  830. procedure TfcCustomImager.CutToClipboard;
  831. begin
  832.   if Picture.Graphic <> nil then
  833.   begin
  834.     CopyToClipboard;
  835.     Picture.Graphic := nil;
  836.   end;
  837. end;
  838. procedure TfcCustomImager.CopyToClipboard;
  839. var tempBitmap: TBitmap;
  840. begin
  841.    tempBitmap:= TBitmap.create;
  842.    WorkBitmap.SaveToBitmap(tempBitmap);
  843.    Clipboard.Assign(tempBitmap);
  844.    tempBitmap.Free;
  845. end;
  846. procedure TfcCustomImager.WndProc(var Message: TMessage);
  847. begin
  848.   inherited;
  849. end;
  850. type
  851.  TfcImagerWinControl = class(TWinControl)
  852.  private
  853.     Imager: TfcDBImager;
  854.  protected
  855.     procedure KeyUp(var Key: Word; Shift: TShiftState); override;
  856.     procedure KeyDown(var Key: Word; Shift: TShiftState); override;
  857.     procedure KeyPress(var Key: Char); override;
  858.  public
  859.     constructor Create(AOwner: TComponent); override;
  860.     procedure CMEnter(var Message: TCMEnter); message CM_ENTER;
  861.     procedure CMExit(var Message: TCMExit); message CM_EXIT;
  862.  end;
  863. constructor TfcImagerWinControl.Create(AOwner: TComponent);
  864. begin
  865.    inherited;
  866.    ControlStyle := ControlStyle + [csReplicatable];
  867.    Imager:= AOwner as TfcDBImager;
  868. end;
  869. procedure TfcImagerWinControl.CMEnter(var Message: TCMEnter);
  870. begin
  871.   Imager.DoEnter;
  872. end;
  873. procedure TfcImagerWinControl.CMExit(var Message: TCMExit);
  874. begin
  875.   Imager.DoExit;
  876. end;
  877. procedure TfcImagerWinControl.KeyDown(var Key: Word; Shift: TShiftState);
  878. begin
  879.    inherited KeyDown(Key, Shift);
  880.    Imager.KeyDown(Key, Shift);
  881. end;
  882. procedure TfcImagerWinControl.KeyUp(var Key: Word; Shift: TShiftState);
  883. begin
  884.    inherited KeyUp(Key, Shift);
  885.    Imager.KeyUp(Key, Shift);
  886. end;
  887. procedure TfcImagerWinControl.KeyPress(var Key: Char);
  888. begin
  889.    inherited KeyPress(Key);
  890.    Imager.KeyPress(Key);
  891. end;
  892. constructor TfcDBImager.Create(AOwner: TComponent);
  893. begin
  894.    inherited;
  895.    ControlStyle := ControlStyle + [csReplicatable];
  896.    FAutoDisplay:=True;
  897.    FDataLink := TFieldDataLink.Create;
  898.    FDataLink.Control := Self;
  899.    FDataLink.OnDataChange := DataChange;
  900.    FDataLink.OnUpdateData := UpdateData;
  901. end;
  902. destructor TfcDBImager.Destroy;
  903. begin
  904.    FDataLink.Free;
  905.    FDataLink:=nil;
  906.    inherited Destroy;
  907. end;
  908. procedure TfcDBImager.Notification(AComponent: TComponent;
  909.   Operation: TOperation);
  910. begin
  911.   inherited Notification(AComponent, Operation);
  912.   if (Operation = opRemove) and (FDataLink <> nil) and
  913.     (AComponent = DataSource) then DataSource := nil;
  914. end;
  915. procedure TfcDBImager.LoadPicture;
  916. begin
  917.   if not FPictureLoaded and (not Assigned(FDataLink.Field) or
  918.     FDataLink.Field.IsBlob) then
  919.   begin
  920.     Picture.Assign(FDataLink.Field);
  921.     Picture.Graphic.Transparent:=Transparent;
  922.   end;
  923. end;
  924. procedure TfcDBImager.DataChange(Sender: TObject);
  925. begin
  926.   Picture.Graphic := nil;
  927.   FPictureLoaded := False;
  928.   if FAutoDisplay then LoadPicture;
  929. end;
  930. procedure TfcDBImager.UpdateData(Sender: TObject);
  931. begin
  932.   if Picture.Graphic is TBitmap then
  933.      FDataLink.Field.Assign(Picture.Graphic) else
  934.      FDataLink.Field.Clear;
  935. end;
  936. function TfcDBImager.GetDataSource: TDataSource;
  937. begin
  938.   Result := FDataLink.DataSource;
  939. end;
  940. procedure TfcDBImager.SetDataSource(Value: TDataSource);
  941. begin
  942.   if not (FDataLink.DataSourceFixed and (csLoading in ComponentState)) then
  943.     FDataLink.DataSource := Value;
  944.   if Value <> nil then Value.FreeNotification(Self);
  945. end;
  946. function TfcDBImager.GetDataField: string;
  947. begin
  948.   Result := FDataLink.FieldName;
  949. end;
  950. procedure TfcDBImager.SetDataField(const Value: string);
  951. begin
  952.   FDataLink.FieldName := Value;
  953. end;
  954. function TfcDBImager.GetReadOnly: Boolean;
  955. begin
  956.   Result := FDataLink.ReadOnly;
  957. end;
  958. procedure TfcDBImager.SetReadOnly(Value: Boolean);
  959. begin
  960.   FDataLink.ReadOnly := Value;
  961. end;
  962. function TfcDBImager.GetField: TField;
  963. begin
  964.   Result := FDataLink.Field;
  965. end;
  966. procedure TfcDBImager.CMGetDataLink(var Message: TMessage);
  967. begin
  968.   Message.Result := Integer(FDataLink);
  969. end;
  970. procedure TfcDBImager.CutToClipboard;
  971. begin
  972.   if Picture.Graphic <> nil then
  973.     if FDataLink.Edit then
  974.     begin
  975.       CopyToClipboard;
  976.       Picture.Graphic := nil;
  977.     end;
  978. end;
  979. procedure TfcDBImager.CopyToClipboard;
  980. begin
  981.   if Picture.Graphic <> nil then Clipboard.Assign(Picture);
  982. end;
  983. procedure TfcCustomImager.PasteFromClipboard;
  984. begin
  985.   if Clipboard.HasFormat(CF_BITMAP) then
  986.   begin
  987.     Picture.Bitmap.Assign(Clipboard);
  988.     Picture.Graphic.Transparent:=Transparent;
  989.   end
  990. end;
  991. procedure TfcDBImager.PasteFromClipboard;
  992. begin
  993.   if Clipboard.HasFormat(CF_BITMAP) and FDataLink.Edit then
  994.   begin
  995.     Picture.Bitmap.Assign(Clipboard);
  996.     Picture.Graphic.Transparent:=Transparent;
  997.   end
  998. end;
  999. procedure TfcCustomImager.DoEnter;
  1000. begin
  1001.   Invalidate; { Draw the focus marker }
  1002. end;
  1003. procedure TfcCustomImager.DoExit;
  1004. begin
  1005.    Invalidate; { Erase the focus marker }
  1006. end;
  1007. procedure TfcDBImager.DoExit;
  1008. begin
  1009.     try
  1010.       FDataLink.UpdateRecord;
  1011.     except
  1012.       FWinControl.SetFocus;
  1013.       raise;
  1014.     end;
  1015.     Invalidate; { Erase the focus marker }
  1016.     inherited;
  1017. end;
  1018. procedure TfcCustomImager.KeyUp(var Key: Word; Shift: TShiftState);
  1019. begin
  1020.   if Assigned(FOnKeyUp) then FOnKeyUp(Self, Key, Shift);
  1021. end;
  1022. procedure TfcCustomImager.KeyDown(var Key: Word; Shift: TShiftState);
  1023. begin
  1024.   if Assigned(FOnKeyDown) then FOnKeyDown(Self, Key, Shift);
  1025.   case Key of
  1026.     VK_INSERT:
  1027.       if ssShift in Shift then PasteFromClipBoard else
  1028.         if ssCtrl in Shift then CopyToClipBoard;
  1029.     VK_DELETE:
  1030.       if ssShift in Shift then CutToClipBoard;
  1031.   end;
  1032. end;
  1033. procedure TfcCustomImager.KeyPress(var Key: Char);
  1034. begin
  1035.   if Assigned(FOnKeyPress) then FOnKeyPress(self, Key);
  1036.   case Key of
  1037.     ^X: CutToClipBoard;
  1038.     ^C: CopyToClipBoard;
  1039.     ^V: PasteFromClipBoard;
  1040.   end;
  1041. end;
  1042. procedure TfcDBImager.KeyPress(var Key: Char);
  1043. begin
  1044.   inherited KeyPress(Key);
  1045.   case Key of
  1046.     #13: LoadPicture;
  1047.     #27: FDataLink.Reset;
  1048.   end;
  1049. end;
  1050. procedure TfcCustomImager.MouseDown(Button: TMouseButton; Shift: TShiftState;
  1051.       X, Y: Integer);
  1052. begin
  1053.    inherited;
  1054.    if FWinControl<>nil then FWinControl.SetFocus;
  1055. end;
  1056. Function TfcCustomImager.CreateImagerWinControl: TWinControl;
  1057. var WinControl: TWinControl;
  1058. begin
  1059.    WinControl:= TfcImagerWinControl.create(self);
  1060.    with WinControl do begin
  1061.       visible:=true;
  1062.       Left:=0;
  1063.       Top:=0;
  1064.       Height:=0;
  1065.       Width:=0;
  1066.       Parent:=self.Parent;
  1067.       TabStop:=self.TabStop;
  1068.    end;
  1069.    result:= WinControl;
  1070. end;
  1071. procedure TfcCustomImager.SetFocusable(Value: boolean);
  1072. begin
  1073.    if Value<>FFocusable then begin
  1074.       FFocusable:=Value;
  1075.       if (Value or Focusable) then begin
  1076.           if (FWinControl=nil) then
  1077.              FWinControl:= CreateImagerWinControl;
  1078.           FWinControl.TabStop:=TabStop;
  1079.       end
  1080.       else begin
  1081.          FWinControl.Free;
  1082.          FWinControl:=nil;
  1083.       end
  1084.    end
  1085. end;
  1086. procedure TfcCustomImager.SetTabStop(Value: boolean);
  1087. begin
  1088.    if Value<>FTabStop then begin
  1089.       FTabStop:=Value;
  1090.       if (Value or Focusable)then begin
  1091.           if (FWinControl=nil) then
  1092.              FWinControl:= CreateImagerWinControl;
  1093.           FWinControl.TabStop:=Value;
  1094.       end
  1095.       else begin
  1096.          FWinControl.Free;
  1097.          FWinControl:=nil;
  1098.       end
  1099.    end
  1100. end;
  1101. procedure TfcDBImager.Paint;
  1102. var Form: TCustomForm;
  1103.     tempImager: TfcImager;
  1104. begin
  1105.    if csDestroying in ComponentState then exit;
  1106.    if (csPaintCopy in ControlState) and
  1107.       Assigned(FDataLink.Field) and FDataLink.Field.IsBlob then
  1108.    begin
  1109.       Canvas.Brush.Color:=TEdit(parent).color;
  1110.       Canvas.FillRect(ClientRect);
  1111. //    Canvas.Brush.Style := bsClear;
  1112.       tempImager := TfcImager.create(self);
  1113.       tempImager.height:= height;
  1114.       tempImager.width:=width;
  1115.       tempImager.picture.assign(FDataLink.Field);
  1116.       tempImager.transparent:=Transparent;
  1117.       SetBkMode(Canvas.Handle, windows.TRANSPARENT);
  1118.       tempImager.Perform(WM_PAINT, Canvas.Handle, 0);
  1119.       SetBkMode(Canvas.Handle, OPAQUE);
  1120.       tempImager.Free;
  1121.       exit;
  1122. //      if Picture.Graphic is TBitmap then
  1123. //         DrawPict.Bitmap.IgnorePalette := QuickDraw;
  1124.    end
  1125.    else begin
  1126.    end;
  1127.       Canvas.Brush.Color:=clWhite;
  1128.       Canvas.FillRect(ClientRect);
  1129.    inherited;
  1130.    Form := GetParentForm(Self);
  1131.    if (Form <> nil) and (FWinControl<>nil) and
  1132.     (Form.ActiveControl = FWinControl) and
  1133.      not (csDesigning in ComponentState) and
  1134.      not (csPaintCopy in ControlState) then
  1135.    begin
  1136.      Canvas.Brush.Color := clWindowFrame;
  1137.      Canvas.FrameRect(ClientRect);
  1138.    end;
  1139. end;
  1140. procedure TfcDBImager.SetAutoDisplay(Value: Boolean);
  1141. begin
  1142.   if FAutoDisplay <> Value then
  1143.   begin
  1144.     FAutoDisplay := Value;
  1145.     if Value then LoadPicture;
  1146.   end;
  1147. end;
  1148. procedure TfcDBImager.BitmapChange(Sender: TObject);
  1149. begin
  1150.   inherited;
  1151.   if FPictureLoaded then FDataLink.Modified;
  1152.   FPictureLoaded := True;
  1153. end;
  1154. end.