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

Delphi控件源码

开发平台:

Delphi

  1. {*******************************************************************}
  2. {                                                                   }
  3. {       Almediadev Visual Component Library                         }
  4. {       BusinessSkinForm                                            }
  5. {       Version 1.98                                                }
  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. unit bsdbctrls;
  15. {$R-,H+,X+}
  16. {$WARNINGS OFF}
  17. {$HINTS OFF}
  18. interface
  19. uses Windows, SysUtils, Messages, Classes, Controls, Forms,
  20.      Graphics, Menus, StdCtrls, ExtCtrls, Mask, Buttons, ComCtrls, Db,
  21.      DBCtrls, bsSkinBoxCtrls, bsSkinCtrls, bsSkinData, bsUtils, bsMessages,
  22.      bsCalc;
  23. type
  24.   TbsSkinDBText = class(TbsSkinStdLabel)
  25.   private
  26.     FDataLink: TFieldDataLink;
  27.     procedure DataChange(Sender: TObject);
  28.     function GetDataField: string;
  29.     function GetDataSource: TDataSource;
  30.     function GetField: TField;
  31.     function GetFieldText: string;
  32.     procedure SetDataField(const Value: string);
  33.     procedure SetDataSource(Value: TDataSource);
  34.     procedure CMGetDataLink(var Message: TMessage); message CM_GETDATALINK;
  35.   protected
  36.     function GetLabelText: string; override;
  37.     procedure Loaded; override;
  38.     procedure Notification(AComponent: TComponent;
  39.       Operation: TOperation); override;
  40.     procedure SetAutoSize(Value: Boolean); override;
  41.   public
  42.     constructor Create(AOwner: TComponent); override;
  43.     destructor Destroy; override;
  44.     function ExecuteAction(Action: TBasicAction): Boolean; override;
  45.     function UpdateAction(Action: TBasicAction): Boolean; override;
  46.     function UseRightToLeftAlignment: Boolean; override;
  47.     property Field: TField read GetField;
  48.   published
  49.     property Align;
  50.     property Alignment;
  51.     property Anchors;
  52.     property AutoSize default False;
  53.     property BiDiMode;
  54.     property Color;
  55.     property Constraints;
  56.     property DataField: string read GetDataField write SetDataField;
  57.     property DataSource: TDataSource read GetDataSource write SetDataSource;
  58.     property DragCursor;
  59.     property DragKind;
  60.     property DragMode;
  61.     property Enabled;
  62.     property Font;
  63.     property ParentBiDiMode;
  64.     property ParentColor;
  65.     property ParentFont;
  66.     property ParentShowHint;
  67.     property PopupMenu;
  68.     property Transparent;
  69.     property ShowHint;
  70.     property Visible;
  71.     property WordWrap;
  72.     property OnClick;
  73.     property OnContextPopup;
  74.     property OnDblClick;
  75.     property OnDragDrop;
  76.     property OnDragOver;
  77.     property OnEndDock;
  78.     property OnEndDrag;
  79.     property OnMouseDown;
  80.     property OnMouseMove;
  81.     property OnMouseUp;
  82.     property OnStartDock;
  83.     property OnStartDrag;
  84.   end;
  85. { TbsSkinDbEdit }
  86.   TbsSkinDBEdit = class(TbsSkinEdit)
  87.   private
  88.     FDataLink: TFieldDataLink;
  89.     FCanvas: TControlCanvas;
  90.     FAlignment: TAlignment;
  91.     FFocused: Boolean;
  92.     procedure ActiveChange(Sender: TObject);
  93.     procedure DataChange(Sender: TObject);
  94.     procedure EditingChange(Sender: TObject);
  95.     function GetDataField: string;
  96.     function GetDataSource: TDataSource;
  97.     function GetField: TField;
  98.     function GetReadOnly: Boolean;
  99.     function GetTextMargins: TPoint;
  100.     procedure ResetMaxLength;
  101.     procedure SetDataField(const Value: string);
  102.     procedure SetDataSource(Value: TDataSource);
  103.     procedure SetFocused(Value: Boolean);
  104.     procedure SetReadOnly(Value: Boolean);
  105.     procedure UpdateData(Sender: TObject);
  106.     procedure WMCut(var Message: TMessage); message WM_CUT;
  107.     procedure WMPaste(var Message: TMessage); message WM_PASTE;
  108.     procedure WMUndo(var Message: TMessage); message WM_UNDO;
  109.     procedure CMEnter(var Message: TCMEnter); message CM_ENTER;
  110.     procedure CMExit(var Message: TCMExit); message CM_EXIT;
  111.     procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
  112.     procedure CMGetDataLink(var Message: TMessage); message CM_GETDATALINK;
  113.   protected
  114.     procedure Change; override;
  115.     function EditCanModify: Boolean; override;
  116.     procedure KeyDown(var Key: Word; Shift: TShiftState); override;
  117.     procedure KeyPress(var Key: Char); override;
  118.     procedure Loaded; override;
  119.     procedure Notification(AComponent: TComponent;
  120.       Operation: TOperation); override;
  121.     procedure Reset; override;
  122.   public
  123.     constructor Create(AOwner: TComponent); override;
  124.     destructor Destroy; override;
  125.     function ExecuteAction(Action: TBasicAction): Boolean; override;
  126.     function UpdateAction(Action: TBasicAction): Boolean; override;
  127.     function UseRightToLeftAlignment: Boolean; override;
  128.     property Field: TField read GetField;
  129.   published
  130.     property Anchors;
  131.     property AutoSelect;
  132.     property AutoSize;
  133.     property BiDiMode;
  134.     property CharCase;
  135.     property Color;
  136.     property Constraints;
  137.     property Ctl3D;
  138.     property DataField: string read GetDataField write SetDataField;
  139.     property DataSource: TDataSource read GetDataSource write SetDataSource;
  140.     property DragCursor;
  141.     property DragKind;
  142.     property DragMode;
  143.     property Enabled;
  144.     property Font;
  145.     property ImeMode;
  146.     property ImeName;
  147.     property MaxLength;
  148.     property ParentBiDiMode;
  149.     property ParentColor;
  150.     property ParentCtl3D;
  151.     property ParentFont;
  152.     property ParentShowHint;
  153.     property PopupMenu;
  154.     property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
  155.     property ShowHint;
  156.     property TabOrder;
  157.     property TabStop;
  158.     property Visible;
  159.     property OnChange;
  160.     property OnClick;
  161.     property OnContextPopup;
  162.     property OnDblClick;
  163.     property OnDragDrop;
  164.     property OnDragOver;
  165.     property OnEndDock;
  166.     property OnEndDrag;
  167.     property OnEnter;
  168.     property OnExit;
  169.     property OnKeyDown;
  170.     property OnKeyPress;
  171.     property OnKeyUp;
  172.     property OnMouseDown;
  173.     property OnMouseMove;
  174.     property OnMouseUp;
  175.     property OnStartDock;
  176.     property OnStartDrag;
  177.   end;
  178.   TbsSkinDBSpinEdit = class(TbsSkinSpinEdit)
  179.   private
  180.     FInDataChange: Boolean;
  181.     FInChange: Boolean;
  182.     FDataLink: TFieldDataLink;
  183.     FCanvas: TControlCanvas;
  184.     FAlignment: TAlignment;
  185.     FFocused: Boolean;
  186.     procedure EditingChange(Sender: TObject);
  187.     procedure DataChange(Sender: TObject);
  188.     function GetDataField: string;
  189.     function GetDataSource: TDataSource;
  190.     function GetField: TField;
  191.     function GetReadOnly: Boolean;
  192.     procedure SetDataField(const Value: string);
  193.     procedure SetDataSource(Value: TDataSource);
  194.     procedure SetReadOnly(Value: Boolean);
  195.     procedure UpdateData(Sender: TObject);
  196.     procedure CMGetDataLink(var Message: TMessage); message CM_GETDATALINK;
  197.   protected
  198.     procedure EditEnter(Sender: TObject); override;
  199.     procedure EditExit(Sender: TObject); override;
  200.     procedure Change; override;
  201.     procedure Loaded; override;
  202.     procedure Notification(AComponent: TComponent;
  203.       Operation: TOperation); override;
  204.     procedure Reset;
  205.   public
  206.     constructor Create(AOwner: TComponent); override;
  207.     destructor Destroy; override;
  208.     function ExecuteAction(Action: TBasicAction): Boolean; override;
  209.     function UpdateAction(Action: TBasicAction): Boolean; override;
  210.     property Field: TField read GetField;
  211.   published
  212.     property Anchors;
  213.     property AutoSize;
  214.     property BiDiMode;
  215.     property Color;
  216.     property Constraints;
  217.     property Ctl3D;
  218.     property DataField: string read GetDataField write SetDataField;
  219.     property DataSource: TDataSource read GetDataSource write SetDataSource;
  220.     property DragCursor;
  221.     property DragKind;
  222.     property DragMode;
  223.     property Enabled;
  224.     property Font;
  225.     property ImeMode;
  226.     property ImeName;
  227.     property MaxLength;
  228.     property ParentBiDiMode;
  229.     property ParentColor;
  230.     property ParentCtl3D;
  231.     property ParentFont;
  232.     property ParentShowHint;
  233.     property PopupMenu;
  234.     property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
  235.     property ShowHint;
  236.     property TabOrder;
  237.     property TabStop;
  238.     property Visible;
  239.     property OnChange;
  240.     property OnClick;
  241.     property OnContextPopup;
  242.     property OnDblClick;
  243.     property OnDragDrop;
  244.     property OnDragOver;
  245.     property OnEndDock;
  246.     property OnEndDrag;
  247.     property OnEnter;
  248.     property OnExit;
  249.     property OnKeyDown;
  250.     property OnKeyPress;
  251.     property OnKeyUp;
  252.     property OnMouseDown;
  253.     property OnMouseMove;
  254.     property OnMouseUp;
  255.     property OnStartDock;
  256.     property OnStartDrag;
  257.   end;
  258.   TbsSkinDBDateEdit = class(TbsSkinDateEdit)
  259.   private
  260.     FInDataChange: Boolean;
  261.     FInChange: Boolean;
  262.     FDataLink: TFieldDataLink;
  263.     FFocused: Boolean;
  264.     procedure EditingChange(Sender: TObject);
  265.     procedure DataChange(Sender: TObject);
  266.     function GetDataField: string;
  267.     function GetDataSource: TDataSource;
  268.     function GetField: TField;
  269.     function GetReadOnly: Boolean;
  270.     procedure SetDataField(const Value: string);
  271.     procedure SetDataSource(Value: TDataSource);
  272.     procedure SetReadOnly(Value: Boolean);
  273.     procedure UpdateData(Sender: TObject);
  274.     procedure CMGetDataLink(var Message: TMessage); message CM_GETDATALINK;
  275.   protected
  276.     procedure Change; override;
  277.     procedure Loaded; override;
  278.     procedure Notification(AComponent: TComponent;
  279.       Operation: TOperation); override;
  280.     procedure Reset; override;
  281.     procedure CMEnter(var Message: TCMGotFocus); message CM_ENTER;
  282.     procedure CMExit(var Message: TCMGotFocus); message CM_EXIT;
  283.   public
  284.     constructor Create(AOwner: TComponent); override;
  285.     destructor Destroy; override;
  286.     function ExecuteAction(Action: TBasicAction): Boolean; override;
  287.     function UpdateAction(Action: TBasicAction): Boolean; override;
  288.     property Field: TField read GetField;
  289.   published
  290.     published
  291.     property Anchors;
  292.     property AutoSize;
  293.     property BiDiMode;
  294.     property Color;
  295.     property Constraints;
  296.     property DataField: string read GetDataField write SetDataField;
  297.     property DataSource: TDataSource read GetDataSource write SetDataSource;
  298.     property DragCursor;
  299.     property DragKind;
  300.     property DragMode;
  301.     property Enabled;
  302.     property Font;
  303.     property ImeMode;
  304.     property ImeName;
  305.     property MaxLength;
  306.     property ParentBiDiMode;
  307.     property ParentColor;
  308.     property ParentCtl3D;
  309.     property ParentFont;
  310.     property ParentShowHint;
  311.     property PopupMenu;
  312.     property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
  313.     property ShowHint;
  314.     property TabOrder;
  315.     property TabStop;
  316.     property Visible;
  317.     property OnChange;
  318.     property OnClick;
  319.     property OnContextPopup;
  320.     property OnDblClick;
  321.     property OnDragDrop;
  322.     property OnDragOver;
  323.     property OnEndDock;
  324.     property OnEndDrag;
  325.     property OnEnter;
  326.     property OnExit;
  327.     property OnKeyDown;
  328.     property OnKeyPress;
  329.     property OnKeyUp;
  330.     property OnMouseDown;
  331.     property OnMouseMove;
  332.     property OnMouseUp;
  333.     property OnStartDock;
  334.     property OnStartDrag;
  335.   end;
  336.   TbsSkinDBTimeEdit = class(TbsSkinTimeEdit)
  337.   private
  338.     FInDataChange: Boolean;
  339.     FInChange: Boolean;
  340.     FDataLink: TFieldDataLink;
  341.     FFocused: Boolean;
  342.     procedure EditingChange(Sender: TObject);
  343.     procedure DataChange(Sender: TObject);
  344.     function GetDataField: string;
  345.     function GetDataSource: TDataSource;
  346.     function GetField: TField;
  347.     function GetReadOnly: Boolean;
  348.     procedure SetDataField(const Value: string);
  349.     procedure SetDataSource(Value: TDataSource);
  350.     procedure SetReadOnly(Value: Boolean);
  351.     procedure UpdateData(Sender: TObject);
  352.     procedure CMGetDataLink(var Message: TMessage); message CM_GETDATALINK;
  353.   protected
  354.     procedure Change; override;
  355.     procedure Loaded; override;
  356.     procedure Notification(AComponent: TComponent;
  357.       Operation: TOperation); override;
  358.     procedure Reset; override;
  359.     procedure CMEnter(var Message: TCMGotFocus); message CM_ENTER;
  360.     procedure CMExit(var Message: TCMGotFocus); message CM_EXIT;
  361.   public
  362.     constructor Create(AOwner: TComponent); override;
  363.     destructor Destroy; override;
  364.     function ExecuteAction(Action: TBasicAction): Boolean; override;
  365.     function UpdateAction(Action: TBasicAction): Boolean; override;
  366.     property Field: TField read GetField;
  367.   published
  368.     published
  369.     property Anchors;
  370.     property AutoSize;
  371.     property BiDiMode;
  372.     property Color;
  373.     property Constraints;
  374.     property DataField: string read GetDataField write SetDataField;
  375.     property DataSource: TDataSource read GetDataSource write SetDataSource;
  376.     property DragCursor;
  377.     property DragKind;
  378.     property DragMode;
  379.     property Enabled;
  380.     property Font;
  381.     property ImeMode;
  382.     property ImeName;
  383.     property MaxLength;
  384.     property ParentBiDiMode;
  385.     property ParentColor;
  386.     property ParentCtl3D;
  387.     property ParentFont;
  388.     property ParentShowHint;
  389.     property PopupMenu;
  390.     property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
  391.     property ShowHint;
  392.     property TabOrder;
  393.     property TabStop;
  394.     property Visible;
  395.     property OnChange;
  396.     property OnClick;
  397.     property OnContextPopup;
  398.     property OnDblClick;
  399.     property OnDragDrop;
  400.     property OnDragOver;
  401.     property OnEndDock;
  402.     property OnEndDrag;
  403.     property OnEnter;
  404.     property OnExit;
  405.     property OnKeyDown;
  406.     property OnKeyPress;
  407.     property OnKeyUp;
  408.     property OnMouseDown;
  409.     property OnMouseMove;
  410.     property OnMouseUp;
  411.     property OnStartDock;
  412.     property OnStartDrag;
  413.   end;
  414.   TbsSkinDBCalcEdit = class(TbsSkinCalcEdit)
  415.   private
  416.     FInDataChange: Boolean;
  417.     FInChange: Boolean;
  418.     FDataLink: TFieldDataLink;
  419.     FFocused: Boolean;
  420.     procedure EditingChange(Sender: TObject);
  421.     procedure DataChange(Sender: TObject);
  422.     function GetDataField: string;
  423.     function GetDataSource: TDataSource;
  424.     function GetField: TField;
  425.     function GetReadOnly: Boolean;
  426.     procedure SetDataField(const Value: string);
  427.     procedure SetDataSource(Value: TDataSource);
  428.     procedure SetReadOnly(Value: Boolean);
  429.     procedure UpdateData(Sender: TObject);
  430.     procedure CMGetDataLink(var Message: TMessage); message CM_GETDATALINK;
  431.   protected
  432.     procedure Change; override;
  433.     procedure Loaded; override;
  434.     procedure Notification(AComponent: TComponent;
  435.       Operation: TOperation); override;
  436.     procedure Reset; override;
  437.     procedure CMEnter(var Message: TCMGotFocus); message CM_ENTER;
  438.     procedure CMExit(var Message: TCMGotFocus); message CM_EXIT;
  439.   public
  440.     constructor Create(AOwner: TComponent); override;
  441.     destructor Destroy; override;
  442.     function ExecuteAction(Action: TBasicAction): Boolean; override;
  443.     function UpdateAction(Action: TBasicAction): Boolean; override;
  444.     property Field: TField read GetField;
  445.   published
  446.     property Anchors;
  447.     property AutoSize;
  448.     property BiDiMode;
  449.     property Color;
  450.     property Constraints;
  451.     property DataField: string read GetDataField write SetDataField;
  452.     property DataSource: TDataSource read GetDataSource write SetDataSource;
  453.     property DragCursor;
  454.     property DragKind;
  455.     property DragMode;
  456.     property Enabled;
  457.     property Font;
  458.     property ImeMode;
  459.     property ImeName;
  460.     property MaxLength;
  461.     property ParentBiDiMode;
  462.     property ParentColor;
  463.     property ParentCtl3D;
  464.     property ParentFont;
  465.     property ParentShowHint;
  466.     property PopupMenu;
  467.     property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
  468.     property ShowHint;
  469.     property TabOrder;
  470.     property TabStop;
  471.     property Visible;
  472.     property OnChange;
  473.     property OnClick;
  474.     property OnContextPopup;
  475.     property OnDblClick;
  476.     property OnDragDrop;
  477.     property OnDragOver;
  478.     property OnEndDock;
  479.     property OnEndDrag;
  480.     property OnEnter;
  481.     property OnExit;
  482.     property OnKeyDown;
  483.     property OnKeyPress;
  484.     property OnKeyUp;
  485.     property OnMouseDown;
  486.     property OnMouseMove;
  487.     property OnMouseUp;
  488.     property OnStartDock;
  489.     property OnStartDrag;
  490.   end;
  491.   TbsSkinDBMemo = class(TbsSkinMemo)
  492.   private
  493.     FDataLink: TFieldDataLink;
  494.     FAutoDisplay: Boolean;
  495.     FFocused: Boolean;
  496.     FMemoLoaded: Boolean;
  497.     procedure DataChange(Sender: TObject);
  498.     procedure EditingChange(Sender: TObject);
  499.     function GetDataField: string;
  500.     function GetDataSource: TDataSource;
  501.     function GetField: TField;
  502.     function GetReadOnly: Boolean;
  503.     procedure SetDataField(const Value: string);
  504.     procedure SetDataSource(Value: TDataSource);
  505.     procedure SetReadOnly(Value: Boolean);
  506.     procedure SetAutoDisplay(Value: Boolean);
  507.     procedure SetFocused(Value: Boolean);
  508.     procedure UpdateData(Sender: TObject);
  509.     procedure WMCut(var Message: TMessage); message WM_CUT;
  510.     procedure WMPaste(var Message: TMessage); message WM_PASTE;
  511.     procedure WMUndo(var Message: TMessage); message WM_UNDO;
  512.     procedure CMEnter(var Message: TCMEnter); message CM_ENTER;
  513.     procedure CMExit(var Message: TCMExit); message CM_EXIT;
  514.     procedure WMLButtonDblClk(var Message: TWMLButtonDblClk); message WM_LBUTTONDBLCLK;
  515.     procedure CMGetDataLink(var Message: TMessage); message CM_GETDATALINK;
  516.   protected
  517.     procedure Change; override;
  518.     procedure KeyDown(var Key: Word; Shift: TShiftState); override;
  519.     procedure KeyPress(var Key: Char); override;
  520.     procedure Loaded; override;
  521.     procedure Notification(AComponent: TComponent;
  522.       Operation: TOperation); override;
  523.     procedure WndProc(var Message: TMessage); override;
  524.   public
  525.     constructor Create(AOwner: TComponent); override;
  526.     destructor Destroy; override;
  527.     function ExecuteAction(Action: TBasicAction): Boolean; override;
  528.     procedure LoadMemo; virtual;
  529.     function UpdateAction(Action: TBasicAction): Boolean; override;
  530.     function UseRightToLeftAlignment: Boolean; override;
  531.     property Field: TField read GetField;
  532.   published
  533.     property Align;
  534.     property Alignment;
  535.     property Anchors;
  536.     property AutoDisplay: Boolean read FAutoDisplay write SetAutoDisplay default True;
  537.     property BiDiMode;
  538.     property Color;
  539.     property Constraints;
  540.     property Ctl3D;
  541.     property DataField: string read GetDataField write SetDataField;
  542.     property DataSource: TDataSource read GetDataSource write SetDataSource;
  543.     property DragCursor;
  544.     property DragKind;
  545.     property DragMode;
  546.     property Enabled;
  547.     property Font;
  548.     property ImeMode;
  549.     property ImeName;
  550.     property MaxLength;
  551.     property ParentBiDiMode;
  552.     property ParentColor;
  553.     property ParentCtl3D;
  554.     property ParentFont;
  555.     property ParentShowHint;
  556.     property PopupMenu;
  557.     property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
  558.     property ScrollBars;
  559.     property ShowHint;
  560.     property TabOrder;
  561.     property TabStop;
  562.     property Visible;
  563.     property WantTabs;
  564.     property WordWrap;
  565.     property OnChange;
  566.     property OnClick;
  567.     property OnContextPopup;
  568.     property OnDblClick;
  569.     property OnDragDrop;
  570.     property OnDragOver;
  571.     property OnEndDock;
  572.     property OnEndDrag;
  573.     property OnEnter;
  574.     property OnExit;
  575.     property OnKeyDown;
  576.     property OnKeyPress;
  577.     property OnKeyUp;
  578.     property OnMouseDown;
  579.     property OnMouseMove;
  580.     property OnMouseUp;
  581.     property OnStartDock;
  582.     property OnStartDrag;
  583.   end;
  584.   TbsSkinDBMemo2 = class(TbsSkinMemo2)
  585.   private
  586.     FDataLink: TFieldDataLink;
  587.     FAutoDisplay: Boolean;
  588.     FFocused: Boolean;
  589.     FMemoLoaded: Boolean;
  590.     procedure DataChange(Sender: TObject);
  591.     procedure EditingChange(Sender: TObject);
  592.     function GetDataField: string;
  593.     function GetDataSource: TDataSource;
  594.     function GetField: TField;
  595.     function GetReadOnly: Boolean;
  596.     procedure SetDataField(const Value: string);
  597.     procedure SetDataSource(Value: TDataSource);
  598.     procedure SetReadOnly(Value: Boolean);
  599.     procedure SetAutoDisplay(Value: Boolean);
  600.     procedure SetFocused(Value: Boolean);
  601.     procedure UpdateData(Sender: TObject);
  602.     procedure WMCut(var Message: TMessage); message WM_CUT;
  603.     procedure WMPaste(var Message: TMessage); message WM_PASTE;
  604.     procedure WMUndo(var Message: TMessage); message WM_UNDO;
  605.     procedure CMEnter(var Message: TCMEnter); message CM_ENTER;
  606.     procedure CMExit(var Message: TCMExit); message CM_EXIT;
  607.     procedure WMLButtonDblClk(var Message: TWMLButtonDblClk); message WM_LBUTTONDBLCLK;
  608.     procedure CMGetDataLink(var Message: TMessage); message CM_GETDATALINK;
  609.   protected
  610.     procedure Change; override;
  611.     procedure KeyDown(var Key: Word; Shift: TShiftState); override;
  612.     procedure KeyPress(var Key: Char); override;
  613.     procedure Loaded; override;
  614.     procedure Notification(AComponent: TComponent;
  615.       Operation: TOperation); override;
  616.     procedure WndProc(var Message: TMessage); override;
  617.   public
  618.     constructor Create(AOwner: TComponent); override;
  619.     destructor Destroy; override;
  620.     function ExecuteAction(Action: TBasicAction): Boolean; override;
  621.     procedure LoadMemo; virtual;
  622.     function UpdateAction(Action: TBasicAction): Boolean; override;
  623.     function UseRightToLeftAlignment: Boolean; override;
  624.     property Field: TField read GetField;
  625.   published
  626.     property Align;
  627.     property Alignment;
  628.     property Anchors;
  629.     property AutoDisplay: Boolean read FAutoDisplay write SetAutoDisplay default True;
  630.     property BiDiMode;
  631.     property Color;
  632.     property Constraints;
  633.     property Ctl3D;
  634.     property DataField: string read GetDataField write SetDataField;
  635.     property DataSource: TDataSource read GetDataSource write SetDataSource;
  636.     property DragCursor;
  637.     property DragKind;
  638.     property DragMode;
  639.     property Enabled;
  640.     property Font;
  641.     property ImeMode;
  642.     property ImeName;
  643.     property MaxLength;
  644.     property ParentBiDiMode;
  645.     property ParentColor;
  646.     property ParentCtl3D;
  647.     property ParentFont;
  648.     property ParentShowHint;
  649.     property PopupMenu;
  650.     property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
  651.     property ScrollBars;
  652.     property ShowHint;
  653.     property TabOrder;
  654.     property TabStop;
  655.     property Visible;
  656.     property WantTabs;
  657.     property WordWrap;
  658.     property OnChange;
  659.     property OnClick;
  660.     property OnContextPopup;
  661.     property OnDblClick;
  662.     property OnDragDrop;
  663.     property OnDragOver;
  664.     property OnEndDock;
  665.     property OnEndDrag;
  666.     property OnEnter;
  667.     property OnExit;
  668.     property OnKeyDown;
  669.     property OnKeyPress;
  670.     property OnKeyUp;
  671.     property OnMouseDown;
  672.     property OnMouseMove;
  673.     property OnMouseUp;
  674.     property OnStartDock;
  675.     property OnStartDrag;
  676.   end;
  677.   TbsSkinDBCheckRadioBox = class(TbsSkinCheckRadioBox)
  678.   private
  679.     FDataLink: TFieldDataLink;
  680.     FValueCheck: string;
  681.     FValueUncheck: string;
  682.     procedure DataChange(Sender: TObject);
  683.     function GetDataField: string;
  684.     function GetDataSource: TDataSource;
  685.     function GetField: TField;
  686.     function GetFieldState: TCheckBoxState;
  687.     function GetReadOnly: Boolean;
  688.     procedure SetDataField(const Value: string);
  689.     procedure SetDataSource(Value: TDataSource);
  690.     procedure SetReadOnly(Value: Boolean);
  691.     procedure SetValueCheck(const Value: string);
  692.     procedure SetValueUncheck(const Value: string);
  693.     procedure UpdateData(Sender: TObject);
  694.     function ValueMatch(const ValueList, Value: string): Boolean;
  695.     procedure CMExit(var Message: TCMExit); message CM_EXIT;
  696.     procedure CMGetDataLink(var Message: TMessage); message CM_GETDATALINK;
  697.   protected
  698.     procedure KeyPress(var Key: Char); override;
  699.     procedure Notification(AComponent: TComponent;
  700.       Operation: TOperation); override;
  701.     procedure WndProc(var Message: TMessage); override;
  702.     procedure SetCheckState; override;
  703.   public
  704.     constructor Create(AOwner: TComponent); override;
  705.     destructor Destroy; override;
  706.     function ExecuteAction(Action: TBasicAction): Boolean; override;
  707.     function UpdateAction(Action: TBasicAction): Boolean; override;
  708.     function UseRightToLeftAlignment: Boolean; override;
  709.     property Checked;
  710.     property Field: TField read GetField;
  711.   published
  712.     property Action;
  713.     property Anchors;
  714.     property BiDiMode;
  715.     property Caption;
  716.     property Color;
  717.     property Constraints;
  718.     property Ctl3D;
  719.     property DataField: string read GetDataField write SetDataField;
  720.     property DataSource: TDataSource read GetDataSource write SetDataSource;
  721.     property DragCursor;
  722.     property DragKind;
  723.     property DragMode;
  724.     property Enabled;
  725.     property Font;
  726.     property ParentBiDiMode;
  727.     property ParentColor;
  728.     property ParentCtl3D;
  729.     property ParentFont;
  730.     property ParentShowHint;
  731.     property PopupMenu;
  732.     property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
  733.     property ShowHint;
  734.     property TabOrder;
  735.     property TabStop;
  736.     property ValueChecked: string read FValueCheck write SetValueCheck;
  737.     property ValueUnchecked: string read FValueUncheck write SetValueUncheck;
  738.     property Visible;
  739.     property OnClick;
  740.     property OnContextPopup;
  741.     property OnDragDrop;
  742.     property OnDragOver;
  743.     property OnEndDock;
  744.     property OnEndDrag;
  745.     property OnEnter;
  746.     property OnExit;
  747.     property OnKeyDown;
  748.     property OnKeyPress;
  749.     property OnKeyUp;
  750.     property OnMouseDown;
  751.     property OnMouseMove;
  752.     property OnMouseUp;
  753.     property OnStartDock;
  754.     property OnStartDrag;
  755.   end;
  756.   TbsSkinDBListBox = class(TbsSkinListBox)
  757.   private
  758.     FDataLink: TFieldDataLink;
  759.     procedure DataChange(Sender: TObject);
  760.     procedure UpdateData(Sender: TObject);
  761.     function GetDataField: string;
  762.     function GetDataSource: TDataSource;
  763.     function GetField: TField;
  764.     function GetReadOnly: Boolean;
  765.     procedure SetDataField(const Value: string);
  766.     procedure SetDataSource(Value: TDataSource);
  767.     procedure SetReadOnly(Value: Boolean);
  768.     procedure SetItems(Value: TStrings);
  769.   protected
  770.     procedure CheckButtonClick(Sender: TObject);
  771.     procedure ListBoxExit; override;
  772.     procedure ListBoxWProc(var Message: TMessage;
  773.                            var Handled: Boolean); override;
  774.     procedure ListBoxClick; override;
  775.     procedure ListBoxKeyDown(var Key: Word; Shift: TShiftState); override;
  776.     procedure ListBoxKeyPress(var Key: Char); override;
  777.     procedure Notification(AComponent: TComponent;
  778.       Operation: TOperation); override;
  779.   public
  780.     constructor Create(AOwner: TComponent); override;
  781.     destructor Destroy; override;
  782.     function ExecuteAction(Action: TBasicAction): Boolean; override;
  783.     function UpdateAction(Action: TBasicAction): Boolean; override;
  784.     function UseRightToLeftAlignment: Boolean; override;
  785.     property Field: TField read GetField;
  786.   published
  787.     property Align;
  788.     property Anchors;
  789.     property BiDiMode;
  790.     property Color;
  791.     property Constraints;
  792.     property Ctl3D default True;
  793.     property DataField: string read GetDataField write SetDataField;
  794.     property DataSource: TDataSource read GetDataSource write SetDataSource;
  795.     property DragCursor;
  796.     property DragKind;
  797.     property DragMode;
  798.     property Enabled;
  799.     property Font;
  800.     property ImeMode;
  801.     property ImeName;
  802.     property Items write SetItems;
  803.     property ParentBiDiMode;
  804.     property ParentColor;
  805.     property ParentCtl3D;
  806.     property ParentFont;
  807.     property ParentShowHint;
  808.     property PopupMenu;
  809.     property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
  810.     property ShowHint;
  811.     property TabOrder;
  812.     property TabStop;
  813.     property Visible;
  814.     property OnClick;
  815.     property OnContextPopup;
  816.     property OnDblClick;
  817.     property OnDragDrop;
  818.     property OnDragOver;
  819.     property OnDrawItem;
  820.     property OnEndDock;
  821.     property OnEndDrag;
  822.     property OnEnter;
  823.     property OnExit;
  824.     property OnKeyDown;
  825.     property OnKeyPress;
  826.     property OnKeyUp;
  827.     property OnMouseDown;
  828.     property OnMouseMove;
  829.     property OnMouseUp;
  830.     property OnStartDock;
  831.     property OnStartDrag;
  832.   end;
  833.   { TbsSkinDBComboBox }
  834.   TbsSkinDBComboBox = class(TbsSkinComboBox)
  835.   private
  836.     FInDataChange: Boolean;
  837.     FInDateSelfChange: Boolean;
  838.     FDataLink: TFieldDataLink;
  839.     procedure DataChange(Sender: TObject);
  840.     function GetComboText: string;
  841.     function GetDataField: string;
  842.     function GetDataSource: TDataSource;
  843.     function GetField: TField;
  844.     function GetReadOnly: Boolean;
  845.     procedure SetComboText(const Value: string);
  846.     procedure SetDataField(const Value: string);
  847.     procedure SetDataSource(Value: TDataSource);
  848.     procedure SetItems(Value: TStrings);
  849.     procedure SetReadOnly(Value: Boolean);
  850.     procedure UpdateData(Sender: TObject);
  851.     procedure CMEnter(var Message: TCMEnter); message CM_ENTER;
  852.     procedure CMExit(var Message: TCMExit); message CM_EXIT;
  853.     procedure CMGetDataLink(var Message: TMessage); message CM_GETDATALINK;
  854.   protected
  855.     procedure Change; override;
  856.     procedure CreateWnd; override;
  857.     procedure KeyDown(var Key: Word; Shift: TShiftState); override;
  858.     procedure KeyPress(var Key: Char); override;
  859.     procedure Loaded; override;
  860.     procedure Notification(AComponent: TComponent;
  861.       Operation: TOperation); override;
  862.     procedure EditWindowProcHook(var Message: TMessage); override;
  863.   public
  864.     constructor Create(AOwner: TComponent); override;
  865.     destructor Destroy; override;
  866.     function ExecuteAction(Action: TBasicAction): Boolean; override;
  867.     function UpdateAction(Action: TBasicAction): Boolean; override;
  868.     function UseRightToLeftAlignment: Boolean; override;
  869.     property Field: TField read GetField;
  870.     property Text;
  871.   published
  872.     property Style; {Must be published before Items}
  873.     property Anchors;
  874.     property BiDiMode;
  875.     property Color;
  876.     property Constraints;
  877.     property Ctl3D;
  878.     property DataField: string read GetDataField write SetDataField;
  879.     property DataSource: TDataSource read GetDataSource write SetDataSource;
  880.     property DragCursor;
  881.     property DragKind;
  882.     property DragMode;
  883.     property DropDownCount;
  884.     property Enabled;
  885.     property Font;
  886.     property ImeMode;
  887.     property ImeName;
  888.     property Items write SetItems;
  889.     property ParentBiDiMode;
  890.     property ParentColor;
  891.     property ParentCtl3D;
  892.     property ParentFont;
  893.     property ParentShowHint;
  894.     property PopupMenu;
  895.     property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
  896.     property ShowHint;
  897.     property Sorted;
  898.     property TabOrder;
  899.     property TabStop;
  900.     property Visible;
  901.     property OnChange;
  902.     property OnClick;
  903.     property OnContextPopup;
  904.     property OnDblClick;
  905.     property OnDragDrop;
  906.     property OnDragOver;
  907.     property OnEndDock;
  908.     property OnEndDrag;
  909.     property OnEnter;
  910.     property OnExit;
  911.     property OnKeyDown;
  912.     property OnKeyPress;
  913.     property OnKeyUp;
  914.     property OnStartDock;
  915.     property OnStartDrag;
  916.   end;
  917.   TbsSkinDBRadioGroup = class(TbsSkinCustomRadioGroup)
  918.   private
  919.     FInClick: Boolean;
  920.     FDataLink: TFieldDataLink;
  921.     FValue: string;
  922.     FValues: TStrings;
  923.     FInSetValue: Boolean;
  924.     FOnChange: TNotifyEvent;
  925.     procedure DataChange(Sender: TObject);
  926.     procedure UpdateData(Sender: TObject);
  927.     function GetDataField: string;
  928.     function GetDataSource: TDataSource;
  929.     function GetField: TField;
  930.     function GetReadOnly: Boolean;
  931.     function GetButtonValue(Index: Integer): string;
  932.     procedure SetDataField(const Value: string);
  933.     procedure SetDataSource(Value: TDataSource);
  934.     procedure SetReadOnly(Value: Boolean);
  935.     procedure SetValue(const Value: string);
  936.     procedure SetItems(Value: TStrings);
  937.     procedure SetValues(Value: TStrings);
  938.     procedure CMExit(var Message: TCMExit); message CM_EXIT;
  939.   protected
  940.     procedure Change; dynamic;
  941.     procedure Click; override;
  942.     procedure KeyPress(var Key: Char); override;
  943.     function CanModify: Boolean; override;
  944.     procedure Notification(AComponent: TComponent;
  945.       Operation: TOperation); override;
  946.     property DataLink: TFieldDataLink read FDataLink;
  947.   public
  948.     constructor Create(AOwner: TComponent); override;
  949.     destructor Destroy; override;
  950.     function ExecuteAction(Action: TBasicAction): Boolean; override;
  951.     function UpdateAction(Action: TBasicAction): Boolean; override;
  952.     function UseRightToLeftAlignment: Boolean; override;
  953.     property Field: TField read GetField;
  954.     property ItemIndex;
  955.     property Value: string read FValue write SetValue;
  956.   published
  957.     property Align;
  958.     property Anchors;
  959.     property BiDiMode;
  960.     property Caption;
  961.     property Color;
  962.     property Columns;
  963.     property Constraints;
  964.     property Ctl3D;
  965.     property DataField: string read GetDataField write SetDataField;
  966.     property DataSource: TDataSource read GetDataSource write SetDataSource;
  967.     property DragCursor;
  968.     property DragKind;
  969.     property DragMode;
  970.     property Enabled;
  971.     property Font;
  972.     property Items write SetItems;
  973.     property ParentBiDiMode;
  974.     property ParentColor;
  975.     property ParentCtl3D;
  976.     property ParentFont;
  977.     property ParentShowHint;
  978.     property PopupMenu;
  979.     property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
  980.     property ShowHint;
  981.     property TabOrder;
  982.     property TabStop;
  983.     property Values: TStrings read FValues write SetValues;
  984.     property Visible;
  985.     property OnChange: TNotifyEvent read FOnChange write FOnChange;
  986.     property OnClick;
  987.     property OnContextPopup;
  988.     property OnDragDrop;
  989.     property OnDragOver;
  990.     property OnEndDock;
  991.     property OnEndDrag;
  992.     property OnEnter;
  993.     property OnExit;
  994.     property OnStartDock;
  995.     property OnStartDrag;
  996.   end;
  997.   { TbsDBLookupControl }
  998.   TbsDBLookupControl = class;
  999.   TbsDataSourceLink = class(TDataLink)
  1000.   private
  1001.     FDBLookupControl: TbsDBLookupControl;
  1002.   protected
  1003.     procedure FocusControl(Field: TFieldRef); override;
  1004.     procedure ActiveChanged; override;
  1005.     procedure LayoutChanged; override;
  1006.     procedure RecordChanged(Field: TField); override;
  1007.   public
  1008.     constructor Create;
  1009.   end;
  1010.   TbsListSourceLink = class(TDataLink)
  1011.   private
  1012.     FDBLookupControl: TbsDBLookupControl;
  1013.   protected
  1014.     procedure ActiveChanged; override;
  1015.     procedure DataSetChanged; override;
  1016.     procedure LayoutChanged; override;
  1017.   public
  1018.     constructor Create;
  1019.   end;
  1020.   TbsDBLookupControl = class(TbsSkinCustomControl)
  1021.   private
  1022.     FLookupSource: TDataSource;
  1023.     FDataLink: TbsDataSourceLink;
  1024.     FListLink: TbsListSourceLink;
  1025.     FDataFieldName: string;
  1026.     FKeyFieldName: string;
  1027.     FListFieldName: string;
  1028.     FListFieldIndex: Integer;
  1029.     FDataField: TField;
  1030.     FMasterField: TField;
  1031.     FKeyField: TField;
  1032.     FListField: TField;
  1033.     FListFields: TList;
  1034.     FKeyValue: Variant;
  1035.     FSearchText: string;
  1036.     FLookupMode: Boolean;
  1037.     FListActive: Boolean;
  1038.     FHasFocus: Boolean;
  1039.     FNullValueKey: TShortCut;
  1040.     procedure CheckNotCircular;
  1041.     procedure CheckNotLookup;
  1042.     procedure DataLinkRecordChanged(Field: TField);
  1043.     function GetDataSource: TDataSource;
  1044.     function GetKeyFieldName: string;
  1045.     function GetListSource: TDataSource;
  1046.     function GetReadOnly: Boolean;
  1047.     procedure SetDataFieldName(const Value: string);
  1048.     procedure SetDataSource(Value: TDataSource);
  1049.     procedure SetKeyFieldName(const Value: string);
  1050.     procedure SetKeyValue(const Value: Variant);
  1051.     procedure SetListFieldName(const Value: string);
  1052.     procedure SetListSource(Value: TDataSource);
  1053.     procedure SetLookupMode(Value: Boolean);
  1054.     procedure SetReadOnly(Value: Boolean);
  1055.     procedure WMGetDlgCode(var Message: TMessage); message WM_GETDLGCODE;
  1056.     procedure WMKeyDown(var Message: TWMKeyDown); message WM_KEYDOWN;    
  1057.     procedure WMKillFocus(var Message: TMessage); message WM_KILLFOCUS;
  1058.     procedure WMSetFocus(var Message: TMessage); message WM_SETFOCUS;
  1059.     procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED;
  1060.     procedure CMGetDataLink(var Message: TMessage); message CM_GETDATALINK;
  1061.   protected
  1062.     function CanModify: Boolean; virtual;
  1063.     procedure KeyValueChanged; virtual;
  1064.     procedure ListLinkDataChanged; virtual;
  1065.     function LocateKey: Boolean; virtual;
  1066.     procedure Notification(AComponent: TComponent;
  1067.       Operation: TOperation); override;
  1068.     procedure ProcessSearchKey(Key: Char); virtual;
  1069.     procedure SelectKeyValue(const Value: Variant); virtual;
  1070.     procedure UpdateDataFields; virtual;
  1071.     procedure UpdateListFields; virtual;
  1072.     property DataField: string read FDataFieldName write SetDataFieldName;
  1073.     property DataLink: TbsDataSourceLink read FDataLink;
  1074.     property DataSource: TDataSource read GetDataSource write SetDataSource;
  1075.     property HasFocus: Boolean read FHasFocus;
  1076.     property KeyField: string read GetKeyFieldName write SetKeyFieldName;
  1077.     property KeyValue: Variant read FKeyValue write SetKeyValue;
  1078.     property ListActive: Boolean read FListActive;
  1079.     property ListField: string read FListFieldName write SetListFieldName;
  1080.     property ListFieldIndex: Integer read FListFieldIndex write FListFieldIndex default 0;
  1081.     property ListFields: TList read FListFields;
  1082.     property ListLink: TbsListSourceLink read FListLink;
  1083.     property ListSource: TDataSource read GetListSource write SetListSource;
  1084.     property NullValueKey: TShortCut read FNullValueKey write FNullValueKey default 0;
  1085.     property ParentColor default False;
  1086.     property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
  1087.     property SearchText: string read FSearchText write FSearchText;
  1088.     property TabStop default True;
  1089.   public
  1090.     constructor Create(AOwner: TComponent); override;
  1091.     destructor Destroy; override;
  1092.     function ExecuteAction(Action: TBasicAction): Boolean; override;
  1093.     function UpdateAction(Action: TBasicAction): Boolean; override;
  1094.     property Field: TField read FDataField;
  1095.   end;
  1096. { TbsSkinDBLookupListBox }
  1097.   TbsSkinDBLookupListBox = class(TbsDBLookupControl)
  1098.   private
  1099.     FStopThumbScroll: Boolean;
  1100.     FScrollBar: TbsSkinScrollBar;
  1101.     FDefaultItemHeight: Integer;
  1102.     FRecordIndex: Integer;
  1103.     FRecordCount: Integer;
  1104.     FRowCount: Integer;
  1105.     FBorderStyle: TBorderStyle;
  1106.     FPopup: Boolean;
  1107.     FKeySelected: Boolean;
  1108.     FTracking: Boolean;
  1109.     FTimerActive: Boolean;
  1110.     FLockPosition: Boolean;
  1111.     FMousePos: Integer;
  1112.     FSelectedItem: string;
  1113.     procedure ShowScrollBar;
  1114.     procedure HideScrollBar;
  1115.     procedure AlignScrollBar;
  1116.     procedure SetDefaultItemHeight(Value: Integer);
  1117.     function GetKeyIndex: Integer;
  1118.     procedure SelectCurrent;
  1119.     procedure SelectItemAt(X, Y: Integer);
  1120.     procedure SetBorderStyle(Value: TBorderStyle);
  1121.     procedure SetRowCount(Value: Integer);
  1122.     procedure StopTimer;
  1123.     procedure StopTracking;
  1124.     procedure TimerScroll;
  1125.     procedure UpdateScrollBar;
  1126.     procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED;
  1127.     procedure WMCancelMode(var Message: TMessage); message WM_CANCELMODE;
  1128.     procedure WMTimer(var Message: TMessage); message WM_TIMER;
  1129.     procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL;
  1130.     procedure OnScrollBarChange(Sender: TObject);
  1131.     procedure OnScrollBarUpButtonClick(Sender: TObject);
  1132.     procedure OnScrollBarDownButtonClick(Sender: TObject);
  1133.   protected
  1134.     procedure FramePaint(C: TCanvas);
  1135.     procedure WMNCCALCSIZE(var Message: TWMNCCalcSize); message WM_NCCALCSIZE;
  1136.     procedure WMNCPAINT(var Message: TMessage); message WM_NCPAINT;
  1137.     procedure CreateParams(var Params: TCreateParams); override;
  1138.     procedure CreateWnd; override;
  1139.     procedure KeyDown(var Key: Word; Shift: TShiftState); override;
  1140.     procedure KeyPress(var Key: Char); override;
  1141.     procedure KeyValueChanged; override;
  1142.     procedure ListLinkDataChanged; override;
  1143.     procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
  1144.       X, Y: Integer); override;
  1145.     procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
  1146.     procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
  1147.       X, Y: Integer); override;
  1148.     procedure CreateControlDefaultImage(B: TBitMap); override;
  1149.     procedure CreateControlSkinImage(B: TBitMap); override;
  1150.     procedure UpdateListFields; override;
  1151.     procedure GetSkinData; override;
  1152.     function GetItemHeight: Integer;
  1153.     function GetBorderHeight: Integer;
  1154.     function GetItemWidth: Integer;
  1155.   public
  1156.     FontName: String;
  1157.     FontStyle: TFontStyles;
  1158.     FontHeight: Integer;
  1159.     SItemRect, ActiveItemRect, FocusItemRect: TRect;
  1160.     ItemLeftOffset, ItemRightOffset: Integer;
  1161.     ItemTextRect: TRect;
  1162.     FontColor, ActiveFontColor, FocusFontColor: TColor;
  1163.     ScrollBarName: String;
  1164.     constructor Create(AOwner: TComponent); override;
  1165.     destructor Destroy; override;
  1166.     function ExecuteAction(Action: TBasicAction): Boolean; override;
  1167.     function UpdateAction(Action: TBasicAction): Boolean; override;
  1168.     function UseRightToLeftAlignment: Boolean; override;
  1169.     property KeyValue;
  1170.     property SelectedItem: string read FSelectedItem;
  1171.     procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
  1172.     procedure ChangeSkinData; override;
  1173.   published
  1174.     property Align;
  1175.     property Anchors;
  1176.     property BiDiMode;
  1177.     property Constraints;
  1178.     property DataField;
  1179.     property DataSource;
  1180.     property DragCursor;
  1181.     property DragKind;
  1182.     property DragMode;
  1183.     property Enabled;
  1184.     property Font;
  1185.     property ImeMode;
  1186.     property ImeName;
  1187.     property KeyField;
  1188.     property ListField;
  1189.     property ListFieldIndex;
  1190.     property ListSource;
  1191.     property NullValueKey;
  1192.     property ParentBiDiMode;
  1193.     property ParentColor;
  1194.     property ParentCtl3D;
  1195.     property ParentFont;
  1196.     property ParentShowHint;
  1197.     property PopupMenu;
  1198.     property ReadOnly;
  1199.     property RowCount: Integer read FRowCount write SetRowCount;
  1200.     property DefaultItemHeight: Integer read FDefaultItemHeight
  1201.                                         write SetDefaultItemHeight;
  1202.     property ShowHint;
  1203.     property TabOrder;
  1204.     property TabStop;
  1205.     property Visible;
  1206.     property OnClick;
  1207.     property OnContextPopup;
  1208.     property OnDblClick;
  1209.     property OnDragDrop;
  1210.     property OnDragOver;
  1211.     property OnEndDock;
  1212.     property OnEndDrag;
  1213.     property OnEnter;
  1214.     property OnExit;
  1215.     property OnKeyDown;
  1216.     property OnKeyPress;
  1217.     property OnKeyUp;
  1218.     property OnMouseDown;
  1219.     property OnMouseMove;
  1220.     property OnMouseUp;
  1221.     property OnStartDock;
  1222.     property OnStartDrag;
  1223.   end;
  1224.   { TDBLookupComboBox }
  1225.   TbsPopupDataList = class(TbsSkinDBLookupListBox)
  1226.   private
  1227.     procedure WMMouseActivate(var Message: TMessage); message WM_MOUSEACTIVATE;
  1228.   protected
  1229.     procedure CreateParams(var Params: TCreateParams); override;
  1230.   public
  1231.     constructor Create(AOwner: TComponent); override;
  1232.   end;
  1233.   TDropDownAlign = (daLeft, daRight, daCenter);
  1234.   TbsSkinDBLookupComboBox = class(TbsDBLookupControl)
  1235.   private
  1236.     FButtonRect, FItemRect: TRect;
  1237.     FDataList: TbsPopupDataList;
  1238.     FButtonWidth: Integer;
  1239.     FText: string;
  1240.     FDropDownRows: Integer;
  1241.     FDropDownWidth: Integer;
  1242.     FDropDownAlign: TDropDownAlign;
  1243.     FListVisible: Boolean;
  1244.     FPressed: Boolean;
  1245.     FMouseIn: Boolean;
  1246.     FTracking: Boolean;
  1247.     FAlignment: TAlignment;
  1248.     FLookupMode: Boolean;
  1249.     FOnDropDown: TNotifyEvent;
  1250.     FOnCloseUp: TNotifyEvent;
  1251.     procedure ListMouseUp(Sender: TObject; Button: TMouseButton;
  1252.       Shift: TShiftState; X, Y: Integer);
  1253.     procedure StopTracking;
  1254.     procedure TrackButton(X, Y: Integer);
  1255.     procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY;
  1256.     procedure CMCancelMode(var Message: TCMCancelMode); message CM_CANCELMODE;
  1257.     procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED;
  1258.     procedure CMGetDataLink(var Message: TMessage); message CM_GETDATALINK;
  1259.     procedure WMCancelMode(var Message: TMessage); message WM_CANCELMODE;
  1260.     procedure WMKillFocus(var Message: TWMKillFocus); message WM_KILLFOCUS;
  1261.   protected
  1262.     procedure CreateParams(var Params: TCreateParams); override;
  1263.     procedure KeyDown(var Key: Word; Shift: TShiftState); override;
  1264.     procedure KeyPress(var Key: Char); override;
  1265.     procedure KeyValueChanged; override;
  1266.     procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
  1267.       X, Y: Integer); override;
  1268.     procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
  1269.     procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
  1270.       X, Y: Integer); override;
  1271.     procedure UpdateListFields; override;
  1272.     procedure CreateControlDefaultImage(B: TBitMap); override;
  1273.     procedure CreateControlSkinImage(B: TBitMap); override;
  1274.     procedure GetSkinData; override;
  1275.   public
  1276.     FontName: String;
  1277.     FontStyle: TFontStyles;
  1278.     FontHeight: Integer;
  1279.     SItemRect, FocusItemRect: TRect;
  1280.     ItemLeftOffset, ItemRightOffset: Integer;
  1281.     ItemTextRect: TRect;
  1282.     FontColor, FocusFontColor: TColor;
  1283.     ButtonRect,
  1284.     ActiveButtonRect,
  1285.     DownButtonRect: TRect;
  1286.     ListBoxName: String;
  1287.     constructor Create(AOwner: TComponent); override;
  1288.     procedure CloseUp(Accept: Boolean); virtual;
  1289.     procedure DropDown; virtual;
  1290.     function ExecuteAction(Action: TBasicAction): Boolean; override;
  1291.     procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
  1292.     function UpdateAction(Action: TBasicAction): Boolean; override;
  1293.     function UseRightToLeftAlignment: Boolean; override;
  1294.     property KeyValue;
  1295.     property ListVisible: Boolean read FListVisible;
  1296.     property Text: string read FText;
  1297.   published
  1298.     property Anchors;
  1299.     property BiDiMode;
  1300.     property Color;
  1301.     property Constraints;
  1302.     property DataField;
  1303.     property DataSource;
  1304.     property DragCursor;
  1305.     property DragKind;
  1306.     property DragMode;
  1307.     property DropDownAlign: TDropDownAlign read FDropDownAlign write FDropDownAlign default daLeft;
  1308.     property DropDownRows: Integer read FDropDownRows write FDropDownRows default 7;
  1309.     property DropDownWidth: Integer read FDropDownWidth write FDropDownWidth default 0;
  1310.     property Enabled;
  1311.     property Font;
  1312.     property ImeMode;
  1313.     property ImeName;
  1314.     property KeyField;
  1315.     property ListField;
  1316.     property ListFieldIndex;
  1317.     property ListSource;
  1318.     property NullValueKey;    
  1319.     property ParentBiDiMode;
  1320.     property ParentColor;
  1321.     property ParentCtl3D;
  1322.     property ParentFont;
  1323.     property ParentShowHint;
  1324.     property PopupMenu;
  1325.     property ReadOnly;
  1326.     property ShowHint;
  1327.     property TabOrder;
  1328.     property TabStop;
  1329.     property Visible;
  1330.     property OnClick;
  1331.     property OnCloseUp: TNotifyEvent read FOnCloseUp write FOnCloseUp;
  1332.     property OnContextPopup;
  1333.     property OnDragDrop;
  1334.     property OnDragOver;
  1335.     property OnDropDown: TNotifyEvent read FOnDropDown write FOnDropDown;
  1336.     property OnEndDock;
  1337.     property OnEndDrag;
  1338.     property OnEnter;
  1339.     property OnExit;
  1340.     property OnKeyDown;
  1341.     property OnKeyPress;
  1342.     property OnKeyUp;
  1343.     property OnMouseDown;
  1344.     property OnMouseMove;
  1345.     property OnMouseUp;
  1346.     property OnStartDock;
  1347.     property OnStartDrag;
  1348.   end;
  1349. const
  1350.   InitRepeatPause = 400;  { pause before repeat timer (ms) }
  1351.   RepeatPause     = 100;  { pause before hint window displays (ms)}
  1352.   SpaceSize       =  5;   { size of space between special buttons }
  1353. type
  1354.   TbsNavButton = class;
  1355.   TbsNavDataLink = class;
  1356.   TbsNavGlyph = (ngEnabled, ngDisabled);
  1357.   TbsNavigateBtn = (nbFirst, nbPrior, nbNext, nbLast,
  1358.                   nbInsert, nbDelete, nbEdit, nbPost, nbCancel, nbRefresh);
  1359.   TbsButtonSet = set of TbsNavigateBtn;
  1360.   TbsNavButtonStyle = set of (nsAllowTimer, nsFocusRect);
  1361.   ENavClick = procedure (Sender: TObject; Button: TbsNavigateBtn) of object;
  1362. { TbsSkinDBNavigator }
  1363.   TbsSkinDBNavigator = class (TbsSkinPanel)
  1364.   private
  1365.     FSkinMessage: TbsSkinMessage;
  1366.     FBtnSkinDataName: String;
  1367.     FDataLink: TbsNavDataLink;
  1368.     FVisibleButtons: TbsButtonSet;
  1369.     FHints: TStrings;
  1370.     FDefHints: TStrings;
  1371.     ButtonWidth: Integer;
  1372.     MinBtnSize: TPoint;
  1373.     FOnNavClick: ENavClick;
  1374.     FBeforeAction: ENavClick;
  1375.     FConfirmDelete: Boolean;
  1376.     FAdditionalGlyphs: Boolean;
  1377.     procedure SetAdditionalGlyphs(Value: Boolean);
  1378.     procedure SetBtnSkinDataName(Value: String);
  1379.     procedure ClickHandler(Sender: TObject);
  1380.     function GetDataSource: TDataSource;
  1381.     function GetHints: TStrings;
  1382.     procedure HintsChanged(Sender: TObject);
  1383.     procedure InitButtons;
  1384.     procedure InitHints;
  1385.     procedure SetDataSource(Value: TDataSource);
  1386.     procedure SetHints(Value: TStrings);
  1387.     procedure SetSize(var W: Integer; var H: Integer);
  1388.     procedure SetVisible(Value: TbsButtonSet);
  1389.     procedure WMSize(var Message: TWMSize);  message WM_SIZE;
  1390.     procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;
  1391.     procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED;
  1392.     procedure WMWindowPosChanging(var Message: TWMWindowPosChanging); message WM_WINDOWPOSCHANGING;
  1393.   protected
  1394.     Buttons: array[TbsNavigateBtn] of TbsNavButton;
  1395.     procedure DataChanged;
  1396.     procedure EditingChanged;
  1397.     procedure ActiveChanged;
  1398.     procedure Loaded; override;
  1399.     procedure Notification(AComponent: TComponent;
  1400.       Operation: TOperation); override;
  1401.     procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;
  1402.     procedure CalcMinSize(var W, H: Integer);
  1403.     procedure SetSkinData(Value: TbsSkinData); override;
  1404.   public
  1405.     procedure Paint; override;
  1406.     constructor Create(AOwner: TComponent); override;
  1407.     destructor Destroy; override;
  1408.     procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
  1409.     procedure BtnClick(Index: TbsNavigateBtn); virtual;
  1410.     procedure ChangeSkinData; override;
  1411.   published
  1412.     property AdditionalGlyphs: Boolean
  1413.       read FAdditionalGlyphs write SetAdditionalGlyphs;
  1414.     property SkinMessage: TbsSkinMessage read FSkinMessage write FSkinMessage;
  1415.     property DataSource: TDataSource read GetDataSource write SetDataSource;
  1416.     property VisibleButtons: TbsButtonSet read FVisibleButtons write SetVisible
  1417.       default [nbFirst, nbPrior, nbNext, nbLast, nbInsert, nbDelete,
  1418.         nbEdit, nbPost, nbCancel, nbRefresh];
  1419.     property BtnSkinDataName: String read FBtnSkinDataName write SetBtnSkinDataName;
  1420.     property Align;
  1421.     property Anchors;
  1422.     property Constraints;
  1423.     property DragCursor;
  1424.     property DragKind;
  1425.     property DragMode;
  1426.     property Enabled;
  1427.     property Hints: TStrings read GetHints write SetHints;
  1428.     property ParentCtl3D;
  1429.     property ParentShowHint;
  1430.     property PopupMenu;
  1431.     property ConfirmDelete: Boolean read FConfirmDelete write FConfirmDelete default True;
  1432.     property ShowHint;
  1433.     property TabOrder;
  1434.     property TabStop;
  1435.     property Visible;
  1436.     property BeforeAction: ENavClick read FBeforeAction write FBeforeAction;
  1437.     property OnClick: ENavClick read FOnNavClick write FOnNavClick;
  1438.     property OnContextPopup;
  1439.     property OnDblClick;
  1440.     property OnDragDrop;
  1441.     property OnDragOver;
  1442.     property OnEndDock;
  1443.     property OnEndDrag;
  1444.     property OnEnter;
  1445.     property OnExit;
  1446.     property OnResize;
  1447.     property OnStartDock;
  1448.     property OnStartDrag;
  1449.   end;
  1450. { TbsNavButton }
  1451.   TbsNavButton = class(TbsSkinButton)
  1452.   private
  1453.     FNavIndex: TbsNavigateBtn;
  1454.     FNavStyle: TbsNavButtonStyle;
  1455.     FRepeatTimer: TTimer;
  1456.     procedure TimerExpired(Sender: TObject);
  1457.   protected
  1458.     procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
  1459.       X, Y: Integer); override;
  1460.     procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
  1461.       X, Y: Integer); override;
  1462.   public
  1463.     procedure GetSkinData; override;
  1464.     destructor Destroy; override;
  1465.     property NavStyle: TbsNavButtonStyle read FNavStyle write FNavStyle;
  1466.     property Index : TbsNavigateBtn read FNavIndex write FNavIndex;
  1467.   end;
  1468. { TbsNavDataLink }
  1469.   TbsNavDataLink = class(TDataLink)
  1470.   private
  1471.     FNavigator: TbsSkinDBNavigator;
  1472.   protected
  1473.     procedure EditingChanged; override;
  1474.     procedure DataSetChanged; override;
  1475.     procedure ActiveChanged; override;
  1476.   public
  1477.     constructor Create(ANav: TbsSkinDBNavigator);
  1478.     destructor Destroy; override;
  1479.   end;
  1480.   { TbsSkinDBImage }
  1481.   TbsSkinDBImage = class(TbsSkinPanel)
  1482.   private
  1483.     FDataLink: TFieldDataLink;
  1484.     FPicture: TPicture;
  1485.     FBorderStyle: TbsSkinBorderStyle;
  1486.     FAutoDisplay: Boolean;
  1487.     FStretch: Boolean;
  1488.     FCenter: Boolean;
  1489.     FPictureLoaded: Boolean;
  1490.     FQuickDraw: Boolean;
  1491.     procedure DataChange(Sender: TObject);
  1492.     function GetDataField: string;
  1493.     function GetDataSource: TDataSource;
  1494.     function GetField: TField;
  1495.     function GetReadOnly: Boolean;
  1496.     procedure PictureChanged(Sender: TObject);
  1497.     procedure SetAutoDisplay(Value: Boolean);
  1498.     procedure SetCenter(Value: Boolean);
  1499.     procedure SetDataField(const Value: string);
  1500.     procedure SetDataSource(Value: TDataSource);
  1501.     procedure SetPicture(Value: TPicture);
  1502.     procedure SetReadOnly(Value: Boolean);
  1503.     procedure SetStretch(Value: Boolean);
  1504.     procedure UpdateData(Sender: TObject);
  1505.     procedure CMGetDataLink(var Message: TMessage); message CM_GETDATALINK;
  1506.     procedure CMEnter(var Message: TCMEnter); message CM_ENTER;
  1507.     procedure CMExit(var Message: TCMExit); message CM_EXIT;
  1508.     procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;
  1509.     procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
  1510.     procedure WMLButtonDblClk(var Message: TWMLButtonDblClk); message WM_LBUTTONDBLCLK;
  1511.     procedure WMCut(var Message: TMessage); message WM_CUT;
  1512.     procedure WMCopy(var Message: TMessage); message WM_COPY;
  1513.     procedure WMPaste(var Message: TMessage); message WM_PASTE;
  1514.     procedure WMSize(var Message: TMessage); message WM_SIZE;
  1515.   protected
  1516.     procedure CreateParams(var Params: TCreateParams); override;
  1517.     function GetPalette: HPALETTE; override;
  1518.     procedure KeyDown(var Key: Word; Shift: TShiftState); override;
  1519.     procedure KeyPress(var Key: Char); override;
  1520.     procedure Notification(AComponent: TComponent;
  1521.       Operation: TOperation); override;
  1522.     procedure PaintImage(Cnvs: TCanvas);
  1523.     procedure CreateControlDefaultImage(B: TBitMap); override;
  1524.     procedure CreateControlSkinImage(B: TBitMap); override;
  1525.   public
  1526.     constructor Create(AOwner: TComponent); override;
  1527.     destructor Destroy; override;
  1528.     procedure CopyToClipboard;
  1529.     procedure CutToClipboard;
  1530.     function ExecuteAction(Action: TBasicAction): Boolean; override;
  1531.     procedure LoadPicture;
  1532.     procedure PasteFromClipboard;
  1533.     function UpdateAction(Action: TBasicAction): Boolean; override;
  1534.     property Field: TField read GetField;
  1535.     property Picture: TPicture read FPicture write SetPicture;
  1536.   published
  1537.     property Align;
  1538.     property Anchors;
  1539.     property AutoDisplay: Boolean read FAutoDisplay write SetAutoDisplay default True;
  1540.     property Center: Boolean read FCenter write SetCenter default True;
  1541.     property Color;
  1542.     property Constraints;
  1543.     property Ctl3D;
  1544.     property DataField: string read GetDataField write SetDataField;
  1545.     property DataSource: TDataSource read GetDataSource write SetDataSource;
  1546.     property DragCursor;
  1547.     property DragKind;
  1548.     property DragMode;
  1549.     property Enabled;
  1550.     property Font;
  1551.     property ParentColor default False;
  1552.     property ParentCtl3D;
  1553.     property ParentFont;
  1554.     property ParentShowHint;
  1555.     property PopupMenu;
  1556.     property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
  1557.     property QuickDraw: Boolean read FQuickDraw write FQuickDraw default True;
  1558.     property ShowHint;
  1559.     property Stretch: Boolean read FStretch write SetStretch default False;
  1560.     property TabOrder;
  1561.     property TabStop default True;
  1562.     property Visible;
  1563.     property OnClick;
  1564.     property OnContextPopup;
  1565.     property OnDblClick;
  1566.     property OnDragDrop;
  1567.     property OnDragOver;
  1568.     property OnEndDock;
  1569.     property OnEndDrag;
  1570.     property OnEnter;
  1571.     property OnExit;
  1572.     property OnKeyDown;
  1573.     property OnKeyPress;
  1574.     property OnKeyUp;
  1575.     property OnMouseDown;
  1576.     property OnMouseMove;
  1577.     property OnMouseUp;
  1578.     property OnStartDock;
  1579.     property OnStartDrag;
  1580.   end;
  1581.   TbsSkinDBRichEdit = class(TbsSkinRichEdit)
  1582.   private
  1583.     FDataLink: TFieldDataLink;
  1584.     FAutoDisplay: Boolean;
  1585.     FFocused: Boolean;
  1586.     FMemoLoaded: Boolean;
  1587.     FDataSave: string;
  1588.     procedure BeginEditing;
  1589.     procedure DataChange(Sender: TObject);
  1590.     procedure EditingChange(Sender: TObject);
  1591.     function GetDataField: string;
  1592.     function GetDataSource: TDataSource;
  1593.     function GetField: TField;
  1594.     function GetReadOnly: Boolean;
  1595.     procedure SetDataField(const Value: string);
  1596.     procedure SetDataSource(Value: TDataSource);
  1597.     procedure SetReadOnly(Value: Boolean);
  1598.     procedure SetAutoDisplay(Value: Boolean);
  1599.     procedure SetFocused(Value: Boolean);
  1600.     procedure UpdateData(Sender: TObject);
  1601.     procedure WMCut(var Message: TMessage); message WM_CUT;
  1602.     procedure WMPaste(var Message: TMessage); message WM_PASTE;
  1603.     procedure CMEnter(var Message: TCMEnter); message CM_ENTER;
  1604.     procedure CMExit(var Message: TCMExit); message CM_EXIT;
  1605.     procedure WMLButtonDblClk(var Message: TWMLButtonDblClk); message WM_LBUTTONDBLCLK;
  1606.     procedure CMGetDataLink(var Message: TMessage); message CM_GETDATALINK;
  1607.   protected
  1608.     procedure Change; override;
  1609.     procedure KeyDown(var Key: Word; Shift: TShiftState); override;
  1610.     procedure KeyPress(var Key: Char); override;
  1611.     procedure Loaded; override;
  1612.     procedure Notification(AComponent: TComponent;
  1613.       Operation: TOperation); override;
  1614.   public
  1615.     constructor Create(AOwner: TComponent); override;
  1616.     destructor Destroy; override;
  1617.     function ExecuteAction(Action: TBasicAction): Boolean; override;
  1618.     procedure LoadMemo; virtual;
  1619.     function UpdateAction(Action: TBasicAction): Boolean; override;
  1620.     function UseRightToLeftAlignment: Boolean; override;
  1621.     property Field: TField read GetField;
  1622.   published
  1623.     property Align;
  1624.     property Alignment;
  1625.     property Anchors;
  1626.     property AutoDisplay: Boolean read FAutoDisplay write SetAutoDisplay default True;
  1627.     property BiDiMode;
  1628.     property Color;
  1629.     property Constraints;
  1630.     property DataField: string read GetDataField write SetDataField;
  1631.     property DataSource: TDataSource read GetDataSource write SetDataSource;
  1632.     property DragCursor;
  1633.     property DragKind;
  1634.     property DragMode;
  1635.     property Enabled;
  1636.     property Font;
  1637.     property HideSelection;
  1638.     property HideScrollBars;
  1639.     property ImeMode;
  1640.     property ImeName;
  1641.     property MaxLength;
  1642.     property ParentBiDiMode;
  1643.     property ParentColor;
  1644.     property ParentCtl3D;
  1645.     property ParentFont;
  1646.     property ParentShowHint;
  1647.     property PlainText;
  1648.     property PopupMenu;
  1649.     property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
  1650.     property ScrollBars;
  1651.     property ShowHint;
  1652.     property TabOrder;
  1653.     property TabStop;
  1654.     property Visible;
  1655.     property WantReturns;
  1656.     property WantTabs;
  1657.     property WordWrap;
  1658.     property OnChange;
  1659.     property OnClick;
  1660.     property OnContextPopup;
  1661.     property OnDblClick;
  1662.     property OnDragDrop;
  1663.     property OnDragOver;
  1664.     property OnEndDock;
  1665.     property OnEndDrag;
  1666.     property OnEnter;
  1667.     property OnExit;
  1668.     property OnKeyDown;
  1669.     property OnKeyPress;
  1670.     property OnKeyUp;
  1671.     property OnMouseDown;
  1672.     property OnMouseMove;
  1673.     property OnMouseUp;
  1674.     property OnResizeRequest;
  1675.     property OnSelectionChange;
  1676.     property OnProtectChange;
  1677.     property OnSaveClipboard;
  1678.     property OnStartDock;
  1679.     property OnStartDrag;
  1680.   end;
  1681. implementation
  1682. uses Clipbrd, Dialogs, Math {$IFDEF VER140}, Variants {$ENDIF}
  1683.      {$IFDEF VER150}, Variants {$ENDIF};
  1684. {$R BSDBCTRLS}
  1685. { TbsSkinDBText }
  1686. constructor TbsSkinDBText.Create(AOwner: TComponent);
  1687. begin
  1688.   inherited Create(AOwner);
  1689.   ControlStyle := ControlStyle + [csReplicatable];
  1690.   AutoSize := False;
  1691.   ShowAccelChar := False;
  1692.   FDataLink := TFieldDataLink.Create;
  1693.   FDataLink.Control := Self;
  1694.   FDataLink.OnDataChange := DataChange;
  1695. end;
  1696. destructor TbsSkinDBText.Destroy;
  1697. begin
  1698.   FDataLink.Free;
  1699.   FDataLink := nil;
  1700.   inherited Destroy;
  1701. end;
  1702. procedure TbsSkinDBText.Loaded;
  1703. begin
  1704.   inherited Loaded;
  1705.   if (csDesigning in ComponentState) then DataChange(Self);
  1706. end;
  1707. procedure TbsSkinDBText.Notification(AComponent: TComponent;
  1708.   Operation: TOperation);
  1709. begin
  1710.   inherited Notification(AComponent, Operation);
  1711.   if (Operation = opRemove) and (FDataLink <> nil) and
  1712.     (AComponent = DataSource) then DataSource := nil;
  1713. end;
  1714. function TbsSkinDBText.UseRightToLeftAlignment: Boolean;
  1715. begin
  1716.   Result := DBUseRightToLeftAlignment(Self, Field);
  1717. end;
  1718. procedure TbsSkinDBText.SetAutoSize(Value: Boolean);
  1719. begin
  1720.   if AutoSize <> Value then
  1721.   begin
  1722. //    if Value and FDataLink.DataSourceFixed then DatabaseError(SDataSourceFixed);
  1723.     inherited SetAutoSize(Value);
  1724.   end;
  1725. end;
  1726. function TbsSkinDBText.GetDataSource: TDataSource;
  1727. begin
  1728.   Result := FDataLink.DataSource;
  1729. end;
  1730. procedure TbsSkinDBText.SetDataSource(Value: TDataSource);
  1731. begin
  1732.   if not (FDataLink.DataSourceFixed and (csLoading in ComponentState)) then
  1733.     FDataLink.DataSource := Value;
  1734.   if Value <> nil then Value.FreeNotification(Self);
  1735. end;
  1736. function TbsSkinDBText.GetDataField: string;
  1737. begin
  1738.   Result := FDataLink.FieldName;
  1739. end;
  1740. procedure TbsSkinDBText.SetDataField(const Value: string);
  1741. begin
  1742.   FDataLink.FieldName := Value;
  1743. end;
  1744. function TbsSkinDBText.GetField: TField;
  1745. begin
  1746.   Result := FDataLink.Field;
  1747. end;
  1748. function TbsSkinDBText.GetFieldText: string;
  1749. begin
  1750.   if FDataLink.Field <> nil then
  1751.     Result := FDataLink.Field.DisplayText
  1752.   else
  1753.     if csDesigning in ComponentState then Result := Name else Result := '';
  1754. end;
  1755. procedure TbsSkinDBText.DataChange(Sender: TObject);
  1756. begin
  1757.   Caption := GetFieldText;
  1758. end;
  1759. function TbsSkinDBText.GetLabelText: string;
  1760. begin
  1761.   if csPaintCopy in ControlState then
  1762.     Result := GetFieldText else
  1763.     Result := Caption;
  1764. end;
  1765. procedure TbsSkinDBText.CMGetDataLink(var Message: TMessage);
  1766. begin
  1767.   Message.Result := Integer(FDataLink);
  1768. end;
  1769. function TbsSkinDBText.ExecuteAction(Action: TBasicAction): Boolean;
  1770. begin
  1771.   Result := inherited ExecuteAction(Action) or (FDataLink <> nil) and
  1772.     FDataLink.ExecuteAction(Action);
  1773. end;
  1774. function TbsSkinDBText.UpdateAction(Action: TBasicAction): Boolean;
  1775. begin
  1776.   Result := inherited UpdateAction(Action) or (FDataLink <> nil) and
  1777.     FDataLink.UpdateAction(Action);
  1778. end;
  1779. procedure TbsSkinDbEdit.ResetMaxLength;
  1780. var
  1781.   F: TField;
  1782. begin
  1783.   if (MaxLength > 0) and Assigned(DataSource) and Assigned(DataSource.DataSet) then
  1784.   begin
  1785.     F := DataSource.DataSet.FindField(DataField);
  1786.     if Assigned(F) and (F.DataType in [ftString, ftWideString]) and (F.Size = MaxLength) then
  1787.       MaxLength := 0;
  1788.   end;
  1789. end;
  1790. constructor TbsSkinDbEdit.Create(AOwner: TComponent);
  1791. begin
  1792.   inherited Create(AOwner);
  1793.   inherited ReadOnly := True;
  1794.   ControlStyle := ControlStyle + [csReplicatable];
  1795.   FDataLink := TFieldDataLink.Create;
  1796.   FDataLink.Control := Self;
  1797.   FDataLink.OnDataChange := DataChange;
  1798.   FDataLink.OnEditingChange := EditingChange;
  1799.   FDataLink.OnUpdateData := UpdateData;
  1800.   FDataLink.OnActiveChange := ActiveChange;
  1801. end;
  1802. destructor TbsSkinDbEdit.Destroy;
  1803. begin
  1804.   FDataLink.Free;
  1805.   FDataLink := nil;
  1806.   FCanvas.Free;
  1807.   inherited Destroy;
  1808. end;
  1809. procedure TbsSkinDbEdit.Loaded;
  1810. begin
  1811.   inherited Loaded;
  1812.   ResetMaxLength;
  1813.   if (csDesigning in ComponentState) then DataChange(Self);
  1814. end;
  1815. procedure TbsSkinDbEdit.Notification(AComponent: TComponent;
  1816.   Operation: TOperation);
  1817. begin
  1818.   inherited Notification(AComponent, Operation);
  1819.   if (Operation = opRemove) and (FDataLink <> nil) and
  1820.     (AComponent = DataSource) then DataSource := nil;
  1821. end;
  1822. function TbsSkinDbEdit.UseRightToLeftAlignment: Boolean;
  1823. begin
  1824.   Result := DBUseRightToLeftAlignment(Self, Field);
  1825. end;
  1826. procedure TbsSkinDbEdit.KeyDown(var Key: Word; Shift: TShiftState);
  1827. begin
  1828.   inherited KeyDown(Key, Shift);
  1829.   if (Key = VK_DELETE) or ((Key = VK_INSERT) and (ssShift in Shift)) then
  1830.     FDataLink.Edit;
  1831. end;
  1832. procedure TbsSkinDbEdit.KeyPress(var Key: Char);
  1833. begin
  1834.   inherited KeyPress(Key);
  1835.   if (Key in [#32..#255]) and (FDataLink.Field <> nil) and
  1836.     not FDataLink.Field.IsValidChar(Key) then
  1837.   begin
  1838.     MessageBeep(0);
  1839.     Key := #0;
  1840.   end;
  1841.   case Key of
  1842.     ^H, ^V, ^X, #32..#255:
  1843.       FDataLink.Edit;
  1844.     #27:
  1845.       begin
  1846.         FDataLink.Reset;
  1847.         SelectAll;
  1848.         Key := #0;
  1849.       end;
  1850.   end;
  1851. end;
  1852. function TbsSkinDbEdit.EditCanModify: Boolean;
  1853. begin
  1854.   Result := FDataLink.Edit;
  1855. end;
  1856. procedure TbsSkinDbEdit.Reset;
  1857. begin
  1858.   FDataLink.Reset;
  1859.   SelectAll;
  1860. end;
  1861. procedure TbsSkinDbEdit.SetFocused(Value: Boolean);
  1862. begin
  1863.   if FFocused <> Value then
  1864.   begin
  1865.     FFocused := Value;
  1866.     if (FAlignment <> taLeftJustify) and not IsMasked then Invalidate;
  1867.     FDataLink.Reset;
  1868.   end;
  1869. end;
  1870. procedure TbsSkinDbEdit.Change;
  1871. begin
  1872.   FDataLink.Modified;
  1873.   inherited Change;
  1874. end;
  1875. function TbsSkinDbEdit.GetDataSource: TDataSource;
  1876. begin
  1877.   Result := FDataLink.DataSource;
  1878. end;
  1879. procedure TbsSkinDbEdit.SetDataSource(Value: TDataSource);
  1880. begin
  1881.   if not (FDataLink.DataSourceFixed and (csLoading in ComponentState)) then
  1882.     FDataLink.DataSource := Value;
  1883.   if Value <> nil then Value.FreeNotification(Self);
  1884. end;
  1885. function TbsSkinDbEdit.GetDataField: string;
  1886. begin
  1887.   Result := FDataLink.FieldName;
  1888. end;
  1889. procedure TbsSkinDbEdit.SetDataField(const Value: string);
  1890. begin
  1891.   if not (csDesigning in ComponentState) then
  1892.     ResetMaxLength;
  1893.   FDataLink.FieldName := Value;
  1894. end;
  1895. function TbsSkinDbEdit.GetReadOnly: Boolean;
  1896. begin
  1897.   Result := FDataLink.ReadOnly;
  1898. end;
  1899. procedure TbsSkinDbEdit.SetReadOnly(Value: Boolean);
  1900. begin
  1901.   FDataLink.ReadOnly := Value;
  1902. end;
  1903. function TbsSkinDbEdit.GetField: TField;
  1904. begin
  1905.   Result := FDataLink.Field;
  1906. end;
  1907. procedure TbsSkinDbEdit.ActiveChange(Sender: TObject);
  1908. begin
  1909.   ResetMaxLength;
  1910. end;
  1911. procedure TbsSkinDbEdit.DataChange(Sender: TObject);
  1912. begin
  1913.   if FDataLink.Field <> nil then
  1914.   begin
  1915.     if FAlignment <> FDataLink.Field.Alignment then
  1916.     begin
  1917.       EditText := '';  {forces update}
  1918.       FAlignment := FDataLink.Field.Alignment;
  1919.     end;
  1920.     EditMask := FDataLink.Field.EditMask;
  1921.     if not (csDesigning in ComponentState) then
  1922.     begin
  1923.       if (FDataLink.Field.DataType in [ftString, ftWideString]) and (MaxLength = 0) then
  1924.         MaxLength := FDataLink.Field.Size;
  1925.     end;
  1926.     if FFocused and FDataLink.CanModify then
  1927.       Text := FDataLink.Field.Text
  1928.     else
  1929.     begin
  1930.       EditText := FDataLink.Field.DisplayText;
  1931.       if FDataLink.Editing and FDataLink.CanModify then
  1932.       Modified := True;
  1933.     end;
  1934.   end else
  1935.   begin
  1936.     FAlignment := taLeftJustify;
  1937.     EditMask := '';
  1938.     if csDesigning in ComponentState then
  1939.       EditText := Name else
  1940.       EditText := '';
  1941.   end;
  1942. end;
  1943. procedure TbsSkinDbEdit.EditingChange(Sender: TObject);
  1944. begin
  1945.   inherited ReadOnly := not FDataLink.Editing;
  1946. end;
  1947. procedure TbsSkinDbEdit.UpdateData(Sender: TObject);
  1948. begin
  1949.   ValidateEdit;
  1950.   FDataLink.Field.Text := Text;
  1951. end;
  1952. procedure TbsSkinDbEdit.WMUndo(var Message: TMessage);
  1953. begin
  1954.   FDataLink.Edit;
  1955.   inherited;
  1956. end;
  1957. procedure TbsSkinDbEdit.WMPaste(var Message: TMessage);
  1958. begin
  1959.   FDataLink.Edit;
  1960.   inherited;
  1961. end;
  1962. procedure TbsSkinDbEdit.WMCut(var Message: TMessage);
  1963. begin
  1964.   FDataLink.Edit;
  1965.   inherited;
  1966. end;
  1967. procedure TbsSkinDbEdit.CMEnter(var Message: TCMEnter);
  1968. begin
  1969.   SetFocused(True);
  1970.   inherited;
  1971.   if FDataLink.CanModify then
  1972.     inherited ReadOnly := False;
  1973. end;
  1974. procedure TbsSkinDbEdit.CMExit(var Message: TCMExit);
  1975. begin
  1976.   try
  1977.     FDataLink.UpdateRecord;
  1978.   except
  1979.     SelectAll;
  1980.     SetFocus;
  1981.     raise;
  1982.   end;
  1983.   SetFocused(False);
  1984.   CheckCursor;
  1985.   DoExit;
  1986. end;
  1987. procedure TbsSkinDbEdit.WMPaint(var Message: TWMPaint);
  1988. const
  1989.   AlignStyle : array[Boolean, TAlignment] of DWORD =
  1990.    ((WS_EX_LEFT, WS_EX_RIGHT, WS_EX_LEFT),
  1991.     (WS_EX_RIGHT, WS_EX_LEFT, WS_EX_LEFT));
  1992. var
  1993.   Left: Integer;
  1994.   Margins: TPoint;
  1995.   R: TRect;
  1996.   DC: HDC;
  1997.   PS: TPaintStruct;
  1998.   S: string;
  1999.   AAlignment: TAlignment;
  2000.   ExStyle: DWORD;
  2001. begin
  2002.   AAlignment := FAlignment;
  2003.   if UseRightToLeftAlignment then ChangeBiDiModeAlignment(AAlignment);
  2004.   if ((AAlignment = taLeftJustify) or FFocused) and
  2005.     not (csPaintCopy in ControlState) then
  2006.   begin
  2007.     if SysLocale.MiddleEast and HandleAllocated and (IsRightToLeft) then
  2008.     begin { This keeps the right aligned text, right aligned }
  2009.       ExStyle := DWORD(GetWindowLong(Handle, GWL_EXSTYLE)) and (not WS_EX_RIGHT) and
  2010.         (not WS_EX_RTLREADING) and (not WS_EX_LEFTSCROLLBAR);
  2011.       if UseRightToLeftReading then ExStyle := ExStyle or WS_EX_RTLREADING;
  2012.       if UseRightToLeftScrollbar then ExStyle := ExStyle or WS_EX_LEFTSCROLLBAR;
  2013.       ExStyle := ExStyle or
  2014.         AlignStyle[UseRightToLeftAlignment, AAlignment];
  2015.       if DWORD(GetWindowLong(Handle, GWL_EXSTYLE)) <> ExStyle then
  2016.         SetWindowLong(Handle, GWL_EXSTYLE, ExStyle);
  2017.     end;
  2018.     inherited;
  2019.     Exit;
  2020.   end;
  2021. { Since edit controls do not handle justification unless multi-line (and
  2022.   then only poorly) we will draw right and center justify manually unless
  2023.   the edit has the focus. }
  2024.   if FCanvas = nil then
  2025.   begin
  2026.     FCanvas := TControlCanvas.Create;
  2027.     FCanvas.Control := Self;
  2028.   end;
  2029.   DC := Message.DC;
  2030.   if DC = 0 then DC := BeginPaint(Handle, PS);
  2031.   FCanvas.Handle := DC;
  2032.   try
  2033.     FCanvas.Font := Font;
  2034.     with FCanvas do
  2035.     begin
  2036.       R := ClientRect;
  2037.       Brush.Style := bsClear;
  2038.       if (csPaintCopy in ControlState) and (FDataLink.Field <> nil) then
  2039.       begin
  2040.         S := FDataLink.Field.DisplayText;
  2041.         case CharCase of
  2042.           ecUpperCase: S := AnsiUpperCase(S);
  2043.           ecLowerCase: S := AnsiLowerCase(S);
  2044.         end;
  2045.       end else
  2046.         S := EditText;
  2047.       if PasswordChar <> #0 then FillChar(S[1], Length(S), PasswordChar);
  2048.       Margins := GetTextMargins;
  2049.       case AAlignment of
  2050.         taLeftJustify: Left := Margins.X;
  2051.         taRightJustify: Left := ClientWidth - TextWidth(S) - Margins.X - 1;
  2052.       else
  2053.         Left := (ClientWidth - TextWidth(S)) div 2;
  2054.       end;
  2055.       if SysLocale.MiddleEast then UpdateTextFlags;
  2056.       TextRect(R, Left, Margins.Y, S);
  2057.     end;
  2058.   finally
  2059.     FCanvas.Handle := 0;
  2060.     if Message.DC = 0 then EndPaint(Handle, PS);
  2061.   end;
  2062. end;
  2063. procedure TbsSkinDbEdit.CMGetDataLink(var Message: TMessage);
  2064. begin
  2065.   Message.Result := Integer(FDataLink);
  2066. end;
  2067. function TbsSkinDbEdit.GetTextMargins: TPoint;
  2068. begin
  2069.   Result.X := 0;
  2070.   Result.Y := 0;
  2071. end;
  2072. function TbsSkinDbEdit.ExecuteAction(Action: TBasicAction): Boolean;
  2073. begin
  2074.   Result := inherited ExecuteAction(Action) or (FDataLink <> nil) and
  2075.     FDataLink.ExecuteAction(Action);
  2076. end;
  2077. function TbsSkinDbEdit.UpdateAction(Action: TBasicAction): Boolean;
  2078. begin
  2079.   Result := inherited UpdateAction(Action) or (FDataLink <> nil) and
  2080.     FDataLink.UpdateAction(Action);
  2081. end;
  2082. constructor TbsSkinDBMemo.Create(AOwner: TComponent);
  2083. begin
  2084.   inherited Create(AOwner);
  2085.   inherited ReadOnly := True;
  2086.   ControlStyle := ControlStyle + [csReplicatable];
  2087.   FAutoDisplay := True;
  2088.   FDataLink := TFieldDataLink.Create;
  2089.   FDataLink.Control := Self;
  2090.   FDataLink.OnDataChange := DataChange;
  2091.   FDataLink.OnEditingChange := EditingChange;
  2092.   FDataLink.OnUpdateData := UpdateData;
  2093. end;
  2094. destructor TbsSkinDBMemo.Destroy;
  2095. begin
  2096.   FDataLink.Free;
  2097.   FDataLink := nil;
  2098.   inherited Destroy;
  2099. end;
  2100. procedure TbsSkinDBMemo.Loaded;
  2101. begin
  2102.   inherited Loaded;
  2103. //  if (csDesigning in ComponentState) then DataChange(Self);
  2104. end;
  2105. procedure TbsSkinDBMemo.Notification(AComponent: TComponent;
  2106.   Operation: TOperation);
  2107. begin
  2108.   inherited Notification(AComponent, Operation);
  2109.   if (Operation = opRemove) and (FDataLink <> nil) and
  2110.     (AComponent = DataSource) then DataSource := nil;
  2111. end;
  2112. function TbsSkinDBMemo.UseRightToLeftAlignment: Boolean;
  2113. begin
  2114.   Result := DBUseRightToLeftAlignment(Self, Field);
  2115. end;
  2116. procedure TbsSkinDBMemo.KeyDown(var Key: Word; Shift: TShiftState);
  2117. begin
  2118.   inherited KeyDown(Key, Shift);
  2119.   if FMemoLoaded then
  2120.   begin
  2121.     if (Key = VK_DELETE) or ((Key = VK_INSERT) and (ssShift in Shift)) then
  2122.       FDataLink.Edit;
  2123.   end;
  2124. end;
  2125. procedure TbsSkinDBMemo.KeyPress(var Key: Char);
  2126. begin
  2127.   inherited KeyPress(Key);
  2128.   if FMemoLoaded then
  2129.   begin
  2130.     if (Key in [#32..#255]) and (FDataLink.Field <> nil) and
  2131.       not FDataLink.Field.IsValidChar(Key) then
  2132.     begin
  2133.       MessageBeep(0);
  2134.       Key := #0;
  2135.     end;
  2136.     case Key of
  2137.       ^H, ^I, ^J, ^M, ^V, ^X, #32..#255:
  2138.         FDataLink.Edit;
  2139.       #27:
  2140.         FDataLink.Reset;
  2141.     end;
  2142.   end else
  2143.   begin
  2144.     if Key = #13 then LoadMemo;
  2145.     Key := #0;
  2146.   end;
  2147. end;
  2148. procedure TbsSkinDBMemo.Change;
  2149. begin
  2150.   if FMemoLoaded then FDataLink.Modified;
  2151.   FMemoLoaded := True;
  2152.   inherited Change;
  2153. end;
  2154. function TbsSkinDBMemo.GetDataSource: TDataSource;
  2155. begin
  2156.   Result := FDataLink.DataSource;
  2157. end;
  2158. procedure TbsSkinDBMemo.SetDataSource(Value: TDataSource);
  2159. begin
  2160.   if not (FDataLink.DataSourceFixed and (csLoading in ComponentState)) then
  2161.     FDataLink.DataSource := Value;
  2162.   if Value <> nil then Value.FreeNotification(Self);
  2163. end;
  2164. function TbsSkinDBMemo.GetDataField: string;
  2165. begin
  2166.   Result := FDataLink.FieldName;
  2167. end;
  2168. procedure TbsSkinDBMemo.SetDataField(const Value: string);
  2169. begin
  2170.   FDataLink.FieldName := Value;
  2171. end;
  2172. function TbsSkinDBMemo.GetReadOnly: Boolean;
  2173. begin
  2174.   Result := FDataLink.ReadOnly;
  2175. end;
  2176. procedure TbsSkinDBMemo.SetReadOnly(Value: Boolean);
  2177. begin
  2178.   FDataLink.ReadOnly := Value;
  2179. end;
  2180. function TbsSkinDBMemo.GetField: TField;
  2181. begin
  2182.   Result := FDataLink.Field;
  2183. end;
  2184. procedure TbsSkinDBMemo.LoadMemo;
  2185. begin
  2186.   if not FMemoLoaded and Assigned(FDataLink.Field) and FDataLink.Field.IsBlob then
  2187.   begin
  2188.     try
  2189.       Lines.Text := FDataLink.Field.AsString;
  2190.       FMemoLoaded := True;
  2191.     except
  2192.       { Memo too large }
  2193.       on E:EInvalidOperation do
  2194.         Lines.Text := Format('(%s)', [E.Message]);
  2195.     end;
  2196.     EditingChange(Self);
  2197.   end;
  2198. end;
  2199. procedure TbsSkinDBMemo.DataChange(Sender: TObject);
  2200. begin
  2201.   if FDataLink.Field <> nil then
  2202.     if FDataLink.Field.IsBlob then
  2203.     begin
  2204.       if FAutoDisplay or (FDataLink.Editing and FMemoLoaded) then
  2205.       begin
  2206.         FMemoLoaded := False;
  2207.         LoadMemo;
  2208.       end else
  2209.       begin
  2210.         Text := Format('(%s)', [FDataLink.Field.DisplayLabel]);
  2211.         FMemoLoaded := False;
  2212.       end;
  2213.     end else
  2214.     begin
  2215.       if FFocused and FDataLink.CanModify then
  2216.         Text := FDataLink.Field.Text
  2217.       else
  2218.         Text := FDataLink.Field.DisplayText;
  2219.       FMemoLoaded := True;
  2220.     end
  2221.   else
  2222.   begin
  2223.     if csDesigning in ComponentState then Text := Name else Text := '';
  2224.     FMemoLoaded := False;
  2225.   end;
  2226.   if HandleAllocated then
  2227.     RedrawWindow(Handle, nil, 0, RDW_INVALIDATE or RDW_ERASE or RDW_FRAME);
  2228. end;
  2229. procedure TbsSkinDBMemo.EditingChange(Sender: TObject);
  2230. begin
  2231.   inherited ReadOnly := not (FDataLink.Editing and FMemoLoaded);
  2232. end;
  2233. procedure TbsSkinDBMemo.UpdateData(Sender: TObject);
  2234. begin
  2235.   FDataLink.Field.AsString := Text;
  2236. end;
  2237. procedure TbsSkinDBMemo.SetFocused(Value: Boolean);
  2238. begin
  2239.   if FFocused <> Value then
  2240.   begin
  2241.     FFocused := Value;
  2242.     if not Assigned(FDataLink.Field) or not FDataLink.Field.IsBlob then
  2243.       FDataLink.Reset;
  2244.   end;
  2245. end;
  2246. procedure TbsSkinDBMemo.WndProc(var Message: TMessage);
  2247. begin
  2248.   inherited;
  2249. end;
  2250. procedure TbsSkinDBMemo.CMEnter(var Message: TCMEnter);
  2251. begin
  2252.   SetFocused(True);
  2253.   inherited;
  2254.   if FDataLink.CanModify then
  2255.     inherited ReadOnly := False;
  2256. end;
  2257. procedure TbsSkinDBMemo.CMExit(var Message: TCMExit);
  2258. begin
  2259.   try
  2260.     FDataLink.UpdateRecord;
  2261.   except
  2262.     SetFocus;
  2263.     raise;
  2264.   end;
  2265.   SetFocused(False);
  2266.   inherited;
  2267. end;
  2268. procedure TbsSkinDBMemo.SetAutoDisplay(Value: Boolean);
  2269. begin
  2270.   if FAutoDisplay <> Value then
  2271.   begin
  2272.     FAutoDisplay := Value;
  2273.     if Value then LoadMemo;
  2274.   end;
  2275. end;
  2276. procedure TbsSkinDBMemo.WMLButtonDblClk(var Message: TWMLButtonDblClk);
  2277. begin
  2278.   if not FMemoLoaded then LoadMemo else inherited;
  2279. end;
  2280. procedure TbsSkinDBMemo.WMCut(var Message: TMessage);
  2281. begin
  2282.   FDataLink.Edit;
  2283.   inherited;
  2284. end;
  2285. procedure TbsSkinDBMemo.WMUndo(var Message: TMessage);
  2286. begin
  2287.   FDataLink.Edit;
  2288.   inherited;
  2289. end;
  2290. procedure TbsSkinDBMemo.WMPaste(var Message: TMessage);
  2291. begin
  2292.   FDataLink.Edit;
  2293.   inherited;
  2294. end;
  2295. procedure TbsSkinDBMemo.CMGetDataLink(var Message: TMessage);
  2296. begin
  2297.   Message.Result := Integer(FDataLink);
  2298. end;
  2299. function TbsSkinDBMemo.ExecuteAction(Action: TBasicAction): Boolean;
  2300. begin
  2301.   Result := inherited ExecuteAction(Action) or (FDataLink <> nil) and
  2302.     FDataLink.ExecuteAction(Action);
  2303. end;
  2304. function TbsSkinDBMemo.UpdateAction(Action: TBasicAction): Boolean;
  2305. begin
  2306.   Result := inherited UpdateAction(Action) or (FDataLink <> nil) and
  2307.     FDataLink.UpdateAction(Action);
  2308. end;
  2309. { TbsSkinDBCheckRadioBox }
  2310. constructor TbsSkinDBCheckRadioBox.Create(AOwner: TComponent);
  2311. begin
  2312.   inherited Create(AOwner);
  2313.   ControlStyle := ControlStyle + [csReplicatable];
  2314.   FValueCheck := 'True';
  2315.   FValueUncheck := 'False';
  2316.   FDataLink := TFieldDataLink.Create;
  2317.   FDataLink.Control := Self;
  2318.   FDataLink.OnDataChange := DataChange;
  2319.   FDataLink.OnUpdateData := UpdateData;
  2320. end;
  2321. destructor TbsSkinDBCheckRadioBox.Destroy;
  2322. begin
  2323.   FDataLink.Free;
  2324.   FDataLink := nil;
  2325.   inherited Destroy;
  2326. end;
  2327. procedure TbsSkinDBCheckRadioBox.SetCheckState;
  2328. begin
  2329.   if not ReadOnly
  2330.   then
  2331.     begin
  2332.       inherited;
  2333.       if FDataLink.Edit then FDataLink.Modified;
  2334.     end;  
  2335. end;
  2336. procedure TbsSkinDBCheckRadioBox.Notification(AComponent: TComponent;
  2337.   Operation: TOperation);
  2338. begin
  2339.   inherited Notification(AComponent, Operation);
  2340.   if (Operation = opRemove) and (FDataLink <> nil) and
  2341.     (AComponent = DataSource) then DataSource := nil;
  2342. end;
  2343. function TbsSkinDBCheckRadioBox.UseRightToLeftAlignment: Boolean;
  2344. begin
  2345.   Result := DBUseRightToLeftAlignment(Self, Field);
  2346. end;
  2347. function TbsSkinDBCheckRadioBox.GetFieldState: TCheckBoxState;
  2348. var
  2349.   Text: string;
  2350. begin
  2351.   if FDatalink.Field <> nil then
  2352.     if FDataLink.Field.IsNull then
  2353.       Result := cbGrayed
  2354.     else if FDataLink.Field.DataType = ftBoolean then
  2355.       if FDataLink.Field.AsBoolean then
  2356.         Result := cbChecked
  2357.       else
  2358.         Result := cbUnchecked
  2359.     else
  2360.     begin
  2361.       Result := cbGrayed;
  2362.       Text := FDataLink.Field.Text;
  2363.       if ValueMatch(FValueCheck, Text) then Result := cbChecked else
  2364.         if ValueMatch(FValueUncheck, Text) then Result := cbUnchecked;
  2365.     end
  2366.   else
  2367.     Result := cbUnchecked;
  2368. end;
  2369. procedure TbsSkinDBCheckRadioBox.DataChange(Sender: TObject);
  2370. var
  2371.   State: TCheckBoxState;
  2372. begin
  2373.   State := GetFieldState;
  2374.   FChecked := State = cbChecked;
  2375.   RePaint;
  2376. end;
  2377. procedure TbsSkinDBCheckRadioBox.UpdateData(Sender: TObject);
  2378. var
  2379.   Pos: Integer;
  2380.   S: string;
  2381. begin
  2382.   if FDataLink.Field.DataType = ftBoolean then
  2383.      FDataLink.Field.AsBoolean := Checked
  2384.   else
  2385.     begin
  2386.       if Checked then S := FValueCheck else S := FValueUncheck;
  2387.       Pos := 1;
  2388.       FDataLink.Field.Text := ExtractFieldName(S, Pos);
  2389.     end;
  2390. end;
  2391. function TbsSkinDBCheckRadioBox.ValueMatch(const ValueList, Value: string): Boolean;
  2392. var
  2393.   Pos: Integer;
  2394. begin
  2395.   Result := False;
  2396.   Pos := 1;
  2397.   while Pos <= Length(ValueList) do
  2398.     if AnsiCompareText(ExtractFieldName(ValueList, Pos), Value) = 0 then
  2399.     begin
  2400.       Result := True;
  2401.       Break;
  2402.     end;
  2403. end;
  2404. function TbsSkinDBCheckRadioBox.GetDataSource: TDataSource;
  2405. begin
  2406.   Result := FDataLink.DataSource;
  2407. end;
  2408. procedure TbsSkinDBCheckRadioBox.SetDataSource(Value: TDataSource);
  2409. begin
  2410.   if not (FDataLink.DataSourceFixed and (csLoading in ComponentState)) then
  2411.     FDataLink.DataSource := Value;
  2412.   if Value <> nil then Value.FreeNotification(Self);
  2413. end;
  2414. function TbsSkinDBCheckRadioBox.GetDataField: string;
  2415. begin
  2416.   Result := FDataLink.FieldName;
  2417. end;
  2418. procedure TbsSkinDBCheckRadioBox.SetDataField(const Value: string);
  2419. begin
  2420.   FDataLink.FieldName := Value;
  2421. end;
  2422. function TbsSkinDBCheckRadioBox.GetReadOnly: Boolean;
  2423. begin
  2424.   Result := FDataLink.ReadOnly;
  2425. end;
  2426. procedure TbsSkinDBCheckRadioBox.SetReadOnly(Value: Boolean);
  2427. begin
  2428.   FDataLink.ReadOnly := Value;
  2429. end;
  2430. function TbsSkinDBCheckRadioBox.GetField: TField;
  2431. begin
  2432.   Result := FDataLink.Field;
  2433. end;
  2434. procedure TbsSkinDBCheckRadioBox.KeyPress(var Key: Char);
  2435. begin
  2436.   inherited KeyPress(Key);
  2437.   case Key of
  2438.     #8, ' ':
  2439.       FDataLink.Edit;
  2440.     #27:
  2441.       FDataLink.Reset;
  2442.   end;
  2443. end;
  2444. procedure TbsSkinDBCheckRadioBox.SetValueCheck(const Value: string);
  2445. begin
  2446.   FValueCheck := Value;
  2447.   DataChange(Self);
  2448. end;
  2449. procedure TbsSkinDBCheckRadioBox.SetValueUncheck(const Value: string);
  2450. begin
  2451.   FValueUncheck := Value;
  2452.   DataChange(Self);
  2453. end;
  2454. procedure TbsSkinDBCheckRadioBox.WndProc(var Message: TMessage);
  2455. begin
  2456.   inherited;
  2457. end;
  2458. procedure TbsSkinDBCheckRadioBox.CMExit(var Message: TCMExit);
  2459. begin
  2460.   try
  2461.     FDataLink.UpdateRecord;
  2462.   except
  2463.     SetFocus;
  2464.     raise;
  2465.   end;
  2466.   inherited;
  2467. end;
  2468. procedure TbsSkinDBCheckRadioBox.CMGetDataLink(var Message: TMessage);
  2469. begin
  2470.   Message.Result := Integer(FDataLink);
  2471. end;
  2472. function TbsSkinDBCheckRadioBox.ExecuteAction(Action: TBasicAction): Boolean;
  2473. begin
  2474.   Result := inherited ExecuteAction(Action) or (FDataLink <> nil) and
  2475.     FDataLink.ExecuteAction(Action);
  2476. end;
  2477. function TbsSkinDBCheckRadioBox.UpdateAction(Action: TBasicAction): Boolean;
  2478. begin
  2479.   Result := inherited UpdateAction(Action) or (FDataLink <> nil) and
  2480.     FDataLink.UpdateAction(Action);
  2481. end;
  2482. { TbsSkinDBListBox }
  2483. constructor TbsSkinDBListBox.Create(AOwner: TComponent);
  2484. begin
  2485.   inherited Create(AOwner);
  2486.   FDataLink := TFieldDataLink.Create;
  2487.   FDataLink.Control := Self;
  2488.   FDataLink.OnDataChange := DataChange;
  2489.   FDataLink.OnUpdateData := UpdateData;
  2490.   OnCheckButtonClick := CheckButtonClick;
  2491. end;
  2492. destructor TbsSkinDBListBox.Destroy;
  2493. begin
  2494.   FDataLink.Free;
  2495.   FDataLink := nil;
  2496.   inherited Destroy;
  2497. end;
  2498. procedure TbsSkinDBListBox.Notification(AComponent: TComponent;
  2499.   Operation: TOperation);
  2500. begin
  2501.   inherited Notification(AComponent, Operation);
  2502.   if (Operation = opRemove) and (FDataLink <> nil) and
  2503.     (AComponent = DataSource) then DataSource := nil;
  2504. end;
  2505. function TbsSkinDBListBox.UseRightToLeftAlignment: Boolean;
  2506. begin
  2507.   Result := DBUseRightToLeftAlignment(Self, Field);
  2508. end;
  2509. procedure TbsSkinDBListBox.CheckButtonClick;
  2510. begin
  2511.   if ReadOnly or not FDataLink.CanModify or not ListBox.Focused then Exit;
  2512.   if FDataLink.Edit
  2513.   then
  2514.     FDataLink.Modified;
  2515.   try
  2516.     FDataLink.UpdateRecord;
  2517.   except
  2518.     SetFocus;
  2519.     raise;
  2520.   end;
  2521. end;
  2522. procedure TbsSkinDBListBox.DataChange(Sender: TObject);
  2523. begin
  2524.   if FDataLink.Field <> nil
  2525.   then
  2526.     ItemIndex := Items.IndexOf(FDataLink.Field.Text)
  2527.   else
  2528.     ItemIndex := -1;
  2529. end;
  2530. procedure TbsSkinDBListBox.UpdateData(Sender: TObject);
  2531. begin
  2532.   if ItemIndex >= 0 then
  2533.     FDataLink.Field.Text := Items[ItemIndex] else
  2534.     FDataLink.Field.Text := '';
  2535. end;
  2536. procedure TbsSkinDBListBox.ListBoxClick;
  2537. begin
  2538.   inherited;
  2539.   if FDataLink.Edit
  2540.   then
  2541.     FDataLink.Modified;
  2542. end;
  2543. function TbsSkinDBListBox.GetDataSource: TDataSource;
  2544. begin
  2545.   Result := FDataLink.DataSource;
  2546. end;
  2547. procedure TbsSkinDBListBox.SetDataSource(Value: TDataSource);
  2548. begin
  2549.   FDataLink.DataSource := Value;
  2550.   if Value <> nil then Value.FreeNotification(Self);
  2551. end;
  2552. function TbsSkinDBListBox.GetDataField: string;
  2553. begin
  2554.   Result := FDataLink.FieldName;
  2555. end;
  2556. procedure TbsSkinDBListBox.SetDataField(const Value: string);
  2557. begin
  2558.   FDataLink.FieldName := Value;
  2559. end;
  2560. function TbsSkinDBListBox.GetReadOnly: Boolean;
  2561. begin
  2562.   Result := FDataLink.ReadOnly;
  2563. end;
  2564. procedure TbsSkinDBListBox.SetReadOnly(Value: Boolean);
  2565. begin
  2566.   FDataLink.ReadOnly := Value;
  2567. end;
  2568. function TbsSkinDBListBox.GetField: TField;
  2569. begin
  2570.   Result := FDataLink.Field;
  2571. end;
  2572. procedure TbsSkinDBListBox.ListBoxKeyDown;
  2573. begin
  2574.   inherited;
  2575.   if Key in [VK_PRIOR, VK_NEXT, VK_END, VK_HOME, VK_LEFT, VK_UP,
  2576.     VK_RIGHT, VK_DOWN] then
  2577.     if not FDataLink.Edit then Key := 0;
  2578. end;
  2579. procedure TbsSkinDBListBox.ListBoxKeyPress;
  2580. begin
  2581.   inherited;
  2582.   case Key of
  2583.     #32..#255:
  2584.       if not FDataLink.Edit then Key := #0;
  2585.     #27:
  2586.       FDataLink.Reset;
  2587.   end;
  2588. end;
  2589. type
  2590.   TbsListBoxX = class(TbsListBox);
  2591. procedure TbsSkinDBListBox.ListBoxWProc(var Message: TMessage;
  2592.                                           var Handled: Boolean);
  2593. begin
  2594.   inherited;
  2595.   case Message.Msg of
  2596.     WM_LButtonDown:
  2597.     if not (csDesigning in ComponentState)
  2598.     then
  2599.       with TWMLButtonDown(Message) do
  2600.       begin
  2601.         if not FDataLink.Edit
  2602.         then
  2603.           begin
  2604.             ListBox.SetFocus;
  2605.             TbsListBoxX(ListBox).MouseDown(mbLeft, KeysToShiftState(Keys), XPos, YPos);
  2606.             Handled := False;
  2607.           end;
  2608.       end;
  2609.   end;
  2610. end;
  2611. procedure TbsSkinDBListBox.ListBoxExit;
  2612. begin
  2613.   try
  2614.     FDataLink.UpdateRecord;
  2615.   except
  2616.     SetFocus;
  2617.     raise;
  2618.   end;
  2619.   inherited;
  2620. end;
  2621. procedure TbsSkinDBListBox.SetItems(Value: TStrings);
  2622. begin
  2623.   Items.Assign(Value);
  2624.   DataChange(Self);
  2625. end;
  2626. function TbsSkinDBListBox.ExecuteAction(Action: TBasicAction): Boolean;
  2627. begin
  2628.   Result := inherited ExecuteAction(Action) or (FDataLink <> nil) and
  2629.     FDataLink.ExecuteAction(Action);
  2630. end;
  2631. function TbsSkinDBListBox.UpdateAction(Action: TBasicAction): Boolean;
  2632. begin
  2633.   Result := inherited UpdateAction(Action) or (FDataLink <> nil) and
  2634.     FDataLink.UpdateAction(Action);
  2635. end;
  2636. { TbsSkinDBComboBox }
  2637. constructor TbsSkinDBComboBox.Create(AOwner: TComponent);
  2638. begin
  2639.   inherited Create(AOwner);
  2640.   ControlStyle := ControlStyle + [csReplicatable];
  2641.   FDataLink := TFieldDataLink.Create;
  2642.   FDataLink.Control := Self;
  2643.   FDataLink.OnDataChange := DataChange;
  2644.   FDataLink.OnUpdateData := UpdateData;
  2645.   FInDataChange := True;
  2646.   FInDateSelfChange := False;
  2647. end;
  2648. destructor TbsSkinDBComboBox.Destroy;
  2649. begin
  2650.   FDataLink.Free;
  2651.   FDataLink := nil;
  2652.   inherited Destroy;
  2653. end;
  2654. procedure TbsSkinDBComboBox.Loaded;
  2655. begin
  2656.   inherited Loaded;
  2657.   if (csDesigning in ComponentState) then DataChange(Self);
  2658. end;
  2659. procedure TbsSkinDBComboBox.Notification(AComponent: TComponent;
  2660.   Operation: TOperation);
  2661. begin
  2662.   inherited Notification(AComponent, Operation);
  2663.   if (Operation = opRemove) and (FDataLink <> nil) and
  2664.     (AComponent = DataSource) then DataSource := nil;
  2665. end;
  2666. procedure TbsSkinDBComboBox.CreateWnd;
  2667. begin
  2668.   inherited CreateWnd;
  2669. end;
  2670. procedure TbsSkinDBComboBox.DataChange(Sender: TObject);
  2671. begin
  2672.   FInDataChange := True;
  2673.   if not FInDateSelfChange
  2674.   then
  2675.     begin
  2676.       if FDataLink.Field <> nil
  2677.       then
  2678.          SetComboText(FDataLink.Field.Text)
  2679.       else
  2680.         if csDesigning in ComponentState
  2681.         then
  2682.           SetComboText(Name)
  2683.         else
  2684.          SetComboText('');
  2685.     end;     
  2686.   FInDataChange := False;
  2687. end;
  2688. procedure TbsSkinDBComboBox.UpdateData(Sender: TObject);
  2689. begin
  2690.   FDataLink.Field.Text := GetComboText;
  2691. end;
  2692. procedure TbsSkinDBComboBox.SetComboText(const Value: string);
  2693. var
  2694.   I: Integer;
  2695.   Redraw: Boolean;
  2696. begin
  2697.   if Value <> GetComboText then
  2698.   begin
  2699.     if Style = bscbFixedStyle then
  2700.     begin
  2701.       Redraw := HandleAllocated;
  2702.       try
  2703.         if Value = '' then I := -1 else I := Items.IndexOf(Value);
  2704.         ItemIndex := I;
  2705.       finally
  2706.         if Redraw then Invalidate;
  2707.       end;
  2708.       if I >= 0 then Exit;
  2709.     end;
  2710.     if Style = bscbEditStyle then Text := Value;
  2711.   end;
  2712. end;
  2713. function TbsSkinDBComboBox.GetComboText: string;
  2714. var
  2715.   I: Integer;
  2716. begin
  2717.   if Style = bscbEditStyle then Result := Text else
  2718.   begin
  2719.     I := ItemIndex;
  2720.     if I < 0 then Result := '' else Result := Items[I];
  2721.   end;
  2722. end;
  2723. procedure TbsSkinDBComboBox.Change;
  2724. begin
  2725.   inherited;
  2726.   if not FInDataChange and not ReadOnly and FDataLink.CanModify
  2727.   then
  2728.     begin
  2729.       FInDateSelfChange := True;
  2730.       FDataLink.Edit;
  2731.       FDataLink.Modified;
  2732.       FInDateSelfChange := False;
  2733.     end;
  2734. end;
  2735. function TbsSkinDBComboBox.GetDataSource: TDataSource;
  2736. begin
  2737.   Result := FDataLink.DataSource;
  2738. end;
  2739. procedure TbsSkinDBComboBox.SetDataSource(Value: TDataSource);
  2740. begin
  2741.   if not (FDataLink.DataSourceFixed and (csLoading in ComponentState)) then
  2742.     FDataLink.DataSource := Value;
  2743.   if Value <> nil then Value.FreeNotification(Self);
  2744. end;
  2745. function TbsSkinDBComboBox.GetDataField: string;
  2746. begin
  2747.   Result := FDataLink.FieldName;
  2748. end;
  2749. procedure TbsSkinDBComboBox.SetDataField(const Value: string);
  2750. begin
  2751.   FDataLink.FieldName := Value;
  2752. end;
  2753. function TbsSkinDBComboBox.GetReadOnly: Boolean;
  2754. begin
  2755.   Result := FDataLink.ReadOnly;
  2756. end;
  2757. procedure TbsSkinDBComboBox.SetReadOnly(Value: Boolean);
  2758. begin
  2759.   FDataLink.ReadOnly := Value;
  2760. end;
  2761. function TbsSkinDBComboBox.GetField: TField;
  2762. begin
  2763.   Result := FDataLink.Field;
  2764. end;
  2765. procedure TbsSkinDBComboBox.EditWindowProcHook;
  2766. begin
  2767.   inherited;
  2768.   case Message.Msg of
  2769.     WM_SETFOCUS:
  2770.       begin
  2771.         if ReadOnly or not FDataLink.CanModify
  2772.         then FEdit.ReadOnly := True;
  2773.       end;
  2774.     WM_KILLFOCUS:
  2775.       begin
  2776.         try
  2777.           begin
  2778.             FDataLink.UpdateRecord;
  2779.           end;
  2780.         except
  2781.           raise;
  2782.         end;
  2783.       end;
  2784.   end;
  2785. end;
  2786. procedure TbsSkinDBComboBox.KeyDown(var Key: Word; Shift: TShiftState);
  2787. begin
  2788.   inherited KeyDown(Key, Shift);
  2789.   if Key in [VK_BACK, VK_DELETE, VK_UP, VK_DOWN, 32..255] then
  2790.   begin
  2791.     if not FDataLink.Edit and (Key in [VK_UP, VK_DOWN]) then
  2792.       Key := 0;
  2793.   end;
  2794. end;
  2795. procedure TbsSkinDBComboBox.KeyPress(var Key: Char);
  2796. begin
  2797.   inherited KeyPress(Key);
  2798.   if (Key in [#32..#255]) and (FDataLink.Field <> nil) and
  2799.     not FDataLink.Field.IsValidChar(Key) then
  2800.   begin
  2801.     MessageBeep(0);
  2802.     Key := #0;
  2803.   end;
  2804.   case Key of
  2805.     ^H, ^V, ^X, #32..#255:
  2806.       FDataLink.Edit;
  2807.     #27:
  2808.       begin
  2809.         FDataLink.Reset;
  2810.       end;
  2811.   end;
  2812. end;
  2813. procedure TbsSkinDBComboBox.CMEnter(var Message: TCMEnter);
  2814. begin
  2815.   inherited;
  2816. end;
  2817. procedure TbsSkinDBComboBox.CMExit(var Message: TCMExit);
  2818. begin
  2819.   try
  2820.     if ReadOnly or not FDataLink.CanModify
  2821.     then
  2822.       DataChange(Self)
  2823.     else
  2824.       FDataLink.UpdateRecord;
  2825.   except
  2826.     SetFocus;
  2827.     raise;
  2828.   end;
  2829.   inherited;
  2830. end;
  2831. procedure TbsSkinDBComboBox.SetItems(Value: TStrings);
  2832. begin
  2833.   Items.Assign(Value);
  2834.   DataChange(Self);
  2835. end;
  2836. function TbsSkinDBComboBox.UseRightToLeftAlignment: Boolean;
  2837. begin
  2838.   Result := DBUseRightToLeftAlignment(Self, Field);
  2839. end;
  2840. procedure TbsSkinDBComboBox.CMGetDatalink(var Message: TMessage);
  2841. begin
  2842.   Message.Result := Integer(FDataLink);
  2843. end;
  2844. function TbsSkinDBComboBox.ExecuteAction(Action: TBasicAction): Boolean;
  2845. begin
  2846.   Result := inherited ExecuteAction(Action) or (FDataLink <> nil) and
  2847.     FDataLink.ExecuteAction(Action);
  2848. end;
  2849. function TbsSkinDBComboBox.UpdateAction(Action: TBasicAction): Boolean;
  2850. begin
  2851.   Result := inherited UpdateAction(Action) or (FDataLink <> nil) and
  2852.     FDataLink.UpdateAction(Action);
  2853. end;
  2854. { TbsSkinDBNavigator }
  2855. var
  2856.   BtnTypeName: array[TbsNavigateBtn] of PChar = ('FIRST', 'PRIOR', 'NEXT',
  2857.     'LAST', 'INSERT', 'DELETE', 'EDIT', 'POST', 'CANCEL', 'REFRESH');
  2858.   BtnHints: array[TbsNavigateBtn] of String = ('FirstRecord', 'PriorRecord',
  2859.     'NextRecord', 'LastRecord', 'InsertRecord', 'DeleteRecord', 'EditRecord',
  2860.     'PostEdit', 'CancelEdit', 'RefreshRecord');
  2861. constructor TbsSkinDBNavigator.Create(AOwner: TComponent);
  2862. begin
  2863.   inherited Create(AOwner);
  2864.   ControlStyle := ControlStyle - [csAcceptsControls, csSetCaption] + [csOpaque];
  2865.   if not NewStyleControls then ControlStyle := ControlStyle + [csFramed];
  2866.   FSkinMessage := nil;
  2867.   FAdditionalGlyphs := False;
  2868.   FDataLink := TbsNavDataLink.Create(Self);
  2869.   FVisibleButtons := [nbFirst, nbPrior, nbNext, nbLast, nbInsert,
  2870.     nbDelete, nbEdit, nbPost, nbCancel, nbRefresh];
  2871.   FHints := TStringList.Create;
  2872.   TStringList(FHints).OnChange := HintsChanged;
  2873.   InitButtons;
  2874.   InitHints;
  2875.   Width := 241;
  2876.   Height := 25;
  2877.   ButtonWidth := 0;
  2878.   FConfirmDelete := True;
  2879.   BorderStyle := bvNone;
  2880.   FBtnSkinDataName := 'button';
  2881. end;
  2882. procedure  TbsSkinDBNavigator.SetAdditionalGlyphs;
  2883. var
  2884.   I: TbsNavigateBtn;
  2885.   ResName: String;
  2886. begin
  2887.   if Value <> FAdditionalGlyphs
  2888.   then
  2889.     begin
  2890.       FAdditionalGlyphs := Value;
  2891.       for I := Low(Buttons) to High(Buttons) do
  2892.       begin
  2893.         FmtStr(ResName, 'bsdbn_%s', [BtnTypeName[I]]);
  2894.         if FAdditionalGlyphs then ResName := ResName + '1';
  2895.         Buttons[I].Glyph.LoadFromResourceName(HInstance, ResName);
  2896.         Buttons[I].RePaint;
  2897.       end;
  2898.     end;  
  2899. end;
  2900. destructor TbsSkinDBNavigator.Destroy;
  2901. begin
  2902.   FDefHints.Free;
  2903.   FDataLink.Free;
  2904.   FHints.Free;
  2905.   FDataLink := nil;
  2906.   inherited Destroy;
  2907. end;
  2908. procedure TbsSkinDBNavigator.ChangeSkinData;
  2909. var
  2910.   i: Integer;
  2911. begin
  2912.   inherited;
  2913.   if (FIndex <> -1) and (GetResizeMode = 1) and (FBtnSkinDataName <> '')
  2914.   then
  2915.     begin
  2916.       i := SkinData.GetControlIndex(FBtnSkinDataName);
  2917.       if i <> -1
  2918.       then
  2919.         with TbsDataSkinButtonControl(FSD.CtrlList.Items[i]) do
  2920.         begin
  2921.           if (LBPoint.X = 0) and (LBPoint.Y = 0)
  2922.           then
  2923.             Height := SkinRect.Bottom - SkinRect.Top; 
  2924.         end;
  2925.     end;
  2926. end;
  2927. procedure TbsSkinDBNavigator.SetSkinData;
  2928. var
  2929.   I: TbsNavigateBtn;
  2930. begin
  2931.   inherited;
  2932.   for I := Low(Buttons) to High(Buttons) do
  2933.   with Buttons[I] do
  2934.   begin
  2935.     SkinData := Self.SkinData;
  2936.   end;
  2937. end;
  2938. procedure TbsSkinDBNavigator.SetBtnSkinDataName;
  2939. var
  2940.   I: TbsNavigateBtn;
  2941. begin
  2942.   FBtnSkinDataName := Value;
  2943.   for I := Low(Buttons) to High(Buttons) do
  2944.   with Buttons[I] do
  2945.   begin
  2946.     SkinDataName := FBtnSkinDataName;
  2947.   end;
  2948. end;
  2949. procedure TbsSkinDBNavigator.Paint;
  2950. begin
  2951.   if VisibleButtons = []
  2952.   then
  2953.     inherited;
  2954. end;
  2955. procedure TbsSkinDBNavigator.InitButtons;
  2956. var
  2957.   I: TbsNavigateBtn;
  2958.   Btn: TbsNavButton;
  2959.   X: Integer;
  2960.   ResName: string;
  2961. begin
  2962.   MinBtnSize := Point(20, 18);
  2963.   X := 0;
  2964.   for I := Low(Buttons) to High(Buttons) do
  2965.   begin
  2966.     Btn := TbsNavButton.Create (Self);
  2967.     Btn.CanFocused := True;
  2968.     Btn.Index := I;
  2969.     Btn.Visible := I in FVisibleButtons;
  2970.     Btn.Enabled := True;
  2971.     Btn.SetBounds (X, 0, MinBtnSize.X, MinBtnSize.Y);
  2972.     FmtStr(ResName, 'bsdbn_%s', [BtnTypeName[I]]);
  2973.     if FAdditionalGlyphs then ResName := ResName + '1';
  2974.     Btn.Glyph.LoadFromResourceName(HInstance, ResName);
  2975.     Btn.NumGlyphs := 2;
  2976.     Btn.Enabled := False;
  2977.     Btn.Enabled := True;
  2978.     Btn.OnClick := ClickHandler;
  2979.     Btn.Parent := Self;
  2980.     Buttons[I] := Btn;
  2981.     X := X + MinBtnSize.X;
  2982.   end;
  2983.   Buttons[nbPrior].NavStyle := Buttons[nbPrior].NavStyle + [nsAllowTimer];
  2984.   Buttons[nbNext].NavStyle  := Buttons[nbNext].NavStyle + [nsAllowTimer];
  2985. end;
  2986. procedure TbsSkinDBNavigator.InitHints;
  2987. var
  2988.   I: Integer;
  2989.   J: TbsNavigateBtn;
  2990. begin
  2991.   if not Assigned(FDefHints) then
  2992.   begin
  2993.     FDefHints := TStringList.Create;
  2994.     for J := Low(Buttons) to High(Buttons) do
  2995.       FDefHints.Add(BtnHints[J]);
  2996.   end;
  2997.   for J := Low(Buttons) to High(Buttons) do
  2998.     Buttons[J].Hint := FDefHints[Ord(J)];
  2999.   J := Low(Buttons);
  3000.   for I := 0 to (FHints.Count - 1) do
  3001.   begin
  3002.     if FHints.Strings[I] <> '' then Buttons[J].Hint := FHints.Strings[I];
  3003.     if J = High(Buttons) then Exit;
  3004.     Inc(J);
  3005.   end;
  3006. end;
  3007. procedure TbsSkinDBNavigator.HintsChanged(Sender: TObject);
  3008. begin
  3009.   InitHints;
  3010. end;
  3011. procedure TbsSkinDBNavigator.SetHints(Value: TStrings);
  3012. begin
  3013.   if Value.Text = FDefHints.Text then
  3014.     FHints.Clear else
  3015.     FHints.Assign(Value);
  3016. end;
  3017. function TbsSkinDBNavigator.GetHints: TStrings;
  3018. begin
  3019.   if (csDesigning in ComponentState) and not (csWriting in ComponentState) and
  3020.      not (csReading in ComponentState) and (FHints.Count = 0) then
  3021.     Result := FDefHints else
  3022.     Result := FHints;
  3023. end;
  3024. procedure TbsSkinDBNavigator.GetChildren(Proc: TGetChildProc; Root: TComponent);
  3025. begin
  3026. end;
  3027. procedure TbsSkinDBNavigator.Notification(AComponent: TComponent;
  3028.   Operation: TOperation);
  3029. begin
  3030.   inherited Notification(AComponent, Operation);
  3031.   if (Operation = opRemove) and (FDataLink <> nil) and
  3032.     (AComponent = DataSource) then DataSource := nil;
  3033.   if (Operation = opRemove) and (FSkinMessage <> nil) and
  3034.     (AComponent = FSkinMessage) then FSkinMessage := nil;
  3035. end;
  3036. procedure TbsSkinDBNavigator.SetVisible(Value: TbsButtonSet);
  3037. var
  3038.   I: TbsNavigateBtn;
  3039.   W, H: Integer;
  3040. begin
  3041.   W := Width;
  3042.   H := Height;
  3043.   FVisibleButtons := Value;
  3044.   for I := Low(Buttons) to High(Buttons) do
  3045.     Buttons[I].Visible := I in FVisibleButtons;
  3046.   SetSize(W, H);
  3047.   if (W <> Width) or (H <> Height) then
  3048.     inherited SetBounds (Left, Top, W, H);
  3049.   Invalidate;
  3050. end;
  3051. procedure TbsSkinDBNavigator.CalcMinSize(var W, H: Integer);
  3052. var
  3053.   Count: Integer;
  3054.   I: TbsNavigateBtn;
  3055. begin
  3056.   if (csLoading in ComponentState) then Exit;
  3057.   if Buttons[nbFirst] = nil then Exit;
  3058.   Count := 0;
  3059.   for I := Low(Buttons) to High(Buttons) do
  3060.     if Buttons[I].Visible then
  3061.       Inc(Count);
  3062.   if Count = 0 then Inc(Count);
  3063.   W := Max(W, Count * MinBtnSize.X);
  3064.   H := Max(H, MinBtnSize.Y);
  3065.   if Align = alNone then W := (W div Count) * Count;
  3066. end;
  3067. procedure TbsSkinDBNavigator.SetSize(var W: Integer; var H: Integer);
  3068. var
  3069.   Count: Integer;
  3070.   I: TbsNavigateBtn;
  3071.   Space, Temp, Remain: Integer;
  3072.   X: Integer;
  3073. begin
  3074.   if (csLoading in ComponentState) then Exit;
  3075.   if Buttons[nbFirst] = nil then Exit;
  3076.   CalcMinSize(W, H);
  3077.   Count := 0;
  3078.   for I := Low(Buttons) to High(Buttons) do
  3079.     if Buttons[I].Visible then
  3080.       Inc(Count);
  3081.   if Count = 0 then Inc(Count);
  3082.   ButtonWidth := W div Count;
  3083.   Temp := Count * ButtonWidth;
  3084.   if Align = alNone then W := Temp;
  3085.   X := 0;
  3086.   Remain := W - Temp;
  3087.   Temp := Count div 2;
  3088.   for I := Low(Buttons) to High(Buttons) do
  3089.   begin
  3090.     if Buttons[I].Visible then
  3091.     begin
  3092.       Space := 0;
  3093.       if Remain <> 0 then
  3094.       begin
  3095.         Dec(Temp, Remain);
  3096.         if Temp < 0 then
  3097.         begin
  3098.           Inc(Temp, Count);
  3099.           Space := 1;
  3100.         end;
  3101.       end;
  3102.       Buttons[I].SetBounds(X, 0, ButtonWidth + Space, Height);
  3103.       Inc(X, ButtonWidth + Space);
  3104.     end
  3105.     else
  3106.       Buttons[I].SetBounds (Width + 1, 0, ButtonWidth, Height);
  3107.   end;
  3108. end;
  3109. procedure TbsSkinDBNavigator.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
  3110. var
  3111.   W, H: Integer;
  3112. begin
  3113.   W := AWidth;
  3114.   H := AHeight;
  3115.   if not HandleAllocated then SetSize(W, H);
  3116.   inherited SetBounds (ALeft, ATop, W, H);
  3117. end;
  3118. procedure TbsSkinDBNavigator.WMSize(var Message: TWMSize);
  3119. var
  3120.   W, H: Integer;
  3121. begin
  3122.   inherited;
  3123.   W := Width;
  3124.   H := Height;
  3125.   SetSize(W, H);
  3126. end;
  3127. procedure TbsSkinDBNavigator.WMWindowPosChanging(var Message: TWMWindowPosChanging);
  3128. begin
  3129.   inherited;
  3130.   if (SWP_NOSIZE and Message.WindowPos.Flags) = 0 then
  3131.     CalcMinSize(Message.WindowPos.cx, Message.WindowPos.cy);
  3132. end;
  3133. procedure TbsSkinDBNavigator.ClickHandler(Sender: TObject);
  3134. begin
  3135.   BtnClick (TbsNavButton (Sender).Index);
  3136. end;
  3137. procedure TbsSkinDBNavigator.BtnClick(Index: TbsNavigateBtn);
  3138. begin
  3139.   if (DataSource <> nil) and (DataSource.State <> dsInactive) then
  3140.   begin
  3141.     if not (csDesigning in ComponentState) and Assigned(FBeforeAction) then
  3142.       FBeforeAction(Self, Index);
  3143.     with DataSource.DataSet do
  3144.     begin
  3145.       case Index of
  3146.         nbPrior: Prior;
  3147.         nbNext: Next;
  3148.         nbFirst: First;
  3149.         nbLast: Last;
  3150.         nbInsert: Insert;
  3151.         nbEdit: Edit;
  3152.         nbCancel: Cancel;
  3153.         nbPost: Post;
  3154.         nbRefresh: Refresh;
  3155.         nbDelete:
  3156.           if (FSkinMessage <> nil)
  3157.           then
  3158.             begin
  3159.               if not FConfirmDelete or
  3160.                 (FSkinMessage.MessageDlg('Delete record?', mtConfirmation,
  3161.                  [mbOK, mbCancel], 0) <> idCancel) then Delete;
  3162.             end
  3163.           else
  3164.             begin
  3165.               if not FConfirmDelete or
  3166.                 (MessageDlg('Delete record?', mtConfirmation,
  3167.                  mbOKCancel, 0) <> idCancel) then Delete;
  3168.             end;
  3169.       end;
  3170.     end;
  3171.   end;
  3172.   if not (csDesigning in ComponentState) and Assigned(FOnNavClick) then
  3173.     FOnNavClick(Self, Index);
  3174. end;
  3175. procedure TbsSkinDBNavigator.WMGetDlgCode(var Message: TWMGetDlgCode);
  3176. begin
  3177.   Message.Result := DLGC_WANTARROWS;
  3178. end;
  3179. procedure TbsSkinDBNavigator.DataChanged;
  3180. var
  3181.   UpEnable, DnEnable: Boolean;
  3182. begin
  3183.   UpEnable := Enabled and FDataLink.Active and not FDataLink.DataSet.BOF;
  3184.   DnEnable := Enabled and FDataLink.Active and not FDataLink.DataSet.EOF;
  3185.   Buttons[nbFirst].Enabled := UpEnable;
  3186.   Buttons[nbPrior].Enabled := UpEnable;
  3187.   Buttons[nbNext].Enabled := DnEnable;
  3188.   Buttons[nbLast].Enabled := DnEnable;
  3189.   Buttons[nbDelete].Enabled := Enabled and FDataLink.Active and
  3190.     FDataLink.DataSet.CanModify and
  3191.     not (FDataLink.DataSet.BOF and FDataLink.DataSet.EOF);
  3192. end;
  3193. procedure TbsSkinDBNavigator.EditingChanged;
  3194. var
  3195.   CanModify: Boolean;
  3196. begin
  3197.   CanModify := Enabled and FDataLink.Active and FDataLink.DataSet.CanModify;
  3198.   Buttons[nbInsert].Enabled := CanModify;
  3199.   Buttons[nbEdit].Enabled := CanModify and not FDataLink.Editing;
  3200.   Buttons[nbPost].Enabled := CanModify and FDataLink.Editing;
  3201.   Buttons[nbCancel].Enabled := CanModify and FDataLink.Editing;
  3202.   Buttons[nbRefresh].Enabled := CanModify;
  3203. end;
  3204. procedure TbsSkinDBNavigator.ActiveChanged;
  3205. var
  3206.   I: TbsNavigateBtn;
  3207. begin
  3208.   if not (Enabled and FDataLink.Active) then
  3209.     for I := Low(Buttons) to High(Buttons) do
  3210.       Buttons[I].Enabled := False
  3211.   else
  3212.   begin
  3213.     DataChanged;
  3214.     EditingChanged;
  3215.   end;
  3216. end;
  3217. procedure TbsSkinDBNavigator.CMEnabledChanged(var Message: TMessage);
  3218. begin
  3219.   inherited;
  3220.   if not (csLoading in ComponentState) then
  3221.     ActiveChanged;
  3222. end;
  3223. procedure TbsSkinDBNavigator.SetDataSource(Value: TDataSource);
  3224. begin
  3225.   FDataLink.DataSource := Value;
  3226.   if not (csLoading in ComponentState) then
  3227.     ActiveChanged;
  3228.   if Value <> nil then Value.FreeNotification(Self);
  3229. end;
  3230. function TbsSkinDBNavigator.GetDataSource: TDataSource;
  3231. begin
  3232.   Result := FDataLink.DataSource;
  3233. end;
  3234. procedure TbsSkinDBNavigator.Loaded;
  3235. var
  3236.   W, H: Integer;
  3237. begin
  3238.   inherited Loaded;
  3239.   W := Width;
  3240.   H := Height;
  3241.   SetSize(W, H);
  3242.   if (W <> Width) or (H <> Height) then
  3243.     inherited SetBounds (Left, Top, W, H);
  3244.   InitHints;
  3245.   ActiveChanged;
  3246. end;
  3247. {TbsNavButton}
  3248. destructor TbsNavButton.Destroy;
  3249. begin
  3250.   if FRepeatTimer <> nil then
  3251.     FRepeatTimer.Free;