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

Delphi控件源码

开发平台:

Delphi

  1. unit fcLabel;
  2. {
  3. //
  4. // Components : TfcCustomLabel, TfcLabel
  5. //
  6. // Copyright (c) 1999 by Woll2Woll Software
  7. //
  8. }
  9. interface
  10. {$i fcIfDef.pas}
  11. {$Warnings Off}
  12. uses
  13.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  14.   StdCtrls, Math, fcCommon, fcText, db, dbctrls,
  15.   {$ifdef fcDelphi6Up}
  16.   VDBConsts
  17.   {$else}
  18.   dbconsts
  19.   {$endif};
  20. type
  21.   TfcCustomLabel = class(TGraphicControl)
  22.   private
  23.     // Property Storage Variables
  24.     FAutoSize: Boolean;
  25.     FFocusControl: TWinControl;
  26.     FTextOptions: TfcCaptionText;
  27.     FOnMouseEnter: TNotifyEvent;
  28.     FOnMouseLeave: TNotifyEvent;
  29.     function GetTransparent: Boolean;
  30.     procedure SetFocusControl(Value: TWinControl);
  31.     procedure SetTransparent(Value: Boolean);
  32.     // Message Handlers
  33.     procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;
  34.     procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED;
  35.     procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR;
  36.     procedure CMMouseEnter(var Message: TWMMouse); message CM_MOUSEENTER;
  37.     procedure CMMouseLeave(var Message: TWMMouse); message CM_MOUSELEAVE;
  38.   protected
  39.     // Virtual Property Access Methods
  40.     procedure SetAutoSize(Value: Boolean); virtual;
  41.     function GetLabelText: string; virtual;
  42.     // Virtual Methods
  43.     procedure MouseEnter; virtual;
  44.     procedure MouseLeave; virtual;
  45.     // Overriden Methods
  46.     procedure Loaded; override;
  47.     procedure Notification(AComponent: TComponent;
  48.       Operation: TOperation); override;
  49.     procedure Paint; override;
  50.     procedure WndProc(var Message: TMessage); override;
  51.     property Canvas;
  52.   public
  53.     Patch: Variant;
  54.     constructor Create(AOwner: TComponent); override;
  55.     destructor Destroy; override;
  56.     function GetTextEnabled: Boolean; virtual;
  57.     procedure AdjustBounds; virtual;
  58.     property AutoSize: Boolean read FAutoSize write SetAutoSize default True;
  59.     property Caption;
  60.     property FocusControl: TWinControl read FFocusControl write SetFocusControl;
  61.     property TextOptions: TfcCaptionText read FTextOptions write FTextOptions;
  62.     property Transparent: Boolean read GetTransparent write SetTransparent default False;
  63.     property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
  64.     property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
  65.   end;
  66.   TfcDBCustomLabel = class(TfcCustomLabel)
  67.   private
  68.     FDataLink: TFieldDataLink;
  69.     procedure DataChange(Sender: TObject);
  70.     function GetDataField: string;
  71.     function GetDataSource: TDataSource;
  72.     function GetField: TField;
  73.     function GetFieldText: string;
  74.     procedure SetDataField(const Value: string);
  75.     procedure SetDataSource(Value: TDataSource);
  76.     procedure CMGetDataLink(var Message: TMessage); message CM_GETDATALINK;
  77.   protected
  78.     function GetLabelText: string; override;
  79.     procedure Loaded; override;
  80.     procedure Notification(AComponent: TComponent;
  81.       Operation: TOperation); override;
  82.     procedure SetAutoSize(Value: Boolean); override;
  83.   public
  84.     constructor Create(AOwner: TComponent); override;
  85.     destructor Destroy; override;
  86.     function ExecuteAction(Action: TBasicAction): Boolean; override;
  87.     function UpdateAction(Action: TBasicAction): Boolean; override;
  88.     function UseRightToLeftAlignment: Boolean; override;
  89.     property Field: TField read GetField;
  90. //  published
  91. //    property Align;
  92. //    property Anchors;
  93. //    property AutoSize default False;
  94. //    property AutoSize;// default False;
  95. //    property BiDiMode;
  96. //    property Caption;
  97. //    property Color;
  98. //    property Constraints;
  99.     property DataField: string read GetDataField write SetDataField;
  100.     property DataSource: TDataSource read GetDataSource write SetDataSource;
  101. //    property DragCursor;
  102. //    property DragKind;
  103. //    property DragMode;
  104. //    property Enabled;
  105. //    property FocusControl;
  106. //    property Font;
  107. //    property ParentBiDiMode;
  108. //    property ParentColor;
  109. //    property ParentFont;
  110. //    property ParentShowHint;
  111. //    property PopupMenu;
  112. //    property TextOptions;
  113. //    property Transparent;
  114. //    property ShowHint;
  115. //    property Visible;
  116. //    property OnClick;
  117. //    property OnContextPopup;
  118. //    property OnDblClick;
  119. //    property OnDragDrop;
  120. //    property OnDragOver;
  121. //    property OnEndDock;
  122. //    property OnEndDrag;
  123. //    property OnMouseEnter;
  124. //    property OnMouseLeave;
  125. //    property OnMouseDown;
  126. //    property OnMouseMove;
  127. //    property OnMouseUp;
  128. //    property OnStartDock;
  129. //    property OnStartDrag;
  130.   end;
  131.   TfcLabel = class(TfcDBCustomLabel)
  132.   published
  133.     property Align;
  134.     property Anchors;
  135.     property AutoSize;
  136. //    property AutoSize default False;
  137.     property BiDiMode;
  138.     property Caption;
  139.     property Color;
  140.     property Constraints;
  141.     property DataField;
  142.     property DataSource;
  143.     property DragCursor;
  144.     property DragKind;
  145.     property DragMode;
  146.     property Enabled;
  147.     property FocusControl;
  148.     property Font;
  149.     property ParentBiDiMode;
  150.     property ParentColor;
  151.     property ParentFont;
  152.     property ParentShowHint;
  153.     property PopupMenu;
  154.     property TextOptions;
  155.     property Transparent;
  156.     property ShowHint;
  157.     property Visible;
  158.     property OnClick;
  159.     property OnContextPopup;
  160.     property OnDblClick;
  161.     property OnDragDrop;
  162.     property OnDragOver;
  163.     property OnEndDock;
  164.     property OnEndDrag;
  165.     property OnMouseEnter;
  166.     property OnMouseLeave;
  167.     property OnMouseDown;
  168.     property OnMouseMove;
  169.     property OnMouseUp;
  170.     property OnStartDock;
  171.     property OnStartDrag;
  172.   end;
  173. implementation
  174. // IUnknown
  175. constructor TfcCustomLabel.Create(AOwner: TComponent);
  176. begin
  177.   inherited Create(AOwner);
  178.   ControlStyle := ControlStyle + [csOpaque, csReplicatable];
  179.   FTextOptions := TfcCaptionText.Create(MakeCallbacks(Invalidate, AdjustBounds, GetTextEnabled),
  180.     Canvas, Font);
  181.   FAutoSize := True;
  182.   Height := 17;
  183.   Width := 65;
  184. end;
  185. destructor TfcCustomLabel.Destroy;
  186. begin
  187.   FTextOptions.Free;
  188.   inherited;
  189. end;
  190. procedure TfcCustomLabel.Paint;
  191. begin
  192.   with Canvas do
  193.   begin
  194.     if not Transparent then
  195.     begin
  196.       Brush.Color := Self.Color;
  197.       Brush.Style := bsSolid;
  198.       FillRect(ClientRect);
  199.     end;
  200.     Brush.Style := bsClear;
  201.     TextOptions.Text := GetLabelText;
  202.     TextOptions.TextRect := ClientRect;
  203.     if TextOptions.DoubleBuffered then
  204.        TextOptions.UpdateFont(Self.Font);
  205.     // Correct for alignment
  206.     TextOptions.Draw;
  207.   end;
  208. end;
  209. function TfcCustomLabel.GetTextEnabled: Boolean;
  210. begin
  211.   result := Enabled;
  212. end;
  213. function TfcCustomLabel.GetLabelText: string;
  214. begin
  215.     Result := Caption;
  216. end;
  217. procedure TfcCustomLabel.AdjustBounds;
  218. var
  219.   DC: HDC;
  220.   ARect: TRect;
  221.   X: Integer;
  222. begin
  223.   if not (csReading in ComponentState) and FAutoSize then
  224.   begin
  225.     DC := GetDC(0);
  226.     Canvas.Handle := DC;
  227.     ARect := TextOptions.CalcDrawRect(True);
  228.     Canvas.Handle := 0;
  229.     ReleaseDC(0, DC);
  230.     x := Left;
  231.     if TextOptions.Alignment = taRightJustify then
  232.       x := (Left + Width) - fcRectWidth(ARect);
  233.     SetBounds(x, Top, fcRectWidth(ARect), fcRectHeight(ARect));
  234.   end;
  235. end;
  236. procedure TfcCustomLabel.SetAutoSize(Value: Boolean);
  237. begin
  238.   if FAutoSize <> Value then
  239.   begin
  240.     FAutoSize := Value;
  241.     AdjustBounds;
  242.     Invalidate;
  243.   end;
  244. end;
  245. function TfcCustomLabel.GetTransparent: Boolean;
  246. begin
  247.   result := not (csOpaque in ControlStyle);
  248. end;
  249. procedure TfcCustomLabel.SetFocusControl(Value: TWinControl);
  250. begin
  251.   FFocusControl := Value;
  252.   if Value <> nil then Value.FreeNotification(Self);
  253. end;
  254. procedure TfcCustomLabel.SetTransparent(Value: Boolean);
  255. begin
  256.   if Transparent <> Value then
  257.   begin
  258.     if Value then
  259.       ControlStyle := ControlStyle - [csOpaque] else
  260.       ControlStyle := ControlStyle + [csOpaque];
  261.     Invalidate;
  262.   end;
  263. end;
  264. procedure TfcCustomLabel.Loaded;
  265. begin
  266.   inherited;
  267.   AdjustBounds;
  268. end;
  269. procedure TfcCustomLabel.Notification(AComponent: TComponent;
  270.   Operation: TOperation);
  271. begin
  272.   inherited;
  273.   if (Operation = opRemove) and (AComponent = FFocusControl) then
  274.     FFocusControl := nil;
  275. end;
  276. procedure TfcCustomLabel.CMTextChanged(var Message: TMessage);
  277. begin
  278.   TextOptions.Text := Caption;
  279.   AdjustBounds;
  280.   Invalidate;
  281. end;
  282. procedure TfcCustomLabel.CMFontChanged(var Message: TMessage);
  283. begin
  284.   inherited;
  285.   AdjustBounds;
  286. end;
  287. procedure TfcCustomLabel.CMDialogChar(var Message: TCMDialogChar);
  288. begin
  289.   if (FFocusControl <> nil) and Enabled and (toShowAccel in TextOptions.Options) and
  290.     IsAccel(Message.CharCode, Caption) then
  291.     with FFocusControl do
  292.       if CanFocus then
  293.       begin
  294.         SetFocus;
  295.         Message.Result := 1;
  296.       end;
  297. end;
  298. procedure TfcCustomLabel.CMMouseEnter(var Message: TWMMouse);
  299. begin
  300.   inherited;
  301.   MouseEnter;
  302. end;
  303. procedure TfcCustomLabel.CMMouseLeave(var Message: TWMMouse);
  304. begin
  305.   inherited;
  306.   MouseLeave;
  307. end;
  308. procedure TfcCustomLabel.MouseEnter;
  309. begin
  310.   if Assigned(FOnMouseEnter) then FOnMouseEnter(self);
  311. end;
  312. procedure TfcCustomLabel.MouseLeave;
  313. begin
  314.   if Assigned(FOnMouseLeave) then FOnMouseLeave(self);
  315. end;
  316. procedure TfcCustomLabel.WndProc(var Message: TMessage);
  317. begin
  318.   inherited;
  319. end;
  320. constructor TfcDBCustomLabel.Create(AOwner: TComponent);
  321. begin
  322.   inherited Create(AOwner);
  323.   ControlStyle := ControlStyle + [csReplicatable];
  324. //  AutoSize := False;
  325.   FDataLink := TFieldDataLink.Create;
  326.   FDataLink.Control := Self;
  327.   FDataLink.OnDataChange := DataChange;
  328. end;
  329. destructor TfcDBCustomLabel.Destroy;
  330. begin
  331.   FDataLink.Free;
  332.   FDataLink := nil;
  333.   inherited Destroy;
  334. end;
  335. procedure TfcDBCustomLabel.Loaded;
  336. begin
  337.   inherited Loaded;
  338.   if (csDesigning in ComponentState) then DataChange(Self);
  339. end;
  340. procedure TfcDBCustomLabel.Notification(AComponent: TComponent;
  341.   Operation: TOperation);
  342. begin
  343.   inherited Notification(AComponent, Operation);
  344.   if (Operation = opRemove) and (FDataLink <> nil) and
  345.     (AComponent = DataSource) then DataSource := nil;
  346. end;
  347. function TfcDBCustomLabel.UseRightToLeftAlignment: Boolean;
  348. begin
  349.   Result := DBUseRightToLeftAlignment(Self, Field);
  350. end;
  351. procedure TfcDBCustomLabel.SetAutoSize(Value: Boolean);
  352. begin
  353.   if AutoSize <> Value then
  354.   begin
  355.     if Value and FDataLink.DataSourceFixed then
  356.         DatabaseError(SDataSourceFixed);
  357.     inherited SetAutoSize(Value);
  358.   end;
  359. end;
  360. function TfcDBCustomLabel.GetDataSource: TDataSource;
  361. begin
  362.   Result := FDataLink.DataSource;
  363. end;
  364. procedure TfcDBCustomLabel.SetDataSource(Value: TDataSource);
  365. begin
  366.   if not (FDataLink.DataSourceFixed and (csLoading in ComponentState)) then
  367.     FDataLink.DataSource := Value;
  368.   if Value <> nil then Value.FreeNotification(Self);
  369. end;
  370. function TfcDBCustomLabel.GetDataField: string;
  371. begin
  372.   Result := FDataLink.FieldName;
  373. end;
  374. procedure TfcDBCustomLabel.SetDataField(const Value: string);
  375. begin
  376.   FDataLink.FieldName := Value;
  377. end;
  378. function TfcDBCustomLabel.GetField: TField;
  379. begin
  380.   Result := FDataLink.Field;
  381. end;
  382. function TfcDBCustomLabel.GetFieldText: string;
  383.   function IsMemoField: boolean;
  384.   begin
  385.      result:= (FDataLink.Field<>Nil) and (FDataLink.Field is TBlobField)
  386.              {$ifdef win32}
  387.                and
  388.               (TBlobField(FDataLink.Field).BlobType=ftMemo)
  389.              {$endif}
  390.   end;
  391. begin
  392.   if FDataLink.Field <> nil then begin
  393.     if IsMemoField then Result := FDataLink.Field.AsString
  394.     else Result := FDataLink.Field.DisplayText;
  395.   end
  396.   else begin
  397.     Result:= Caption;
  398.     if (Result='') and (DataSource<>nil) and
  399.        (csDesigning in ComponentState) then
  400.        Result := Name
  401.   end
  402. end;
  403. procedure TfcDBCustomLabel.DataChange(Sender: TObject);
  404. begin
  405.   Caption := GetFieldText;
  406. end;
  407. function TfcDBCustomLabel.GetLabelText: string;
  408. begin
  409.   if csPaintCopy in ControlState then
  410.     Result := GetFieldText else
  411.     Result := Caption;
  412. end;
  413. procedure TfcDBCustomLabel.CMGetDataLink(var Message: TMessage);
  414. begin
  415.   Message.Result := Integer(FDataLink);
  416. end;
  417. function TfcDBCustomLabel.ExecuteAction(Action: TBasicAction): Boolean;
  418. begin
  419.   Result := inherited ExecuteAction(Action) or (FDataLink <> nil) and
  420.     FDataLink.ExecuteAction(Action);
  421. end;
  422. function TfcDBCustomLabel.UpdateAction(Action: TBasicAction): Boolean;
  423. begin
  424.   Result := inherited UpdateAction(Action) or (FDataLink <> nil) and
  425.     FDataLink.UpdateAction(Action);
  426. end;
  427. end.