| 1 | 
 | 
|---|
| 2 | {*****************************************************************************}
 | 
|---|
| 3 | {                                                                             }
 | 
|---|
| 4 | {    Tnt Delphi Unicode Controls                                              }
 | 
|---|
| 5 | {      http://www.tntware.com/delphicontrols/unicode/                         }
 | 
|---|
| 6 | {        Version: 2.3.0                                                       }
 | 
|---|
| 7 | {                                                                             }
 | 
|---|
| 8 | {    Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com)       }
 | 
|---|
| 9 | {                                                                             }
 | 
|---|
| 10 | {*****************************************************************************}
 | 
|---|
| 11 | 
 | 
|---|
| 12 | unit TntDBCtrls;
 | 
|---|
| 13 | 
 | 
|---|
| 14 | {$INCLUDE TntCompilers.inc}
 | 
|---|
| 15 | 
 | 
|---|
| 16 | interface
 | 
|---|
| 17 | 
 | 
|---|
| 18 | uses
 | 
|---|
| 19 |   Classes, Windows, Messages, DB, DBCtrls, Controls, StdCtrls,
 | 
|---|
| 20 |   TntClasses, TntStdCtrls, TntControls, TntComCtrls, TntExtCtrls;
 | 
|---|
| 21 | 
 | 
|---|
| 22 | type
 | 
|---|
| 23 | {TNT-WARN TPaintControl}
 | 
|---|
| 24 |   TTntPaintControl = class
 | 
|---|
| 25 |   private
 | 
|---|
| 26 |     FOwner: TWinControl;
 | 
|---|
| 27 |     FClassName: WideString;
 | 
|---|
| 28 |     FHandle: HWnd;
 | 
|---|
| 29 |     FObjectInstance: Pointer;
 | 
|---|
| 30 |     FDefWindowProc: Pointer;
 | 
|---|
| 31 |     FCtl3dButton: Boolean;
 | 
|---|
| 32 |     function GetHandle: HWnd;
 | 
|---|
| 33 |     procedure SetCtl3DButton(Value: Boolean);
 | 
|---|
| 34 |     procedure WndProc(var Message: TMessage);
 | 
|---|
| 35 |   public
 | 
|---|
| 36 |     constructor Create(AOwner: TWinControl; const ClassName: WideString);
 | 
|---|
| 37 |     destructor Destroy; override;
 | 
|---|
| 38 |     procedure DestroyHandle;
 | 
|---|
| 39 |     property Ctl3DButton: Boolean read FCtl3dButton write SetCtl3dButton;
 | 
|---|
| 40 |     property Handle: HWnd read GetHandle;
 | 
|---|
| 41 |   end;
 | 
|---|
| 42 | 
 | 
|---|
| 43 | type
 | 
|---|
| 44 | {TNT-WARN TDBEdit}
 | 
|---|
| 45 |   TTntDBEdit = class(TDBEdit{TNT-ALLOW TDBEdit})
 | 
|---|
| 46 |   private
 | 
|---|
| 47 |     InheritedDataChange: TNotifyEvent;
 | 
|---|
| 48 |     FPasswordChar: WideChar;
 | 
|---|
| 49 |     procedure DataChange(Sender: TObject);
 | 
|---|
| 50 |     procedure UpdateData(Sender: TObject);
 | 
|---|
| 51 |     function GetHint: WideString;
 | 
|---|
| 52 |     procedure SetHint(const Value: WideString);
 | 
|---|
| 53 |     function IsHintStored: Boolean;
 | 
|---|
| 54 |     procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
 | 
|---|
| 55 |     function GetTextMargins: TPoint;
 | 
|---|
| 56 |     function GetPasswordChar: WideChar;
 | 
|---|
| 57 |     procedure SetPasswordChar(const Value: WideChar);
 | 
|---|
| 58 |     procedure CMEnter(var Message: TCMEnter); message CM_ENTER;
 | 
|---|
| 59 |   private
 | 
|---|
| 60 |     function GetSelStart: Integer; reintroduce; virtual;
 | 
|---|
| 61 |     procedure SetSelStart(const Value: Integer); reintroduce; virtual;
 | 
|---|
| 62 |     function GetSelLength: Integer; reintroduce; virtual;
 | 
|---|
| 63 |     procedure SetSelLength(const Value: Integer); reintroduce; virtual;
 | 
|---|
| 64 |     function GetSelText: WideString; reintroduce;
 | 
|---|
| 65 |     procedure SetSelText(const Value: WideString);
 | 
|---|
| 66 |     function GetText: WideString;
 | 
|---|
| 67 |     procedure SetText(const Value: WideString);
 | 
|---|
| 68 |   protected
 | 
|---|
| 69 |     procedure CreateWindowHandle(const Params: TCreateParams); override;
 | 
|---|
| 70 |     procedure CreateWnd; override;
 | 
|---|
| 71 |     procedure DefineProperties(Filer: TFiler); override;
 | 
|---|
| 72 |     function GetActionLinkClass: TControlActionLinkClass; override;
 | 
|---|
| 73 |     procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override;
 | 
|---|
| 74 |   public
 | 
|---|
| 75 |     constructor Create(AOwner: TComponent); override;
 | 
|---|
| 76 |     property SelText: WideString read GetSelText write SetSelText;
 | 
|---|
| 77 |     property SelStart: Integer read GetSelStart write SetSelStart;
 | 
|---|
| 78 |     property SelLength: Integer read GetSelLength write SetSelLength;
 | 
|---|
| 79 |     property Text: WideString read GetText write SetText;
 | 
|---|
| 80 |   published
 | 
|---|
| 81 |     property Hint: WideString read GetHint write SetHint stored IsHintStored;
 | 
|---|
| 82 |     property PasswordChar: WideChar read GetPasswordChar write SetPasswordChar default #0;
 | 
|---|
| 83 |   end;
 | 
|---|
| 84 | 
 | 
|---|
| 85 | {TNT-WARN TDBText}
 | 
|---|
| 86 |   TTntDBText = class(TDBText{TNT-ALLOW TDBText})
 | 
|---|
| 87 |   private
 | 
|---|
| 88 |     FDataLink: TFieldDataLink;
 | 
|---|
| 89 |     InheritedDataChange: TNotifyEvent;
 | 
|---|
| 90 |     function GetHint: WideString;
 | 
|---|
| 91 |     procedure SetHint(const Value: WideString);
 | 
|---|
| 92 |     function IsHintStored: Boolean;
 | 
|---|
| 93 |     procedure CMHintShow(var Message: TMessage); message CM_HINTSHOW;
 | 
|---|
| 94 |     procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR;
 | 
|---|
| 95 |     function GetCaption: TWideCaption;
 | 
|---|
| 96 |     function IsCaptionStored: Boolean;
 | 
|---|
| 97 |     procedure SetCaption(const Value: TWideCaption);
 | 
|---|
| 98 |     function GetFieldText: WideString;
 | 
|---|
| 99 |     procedure DataChange(Sender: TObject);
 | 
|---|
| 100 |   protected
 | 
|---|
| 101 |     procedure DefineProperties(Filer: TFiler); override;
 | 
|---|
| 102 |     function GetLabelText: WideString; reintroduce; virtual;
 | 
|---|
| 103 |     function GetActionLinkClass: TControlActionLinkClass; override;
 | 
|---|
| 104 |     procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override;
 | 
|---|
| 105 |     procedure DoDrawText(var Rect: TRect; Flags: Longint); override;
 | 
|---|
| 106 |   public
 | 
|---|
| 107 |     constructor Create(AOwner: TComponent); override;
 | 
|---|
| 108 |     destructor Destroy; override;
 | 
|---|
| 109 |     property Caption: TWideCaption read GetCaption write SetCaption stored IsCaptionStored;
 | 
|---|
| 110 |   published
 | 
|---|
| 111 |     property Hint: WideString read GetHint write SetHint stored IsHintStored;
 | 
|---|
| 112 |   end;
 | 
|---|
| 113 | 
 | 
|---|
| 114 | {TNT-WARN TDBComboBox}
 | 
|---|
| 115 |   TTntCustomDBComboBox = class(TDBComboBox{TNT-ALLOW TDBComboBox},
 | 
|---|
| 116 |     IWideCustomListControl)
 | 
|---|
| 117 |   private
 | 
|---|
| 118 |     FDataLink: TFieldDataLink;
 | 
|---|
| 119 |     FFilter: WideString;
 | 
|---|
| 120 |     FLastTime: Cardinal;
 | 
|---|
| 121 |     procedure UpdateData(Sender: TObject);
 | 
|---|
| 122 |     procedure EditingChange(Sender: TObject);
 | 
|---|
| 123 |     procedure CMEnter(var Message: TCMEnter); message CM_ENTER;
 | 
|---|
| 124 |     procedure SetReadOnly;
 | 
|---|
| 125 |     function GetHint: WideString;
 | 
|---|
| 126 |     procedure SetHint(const Value: WideString);
 | 
|---|
| 127 |     function IsHintStored: Boolean;
 | 
|---|
| 128 |     procedure WMChar(var Message: TWMChar); message WM_CHAR;
 | 
|---|
| 129 |   private
 | 
|---|
| 130 |     FItems: TTntStrings;
 | 
|---|
| 131 |     FSaveItems: TTntStrings;
 | 
|---|
| 132 |     FSaveItemIndex: integer;
 | 
|---|
| 133 |     function GetItems: TTntStrings;
 | 
|---|
| 134 |     procedure SetItems(const Value: TTntStrings); reintroduce;
 | 
|---|
| 135 |     function GetSelStart: Integer;
 | 
|---|
| 136 |     procedure SetSelStart(const Value: Integer);
 | 
|---|
| 137 |     function GetSelLength: Integer;
 | 
|---|
| 138 |     procedure SetSelLength(const Value: Integer);
 | 
|---|
| 139 |     function GetSelText: WideString;
 | 
|---|
| 140 |     procedure SetSelText(const Value: WideString);
 | 
|---|
| 141 |     function GetText: WideString;
 | 
|---|
| 142 |     procedure SetText(const Value: WideString);
 | 
|---|
| 143 | 
 | 
|---|
| 144 |     procedure CNCommand(var Message: TWMCommand); message CN_COMMAND;
 | 
|---|
| 145 |   protected
 | 
|---|
| 146 |     procedure DataChange(Sender: TObject);
 | 
|---|
| 147 |     function GetAutoComplete_UniqueMatchOnly: Boolean; dynamic;
 | 
|---|
| 148 |     function GetAutoComplete_PreserveDataEntryCase: Boolean; dynamic;
 | 
|---|
| 149 |     procedure DoEditCharMsg(var Message: TWMChar); virtual;
 | 
|---|
| 150 |     function GetFieldValue: Variant; virtual;
 | 
|---|
| 151 |     procedure SetFieldValue(const Value: Variant); virtual;
 | 
|---|
| 152 |     function GetComboValue: Variant; virtual; abstract;
 | 
|---|
| 153 |     procedure SetComboValue(const Value: Variant); virtual; abstract;
 | 
|---|
| 154 |     {$IFDEF DELPHI_7} // fix for Delphi 7 only
 | 
|---|
| 155 |     function GetItemsClass: TCustomComboBoxStringsClass; override;
 | 
|---|
| 156 |     {$ENDIF}
 | 
|---|
| 157 |   protected
 | 
|---|
| 158 |     procedure CreateWindowHandle(const Params: TCreateParams); override;
 | 
|---|
| 159 |     procedure DefineProperties(Filer: TFiler); override;
 | 
|---|
| 160 |     function GetActionLinkClass: TControlActionLinkClass; override;
 | 
|---|
| 161 |     procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override;
 | 
|---|
| 162 |     procedure CreateWnd; override;
 | 
|---|
| 163 |     procedure DestroyWnd; override;
 | 
|---|
| 164 |     procedure WndProc(var Message: TMessage); override;
 | 
|---|
| 165 |     procedure ComboWndProc(var Message: TMessage; ComboWnd: HWnd; ComboProc: Pointer); override;
 | 
|---|
| 166 |     procedure KeyPress(var Key: AnsiChar); override;
 | 
|---|
| 167 |   public
 | 
|---|
| 168 |     constructor Create(AOwner: TComponent); override;
 | 
|---|
| 169 |     destructor Destroy; override;
 | 
|---|
| 170 |     procedure CopySelection(Destination: TCustomListControl); override;
 | 
|---|
| 171 |     procedure AddItem(const Item: WideString; AObject: TObject); reintroduce; virtual;
 | 
|---|
| 172 |   public
 | 
|---|
| 173 |     property SelText: WideString read GetSelText write SetSelText;
 | 
|---|
| 174 |     property SelStart: Integer read GetSelStart write SetSelStart;
 | 
|---|
| 175 |     property SelLength: Integer read GetSelLength write SetSelLength;
 | 
|---|
| 176 |     property Text: WideString read GetText write SetText;
 | 
|---|
| 177 |   published
 | 
|---|
| 178 |     property Hint: WideString read GetHint write SetHint stored IsHintStored;
 | 
|---|
| 179 |     property Items: TTntStrings read GetItems write SetItems;
 | 
|---|
| 180 |   end;
 | 
|---|
| 181 | 
 | 
|---|
| 182 |   TTntDBComboBox = class(TTntCustomDBComboBox)
 | 
|---|
| 183 |   protected
 | 
|---|
| 184 |     function GetFieldValue: Variant; override;
 | 
|---|
| 185 |     procedure SetFieldValue(const Value: Variant); override;
 | 
|---|
| 186 |     function GetComboValue: Variant; override;
 | 
|---|
| 187 |     procedure SetComboValue(const Value: Variant); override;
 | 
|---|
| 188 |   end;
 | 
|---|
| 189 | 
 | 
|---|
| 190 | type
 | 
|---|
| 191 | {TNT-WARN TDBCheckBox}
 | 
|---|
| 192 |   TTntDBCheckBox = class(TDBCheckBox{TNT-ALLOW TDBCheckBox})
 | 
|---|
| 193 |   private
 | 
|---|
| 194 |     function GetCaption: TWideCaption;
 | 
|---|
| 195 |     procedure SetCaption(const Value: TWideCaption);
 | 
|---|
| 196 |     function GetHint: WideString;
 | 
|---|
| 197 |     procedure SetHint(const Value: WideString);
 | 
|---|
| 198 |     function IsCaptionStored: Boolean;
 | 
|---|
| 199 |     function IsHintStored: Boolean;
 | 
|---|
| 200 |   protected
 | 
|---|
| 201 |     procedure CreateWindowHandle(const Params: TCreateParams); override;
 | 
|---|
| 202 |     procedure DefineProperties(Filer: TFiler); override;
 | 
|---|
| 203 |     function GetActionLinkClass: TControlActionLinkClass; override;
 | 
|---|
| 204 |     procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override;
 | 
|---|
| 205 |     procedure Toggle; override;
 | 
|---|
| 206 |   published
 | 
|---|
| 207 |     property Caption: TWideCaption read GetCaption write SetCaption stored IsCaptionStored;
 | 
|---|
| 208 |     property Hint: WideString read GetHint write SetHint stored IsHintStored;
 | 
|---|
| 209 |   end;
 | 
|---|
| 210 | 
 | 
|---|
| 211 | {TNT-WARN TDBRichEdit}
 | 
|---|
| 212 |   TTntDBRichEdit = class(TTntCustomRichEdit)
 | 
|---|
| 213 |   private
 | 
|---|
| 214 |     FDataLink: TFieldDataLink;
 | 
|---|
| 215 |     FAutoDisplay: Boolean;
 | 
|---|
| 216 |     FFocused: Boolean;
 | 
|---|
| 217 |     FMemoLoaded: Boolean;
 | 
|---|
| 218 |     FDataSave: AnsiString;
 | 
|---|
| 219 |     procedure BeginEditing;
 | 
|---|
| 220 |     procedure DataChange(Sender: TObject);
 | 
|---|
| 221 |     procedure EditingChange(Sender: TObject);
 | 
|---|
| 222 |     function GetDataField: WideString;
 | 
|---|
| 223 |     function GetDataSource: TDataSource;
 | 
|---|
| 224 |     function GetField: TField;
 | 
|---|
| 225 |     function GetReadOnly: Boolean;
 | 
|---|
| 226 |     procedure SetDataField(const Value: WideString);
 | 
|---|
| 227 |     procedure SetDataSource(Value: TDataSource);
 | 
|---|
| 228 |     procedure SetReadOnly(Value: Boolean);
 | 
|---|
| 229 |     procedure SetAutoDisplay(Value: Boolean);
 | 
|---|
| 230 |     procedure SetFocused(Value: Boolean);
 | 
|---|
| 231 |     procedure UpdateData(Sender: TObject);
 | 
|---|
| 232 |     procedure WMCut(var Message: TMessage); message WM_CUT;
 | 
|---|
| 233 |     procedure WMPaste(var Message: TMessage); message WM_PASTE;
 | 
|---|
| 234 |     procedure CMEnter(var Message: TCMEnter); message CM_ENTER;
 | 
|---|
| 235 |     procedure CMExit(var Message: TCMExit); message CM_EXIT;
 | 
|---|
| 236 |     procedure WMLButtonDblClk(var Message: TWMLButtonDblClk); message WM_LBUTTONDBLCLK;
 | 
|---|
| 237 |     procedure CMGetDataLink(var Message: TMessage); message CM_GETDATALINK;
 | 
|---|
| 238 |     procedure CNNotify(var Message: TWMNotify); message CN_NOTIFY;
 | 
|---|
| 239 |   protected
 | 
|---|
| 240 |     procedure InternalLoadMemo; dynamic;
 | 
|---|
| 241 |     procedure InternalSaveMemo; dynamic;
 | 
|---|
| 242 |   protected
 | 
|---|
| 243 |     procedure Change; override;
 | 
|---|
| 244 |     procedure KeyDown(var Key: Word; Shift: TShiftState); override;
 | 
|---|
| 245 |     procedure KeyPress(var Key: AnsiChar); override;
 | 
|---|
| 246 |     procedure Loaded; override;
 | 
|---|
| 247 |     procedure Notification(AComponent: TComponent; Operation: TOperation); override;
 | 
|---|
| 248 |   public
 | 
|---|
| 249 |     constructor Create(AOwner: TComponent); override;
 | 
|---|
| 250 |     destructor Destroy; override;
 | 
|---|
| 251 |     function ExecuteAction(Action: TBasicAction): Boolean; override;
 | 
|---|
| 252 |     procedure LoadMemo; virtual;
 | 
|---|
| 253 |     function UpdateAction(Action: TBasicAction): Boolean; override;
 | 
|---|
| 254 |     function UseRightToLeftAlignment: Boolean; override;
 | 
|---|
| 255 |     property Field: TField read GetField;
 | 
|---|
| 256 |   published
 | 
|---|
| 257 |     property Align;
 | 
|---|
| 258 |     property Alignment;
 | 
|---|
| 259 |     property Anchors;
 | 
|---|
| 260 |     property AutoDisplay: Boolean read FAutoDisplay write SetAutoDisplay default True;
 | 
|---|
| 261 |     property BevelEdges;
 | 
|---|
| 262 |     property BevelInner;
 | 
|---|
| 263 |     property BevelOuter;
 | 
|---|
| 264 |     property BevelKind;
 | 
|---|
| 265 |     property BevelWidth;
 | 
|---|
| 266 |     property BiDiMode;
 | 
|---|
| 267 |     property BorderStyle;
 | 
|---|
| 268 |     property Color;
 | 
|---|
| 269 |     property Constraints;
 | 
|---|
| 270 |     property Ctl3D;
 | 
|---|
| 271 |     property DataField: WideString read GetDataField write SetDataField;
 | 
|---|
| 272 |     property DataSource: TDataSource read GetDataSource write SetDataSource;
 | 
|---|
| 273 |     property DragCursor;
 | 
|---|
| 274 |     property DragKind;
 | 
|---|
| 275 |     property DragMode;
 | 
|---|
| 276 |     property Enabled;
 | 
|---|
| 277 |     property Font;
 | 
|---|
| 278 |     property HideSelection;
 | 
|---|
| 279 |     property HideScrollBars;
 | 
|---|
| 280 |     property ImeMode;
 | 
|---|
| 281 |     property ImeName;
 | 
|---|
| 282 |     property MaxLength;
 | 
|---|
| 283 |     property ParentBiDiMode;
 | 
|---|
| 284 |     property ParentColor;
 | 
|---|
| 285 |     property ParentCtl3D;
 | 
|---|
| 286 |     property ParentFont;
 | 
|---|
| 287 |     property ParentShowHint;
 | 
|---|
| 288 |     property PlainText;
 | 
|---|
| 289 |     property PopupMenu;
 | 
|---|
| 290 |     property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
 | 
|---|
| 291 |     property ScrollBars;
 | 
|---|
| 292 |     property ShowHint;
 | 
|---|
| 293 |     property TabOrder;
 | 
|---|
| 294 |     property TabStop;
 | 
|---|
| 295 |     property Visible;
 | 
|---|
| 296 |     property WantReturns;
 | 
|---|
| 297 |     property WantTabs;
 | 
|---|
| 298 |     property WordWrap;
 | 
|---|
| 299 |     property OnChange;
 | 
|---|
| 300 |     property OnClick;
 | 
|---|
| 301 |     property OnContextPopup;
 | 
|---|
| 302 |     property OnDblClick;
 | 
|---|
| 303 |     property OnDragDrop;
 | 
|---|
| 304 |     property OnDragOver;
 | 
|---|
| 305 |     property OnEndDock;
 | 
|---|
| 306 |     property OnEndDrag;
 | 
|---|
| 307 |     property OnEnter;
 | 
|---|
| 308 |     property OnExit;
 | 
|---|
| 309 |     property OnKeyDown;
 | 
|---|
| 310 |     property OnKeyPress;
 | 
|---|
| 311 |     property OnKeyUp;
 | 
|---|
| 312 |     {$IFDEF COMPILER_9_UP}
 | 
|---|
| 313 |     property OnMouseActivate;
 | 
|---|
| 314 |     {$ENDIF}
 | 
|---|
| 315 |     property OnMouseDown;
 | 
|---|
| 316 |     {$IFDEF COMPILER_10_UP}
 | 
|---|
| 317 |     property OnMouseEnter;
 | 
|---|
| 318 |     property OnMouseLeave;
 | 
|---|
| 319 |     {$ENDIF}
 | 
|---|
| 320 |     property OnMouseMove;
 | 
|---|
| 321 |     property OnMouseUp;
 | 
|---|
| 322 |     property OnResizeRequest;
 | 
|---|
| 323 |     property OnSelectionChange;
 | 
|---|
| 324 |     property OnProtectChange;
 | 
|---|
| 325 |     property OnSaveClipboard;
 | 
|---|
| 326 |     property OnStartDock;
 | 
|---|
| 327 |     property OnStartDrag;
 | 
|---|
| 328 |   end;
 | 
|---|
| 329 | 
 | 
|---|
| 330 | type
 | 
|---|
| 331 | {TNT-WARN TDBMemo}
 | 
|---|
| 332 |   TTntDBMemo = class(TTntCustomMemo)
 | 
|---|
| 333 |   private
 | 
|---|
| 334 |     FDataLink: TFieldDataLink;
 | 
|---|
| 335 |     FAutoDisplay: Boolean;
 | 
|---|
| 336 |     FFocused: Boolean;
 | 
|---|
| 337 |     FMemoLoaded: Boolean;
 | 
|---|
| 338 |     FPaintControl: TTntPaintControl;
 | 
|---|
| 339 |     procedure DataChange(Sender: TObject);
 | 
|---|
| 340 |     procedure EditingChange(Sender: TObject);
 | 
|---|
| 341 |     function GetDataField: WideString;
 | 
|---|
| 342 |     function GetDataSource: TDataSource;
 | 
|---|
| 343 |     function GetField: TField;
 | 
|---|
| 344 |     function GetReadOnly: Boolean;
 | 
|---|
| 345 |     procedure SetDataField(const Value: WideString);
 | 
|---|
| 346 |     procedure SetDataSource(Value: TDataSource);
 | 
|---|
| 347 |     procedure SetReadOnly(Value: Boolean);
 | 
|---|
| 348 |     procedure SetAutoDisplay(Value: Boolean);
 | 
|---|
| 349 |     procedure SetFocused(Value: Boolean);
 | 
|---|
| 350 |     procedure UpdateData(Sender: TObject);
 | 
|---|
| 351 |     procedure WMCut(var Message: TMessage); message WM_CUT;
 | 
|---|
| 352 |     procedure WMPaste(var Message: TMessage); message WM_PASTE;
 | 
|---|
| 353 |     procedure WMUndo(var Message: TMessage); message WM_UNDO;
 | 
|---|
| 354 |     procedure CMEnter(var Message: TCMEnter); message CM_ENTER;
 | 
|---|
| 355 |     procedure CMExit(var Message: TCMExit); message CM_EXIT;
 | 
|---|
| 356 |     procedure WMLButtonDblClk(var Message: TWMLButtonDblClk); message WM_LBUTTONDBLCLK;
 | 
|---|
| 357 |     procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
 | 
|---|
| 358 |     procedure CMGetDataLink(var Message: TMessage); message CM_GETDATALINK;
 | 
|---|
| 359 |   protected
 | 
|---|
| 360 |     procedure Change; override;
 | 
|---|
| 361 |     procedure KeyDown(var Key: Word; Shift: TShiftState); override;
 | 
|---|
| 362 |     procedure KeyPress(var Key: Char{TNT-ALLOW Char}); override;
 | 
|---|
| 363 |     procedure Loaded; override;
 | 
|---|
| 364 |     procedure Notification(AComponent: TComponent;
 | 
|---|
| 365 |       Operation: TOperation); override;
 | 
|---|
| 366 |     procedure WndProc(var Message: TMessage); override;
 | 
|---|
| 367 |   public
 | 
|---|
| 368 |     constructor Create(AOwner: TComponent); override;
 | 
|---|
| 369 |     destructor Destroy; override;
 | 
|---|
| 370 |     function ExecuteAction(Action: TBasicAction): Boolean; override;
 | 
|---|
| 371 |     procedure LoadMemo; virtual;
 | 
|---|
| 372 |     function UpdateAction(Action: TBasicAction): Boolean; override;
 | 
|---|
| 373 |     function UseRightToLeftAlignment: Boolean; override;
 | 
|---|
| 374 |     property Field: TField read GetField;
 | 
|---|
| 375 |   published
 | 
|---|
| 376 |     property Align;
 | 
|---|
| 377 |     property Alignment;
 | 
|---|
| 378 |     property Anchors;
 | 
|---|
| 379 |     property AutoDisplay: Boolean read FAutoDisplay write SetAutoDisplay default True;
 | 
|---|
| 380 |     property BevelEdges;
 | 
|---|
| 381 |     property BevelInner;
 | 
|---|
| 382 |     property BevelOuter;
 | 
|---|
| 383 |     property BevelKind;
 | 
|---|
| 384 |     property BevelWidth;
 | 
|---|
| 385 |     property BiDiMode;
 | 
|---|
| 386 |     property BorderStyle;
 | 
|---|
| 387 |     property Color;
 | 
|---|
| 388 |     property Constraints;
 | 
|---|
| 389 |     property Ctl3D;
 | 
|---|
| 390 |     property DataField: WideString read GetDataField write SetDataField;
 | 
|---|
| 391 |     property DataSource: TDataSource read GetDataSource write SetDataSource;
 | 
|---|
| 392 |     property DragCursor;
 | 
|---|
| 393 |     property DragKind;
 | 
|---|
| 394 |     property DragMode;
 | 
|---|
| 395 |     property Enabled;
 | 
|---|
| 396 |     property Font;
 | 
|---|
| 397 |     property HideSelection;    
 | 
|---|
| 398 |     property ImeMode;
 | 
|---|
| 399 |     property ImeName;
 | 
|---|
| 400 |     property MaxLength;
 | 
|---|
| 401 |     property ParentBiDiMode;
 | 
|---|
| 402 |     property ParentColor;
 | 
|---|
| 403 |     property ParentCtl3D;
 | 
|---|
| 404 |     property ParentFont;
 | 
|---|
| 405 |     property ParentShowHint;
 | 
|---|
| 406 |     property PopupMenu;
 | 
|---|
| 407 |     property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
 | 
|---|
| 408 |     property ScrollBars;
 | 
|---|
| 409 |     property ShowHint;
 | 
|---|
| 410 |     property TabOrder;
 | 
|---|
| 411 |     property TabStop;
 | 
|---|
| 412 |     property Visible;
 | 
|---|
| 413 |     property WantReturns;
 | 
|---|
| 414 |     property WantTabs;
 | 
|---|
| 415 |     property WordWrap;
 | 
|---|
| 416 |     property OnChange;
 | 
|---|
| 417 |     property OnClick;
 | 
|---|
| 418 |     property OnContextPopup;
 | 
|---|
| 419 |     property OnDblClick;
 | 
|---|
| 420 |     property OnDragDrop;
 | 
|---|
| 421 |     property OnDragOver;
 | 
|---|
| 422 |     property OnEndDock;
 | 
|---|
| 423 |     property OnEndDrag;
 | 
|---|
| 424 |     property OnEnter;
 | 
|---|
| 425 |     property OnExit;
 | 
|---|
| 426 |     property OnKeyDown;
 | 
|---|
| 427 |     property OnKeyPress;
 | 
|---|
| 428 |     property OnKeyUp;
 | 
|---|
| 429 |     {$IFDEF COMPILER_9_UP}
 | 
|---|
| 430 |     property OnMouseActivate;
 | 
|---|
| 431 |     {$ENDIF}
 | 
|---|
| 432 |     property OnMouseDown;
 | 
|---|
| 433 |     {$IFDEF COMPILER_10_UP}
 | 
|---|
| 434 |     property OnMouseEnter;
 | 
|---|
| 435 |     property OnMouseLeave;
 | 
|---|
| 436 |     {$ENDIF}
 | 
|---|
| 437 |     property OnMouseMove;
 | 
|---|
| 438 |     property OnMouseUp;
 | 
|---|
| 439 |     property OnStartDock;
 | 
|---|
| 440 |     property OnStartDrag;
 | 
|---|
| 441 |   end;
 | 
|---|
| 442 | 
 | 
|---|
| 443 | { TDBRadioGroup }
 | 
|---|
| 444 | type
 | 
|---|
| 445 |   TTntDBRadioGroup = class(TTntCustomRadioGroup)
 | 
|---|
| 446 |   private
 | 
|---|
| 447 |     FDataLink: TFieldDataLink;
 | 
|---|
| 448 |     FValue: WideString;
 | 
|---|
| 449 |     FValues: TTntStrings;
 | 
|---|
| 450 |     FInSetValue: Boolean;
 | 
|---|
| 451 |     FOnChange: TNotifyEvent;
 | 
|---|
| 452 |     procedure DataChange(Sender: TObject);
 | 
|---|
| 453 |     procedure UpdateData(Sender: TObject);
 | 
|---|
| 454 |     function GetDataField: WideString;
 | 
|---|
| 455 |     function GetDataSource: TDataSource;
 | 
|---|
| 456 |     function GetField: TField;
 | 
|---|
| 457 |     function GetReadOnly: Boolean;
 | 
|---|
| 458 |     function GetButtonValue(Index: Integer): WideString;
 | 
|---|
| 459 |     procedure SetDataField(const Value: WideString);
 | 
|---|
| 460 |     procedure SetDataSource(Value: TDataSource);
 | 
|---|
| 461 |     procedure SetReadOnly(Value: Boolean);
 | 
|---|
| 462 |     procedure SetValue(const Value: WideString);
 | 
|---|
| 463 |     procedure SetItems(Value: TTntStrings);
 | 
|---|
| 464 |     procedure SetValues(Value: TTntStrings);
 | 
|---|
| 465 |     procedure CMExit(var Message: TCMExit); message CM_EXIT;
 | 
|---|
| 466 |     procedure CMGetDataLink(var Message: TMessage); message CM_GETDATALINK;
 | 
|---|
| 467 |   protected
 | 
|---|
| 468 |     procedure Change; dynamic;
 | 
|---|
| 469 |     procedure Click; override;
 | 
|---|
| 470 |     procedure KeyPress(var Key: Char{TNT-ALLOW Char}); override;
 | 
|---|
| 471 |     function CanModify: Boolean; override;
 | 
|---|
| 472 |     procedure Notification(AComponent: TComponent; Operation: TOperation); override;
 | 
|---|
| 473 |     property DataLink: TFieldDataLink read FDataLink;
 | 
|---|
| 474 |   public
 | 
|---|
| 475 |     constructor Create(AOwner: TComponent); override;
 | 
|---|
| 476 |     destructor Destroy; override;
 | 
|---|
| 477 |     function ExecuteAction(Action: TBasicAction): Boolean; override;
 | 
|---|
| 478 |     function UpdateAction(Action: TBasicAction): Boolean; override;
 | 
|---|
| 479 |     function UseRightToLeftAlignment: Boolean; override;
 | 
|---|
| 480 |     property Field: TField read GetField;
 | 
|---|
| 481 |     property ItemIndex;
 | 
|---|
| 482 |     property Value: WideString read FValue write SetValue;
 | 
|---|
| 483 |   published
 | 
|---|
| 484 |     property Align;
 | 
|---|
| 485 |     property Anchors;
 | 
|---|
| 486 |     property BiDiMode;
 | 
|---|
| 487 |     property Caption;
 | 
|---|
| 488 |     property Color;
 | 
|---|
| 489 |     property Columns;
 | 
|---|
| 490 |     property Constraints;
 | 
|---|
| 491 |     property Ctl3D;
 | 
|---|
| 492 |     property DataField: WideString read GetDataField write SetDataField;
 | 
|---|
| 493 |     property DataSource: TDataSource read GetDataSource write SetDataSource;
 | 
|---|
| 494 |     property DragCursor;
 | 
|---|
| 495 |     property DragKind;
 | 
|---|
| 496 |     property DragMode;
 | 
|---|
| 497 |     property Enabled;
 | 
|---|
| 498 |     property Font;
 | 
|---|
| 499 |     property Items write SetItems;
 | 
|---|
| 500 |     {$IFDEF COMPILER_7_UP}
 | 
|---|
| 501 |     property ParentBackground;
 | 
|---|
| 502 |     {$ENDIF}
 | 
|---|
| 503 |     property ParentBiDiMode;
 | 
|---|
| 504 |     property ParentColor;
 | 
|---|
| 505 |     property ParentCtl3D;
 | 
|---|
| 506 |     property ParentFont;
 | 
|---|
| 507 |     property ParentShowHint;
 | 
|---|
| 508 |     property PopupMenu;
 | 
|---|
| 509 |     property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
 | 
|---|
| 510 |     property ShowHint;
 | 
|---|
| 511 |     property TabOrder;
 | 
|---|
| 512 |     property TabStop;
 | 
|---|
| 513 |     property Values: TTntStrings read FValues write SetValues;
 | 
|---|
| 514 |     property Visible;
 | 
|---|
| 515 |     property OnChange: TNotifyEvent read FOnChange write FOnChange;
 | 
|---|
| 516 |     property OnClick;
 | 
|---|
| 517 |     property OnContextPopup;
 | 
|---|
| 518 |     property OnDragDrop;
 | 
|---|
| 519 |     property OnDragOver;
 | 
|---|
| 520 |     property OnEndDock;
 | 
|---|
| 521 |     property OnEndDrag;
 | 
|---|
| 522 |     property OnEnter;
 | 
|---|
| 523 |     property OnExit;
 | 
|---|
| 524 |     {$IFDEF COMPILER_10_UP}
 | 
|---|
| 525 |     property OnMouseEnter;
 | 
|---|
| 526 |     property OnMouseLeave;
 | 
|---|
| 527 |     {$ENDIF}
 | 
|---|
| 528 |     property OnStartDock;
 | 
|---|
| 529 |     property OnStartDrag;
 | 
|---|
| 530 |   end;
 | 
|---|
| 531 | 
 | 
|---|
| 532 | implementation
 | 
|---|
| 533 | 
 | 
|---|
| 534 | uses
 | 
|---|
| 535 |   Forms, SysUtils, Graphics, Variants, TntDB,
 | 
|---|
| 536 |   TntActnList, TntGraphics, TntSysUtils, RichEdit, Mask;
 | 
|---|
| 537 | 
 | 
|---|
| 538 | function FieldIsBlobLike(Field: TField): Boolean;
 | 
|---|
| 539 | begin
 | 
|---|
| 540 |   Result := False;
 | 
|---|
| 541 |   if Assigned(Field) then begin
 | 
|---|
| 542 |     if (Field.IsBlob)
 | 
|---|
| 543 |     or (Field.DataType in [Low(TBlobType).. High(TBlobType)]) then
 | 
|---|
| 544 |       Result := True
 | 
|---|
| 545 |     else if (Field is TWideStringField{TNT-ALLOW TWideStringField})
 | 
|---|
| 546 |     and (Field.Size = MaxInt) then
 | 
|---|
| 547 |       Result := True; { wide string field filling in for a blob field }
 | 
|---|
| 548 |   end;
 | 
|---|
| 549 | end;
 | 
|---|
| 550 | 
 | 
|---|
| 551 | { TTntPaintControl }
 | 
|---|
| 552 | 
 | 
|---|
| 553 | type
 | 
|---|
| 554 |   TAccessWinControl = class(TWinControl);
 | 
|---|
| 555 | 
 | 
|---|
| 556 | constructor TTntPaintControl.Create(AOwner: TWinControl; const ClassName: WideString);
 | 
|---|
| 557 | begin
 | 
|---|
| 558 |   FOwner := AOwner;
 | 
|---|
| 559 |   FClassName := ClassName;
 | 
|---|
| 560 | end;
 | 
|---|
| 561 | 
 | 
|---|
| 562 | destructor TTntPaintControl.Destroy;
 | 
|---|
| 563 | begin
 | 
|---|
| 564 |   DestroyHandle;
 | 
|---|
| 565 | end;
 | 
|---|
| 566 | 
 | 
|---|
| 567 | procedure TTntPaintControl.DestroyHandle;
 | 
|---|
| 568 | begin
 | 
|---|
| 569 |   if FHandle <> 0 then DestroyWindow(FHandle);
 | 
|---|
| 570 |   Classes.FreeObjectInstance(FObjectInstance);
 | 
|---|
| 571 |   FHandle := 0;
 | 
|---|
| 572 |   FObjectInstance := nil;
 | 
|---|
| 573 | end;
 | 
|---|
| 574 | 
 | 
|---|
| 575 | function TTntPaintControl.GetHandle: HWnd;
 | 
|---|
| 576 | var
 | 
|---|
| 577 |   Params: TCreateParams;
 | 
|---|
| 578 | begin
 | 
|---|
| 579 |   if FHandle = 0 then
 | 
|---|
| 580 |   begin
 | 
|---|
| 581 |     FObjectInstance := Classes.MakeObjectInstance(WndProc);
 | 
|---|
| 582 |     TAccessWinControl(FOwner).CreateParams(Params);
 | 
|---|
| 583 |     Params.Style := Params.Style and not (WS_HSCROLL or WS_VSCROLL);
 | 
|---|
| 584 |     if (not Win32PlatformIsUnicode) then begin
 | 
|---|
| 585 |       with Params do
 | 
|---|
| 586 |         FHandle := CreateWindowEx(ExStyle, PAnsiChar(AnsiString(FClassName)),
 | 
|---|
| 587 |           PAnsiChar(TAccessWinControl(FOwner).Text), Style or WS_VISIBLE,
 | 
|---|
| 588 |           X, Y, Width, Height, Application.Handle, 0, HInstance, nil);
 | 
|---|
| 589 |       FDefWindowProc := Pointer(GetWindowLong(FHandle, GWL_WNDPROC));
 | 
|---|
| 590 |       SetWindowLong(FHandle, GWL_WNDPROC, Integer(FObjectInstance));
 | 
|---|
| 591 |     end else begin
 | 
|---|
| 592 |       with Params do
 | 
|---|
| 593 |         FHandle := CreateWindowExW(ExStyle, PWideChar(FClassName),
 | 
|---|
| 594 |           PWideChar(TntControl_GetText(FOwner)), Style or WS_VISIBLE,
 | 
|---|
| 595 |           X, Y, Width, Height, Application.Handle, 0, HInstance, nil);
 | 
|---|
| 596 |       FDefWindowProc := Pointer(GetWindowLongW(FHandle, GWL_WNDPROC));
 | 
|---|
| 597 |       SetWindowLongW(FHandle, GWL_WNDPROC, Integer(FObjectInstance));
 | 
|---|
| 598 |     end;
 | 
|---|
| 599 |     SendMessage(FHandle, WM_SETFONT, Integer(TAccessWinControl(FOwner).Font.Handle), 1);
 | 
|---|
| 600 |   end;
 | 
|---|
| 601 |   Result := FHandle;
 | 
|---|
| 602 | end;
 | 
|---|
| 603 | 
 | 
|---|
| 604 | procedure TTntPaintControl.SetCtl3DButton(Value: Boolean);
 | 
|---|
| 605 | begin
 | 
|---|
| 606 |   if FHandle <> 0 then DestroyHandle;
 | 
|---|
| 607 |   FCtl3DButton := Value;
 | 
|---|
| 608 | end;
 | 
|---|
| 609 | 
 | 
|---|
| 610 | procedure TTntPaintControl.WndProc(var Message: TMessage);
 | 
|---|
| 611 | begin
 | 
|---|
| 612 |   with Message do
 | 
|---|
| 613 |     if (Msg >= CN_CTLCOLORMSGBOX) and (Msg <= CN_CTLCOLORSTATIC) then
 | 
|---|
| 614 |       Result := FOwner.Perform(Msg, WParam, LParam)
 | 
|---|
| 615 |     else if (not Win32PlatformIsUnicode) then
 | 
|---|
| 616 |       Result := CallWindowProcA(FDefWindowProc, FHandle, Msg, WParam, LParam)
 | 
|---|
| 617 |     else
 | 
|---|
| 618 |       Result := CallWindowProcW(FDefWindowProc, FHandle, Msg, WParam, LParam);
 | 
|---|
| 619 | end;
 | 
|---|
| 620 | 
 | 
|---|
| 621 | { THackFieldDataLink }
 | 
|---|
| 622 | type
 | 
|---|
| 623 |   THackFieldDataLink_D6_D7_D9 = class(TDataLink)
 | 
|---|
| 624 |   protected
 | 
|---|
| 625 |     FxxxField: TField;
 | 
|---|
| 626 |     FxxxFieldName: string{TNT-ALLOW string};
 | 
|---|
| 627 |     FxxxControl: TComponent;
 | 
|---|
| 628 |     FxxxEditing: Boolean;
 | 
|---|
| 629 |     FModified: Boolean;
 | 
|---|
| 630 |   end;
 | 
|---|
| 631 | 
 | 
|---|
| 632 | {$IFDEF COMPILER_6}  // verified against VCL source in Delphi 6 and BCB 6
 | 
|---|
| 633 |   THackFieldDataLink = THackFieldDataLink_D6_D7_D9;
 | 
|---|
| 634 | {$ENDIF}
 | 
|---|
| 635 | {$IFDEF DELPHI_7}    // verified against VCL source in Delphi 7
 | 
|---|
| 636 |   THackFieldDataLink = THackFieldDataLink_D6_D7_D9;
 | 
|---|
| 637 | {$ENDIF}
 | 
|---|
| 638 | {$IFDEF DELPHI_9}    // verified against VCL source in Delphi 9
 | 
|---|
| 639 |   THackFieldDataLink = THackFieldDataLink_D6_D7_D9;
 | 
|---|
| 640 | {$ENDIF}
 | 
|---|
| 641 | {$IFDEF DELPHI_10}    // verified against VCL source in Delphi 10
 | 
|---|
| 642 |   THackFieldDataLink = class(TDataLink)
 | 
|---|
| 643 |   protected
 | 
|---|
| 644 |     FxxxField: TField;
 | 
|---|
| 645 |     FxxxFieldName: WideString;
 | 
|---|
| 646 |     FxxxControl: TComponent;
 | 
|---|
| 647 |     FxxxEditing: Boolean;
 | 
|---|
| 648 |     FModified: Boolean;
 | 
|---|
| 649 |   end;
 | 
|---|
| 650 | {$ENDIF}
 | 
|---|
| 651 | 
 | 
|---|
| 652 | { TTntDBEdit }
 | 
|---|
| 653 | 
 | 
|---|
| 654 | type
 | 
|---|
| 655 |   THackDBEdit_D6_D7_D9 = class(TCustomMaskEdit)
 | 
|---|
| 656 |   protected
 | 
|---|
| 657 |     FDataLink: TFieldDataLink;
 | 
|---|
| 658 |     FCanvas: TControlCanvas;
 | 
|---|
| 659 |     FAlignment: TAlignment;
 | 
|---|
| 660 |     FFocused: Boolean;
 | 
|---|
| 661 |   end;
 | 
|---|
| 662 | 
 | 
|---|
| 663 | {$IFDEF COMPILER_6}   // verified against VCL source in Delphi 6 and BCB 6
 | 
|---|
| 664 |   THackDBEdit = THackDBEdit_D6_D7_D9;
 | 
|---|
| 665 | {$ENDIF}
 | 
|---|
| 666 | {$IFDEF DELPHI_7}     // verified against VCL source in Delphi 7
 | 
|---|
| 667 |   THackDBEdit = THackDBEdit_D6_D7_D9;
 | 
|---|
| 668 | {$ENDIF}
 | 
|---|
| 669 | {$IFDEF DELPHI_9}     // verified against VCL source in Delphi 9
 | 
|---|
| 670 |   THackDBEdit = THackDBEdit_D6_D7_D9;
 | 
|---|
| 671 | {$ENDIF}
 | 
|---|
| 672 | {$IFDEF DELPHI_10}     // verified against VCL source in Delphi 10
 | 
|---|
| 673 |   THackDBEdit = THackDBEdit_D6_D7_D9;
 | 
|---|
| 674 | {$ENDIF}
 | 
|---|
| 675 | 
 | 
|---|
| 676 | constructor TTntDBEdit.Create(AOwner: TComponent);
 | 
|---|
| 677 | begin
 | 
|---|
| 678 |   inherited;
 | 
|---|
| 679 |   InheritedDataChange := THackDBEdit(Self).FDataLink.OnDataChange;
 | 
|---|
| 680 |   THackDBEdit(Self).FDataLink.OnDataChange := DataChange;
 | 
|---|
| 681 |   THackDBEdit(Self).FDataLink.OnUpdateData := UpdateData;
 | 
|---|
| 682 | end;
 | 
|---|
| 683 | 
 | 
|---|
| 684 | procedure TTntDBEdit.CreateWindowHandle(const Params: TCreateParams);
 | 
|---|
| 685 | begin
 | 
|---|
| 686 |   CreateUnicodeHandle(Self, Params, 'EDIT');
 | 
|---|
| 687 | end;
 | 
|---|
| 688 | 
 | 
|---|
| 689 | procedure TTntDBEdit.CreateWnd;
 | 
|---|
| 690 | begin
 | 
|---|
| 691 |   inherited;
 | 
|---|
| 692 |   TntCustomEdit_AfterInherited_CreateWnd(Self, FPasswordChar);
 | 
|---|
| 693 | end;
 | 
|---|
| 694 | 
 | 
|---|
| 695 | procedure TTntDBEdit.DefineProperties(Filer: TFiler);
 | 
|---|
| 696 | begin
 | 
|---|
| 697 |   inherited;
 | 
|---|
| 698 |   TntPersistent_AfterInherited_DefineProperties(Filer, Self);
 | 
|---|
| 699 | end;
 | 
|---|
| 700 | 
 | 
|---|
| 701 | function TTntDBEdit.GetSelStart: Integer;
 | 
|---|
| 702 | begin
 | 
|---|
| 703 |   Result := TntCustomEdit_GetSelStart(Self);
 | 
|---|
| 704 | end;
 | 
|---|
| 705 | 
 | 
|---|
| 706 | procedure TTntDBEdit.SetSelStart(const Value: Integer);
 | 
|---|
| 707 | begin
 | 
|---|
| 708 |   TntCustomEdit_SetSelStart(Self, Value);
 | 
|---|
| 709 | end;
 | 
|---|
| 710 | 
 | 
|---|
| 711 | function TTntDBEdit.GetSelLength: Integer;
 | 
|---|
| 712 | begin
 | 
|---|
| 713 |   Result := TntCustomEdit_GetSelLength(Self);
 | 
|---|
| 714 | end;
 | 
|---|
| 715 | 
 | 
|---|
| 716 | procedure TTntDBEdit.SetSelLength(const Value: Integer);
 | 
|---|
| 717 | begin
 | 
|---|
| 718 |   TntCustomEdit_SetSelLength(Self, Value);
 | 
|---|
| 719 | end;
 | 
|---|
| 720 | 
 | 
|---|
| 721 | function TTntDBEdit.GetSelText: WideString;
 | 
|---|
| 722 | begin
 | 
|---|
| 723 |   Result := TntCustomEdit_GetSelText(Self);
 | 
|---|
| 724 | end;
 | 
|---|
| 725 | 
 | 
|---|
| 726 | procedure TTntDBEdit.SetSelText(const Value: WideString);
 | 
|---|
| 727 | begin
 | 
|---|
| 728 |   TntCustomEdit_SetSelText(Self, Value);
 | 
|---|
| 729 | end;
 | 
|---|
| 730 | 
 | 
|---|
| 731 | function TTntDBEdit.GetPasswordChar: WideChar;
 | 
|---|
| 732 | begin
 | 
|---|
| 733 |   Result := TntCustomEdit_GetPasswordChar(Self, FPasswordChar)
 | 
|---|
| 734 | end;
 | 
|---|
| 735 | 
 | 
|---|
| 736 | procedure TTntDBEdit.SetPasswordChar(const Value: WideChar);
 | 
|---|
| 737 | begin
 | 
|---|
| 738 |   TntCustomEdit_SetPasswordChar(Self, FPasswordChar, Value);
 | 
|---|
| 739 | end;
 | 
|---|
| 740 | 
 | 
|---|
| 741 | function TTntDBEdit.GetText: WideString;
 | 
|---|
| 742 | begin
 | 
|---|
| 743 |   Result := TntControl_GetText(Self);
 | 
|---|
| 744 | end;
 | 
|---|
| 745 | 
 | 
|---|
| 746 | procedure TTntDBEdit.SetText(const Value: WideString);
 | 
|---|
| 747 | begin
 | 
|---|
| 748 |   TntControl_SetText(Self, Value);
 | 
|---|
| 749 | end;
 | 
|---|
| 750 | 
 | 
|---|
| 751 | procedure TTntDBEdit.DataChange(Sender: TObject);
 | 
|---|
| 752 | begin
 | 
|---|
| 753 |   with THackDBEdit(Self), Self do begin
 | 
|---|
| 754 |     if Field = nil then
 | 
|---|
| 755 |       InheritedDataChange(Sender)
 | 
|---|
| 756 |     else begin
 | 
|---|
| 757 |       if FAlignment <> Field.Alignment then
 | 
|---|
| 758 |       begin
 | 
|---|
| 759 |         EditText := '';  {forces update}
 | 
|---|
| 760 |         FAlignment := Field.Alignment;
 | 
|---|
| 761 |       end;
 | 
|---|
| 762 |       EditMask := Field.EditMask;
 | 
|---|
| 763 |       if not (csDesigning in ComponentState) then
 | 
|---|
| 764 |       begin
 | 
|---|
| 765 |         if (Field.DataType in [ftString, ftWideString]) and (MaxLength = 0) then
 | 
|---|
| 766 |           MaxLength := Field.Size;
 | 
|---|
| 767 |       end;
 | 
|---|
| 768 |       if FFocused and FDataLink.CanModify then
 | 
|---|
| 769 |         Text := GetWideText(Field)
 | 
|---|
| 770 |       else
 | 
|---|
| 771 |       begin
 | 
|---|
| 772 |         Text := GetWideDisplayText(Field);
 | 
|---|
| 773 |         if FDataLink.Editing and THackFieldDataLink(FDataLink).FModified then
 | 
|---|
| 774 |           Modified := True;
 | 
|---|
| 775 |       end;
 | 
|---|
| 776 |     end;
 | 
|---|
| 777 |   end;
 | 
|---|
| 778 | end;
 | 
|---|
| 779 | 
 | 
|---|
| 780 | procedure TTntDBEdit.UpdateData(Sender: TObject);
 | 
|---|
| 781 | begin
 | 
|---|
| 782 |   ValidateEdit;
 | 
|---|
| 783 |   SetWideText(Field, Text);
 | 
|---|
| 784 | end;
 | 
|---|
| 785 | 
 | 
|---|
| 786 | procedure TTntDBEdit.CMEnter(var Message: TCMEnter);
 | 
|---|
| 787 | var
 | 
|---|
| 788 |   SaveFarEast: Boolean;
 | 
|---|
| 789 | begin
 | 
|---|
| 790 |   SaveFarEast := SysLocale.FarEast;
 | 
|---|
| 791 |   try
 | 
|---|
| 792 |     SysLocale.FarEast := False;
 | 
|---|
| 793 |     inherited; // inherited tries to work around Win95 FarEast bug, but introduces others
 | 
|---|
| 794 |   finally
 | 
|---|
| 795 |     SysLocale.FarEast := SaveFarEast;
 | 
|---|
| 796 |   end;
 | 
|---|
| 797 | end;
 | 
|---|
| 798 | 
 | 
|---|
| 799 | function TTntDBEdit.IsHintStored: Boolean;
 | 
|---|
| 800 | begin
 | 
|---|
| 801 |   Result := TntControl_IsHintStored(Self);
 | 
|---|
| 802 | end;
 | 
|---|
| 803 | 
 | 
|---|
| 804 | function TTntDBEdit.GetHint: WideString;
 | 
|---|
| 805 | begin
 | 
|---|
| 806 |   Result := TntControl_GetHint(Self)
 | 
|---|
| 807 | end;
 | 
|---|
| 808 | 
 | 
|---|
| 809 | procedure TTntDBEdit.SetHint(const Value: WideString);
 | 
|---|
| 810 | begin
 | 
|---|
| 811 |   TntControl_SetHint(Self, Value);
 | 
|---|
| 812 | end;
 | 
|---|
| 813 | 
 | 
|---|
| 814 | procedure TTntDBEdit.ActionChange(Sender: TObject; CheckDefaults: Boolean);
 | 
|---|
| 815 | begin
 | 
|---|
| 816 |   TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults);
 | 
|---|
| 817 |   inherited;
 | 
|---|
| 818 | end;
 | 
|---|
| 819 | 
 | 
|---|
| 820 | function TTntDBEdit.GetActionLinkClass: TControlActionLinkClass;
 | 
|---|
| 821 | begin
 | 
|---|
| 822 |   Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass);
 | 
|---|
| 823 | end;
 | 
|---|
| 824 | 
 | 
|---|
| 825 | procedure TTntDBEdit.WMPaint(var Message: TWMPaint);
 | 
|---|
| 826 | const
 | 
|---|
| 827 |   AlignStyle : array[Boolean, TAlignment] of DWORD =
 | 
|---|
| 828 |    ((WS_EX_LEFT, WS_EX_RIGHT, WS_EX_LEFT),
 | 
|---|
| 829 |     (WS_EX_RIGHT, WS_EX_LEFT, WS_EX_LEFT));
 | 
|---|
| 830 | var
 | 
|---|
| 831 |   ALeft: Integer;
 | 
|---|
| 832 |   _Margins: TPoint;
 | 
|---|
| 833 |   R: TRect;
 | 
|---|
| 834 |   DC: HDC;
 | 
|---|
| 835 |   PS: TPaintStruct;
 | 
|---|
| 836 |   S: WideString;
 | 
|---|
| 837 |   AAlignment: TAlignment;
 | 
|---|
| 838 |   I: Integer;
 | 
|---|
| 839 | begin
 | 
|---|
| 840 |   with THackDBEdit(Self), Self do begin
 | 
|---|
| 841 |     AAlignment := FAlignment;
 | 
|---|
| 842 |     if UseRightToLeftAlignment then ChangeBiDiModeAlignment(AAlignment);
 | 
|---|
| 843 |     if ((AAlignment = taLeftJustify) or FFocused) and (not (csPaintCopy in ControlState))
 | 
|---|
| 844 |     or (not Win32PlatformIsUnicode) then
 | 
|---|
| 845 |     begin
 | 
|---|
| 846 |       inherited;
 | 
|---|
| 847 |       Exit;
 | 
|---|
| 848 |     end;
 | 
|---|
| 849 |   { Since edit controls do not handle justification unless multi-line (and
 | 
|---|
| 850 |     then only poorly) we will draw right and center justify manually unless
 | 
|---|
| 851 |     the edit has the focus. }
 | 
|---|
| 852 |     if FCanvas = nil then
 | 
|---|
| 853 |     begin
 | 
|---|
| 854 |       FCanvas := TControlCanvas.Create;
 | 
|---|
| 855 |       FCanvas.Control := Self;
 | 
|---|
| 856 |     end;
 | 
|---|
| 857 |     DC := Message.DC;
 | 
|---|
| 858 |     if DC = 0 then DC := BeginPaint(Handle, PS);
 | 
|---|
| 859 |     FCanvas.Handle := DC;
 | 
|---|
| 860 |     try
 | 
|---|
| 861 |       FCanvas.Font := Font;
 | 
|---|
| 862 |       with FCanvas do
 | 
|---|
| 863 |       begin
 | 
|---|
| 864 |         R := ClientRect;
 | 
|---|
| 865 |         if not (NewStyleControls and Ctl3D) and (BorderStyle = bsSingle) then
 | 
|---|
| 866 |         begin
 | 
|---|
| 867 |           Brush.Color := clWindowFrame;
 | 
|---|
| 868 |           FrameRect(R);
 | 
|---|
| 869 |           InflateRect(R, -1, -1);
 | 
|---|
| 870 |         end;
 | 
|---|
| 871 |         Brush.Color := Color;
 | 
|---|
| 872 |         if not Enabled then
 | 
|---|
| 873 |           Font.Color := clGrayText;
 | 
|---|
| 874 |         if (csPaintCopy in ControlState) and (Field <> nil) then
 | 
|---|
| 875 |         begin
 | 
|---|
| 876 |           S := GetWideDisplayText(Field);
 | 
|---|
| 877 |           case CharCase of
 | 
|---|
| 878 |             ecUpperCase:
 | 
|---|
| 879 |               S := Tnt_WideUpperCase(S);
 | 
|---|
| 880 |             ecLowerCase:
 | 
|---|
| 881 |               S := Tnt_WideLowerCase(S);
 | 
|---|
| 882 |           end;
 | 
|---|
| 883 |         end else
 | 
|---|
| 884 |           S := Text { EditText? };
 | 
|---|
| 885 |         if PasswordChar <> #0 then
 | 
|---|
| 886 |           for I := 1 to Length(S) do S[I] := PasswordChar;
 | 
|---|
| 887 |         _Margins := GetTextMargins;
 | 
|---|
| 888 |         case AAlignment of
 | 
|---|
| 889 |           taLeftJustify: ALeft := _Margins.X;
 | 
|---|
| 890 |           taRightJustify: ALeft := ClientWidth - WideCanvasTextWidth(FCanvas, S) - _Margins.X - 1;
 | 
|---|
| 891 |         else
 | 
|---|
| 892 |           ALeft := (ClientWidth - WideCanvasTextWidth(FCanvas, S)) div 2;
 | 
|---|
| 893 |         end;
 | 
|---|
| 894 |         if SysLocale.MiddleEast then UpdateTextFlags;
 | 
|---|
| 895 |         WideCanvasTextRect(FCanvas, R, ALeft, _Margins.Y, S);
 | 
|---|
| 896 |       end;
 | 
|---|
| 897 |     finally
 | 
|---|
| 898 |       FCanvas.Handle := 0;
 | 
|---|
| 899 |       if Message.DC = 0 then EndPaint(Handle, PS);
 | 
|---|
| 900 |     end;
 | 
|---|
| 901 |   end;
 | 
|---|
| 902 | end;
 | 
|---|
| 903 | 
 | 
|---|
| 904 | function TTntDBEdit.GetTextMargins: TPoint;
 | 
|---|
| 905 | var
 | 
|---|
| 906 |   DC: HDC;
 | 
|---|
| 907 |   SaveFont: HFont;
 | 
|---|
| 908 |   I: Integer;
 | 
|---|
| 909 |   SysMetrics, Metrics: TTextMetric;
 | 
|---|
| 910 | begin
 | 
|---|
| 911 |   if NewStyleControls then
 | 
|---|
| 912 |   begin
 | 
|---|
| 913 |     if BorderStyle = bsNone then I := 0 else
 | 
|---|
| 914 |       if Ctl3D then I := 1 else I := 2;
 | 
|---|
| 915 |     Result.X := SendMessage(Handle, EM_GETMARGINS, 0, 0) and $0000FFFF + I;
 | 
|---|
| 916 |     Result.Y := I;
 | 
|---|
| 917 |   end else
 | 
|---|
| 918 |   begin
 | 
|---|
| 919 |     if BorderStyle = bsNone then I := 0 else
 | 
|---|
| 920 |     begin
 | 
|---|
| 921 |       DC := GetDC(0);
 | 
|---|
| 922 |       GetTextMetrics(DC, SysMetrics);
 | 
|---|
| 923 |       SaveFont := SelectObject(DC, Font.Handle);
 | 
|---|
| 924 |       GetTextMetrics(DC, Metrics);
 | 
|---|
| 925 |       SelectObject(DC, SaveFont);
 | 
|---|
| 926 |       ReleaseDC(0, DC);
 | 
|---|
| 927 |       I := SysMetrics.tmHeight;
 | 
|---|
| 928 |       if I > Metrics.tmHeight then I := Metrics.tmHeight;
 | 
|---|
| 929 |       I := I div 4;
 | 
|---|
| 930 |     end;
 | 
|---|
| 931 |     Result.X := I;
 | 
|---|
| 932 |     Result.Y := I;
 | 
|---|
| 933 |   end;
 | 
|---|
| 934 | end;
 | 
|---|
| 935 | 
 | 
|---|
| 936 | { TTntDBText }
 | 
|---|
| 937 | 
 | 
|---|
| 938 | constructor TTntDBText.Create(AOwner: TComponent);
 | 
|---|
| 939 | begin
 | 
|---|
| 940 |   inherited;
 | 
|---|
| 941 |   FDataLink := TDataLink(Perform(CM_GETDATALINK, 0, 0)) as TFieldDataLink;
 | 
|---|
| 942 |   InheritedDataChange := FDataLink.OnDataChange;
 | 
|---|
| 943 |   FDataLink.OnDataChange := DataChange;
 | 
|---|
| 944 | end;
 | 
|---|
| 945 | 
 | 
|---|
| 946 | destructor TTntDBText.Destroy;
 | 
|---|
| 947 | begin
 | 
|---|
| 948 |   FDataLink := nil;
 | 
|---|
| 949 |   inherited;
 | 
|---|
| 950 | end;
 | 
|---|
| 951 | 
 | 
|---|
| 952 | procedure TTntDBText.CMDialogChar(var Message: TCMDialogChar);
 | 
|---|
| 953 | begin
 | 
|---|
| 954 |   TntLabel_CMDialogChar(Self, Message, Caption);
 | 
|---|
| 955 | end;
 | 
|---|
| 956 | 
 | 
|---|
| 957 | function TTntDBText.IsCaptionStored: Boolean;
 | 
|---|
| 958 | begin
 | 
|---|
| 959 |   Result := TntControl_IsCaptionStored(Self)
 | 
|---|
| 960 | end;
 | 
|---|
| 961 | 
 | 
|---|
| 962 | function TTntDBText.GetCaption: TWideCaption;
 | 
|---|
| 963 | begin
 | 
|---|
| 964 |   Result := TntControl_GetText(Self);
 | 
|---|
| 965 | end;
 | 
|---|
| 966 | 
 | 
|---|
| 967 | procedure TTntDBText.SetCaption(const Value: TWideCaption);
 | 
|---|
| 968 | begin
 | 
|---|
| 969 |   TntControl_SetText(Self, Value);
 | 
|---|
| 970 | end;
 | 
|---|
| 971 | 
 | 
|---|
| 972 | procedure TTntDBText.DefineProperties(Filer: TFiler);
 | 
|---|
| 973 | begin
 | 
|---|
| 974 |   inherited;
 | 
|---|
| 975 |   TntPersistent_AfterInherited_DefineProperties(Filer, Self);
 | 
|---|
| 976 | end;
 | 
|---|
| 977 | 
 | 
|---|
| 978 | function TTntDBText.GetLabelText: WideString;
 | 
|---|
| 979 | begin
 | 
|---|
| 980 |   if csPaintCopy in ControlState then
 | 
|---|
| 981 |     Result := GetFieldText
 | 
|---|
| 982 |   else
 | 
|---|
| 983 |     Result := Caption;
 | 
|---|
| 984 | end;
 | 
|---|
| 985 | 
 | 
|---|
| 986 | procedure TTntDBText.DoDrawText(var Rect: TRect; Flags: Integer);
 | 
|---|
| 987 | begin
 | 
|---|
| 988 |   if not TntLabel_DoDrawText(Self, Rect, Flags, GetLabelText) then
 | 
|---|
| 989 |     inherited;
 | 
|---|
| 990 | end;
 | 
|---|
| 991 | 
 | 
|---|
| 992 | function TTntDBText.IsHintStored: Boolean;
 | 
|---|
| 993 | begin
 | 
|---|
| 994 |   Result := TntControl_IsHintStored(Self);
 | 
|---|
| 995 | end;
 | 
|---|
| 996 | 
 | 
|---|
| 997 | function TTntDBText.GetHint: WideString;
 | 
|---|
| 998 | begin
 | 
|---|
| 999 |   Result := TntControl_GetHint(Self)
 | 
|---|
| 1000 | end;
 | 
|---|
| 1001 | 
 | 
|---|
| 1002 | procedure TTntDBText.SetHint(const Value: WideString);
 | 
|---|
| 1003 | begin
 | 
|---|
| 1004 |   TntControl_SetHint(Self, Value);
 | 
|---|
| 1005 | end;
 | 
|---|
| 1006 | 
 | 
|---|
| 1007 | procedure TTntDBText.CMHintShow(var Message: TMessage);
 | 
|---|
| 1008 | begin
 | 
|---|
| 1009 |   ProcessCMHintShowMsg(Message);
 | 
|---|
| 1010 |   inherited;
 | 
|---|
| 1011 | end;
 | 
|---|
| 1012 | 
 | 
|---|
| 1013 | procedure TTntDBText.ActionChange(Sender: TObject; CheckDefaults: Boolean);
 | 
|---|
| 1014 | begin
 | 
|---|
| 1015 |   TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults);
 | 
|---|
| 1016 |   inherited;
 | 
|---|
| 1017 | end;
 | 
|---|
| 1018 | 
 | 
|---|
| 1019 | function TTntDBText.GetActionLinkClass: TControlActionLinkClass;
 | 
|---|
| 1020 | begin
 | 
|---|
| 1021 |   Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass);
 | 
|---|
| 1022 | end;
 | 
|---|
| 1023 | 
 | 
|---|
| 1024 | function TTntDBText.GetFieldText: WideString;
 | 
|---|
| 1025 | begin
 | 
|---|
| 1026 |   if Field <> nil then
 | 
|---|
| 1027 |     Result := GetWideDisplayText(Field)
 | 
|---|
| 1028 |   else
 | 
|---|
| 1029 |     if csDesigning in ComponentState then Result := Name else Result := '';
 | 
|---|
| 1030 | end;
 | 
|---|
| 1031 | 
 | 
|---|
| 1032 | procedure TTntDBText.DataChange(Sender: TObject);
 | 
|---|
| 1033 | begin
 | 
|---|
| 1034 |   Caption := GetFieldText;
 | 
|---|
| 1035 | end;
 | 
|---|
| 1036 | 
 | 
|---|
| 1037 | { TTntCustomDBComboBox }
 | 
|---|
| 1038 | 
 | 
|---|
| 1039 | constructor TTntCustomDBComboBox.Create(AOwner: TComponent);
 | 
|---|
| 1040 | begin
 | 
|---|
| 1041 |   inherited;
 | 
|---|
| 1042 |   FItems := TTntComboBoxStrings.Create;
 | 
|---|
| 1043 |   TTntComboBoxStrings(FItems).ComboBox := Self;
 | 
|---|
| 1044 |   FDataLink := TDataLink(Perform(CM_GETDATALINK, 0, 0)) as TFieldDataLink;
 | 
|---|
| 1045 |   FDataLink.OnDataChange := DataChange;
 | 
|---|
| 1046 |   FDataLink.OnUpdateData := UpdateData;
 | 
|---|
| 1047 |   FDataLink.OnEditingChange := EditingChange;
 | 
|---|
| 1048 | end;
 | 
|---|
| 1049 | 
 | 
|---|
| 1050 | destructor TTntCustomDBComboBox.Destroy;
 | 
|---|
| 1051 | begin
 | 
|---|
| 1052 |   FreeAndNil(FItems);
 | 
|---|
| 1053 |   FreeAndNil(FSaveItems);
 | 
|---|
| 1054 |   FDataLink := nil;
 | 
|---|
| 1055 |   inherited;
 | 
|---|
| 1056 | end;
 | 
|---|
| 1057 | 
 | 
|---|
| 1058 | procedure TTntCustomDBComboBox.CreateWindowHandle(const Params: TCreateParams);
 | 
|---|
| 1059 | begin
 | 
|---|
| 1060 |   CreateUnicodeHandle(Self, Params, 'COMBOBOX');
 | 
|---|
| 1061 | end;
 | 
|---|
| 1062 | 
 | 
|---|
| 1063 | procedure TTntCustomDBComboBox.DefineProperties(Filer: TFiler);
 | 
|---|
| 1064 | begin
 | 
|---|
| 1065 |   inherited;
 | 
|---|
| 1066 |   TntPersistent_AfterInherited_DefineProperties(Filer, Self);
 | 
|---|
| 1067 | end;
 | 
|---|
| 1068 | 
 | 
|---|
| 1069 | type
 | 
|---|
| 1070 |   TAccessCustomComboBox = class(TCustomComboBox{TNT-ALLOW TCustomComboBox});
 | 
|---|
| 1071 | 
 | 
|---|
| 1072 | procedure TTntCustomDBComboBox.CreateWnd;
 | 
|---|
| 1073 | var
 | 
|---|
| 1074 |   PreInheritedAnsiText: AnsiString;
 | 
|---|
| 1075 | begin
 | 
|---|
| 1076 |   PreInheritedAnsiText := TAccessCustomComboBox(Self).Text;
 | 
|---|
| 1077 |   inherited;
 | 
|---|
| 1078 |   TntCombo_AfterInherited_CreateWnd(Self, Items, FSaveItems, FSaveItemIndex, PreInheritedAnsiText);
 | 
|---|
| 1079 | end;
 | 
|---|
| 1080 | 
 | 
|---|
| 1081 | procedure TTntCustomDBComboBox.DestroyWnd;
 | 
|---|
| 1082 | var
 | 
|---|
| 1083 |   SavedText: WideString;
 | 
|---|
| 1084 | begin
 | 
|---|
| 1085 |   if not (csDestroyingHandle in ControlState) then begin { avoid recursion when parent is TToolBar and system font changes. }
 | 
|---|
| 1086 |     TntCombo_BeforeInherited_DestroyWnd(Self, Items, FSaveItems, ItemIndex, FSaveItemIndex, SavedText);
 | 
|---|
| 1087 |     inherited;
 | 
|---|
| 1088 |     TntControl_SetStoredText(Self, SavedText);
 | 
|---|
| 1089 |   end;
 | 
|---|
| 1090 | end;
 | 
|---|
| 1091 | 
 | 
|---|
| 1092 | procedure TTntCustomDBComboBox.SetReadOnly;
 | 
|---|
| 1093 | begin
 | 
|---|
| 1094 |   if (Style in [csDropDown, csSimple]) and HandleAllocated then
 | 
|---|
| 1095 |     SendMessage(EditHandle, EM_SETREADONLY, Ord(not FDataLink.CanModify), 0);
 | 
|---|
| 1096 | end;
 | 
|---|
| 1097 | 
 | 
|---|
| 1098 | procedure TTntCustomDBComboBox.EditingChange(Sender: TObject);
 | 
|---|
| 1099 | begin
 | 
|---|
| 1100 |   SetReadOnly;
 | 
|---|
| 1101 | end;
 | 
|---|
| 1102 | 
 | 
|---|
| 1103 | procedure TTntCustomDBComboBox.CMEnter(var Message: TCMEnter);
 | 
|---|
| 1104 | var
 | 
|---|
| 1105 |   SaveFarEast: Boolean;
 | 
|---|
| 1106 | begin
 | 
|---|
| 1107 |   SaveFarEast := SysLocale.FarEast;
 | 
|---|
| 1108 |   try
 | 
|---|
| 1109 |     SysLocale.FarEast := False;
 | 
|---|
| 1110 |     inherited; // inherited tries to work around Win95 FarEast bug, but introduces others
 | 
|---|
| 1111 |   finally
 | 
|---|
| 1112 |     SysLocale.FarEast := SaveFarEast;
 | 
|---|
| 1113 |   end;
 | 
|---|
| 1114 | end;
 | 
|---|
| 1115 | 
 | 
|---|
| 1116 | procedure TTntCustomDBComboBox.WndProc(var Message: TMessage);
 | 
|---|
| 1117 | begin
 | 
|---|
| 1118 |   if (not (csDesigning in ComponentState))
 | 
|---|
| 1119 |   and (Message.Msg = CB_SHOWDROPDOWN)
 | 
|---|
| 1120 |   and (Message.WParam = 0)
 | 
|---|
| 1121 |   and (not FDataLink.Editing) then begin
 | 
|---|
| 1122 |     DataChange(Self); {Restore text}
 | 
|---|
| 1123 |     Dispatch(Message); {Do NOT call inherited!}
 | 
|---|
| 1124 |   end else
 | 
|---|
| 1125 |     inherited WndProc(Message);
 | 
|---|
| 1126 | end;
 | 
|---|
| 1127 | 
 | 
|---|
| 1128 | procedure TTntCustomDBComboBox.ComboWndProc(var Message: TMessage; ComboWnd: HWnd; ComboProc: Pointer);
 | 
|---|
| 1129 | begin
 | 
|---|
| 1130 |   if not TntCombo_ComboWndProc(Self, Message, ComboWnd, ComboProc, DoEditCharMsg) then
 | 
|---|
| 1131 |     inherited;
 | 
|---|
| 1132 | end;
 | 
|---|
| 1133 | 
 | 
|---|
| 1134 | procedure TTntCustomDBComboBox.KeyPress(var Key: AnsiChar);
 | 
|---|
| 1135 | var
 | 
|---|
| 1136 |   SaveAutoComplete: Boolean;
 | 
|---|
| 1137 | begin
 | 
|---|
| 1138 |   TntCombo_BeforeKeyPress(Self, SaveAutoComplete);
 | 
|---|
| 1139 |   try
 | 
|---|
| 1140 |     inherited;
 | 
|---|
| 1141 |   finally
 | 
|---|
| 1142 |     TntCombo_AfterKeyPress(Self, SaveAutoComplete);
 | 
|---|
| 1143 |   end;
 | 
|---|
| 1144 | end;
 | 
|---|
| 1145 | 
 | 
|---|
| 1146 | procedure TTntCustomDBComboBox.DoEditCharMsg(var Message: TWMChar);
 | 
|---|
| 1147 | begin
 | 
|---|
| 1148 |   TntCombo_AutoCompleteKeyPress(Self, Items, Message,
 | 
|---|
| 1149 |     GetAutoComplete_UniqueMatchOnly, GetAutoComplete_PreserveDataEntryCase);
 | 
|---|
| 1150 | end;
 | 
|---|
| 1151 | 
 | 
|---|
| 1152 | procedure TTntCustomDBComboBox.WMChar(var Message: TWMChar);
 | 
|---|
| 1153 | begin
 | 
|---|
| 1154 |   TntCombo_AutoSearchKeyPress(Self, Items, Message, FFilter, FLastTime);
 | 
|---|
| 1155 |   inherited;
 | 
|---|
| 1156 | end;
 | 
|---|
| 1157 | 
 | 
|---|
| 1158 | function TTntCustomDBComboBox.GetItems: TTntStrings;
 | 
|---|
| 1159 | begin
 | 
|---|
| 1160 |   Result := FItems;
 | 
|---|
| 1161 | end;
 | 
|---|
| 1162 | 
 | 
|---|
| 1163 | procedure TTntCustomDBComboBox.SetItems(const Value: TTntStrings);
 | 
|---|
| 1164 | begin
 | 
|---|
| 1165 |   FItems.Assign(Value);
 | 
|---|
| 1166 |   DataChange(Self);
 | 
|---|
| 1167 | end;
 | 
|---|
| 1168 | 
 | 
|---|
| 1169 | function TTntCustomDBComboBox.GetSelStart: Integer;
 | 
|---|
| 1170 | begin
 | 
|---|
| 1171 |   Result := TntCombo_GetSelStart(Self);
 | 
|---|
| 1172 | end;
 | 
|---|
| 1173 | 
 | 
|---|
| 1174 | procedure TTntCustomDBComboBox.SetSelStart(const Value: Integer);
 | 
|---|
| 1175 | begin
 | 
|---|
| 1176 |   TntCombo_SetSelStart(Self, Value);
 | 
|---|
| 1177 | end;
 | 
|---|
| 1178 | 
 | 
|---|
| 1179 | function TTntCustomDBComboBox.GetSelLength: Integer;
 | 
|---|
| 1180 | begin
 | 
|---|
| 1181 |   Result := TntCombo_GetSelLength(Self);
 | 
|---|
| 1182 | end;
 | 
|---|
| 1183 | 
 | 
|---|
| 1184 | procedure TTntCustomDBComboBox.SetSelLength(const Value: Integer);
 | 
|---|
| 1185 | begin
 | 
|---|
| 1186 |   TntCombo_SetSelLength(Self, Value);
 | 
|---|
| 1187 | end;
 | 
|---|
| 1188 | 
 | 
|---|
| 1189 | function TTntCustomDBComboBox.GetSelText: WideString;
 | 
|---|
| 1190 | begin
 | 
|---|
| 1191 |   Result := TntCombo_GetSelText(Self);
 | 
|---|
| 1192 | end;
 | 
|---|
| 1193 | 
 | 
|---|
| 1194 | procedure TTntCustomDBComboBox.SetSelText(const Value: WideString);
 | 
|---|
| 1195 | begin
 | 
|---|
| 1196 |   TntCombo_SetSelText(Self, Value);
 | 
|---|
| 1197 | end;
 | 
|---|
| 1198 | 
 | 
|---|
| 1199 | function TTntCustomDBComboBox.GetText: WideString;
 | 
|---|
| 1200 | begin
 | 
|---|
| 1201 |   Result := TntControl_GetText(Self);
 | 
|---|
| 1202 | end;
 | 
|---|
| 1203 | 
 | 
|---|
| 1204 | procedure TTntCustomDBComboBox.SetText(const Value: WideString);
 | 
|---|
| 1205 | begin
 | 
|---|
| 1206 |   TntControl_SetText(Self, Value);
 | 
|---|
| 1207 | end;
 | 
|---|
| 1208 | 
 | 
|---|
| 1209 | procedure TTntCustomDBComboBox.CNCommand(var Message: TWMCommand);
 | 
|---|
| 1210 | begin
 | 
|---|
| 1211 |   if not TntCombo_CNCommand(Self, Items, Message) then
 | 
|---|
| 1212 |     inherited;
 | 
|---|
| 1213 | end;
 | 
|---|
| 1214 | 
 | 
|---|
| 1215 | function TTntCustomDBComboBox.GetFieldValue: Variant;
 | 
|---|
| 1216 | begin
 | 
|---|
| 1217 |   Result := Field.Value;
 | 
|---|
| 1218 | end;
 | 
|---|
| 1219 | 
 | 
|---|
| 1220 | procedure TTntCustomDBComboBox.SetFieldValue(const Value: Variant);
 | 
|---|
| 1221 | begin
 | 
|---|
| 1222 |   Field.Value := Value;
 | 
|---|
| 1223 | end;
 | 
|---|
| 1224 | 
 | 
|---|
| 1225 | procedure TTntCustomDBComboBox.DataChange(Sender: TObject);
 | 
|---|
| 1226 | begin
 | 
|---|
| 1227 |   if not (Style = csSimple) and DroppedDown then Exit;
 | 
|---|
| 1228 |   if Field <> nil then
 | 
|---|
| 1229 |     SetComboValue(GetFieldValue)
 | 
|---|
| 1230 |   else
 | 
|---|
| 1231 |     if csDesigning in ComponentState then
 | 
|---|
| 1232 |       SetComboValue(Name)
 | 
|---|
| 1233 |     else
 | 
|---|
| 1234 |       SetComboValue(Null);
 | 
|---|
| 1235 | end;
 | 
|---|
| 1236 | 
 | 
|---|
| 1237 | procedure TTntCustomDBComboBox.UpdateData(Sender: TObject);
 | 
|---|
| 1238 | begin
 | 
|---|
| 1239 |   SetFieldValue(GetComboValue);
 | 
|---|
| 1240 | end;
 | 
|---|
| 1241 | 
 | 
|---|
| 1242 | function TTntCustomDBComboBox.GetAutoComplete_PreserveDataEntryCase: Boolean;
 | 
|---|
| 1243 | begin
 | 
|---|
| 1244 |   Result := True;
 | 
|---|
| 1245 | end;
 | 
|---|
| 1246 | 
 | 
|---|
| 1247 | function TTntCustomDBComboBox.GetAutoComplete_UniqueMatchOnly: Boolean;
 | 
|---|
| 1248 | begin
 | 
|---|
| 1249 |   Result := False;
 | 
|---|
| 1250 | end;
 | 
|---|
| 1251 | 
 | 
|---|
| 1252 | function TTntCustomDBComboBox.IsHintStored: Boolean;
 | 
|---|
| 1253 | begin
 | 
|---|
| 1254 |   Result := TntControl_IsHintStored(Self);
 | 
|---|
| 1255 | end;
 | 
|---|
| 1256 | 
 | 
|---|
| 1257 | function TTntCustomDBComboBox.GetHint: WideString;
 | 
|---|
| 1258 | begin
 | 
|---|
| 1259 |   Result := TntControl_GetHint(Self)
 | 
|---|
| 1260 | end;
 | 
|---|
| 1261 | 
 | 
|---|
| 1262 | procedure TTntCustomDBComboBox.SetHint(const Value: WideString);
 | 
|---|
| 1263 | begin
 | 
|---|
| 1264 |   TntControl_SetHint(Self, Value);
 | 
|---|
| 1265 | end;
 | 
|---|
| 1266 | 
 | 
|---|
| 1267 | procedure TTntCustomDBComboBox.AddItem(const Item: WideString; AObject: TObject);
 | 
|---|
| 1268 | begin
 | 
|---|
| 1269 |   TntComboBox_AddItem(Items, Item, AObject);
 | 
|---|
| 1270 | end;
 | 
|---|
| 1271 | 
 | 
|---|
| 1272 | procedure TTntCustomDBComboBox.CopySelection(Destination: TCustomListControl);
 | 
|---|
| 1273 | begin
 | 
|---|
| 1274 |   TntComboBox_CopySelection(Items, ItemIndex, Destination);
 | 
|---|
| 1275 | end;
 | 
|---|
| 1276 | 
 | 
|---|
| 1277 | procedure TTntCustomDBComboBox.ActionChange(Sender: TObject; CheckDefaults: Boolean);
 | 
|---|
| 1278 | begin
 | 
|---|
| 1279 |   TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults);
 | 
|---|
| 1280 |   inherited;
 | 
|---|
| 1281 | end;
 | 
|---|
| 1282 | 
 | 
|---|
| 1283 | function TTntCustomDBComboBox.GetActionLinkClass: TControlActionLinkClass;
 | 
|---|
| 1284 | begin
 | 
|---|
| 1285 |   Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass);
 | 
|---|
| 1286 | end;
 | 
|---|
| 1287 | 
 | 
|---|
| 1288 | {$IFDEF DELPHI_7} // fix for Delphi 7 only
 | 
|---|
| 1289 | function TTntCustomDBComboBox.GetItemsClass: TCustomComboBoxStringsClass;
 | 
|---|
| 1290 | begin
 | 
|---|
| 1291 |   Result := TD7PatchedComboBoxStrings;
 | 
|---|
| 1292 | end;
 | 
|---|
| 1293 | {$ENDIF}
 | 
|---|
| 1294 | 
 | 
|---|
| 1295 | { TTntDBComboBox }
 | 
|---|
| 1296 | 
 | 
|---|
| 1297 | function TTntDBComboBox.GetFieldValue: Variant;
 | 
|---|
| 1298 | begin
 | 
|---|
| 1299 |   Result := GetWideText(Field);
 | 
|---|
| 1300 | end;
 | 
|---|
| 1301 | 
 | 
|---|
| 1302 | procedure TTntDBComboBox.SetFieldValue(const Value: Variant);
 | 
|---|
| 1303 | begin
 | 
|---|
| 1304 |   SetWideText(Field, Value);
 | 
|---|
| 1305 | end;
 | 
|---|
| 1306 | 
 | 
|---|
| 1307 | procedure TTntDBComboBox.SetComboValue(const Value: Variant);
 | 
|---|
| 1308 | var
 | 
|---|
| 1309 |   I: Integer;
 | 
|---|
| 1310 |   Redraw: Boolean;
 | 
|---|
| 1311 |   OldValue: WideString;
 | 
|---|
| 1312 |   NewValue: WideString;
 | 
|---|
| 1313 | begin
 | 
|---|
| 1314 |   OldValue := VarToWideStr(GetComboValue);
 | 
|---|
| 1315 |   NewValue := VarToWideStr(Value);
 | 
|---|
| 1316 | 
 | 
|---|
| 1317 |   if NewValue <> OldValue then
 | 
|---|
| 1318 |   begin
 | 
|---|
| 1319 |     if Style <> csDropDown then
 | 
|---|
| 1320 |     begin
 | 
|---|
| 1321 |       Redraw := (Style <> csSimple) and HandleAllocated;
 | 
|---|
| 1322 |       if Redraw then Items.BeginUpdate;
 | 
|---|
| 1323 |       try
 | 
|---|
| 1324 |         if NewValue = '' then I := -1 else I := Items.IndexOf(NewValue);
 | 
|---|
| 1325 |         ItemIndex := I;
 | 
|---|
| 1326 |       finally
 | 
|---|
| 1327 |         Items.EndUpdate;
 | 
|---|
| 1328 |       end;
 | 
|---|
| 1329 |       if I >= 0 then Exit;
 | 
|---|
| 1330 |     end;
 | 
|---|
| 1331 |     if Style in [csDropDown, csSimple] then Text := NewValue;
 | 
|---|
| 1332 |   end;
 | 
|---|
| 1333 | end;
 | 
|---|
| 1334 | 
 | 
|---|
| 1335 | function TTntDBComboBox.GetComboValue: Variant;
 | 
|---|
| 1336 | var
 | 
|---|
| 1337 |   I: Integer;
 | 
|---|
| 1338 | begin
 | 
|---|
| 1339 |   if Style in [csDropDown, csSimple] then Result := Text else
 | 
|---|
| 1340 |   begin
 | 
|---|
| 1341 |     I := ItemIndex;
 | 
|---|
| 1342 |     if I < 0 then Result := '' else Result := Items[I];
 | 
|---|
| 1343 |   end;
 | 
|---|
| 1344 | end;
 | 
|---|
| 1345 | 
 | 
|---|
| 1346 | { TTntDBCheckBox }
 | 
|---|
| 1347 | 
 | 
|---|
| 1348 | procedure TTntDBCheckBox.CreateWindowHandle(const Params: TCreateParams);
 | 
|---|
| 1349 | begin
 | 
|---|
| 1350 |   CreateUnicodeHandle(Self, Params, 'BUTTON');
 | 
|---|
| 1351 | end;
 | 
|---|
| 1352 | 
 | 
|---|
| 1353 | procedure TTntDBCheckBox.DefineProperties(Filer: TFiler);
 | 
|---|
| 1354 | begin
 | 
|---|
| 1355 |   inherited;
 | 
|---|
| 1356 |   TntPersistent_AfterInherited_DefineProperties(Filer, Self);
 | 
|---|
| 1357 | end;
 | 
|---|
| 1358 | 
 | 
|---|
| 1359 | function TTntDBCheckBox.IsCaptionStored: Boolean;
 | 
|---|
| 1360 | begin
 | 
|---|
| 1361 |   Result := TntControl_IsCaptionStored(Self);
 | 
|---|
| 1362 | end;
 | 
|---|
| 1363 | 
 | 
|---|
| 1364 | function TTntDBCheckBox.GetCaption: TWideCaption;
 | 
|---|
| 1365 | begin
 | 
|---|
| 1366 |   Result := TntControl_GetText(Self)
 | 
|---|
| 1367 | end;
 | 
|---|
| 1368 | 
 | 
|---|
| 1369 | procedure TTntDBCheckBox.SetCaption(const Value: TWideCaption);
 | 
|---|
| 1370 | begin
 | 
|---|
| 1371 |   TntControl_SetText(Self, Value);
 | 
|---|
| 1372 | end;
 | 
|---|
| 1373 | 
 | 
|---|
| 1374 | function TTntDBCheckBox.IsHintStored: Boolean;
 | 
|---|
| 1375 | begin
 | 
|---|
| 1376 |   Result := TntControl_IsHintStored(Self);
 | 
|---|
| 1377 | end;
 | 
|---|
| 1378 | 
 | 
|---|
| 1379 | function TTntDBCheckBox.GetHint: WideString;
 | 
|---|
| 1380 | begin
 | 
|---|
| 1381 |   Result := TntControl_GetHint(Self)
 | 
|---|
| 1382 | end;
 | 
|---|
| 1383 | 
 | 
|---|
| 1384 | procedure TTntDBCheckBox.SetHint(const Value: WideString);
 | 
|---|
| 1385 | begin
 | 
|---|
| 1386 |   TntControl_SetHint(Self, Value);
 | 
|---|
| 1387 | end;
 | 
|---|
| 1388 | 
 | 
|---|
| 1389 | procedure TTntDBCheckBox.Toggle;
 | 
|---|
| 1390 | var
 | 
|---|
| 1391 |   FDataLink: TDataLink;
 | 
|---|
| 1392 | begin
 | 
|---|
| 1393 |   inherited;
 | 
|---|
| 1394 |   FDataLink := TDataLink(Perform(CM_GETDATALINK, 0, 0)) as TFieldDataLink;
 | 
|---|
| 1395 |   FDataLink.UpdateRecord;
 | 
|---|
| 1396 | end;
 | 
|---|
| 1397 | 
 | 
|---|
| 1398 | procedure TTntDBCheckBox.ActionChange(Sender: TObject; CheckDefaults: Boolean);
 | 
|---|
| 1399 | begin
 | 
|---|
| 1400 |   TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults);
 | 
|---|
| 1401 |   inherited;
 | 
|---|
| 1402 | end;
 | 
|---|
| 1403 | 
 | 
|---|
| 1404 | function TTntDBCheckBox.GetActionLinkClass: TControlActionLinkClass;
 | 
|---|
| 1405 | begin
 | 
|---|
| 1406 |   Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass);
 | 
|---|
| 1407 | end;
 | 
|---|
| 1408 | 
 | 
|---|
| 1409 | { TTntDBRichEdit }
 | 
|---|
| 1410 | 
 | 
|---|
| 1411 | constructor TTntDBRichEdit.Create(AOwner: TComponent);
 | 
|---|
| 1412 | begin
 | 
|---|
| 1413 |   inherited Create(AOwner);
 | 
|---|
| 1414 |   inherited ReadOnly := True;
 | 
|---|
| 1415 |   FAutoDisplay := True;
 | 
|---|
| 1416 |   FDataLink := TFieldDataLink.Create;
 | 
|---|
| 1417 |   FDataLink.Control := Self;
 | 
|---|
| 1418 |   FDataLink.OnDataChange := DataChange;
 | 
|---|
| 1419 |   FDataLink.OnEditingChange := EditingChange;
 | 
|---|
| 1420 |   FDataLink.OnUpdateData := UpdateData;
 | 
|---|
| 1421 | end;
 | 
|---|
| 1422 | 
 | 
|---|
| 1423 | destructor TTntDBRichEdit.Destroy;
 | 
|---|
| 1424 | begin
 | 
|---|
| 1425 |   FDataLink.Free;
 | 
|---|
| 1426 |   FDataLink := nil;
 | 
|---|
| 1427 |   inherited Destroy;
 | 
|---|
| 1428 | end;
 | 
|---|
| 1429 | 
 | 
|---|
| 1430 | procedure TTntDBRichEdit.Loaded;
 | 
|---|
| 1431 | begin
 | 
|---|
| 1432 |   inherited Loaded;
 | 
|---|
| 1433 |   if (csDesigning in ComponentState) then
 | 
|---|
| 1434 |     DataChange(Self)
 | 
|---|
| 1435 | end;
 | 
|---|
| 1436 | 
 | 
|---|
| 1437 | procedure TTntDBRichEdit.Notification(AComponent: TComponent; Operation: TOperation);
 | 
|---|
| 1438 | begin
 | 
|---|
| 1439 |   inherited;
 | 
|---|
| 1440 |   if (Operation = opRemove) and (FDataLink <> nil) and
 | 
|---|
| 1441 |     (AComponent = DataSource) then DataSource := nil;
 | 
|---|
| 1442 | end;
 | 
|---|
| 1443 | 
 | 
|---|
| 1444 | function TTntDBRichEdit.UseRightToLeftAlignment: Boolean;
 | 
|---|
| 1445 | begin
 | 
|---|
| 1446 |   Result := DBUseRightToLeftAlignment(Self, Field);
 | 
|---|
| 1447 | end;
 | 
|---|
| 1448 | 
 | 
|---|
| 1449 | procedure TTntDBRichEdit.BeginEditing;
 | 
|---|
| 1450 | begin
 | 
|---|
| 1451 |   if not FDataLink.Editing then
 | 
|---|
| 1452 |   try
 | 
|---|
| 1453 |     if FieldIsBlobLike(Field) then
 | 
|---|
| 1454 |       FDataSave := Field.AsString{TNT-ALLOW AsString};
 | 
|---|
| 1455 |     FDataLink.Edit;
 | 
|---|
| 1456 |   finally
 | 
|---|
| 1457 |     FDataSave := '';
 | 
|---|
| 1458 |   end;
 | 
|---|
| 1459 | end;
 | 
|---|
| 1460 | 
 | 
|---|
| 1461 | procedure TTntDBRichEdit.KeyDown(var Key: Word; Shift: TShiftState);
 | 
|---|
| 1462 | begin
 | 
|---|
| 1463 |   inherited KeyDown(Key, Shift);
 | 
|---|
| 1464 |   if FMemoLoaded then
 | 
|---|
| 1465 |   begin
 | 
|---|
| 1466 |     if (Key = VK_DELETE) or (Key = VK_BACK) or
 | 
|---|
| 1467 |       ((Key = VK_INSERT) and (ssShift in Shift)) or
 | 
|---|
| 1468 |       (((Key = Ord('V')) or (Key = Ord('X'))) and (ssCtrl in Shift)) then
 | 
|---|
| 1469 |       BeginEditing;
 | 
|---|
| 1470 |   end;
 | 
|---|
| 1471 | end;
 | 
|---|
| 1472 | 
 | 
|---|
| 1473 | procedure TTntDBRichEdit.KeyPress(var Key: AnsiChar);
 | 
|---|
| 1474 | begin
 | 
|---|
| 1475 |   inherited KeyPress(Key);
 | 
|---|
| 1476 |   if FMemoLoaded then
 | 
|---|
| 1477 |   begin
 | 
|---|
| 1478 |     if (Key in [#32..#255]) and (Field <> nil) and
 | 
|---|
| 1479 |       not Field.IsValidChar(Key) then
 | 
|---|
| 1480 |     begin
 | 
|---|
| 1481 |       MessageBeep(0);
 | 
|---|
| 1482 |       Key := #0;
 | 
|---|
| 1483 |     end;
 | 
|---|
| 1484 |     case Key of
 | 
|---|
| 1485 |       ^H, ^I, ^J, ^M, ^V, ^X, #32..#255:
 | 
|---|
| 1486 |         BeginEditing;
 | 
|---|
| 1487 |       #27:
 | 
|---|
| 1488 |         FDataLink.Reset;
 | 
|---|
| 1489 |     end;
 | 
|---|
| 1490 |   end else
 | 
|---|
| 1491 |   begin
 | 
|---|
| 1492 |     if Key = #13 then LoadMemo;
 | 
|---|
| 1493 |     Key := #0;
 | 
|---|
| 1494 |   end;
 | 
|---|
| 1495 | end;
 | 
|---|
| 1496 | 
 | 
|---|
| 1497 | procedure TTntDBRichEdit.Change;
 | 
|---|
| 1498 | begin
 | 
|---|
| 1499 |   if FMemoLoaded then
 | 
|---|
| 1500 |     FDataLink.Modified;
 | 
|---|
| 1501 |   FMemoLoaded := True;
 | 
|---|
| 1502 |   inherited Change;
 | 
|---|
| 1503 | end;
 | 
|---|
| 1504 | 
 | 
|---|
| 1505 | procedure TTntDBRichEdit.CNNotify(var Message: TWMNotify);
 | 
|---|
| 1506 | begin
 | 
|---|
| 1507 |   inherited;
 | 
|---|
| 1508 |   if Message.NMHdr^.code = EN_PROTECTED then
 | 
|---|
| 1509 |     Message.Result := 0 { allow the operation (otherwise the control might appear stuck) }
 | 
|---|
| 1510 | end;
 | 
|---|
| 1511 | 
 | 
|---|
| 1512 | function TTntDBRichEdit.GetDataSource: TDataSource;
 | 
|---|
| 1513 | begin
 | 
|---|
| 1514 |   Result := FDataLink.DataSource;
 | 
|---|
| 1515 | end;
 | 
|---|
| 1516 | 
 | 
|---|
| 1517 | procedure TTntDBRichEdit.SetDataSource(Value: TDataSource);
 | 
|---|
| 1518 | begin
 | 
|---|
| 1519 |   FDataLink.DataSource := Value;
 | 
|---|
| 1520 |   if Value <> nil then Value.FreeNotification(Self);
 | 
|---|
| 1521 | end;
 | 
|---|
| 1522 | 
 | 
|---|
| 1523 | function TTntDBRichEdit.GetDataField: WideString;
 | 
|---|
| 1524 | begin
 | 
|---|
| 1525 |   Result := FDataLink.FieldName;
 | 
|---|
| 1526 | end;
 | 
|---|
| 1527 | 
 | 
|---|
| 1528 | procedure TTntDBRichEdit.SetDataField(const Value: WideString);
 | 
|---|
| 1529 | begin
 | 
|---|
| 1530 |   FDataLink.FieldName := Value;
 | 
|---|
| 1531 | end;
 | 
|---|
| 1532 | 
 | 
|---|
| 1533 | function TTntDBRichEdit.GetReadOnly: Boolean;
 | 
|---|
| 1534 | begin
 | 
|---|
| 1535 |   Result := FDataLink.ReadOnly;
 | 
|---|
| 1536 | end;
 | 
|---|
| 1537 | 
 | 
|---|
| 1538 | procedure TTntDBRichEdit.SetReadOnly(Value: Boolean);
 | 
|---|
| 1539 | begin
 | 
|---|
| 1540 |   FDataLink.ReadOnly := Value;
 | 
|---|
| 1541 | end;
 | 
|---|
| 1542 | 
 | 
|---|
| 1543 | function TTntDBRichEdit.GetField: TField;
 | 
|---|
| 1544 | begin
 | 
|---|
| 1545 |   Result := FDataLink.Field;
 | 
|---|
| 1546 | end;
 | 
|---|
| 1547 | 
 | 
|---|
| 1548 | procedure TTntDBRichEdit.InternalLoadMemo;
 | 
|---|
| 1549 | var
 | 
|---|
| 1550 |   Stream: TStringStream{TNT-ALLOW TStringStream};
 | 
|---|
| 1551 | begin
 | 
|---|
| 1552 |   if PlainText then
 | 
|---|
| 1553 |     Text := GetAsWideString(Field)
 | 
|---|
| 1554 |   else begin
 | 
|---|
| 1555 |     Stream := TStringStream{TNT-ALLOW TStringStream}.Create(Field.AsString{TNT-ALLOW AsString});
 | 
|---|
| 1556 |     try
 | 
|---|
| 1557 |       Lines.LoadFromStream(Stream);
 | 
|---|
| 1558 |     finally
 | 
|---|
| 1559 |       Stream.Free;
 | 
|---|
| 1560 |     end;
 | 
|---|
| 1561 |   end;
 | 
|---|
| 1562 | end;
 | 
|---|
| 1563 | 
 | 
|---|
| 1564 | procedure TTntDBRichEdit.LoadMemo;
 | 
|---|
| 1565 | begin
 | 
|---|
| 1566 |   if not FMemoLoaded and Assigned(Field) and FieldIsBlobLike(Field) then
 | 
|---|
| 1567 |   begin
 | 
|---|
| 1568 |     try
 | 
|---|
| 1569 |       InternalLoadMemo;
 | 
|---|
| 1570 |       FMemoLoaded := True;
 | 
|---|
| 1571 |     except
 | 
|---|
| 1572 |       { Rich Edit Load failure }
 | 
|---|
| 1573 |       on E:EOutOfResources do
 | 
|---|
| 1574 |         Lines.Text := WideFormat('(%s)', [E.Message]);
 | 
|---|
| 1575 |     end;
 | 
|---|
| 1576 |     EditingChange(Self);
 | 
|---|
| 1577 |   end;
 | 
|---|
| 1578 | end;
 | 
|---|
| 1579 | 
 | 
|---|
| 1580 | procedure TTntDBRichEdit.DataChange(Sender: TObject);
 | 
|---|
| 1581 | begin
 | 
|---|
| 1582 |   if Field <> nil then
 | 
|---|
| 1583 |     if FieldIsBlobLike(Field) then
 | 
|---|
| 1584 |     begin
 | 
|---|
| 1585 |       if FAutoDisplay or (FDataLink.Editing and FMemoLoaded) then
 | 
|---|
| 1586 |       begin
 | 
|---|
| 1587 |         { Check if the data has changed since we read it the first time }
 | 
|---|
| 1588 |         if (FDataSave <> '') and (FDataSave = Field.AsString{TNT-ALLOW AsString}) then Exit;
 | 
|---|
| 1589 |         FMemoLoaded := False;
 | 
|---|
| 1590 |         LoadMemo;
 | 
|---|
| 1591 |       end else
 | 
|---|
| 1592 |       begin
 | 
|---|
| 1593 |         Text := WideFormat('(%s)', [Field.DisplayName]);
 | 
|---|
| 1594 |         FMemoLoaded := False;
 | 
|---|
| 1595 |       end;
 | 
|---|
| 1596 |     end else
 | 
|---|
| 1597 |     begin
 | 
|---|
| 1598 |       if FFocused and FDataLink.CanModify then
 | 
|---|
| 1599 |         Text := GetWideText(Field)
 | 
|---|
| 1600 |       else
 | 
|---|
| 1601 |         Text := GetWideDisplayText(Field);
 | 
|---|
| 1602 |       FMemoLoaded := True;
 | 
|---|
| 1603 |     end
 | 
|---|
| 1604 |   else
 | 
|---|
| 1605 |   begin
 | 
|---|
| 1606 |     if csDesigning in ComponentState then Text := Name else Text := '';
 | 
|---|
| 1607 |     FMemoLoaded := False;
 | 
|---|
| 1608 |   end;
 | 
|---|
| 1609 |   if HandleAllocated then
 | 
|---|
| 1610 |     RedrawWindow(Handle, nil, 0, RDW_INVALIDATE or RDW_ERASE or RDW_FRAME);
 | 
|---|
| 1611 | end;
 | 
|---|
| 1612 | 
 | 
|---|
| 1613 | procedure TTntDBRichEdit.EditingChange(Sender: TObject);
 | 
|---|
| 1614 | begin
 | 
|---|
| 1615 |   inherited ReadOnly := not (FDataLink.Editing and FMemoLoaded);
 | 
|---|
| 1616 | end;
 | 
|---|
| 1617 | 
 | 
|---|
| 1618 | procedure TTntDBRichEdit.InternalSaveMemo;
 | 
|---|
| 1619 | var
 | 
|---|
| 1620 |   Stream: TStringStream{TNT-ALLOW TStringStream};
 | 
|---|
| 1621 | begin
 | 
|---|
| 1622 |   if PlainText then
 | 
|---|
| 1623 |     SetAsWideString(Field, Text)
 | 
|---|
| 1624 |   else begin
 | 
|---|
| 1625 |     Stream := TStringStream{TNT-ALLOW TStringStream}.Create('');
 | 
|---|
| 1626 |     try
 | 
|---|
| 1627 |       Lines.SaveToStream(Stream);
 | 
|---|
| 1628 |       Field.AsString{TNT-ALLOW AsString} := Stream.DataString;
 | 
|---|
| 1629 |     finally
 | 
|---|
| 1630 |       Stream.Free;
 | 
|---|
| 1631 |     end;
 | 
|---|
| 1632 |   end;
 | 
|---|
| 1633 | end;
 | 
|---|
| 1634 | 
 | 
|---|
| 1635 | procedure TTntDBRichEdit.UpdateData(Sender: TObject);
 | 
|---|
| 1636 | begin
 | 
|---|
| 1637 |   if FieldIsBlobLike(Field) then
 | 
|---|
| 1638 |     InternalSaveMemo
 | 
|---|
| 1639 |   else
 | 
|---|
| 1640 |     SetAsWideString(Field, Text);
 | 
|---|
| 1641 | end;
 | 
|---|
| 1642 | 
 | 
|---|
| 1643 | procedure TTntDBRichEdit.SetFocused(Value: Boolean);
 | 
|---|
| 1644 | begin
 | 
|---|
| 1645 |   if FFocused <> Value then
 | 
|---|
| 1646 |   begin
 | 
|---|
| 1647 |     FFocused := Value;
 | 
|---|
| 1648 |     if not Assigned(Field) or not FieldIsBlobLike(Field) then
 | 
|---|
| 1649 |       FDataLink.Reset;
 | 
|---|
| 1650 |   end;
 | 
|---|
| 1651 | end;
 | 
|---|
| 1652 | 
 | 
|---|
| 1653 | procedure TTntDBRichEdit.CMEnter(var Message: TCMEnter);
 | 
|---|
| 1654 | begin
 | 
|---|
| 1655 |   SetFocused(True);
 | 
|---|
| 1656 |   inherited;
 | 
|---|
| 1657 | end;
 | 
|---|
| 1658 | 
 | 
|---|
| 1659 | procedure TTntDBRichEdit.CMExit(var Message: TCMExit);
 | 
|---|
| 1660 | begin
 | 
|---|
| 1661 |   try
 | 
|---|
| 1662 |     FDataLink.UpdateRecord;
 | 
|---|
| 1663 |   except
 | 
|---|
| 1664 |     SetFocus;
 | 
|---|
| 1665 |     raise;
 | 
|---|
| 1666 |   end;
 | 
|---|
| 1667 |   SetFocused(False);
 | 
|---|
| 1668 |   inherited;
 | 
|---|
| 1669 | end;
 | 
|---|
| 1670 | 
 | 
|---|
| 1671 | procedure TTntDBRichEdit.SetAutoDisplay(Value: Boolean);
 | 
|---|
| 1672 | begin
 | 
|---|
| 1673 |   if FAutoDisplay <> Value then
 | 
|---|
| 1674 |   begin
 | 
|---|
| 1675 |     FAutoDisplay := Value;
 | 
|---|
| 1676 |     if Value then LoadMemo;
 | 
|---|
| 1677 |   end;
 | 
|---|
| 1678 | end;
 | 
|---|
| 1679 | 
 | 
|---|
| 1680 | procedure TTntDBRichEdit.WMLButtonDblClk(var Message: TWMLButtonDblClk);
 | 
|---|
| 1681 | begin
 | 
|---|
| 1682 |   if not FMemoLoaded then LoadMemo else inherited;
 | 
|---|
| 1683 | end;
 | 
|---|
| 1684 | 
 | 
|---|
| 1685 | procedure TTntDBRichEdit.WMCut(var Message: TMessage);
 | 
|---|
| 1686 | begin
 | 
|---|
| 1687 |   BeginEditing;
 | 
|---|
| 1688 |   inherited;
 | 
|---|
| 1689 | end;
 | 
|---|
| 1690 | 
 | 
|---|
| 1691 | procedure TTntDBRichEdit.WMPaste(var Message: TMessage);
 | 
|---|
| 1692 | begin
 | 
|---|
| 1693 |   BeginEditing;
 | 
|---|
| 1694 |   inherited;
 | 
|---|
| 1695 | end;
 | 
|---|
| 1696 | 
 | 
|---|
| 1697 | procedure TTntDBRichEdit.CMGetDataLink(var Message: TMessage);
 | 
|---|
| 1698 | begin
 | 
|---|
| 1699 |   Message.Result := Integer(FDataLink);
 | 
|---|
| 1700 | end;
 | 
|---|
| 1701 | 
 | 
|---|
| 1702 | function TTntDBRichEdit.ExecuteAction(Action: TBasicAction): Boolean;
 | 
|---|
| 1703 | begin
 | 
|---|
| 1704 |   Result := inherited ExecuteAction(Action) or (FDataLink <> nil) and
 | 
|---|
| 1705 |     FDataLink.ExecuteAction(Action);
 | 
|---|
| 1706 | end;
 | 
|---|
| 1707 | 
 | 
|---|
| 1708 | function TTntDBRichEdit.UpdateAction(Action: TBasicAction): Boolean;
 | 
|---|
| 1709 | begin
 | 
|---|
| 1710 |   Result := inherited UpdateAction(Action) or (FDataLink <> nil) and
 | 
|---|
| 1711 |     FDataLink.UpdateAction(Action);
 | 
|---|
| 1712 | end;
 | 
|---|
| 1713 | 
 | 
|---|
| 1714 | { TTntDBMemo }
 | 
|---|
| 1715 | 
 | 
|---|
| 1716 | constructor TTntDBMemo.Create(AOwner: TComponent);
 | 
|---|
| 1717 | begin
 | 
|---|
| 1718 |   inherited Create(AOwner);
 | 
|---|
| 1719 |   inherited ReadOnly := True;
 | 
|---|
| 1720 |   ControlStyle := ControlStyle + [csReplicatable];
 | 
|---|
| 1721 |   FAutoDisplay := True;
 | 
|---|
| 1722 |   FDataLink := TFieldDataLink.Create;
 | 
|---|
| 1723 |   FDataLink.Control := Self;
 | 
|---|
| 1724 |   FDataLink.OnDataChange := DataChange;
 | 
|---|
| 1725 |   FDataLink.OnEditingChange := EditingChange;
 | 
|---|
| 1726 |   FDataLink.OnUpdateData := UpdateData;
 | 
|---|
| 1727 |   FPaintControl := TTntPaintControl.Create(Self, 'EDIT');
 | 
|---|
| 1728 | end;
 | 
|---|
| 1729 | 
 | 
|---|
| 1730 | destructor TTntDBMemo.Destroy;
 | 
|---|
| 1731 | begin
 | 
|---|
| 1732 |   FPaintControl.Free;
 | 
|---|
| 1733 |   FDataLink.Free;
 | 
|---|
| 1734 |   FDataLink := nil;
 | 
|---|
| 1735 |   inherited Destroy;
 | 
|---|
| 1736 | end;
 | 
|---|
| 1737 | 
 | 
|---|
| 1738 | procedure TTntDBMemo.Loaded;
 | 
|---|
| 1739 | begin
 | 
|---|
| 1740 |   inherited Loaded;
 | 
|---|
| 1741 |   if (csDesigning in ComponentState) then DataChange(Self);
 | 
|---|
| 1742 | end;
 | 
|---|
| 1743 | 
 | 
|---|
| 1744 | procedure TTntDBMemo.Notification(AComponent: TComponent;
 | 
|---|
| 1745 |   Operation: TOperation);
 | 
|---|
| 1746 | begin
 | 
|---|
| 1747 |   inherited Notification(AComponent, Operation);
 | 
|---|
| 1748 |   if (Operation = opRemove) and (FDataLink <> nil) and
 | 
|---|
| 1749 |     (AComponent = DataSource) then DataSource := nil;
 | 
|---|
| 1750 | end;
 | 
|---|
| 1751 | 
 | 
|---|
| 1752 | function TTntDBMemo.UseRightToLeftAlignment: Boolean;
 | 
|---|
| 1753 | begin
 | 
|---|
| 1754 |   Result := DBUseRightToLeftAlignment(Self, Field);
 | 
|---|
| 1755 | end;
 | 
|---|
| 1756 | 
 | 
|---|
| 1757 | procedure TTntDBMemo.KeyDown(var Key: Word; Shift: TShiftState);
 | 
|---|
| 1758 | begin
 | 
|---|
| 1759 |   inherited KeyDown(Key, Shift);
 | 
|---|
| 1760 |   if FMemoLoaded then
 | 
|---|
| 1761 |   begin
 | 
|---|
| 1762 |     if (Key = VK_DELETE) or ((Key = VK_INSERT) and (ssShift in Shift)) then
 | 
|---|
| 1763 |       FDataLink.Edit;
 | 
|---|
| 1764 |   end;
 | 
|---|
| 1765 | end;
 | 
|---|
| 1766 | 
 | 
|---|
| 1767 | procedure TTntDBMemo.KeyPress(var Key: Char{TNT-ALLOW Char});
 | 
|---|
| 1768 | begin
 | 
|---|
| 1769 |   inherited KeyPress(Key);
 | 
|---|
| 1770 |   if FMemoLoaded then
 | 
|---|
| 1771 |   begin
 | 
|---|
| 1772 |     if (Key in [#32..#255]) and (FDataLink.Field <> nil) and
 | 
|---|
| 1773 |       not FDataLink.Field.IsValidChar(Key) then
 | 
|---|
| 1774 |     begin
 | 
|---|
| 1775 |       MessageBeep(0);
 | 
|---|
| 1776 |       Key := #0;
 | 
|---|
| 1777 |     end;
 | 
|---|
| 1778 |     case Key of
 | 
|---|
| 1779 |       ^H, ^I, ^J, ^M, ^V, ^X, #32..#255:
 | 
|---|
| 1780 |         FDataLink.Edit;
 | 
|---|
| 1781 |       #27:
 | 
|---|
| 1782 |         FDataLink.Reset;
 | 
|---|
| 1783 |     end;
 | 
|---|
| 1784 |   end else
 | 
|---|
| 1785 |   begin
 | 
|---|
| 1786 |     if Key = #13 then LoadMemo;
 | 
|---|
| 1787 |     Key := #0;
 | 
|---|
| 1788 |   end;
 | 
|---|
| 1789 | end;
 | 
|---|
| 1790 | 
 | 
|---|
| 1791 | procedure TTntDBMemo.Change;
 | 
|---|
| 1792 | begin
 | 
|---|
| 1793 |   if FMemoLoaded then FDataLink.Modified;
 | 
|---|
| 1794 |   FMemoLoaded := True;
 | 
|---|
| 1795 |   inherited Change;
 | 
|---|
| 1796 | end;
 | 
|---|
| 1797 | 
 | 
|---|
| 1798 | function TTntDBMemo.GetDataSource: TDataSource;
 | 
|---|
| 1799 | begin
 | 
|---|
| 1800 |   Result := FDataLink.DataSource;
 | 
|---|
| 1801 | end;
 | 
|---|
| 1802 | 
 | 
|---|
| 1803 | procedure TTntDBMemo.SetDataSource(Value: TDataSource);
 | 
|---|
| 1804 | begin
 | 
|---|
| 1805 |   if not (FDataLink.DataSourceFixed and (csLoading in ComponentState)) then
 | 
|---|
| 1806 |     FDataLink.DataSource := Value;
 | 
|---|
| 1807 |   if Value <> nil then Value.FreeNotification(Self);
 | 
|---|
| 1808 | end;
 | 
|---|
| 1809 | 
 | 
|---|
| 1810 | function TTntDBMemo.GetDataField: WideString;
 | 
|---|
| 1811 | begin
 | 
|---|
| 1812 |   Result := FDataLink.FieldName;
 | 
|---|
| 1813 | end;
 | 
|---|
| 1814 | 
 | 
|---|
| 1815 | procedure TTntDBMemo.SetDataField(const Value: WideString);
 | 
|---|
| 1816 | begin
 | 
|---|
| 1817 |   FDataLink.FieldName := Value;
 | 
|---|
| 1818 | end;
 | 
|---|
| 1819 | 
 | 
|---|
| 1820 | function TTntDBMemo.GetReadOnly: Boolean;
 | 
|---|
| 1821 | begin
 | 
|---|
| 1822 |   Result := FDataLink.ReadOnly;
 | 
|---|
| 1823 | end;
 | 
|---|
| 1824 | 
 | 
|---|
| 1825 | procedure TTntDBMemo.SetReadOnly(Value: Boolean);
 | 
|---|
| 1826 | begin
 | 
|---|
| 1827 |   FDataLink.ReadOnly := Value;
 | 
|---|
| 1828 | end;
 | 
|---|
| 1829 | 
 | 
|---|
| 1830 | function TTntDBMemo.GetField: TField;
 | 
|---|
| 1831 | begin
 | 
|---|
| 1832 |   Result := FDataLink.Field;
 | 
|---|
| 1833 | end;
 | 
|---|
| 1834 | 
 | 
|---|
| 1835 | procedure TTntDBMemo.LoadMemo;
 | 
|---|
| 1836 | begin
 | 
|---|
| 1837 |   if not FMemoLoaded and Assigned(FDataLink.Field) and FieldIsBlobLike(FDataLink.Field) then
 | 
|---|
| 1838 |   begin
 | 
|---|
| 1839 |     try
 | 
|---|
| 1840 |       Lines.Text := GetAsWideString(FDataLink.Field);
 | 
|---|
| 1841 |       FMemoLoaded := True;
 | 
|---|
| 1842 |     except
 | 
|---|
| 1843 |       { Memo too large }
 | 
|---|
| 1844 |       on E:EInvalidOperation do
 | 
|---|
| 1845 |         Lines.Text := WideFormat('(%s)', [E.Message]);
 | 
|---|
| 1846 |     end;
 | 
|---|
| 1847 |     EditingChange(Self);
 | 
|---|
| 1848 |   end;
 | 
|---|
| 1849 | end;
 | 
|---|
| 1850 | 
 | 
|---|
| 1851 | procedure TTntDBMemo.DataChange(Sender: TObject);
 | 
|---|
| 1852 | begin
 | 
|---|
| 1853 |   if FDataLink.Field <> nil then
 | 
|---|
| 1854 |     if FieldIsBlobLike(FDataLink.Field) then
 | 
|---|
| 1855 |     begin
 | 
|---|
| 1856 |       if FAutoDisplay or (FDataLink.Editing and FMemoLoaded) then
 | 
|---|
| 1857 |       begin
 | 
|---|
| 1858 |         FMemoLoaded := False;
 | 
|---|
| 1859 |         LoadMemo;
 | 
|---|
| 1860 |       end else
 | 
|---|
| 1861 |       begin
 | 
|---|
| 1862 |         Text := WideFormat('(%s)', [FDataLink.Field.DisplayName]);
 | 
|---|
| 1863 |         FMemoLoaded := False;
 | 
|---|
| 1864 |         EditingChange(Self);
 | 
|---|
| 1865 |       end;
 | 
|---|
| 1866 |     end else
 | 
|---|
| 1867 |     begin
 | 
|---|
| 1868 |       if FFocused and FDataLink.CanModify then
 | 
|---|
| 1869 |         Text := GetWideText(FDataLink.Field)
 | 
|---|
| 1870 |       else
 | 
|---|
| 1871 |         Text := GetWideDisplayText(FDataLink.Field);
 | 
|---|
| 1872 |       FMemoLoaded := True;
 | 
|---|
| 1873 |     end
 | 
|---|
| 1874 |   else
 | 
|---|
| 1875 |   begin
 | 
|---|
| 1876 |     if csDesigning in ComponentState then Text := Name else Text := '';
 | 
|---|
| 1877 |     FMemoLoaded := False;
 | 
|---|
| 1878 |   end;
 | 
|---|
| 1879 |   if HandleAllocated then
 | 
|---|
| 1880 |     RedrawWindow(Handle, nil, 0, RDW_INVALIDATE or RDW_ERASE or RDW_FRAME);
 | 
|---|
| 1881 | end;
 | 
|---|
| 1882 | 
 | 
|---|
| 1883 | procedure TTntDBMemo.EditingChange(Sender: TObject);
 | 
|---|
| 1884 | begin
 | 
|---|
| 1885 |   inherited ReadOnly := not (FDataLink.Editing and FMemoLoaded);
 | 
|---|
| 1886 | end;
 | 
|---|
| 1887 | 
 | 
|---|
| 1888 | procedure TTntDBMemo.UpdateData(Sender: TObject);
 | 
|---|
| 1889 | begin
 | 
|---|
| 1890 |   SetAsWideString(FDataLink.Field, Text);
 | 
|---|
| 1891 | end;
 | 
|---|
| 1892 | 
 | 
|---|
| 1893 | procedure TTntDBMemo.SetFocused(Value: Boolean);
 | 
|---|
| 1894 | begin
 | 
|---|
| 1895 |   if FFocused <> Value then
 | 
|---|
| 1896 |   begin
 | 
|---|
| 1897 |     FFocused := Value;
 | 
|---|
| 1898 |     if not Assigned(FDataLink.Field) or not FieldIsBlobLike(FDataLink.Field) then
 | 
|---|
| 1899 |       FDataLink.Reset;
 | 
|---|
| 1900 |   end;
 | 
|---|
| 1901 | end;
 | 
|---|
| 1902 | 
 | 
|---|
| 1903 | procedure TTntDBMemo.WndProc(var Message: TMessage);
 | 
|---|
| 1904 | begin
 | 
|---|
| 1905 |   with Message do
 | 
|---|
| 1906 |     if (Msg = WM_CREATE) or (Msg = WM_WINDOWPOSCHANGED) or
 | 
|---|
| 1907 |       (Msg = CM_FONTCHANGED) then FPaintControl.DestroyHandle;
 | 
|---|
| 1908 |   inherited;
 | 
|---|
| 1909 | end;
 | 
|---|
| 1910 | 
 | 
|---|
| 1911 | procedure TTntDBMemo.CMEnter(var Message: TCMEnter);
 | 
|---|
| 1912 | begin
 | 
|---|
| 1913 |   SetFocused(True);
 | 
|---|
| 1914 |   inherited;
 | 
|---|
| 1915 | end;
 | 
|---|
| 1916 | 
 | 
|---|
| 1917 | procedure TTntDBMemo.CMExit(var Message: TCMExit);
 | 
|---|
| 1918 | begin
 | 
|---|
| 1919 |   try
 | 
|---|
| 1920 |     FDataLink.UpdateRecord;
 | 
|---|
| 1921 |   except
 | 
|---|
| 1922 |     SetFocus;
 | 
|---|
| 1923 |     raise;
 | 
|---|
| 1924 |   end;
 | 
|---|
| 1925 |   SetFocused(False);
 | 
|---|
| 1926 |   inherited;
 | 
|---|
| 1927 | end;
 | 
|---|
| 1928 | 
 | 
|---|
| 1929 | procedure TTntDBMemo.SetAutoDisplay(Value: Boolean);
 | 
|---|
| 1930 | begin
 | 
|---|
| 1931 |   if FAutoDisplay <> Value then
 | 
|---|
| 1932 |   begin
 | 
|---|
| 1933 |     FAutoDisplay := Value;
 | 
|---|
| 1934 |     if Value then LoadMemo;
 | 
|---|
| 1935 |   end;
 | 
|---|
| 1936 | end;
 | 
|---|
| 1937 | 
 | 
|---|
| 1938 | procedure TTntDBMemo.WMLButtonDblClk(var Message: TWMLButtonDblClk);
 | 
|---|
| 1939 | begin
 | 
|---|
| 1940 |   if not FMemoLoaded then LoadMemo else inherited;
 | 
|---|
| 1941 | end;
 | 
|---|
| 1942 | 
 | 
|---|
| 1943 | procedure TTntDBMemo.WMCut(var Message: TMessage);
 | 
|---|
| 1944 | begin
 | 
|---|
| 1945 |   FDataLink.Edit;
 | 
|---|
| 1946 |   inherited;
 | 
|---|
| 1947 | end;
 | 
|---|
| 1948 | 
 | 
|---|
| 1949 | procedure TTntDBMemo.WMUndo(var Message: TMessage);
 | 
|---|
| 1950 | begin
 | 
|---|
| 1951 |   FDataLink.Edit;
 | 
|---|
| 1952 |   inherited;
 | 
|---|
| 1953 | end;
 | 
|---|
| 1954 | 
 | 
|---|
| 1955 | procedure TTntDBMemo.WMPaste(var Message: TMessage);
 | 
|---|
| 1956 | begin
 | 
|---|
| 1957 |   FDataLink.Edit;
 | 
|---|
| 1958 |   inherited;
 | 
|---|
| 1959 | end;
 | 
|---|
| 1960 | 
 | 
|---|
| 1961 | procedure TTntDBMemo.CMGetDataLink(var Message: TMessage);
 | 
|---|
| 1962 | begin
 | 
|---|
| 1963 |   Message.Result := Integer(FDataLink);
 | 
|---|
| 1964 | end;
 | 
|---|
| 1965 | 
 | 
|---|
| 1966 | procedure TTntDBMemo.WMPaint(var Message: TWMPaint);
 | 
|---|
| 1967 | var
 | 
|---|
| 1968 |   S: WideString;
 | 
|---|
| 1969 | begin
 | 
|---|
| 1970 |   if not (csPaintCopy in ControlState) then
 | 
|---|
| 1971 |     inherited
 | 
|---|
| 1972 |   else begin
 | 
|---|
| 1973 |     if FDataLink.Field <> nil then
 | 
|---|
| 1974 |       if FieldIsBlobLike(FDataLink.Field) then
 | 
|---|
| 1975 |       begin
 | 
|---|
| 1976 |         if FAutoDisplay then
 | 
|---|
| 1977 |           S := TntAdjustLineBreaks(GetAsWideString(FDataLink.Field)) else
 | 
|---|
| 1978 |           S := WideFormat('(%s)', [FDataLink.Field.DisplayName]);
 | 
|---|
| 1979 |       end else
 | 
|---|
| 1980 |         S := GetWideDisplayText(FDataLink.Field);
 | 
|---|
| 1981 |     if (not Win32PlatformIsUnicode) then
 | 
|---|
| 1982 |       SendMessageA(FPaintControl.Handle, WM_SETTEXT, 0, Integer(PAnsiChar(AnsiString(S))))
 | 
|---|
| 1983 |     else begin
 | 
|---|
| 1984 |       SendMessageW(FPaintControl.Handle, WM_SETTEXT, 0, Integer(PWideChar(S)));
 | 
|---|
| 1985 |     end;
 | 
|---|
| 1986 |     SendMessage(FPaintControl.Handle, WM_ERASEBKGND, Integer(Message.DC), 0);
 | 
|---|
| 1987 |     SendMessage(FPaintControl.Handle, WM_PAINT, Integer(Message.DC), 0);
 | 
|---|
| 1988 |   end;
 | 
|---|
| 1989 | end;
 | 
|---|
| 1990 | 
 | 
|---|
| 1991 | function TTntDBMemo.ExecuteAction(Action: TBasicAction): Boolean;
 | 
|---|
| 1992 | begin
 | 
|---|
| 1993 |   Result := inherited ExecuteAction(Action) or (FDataLink <> nil) and
 | 
|---|
| 1994 |     FDataLink.ExecuteAction(Action);
 | 
|---|
| 1995 | end;
 | 
|---|
| 1996 | 
 | 
|---|
| 1997 | function TTntDBMemo.UpdateAction(Action: TBasicAction): Boolean;
 | 
|---|
| 1998 | begin
 | 
|---|
| 1999 |   Result := inherited UpdateAction(Action) or (FDataLink <> nil) and
 | 
|---|
| 2000 |     FDataLink.UpdateAction(Action);
 | 
|---|
| 2001 | end;
 | 
|---|
| 2002 | 
 | 
|---|
| 2003 | { TTntDBRadioGroup }
 | 
|---|
| 2004 | 
 | 
|---|
| 2005 | constructor TTntDBRadioGroup.Create(AOwner: TComponent);
 | 
|---|
| 2006 | begin
 | 
|---|
| 2007 |   inherited Create(AOwner);
 | 
|---|
| 2008 |   FDataLink := TFieldDataLink.Create;
 | 
|---|
| 2009 |   FDataLink.Control := Self;
 | 
|---|
| 2010 |   FDataLink.OnDataChange := DataChange;
 | 
|---|
| 2011 |   FDataLink.OnUpdateData := UpdateData;
 | 
|---|
| 2012 |   FValues := TTntStringList.Create;
 | 
|---|
| 2013 | end;
 | 
|---|
| 2014 | 
 | 
|---|
| 2015 | destructor TTntDBRadioGroup.Destroy;
 | 
|---|
| 2016 | begin
 | 
|---|
| 2017 |   FDataLink.Free;
 | 
|---|
| 2018 |   FDataLink := nil;
 | 
|---|
| 2019 |   FValues.Free;
 | 
|---|
| 2020 |   inherited Destroy;
 | 
|---|
| 2021 | end;
 | 
|---|
| 2022 | 
 | 
|---|
| 2023 | procedure TTntDBRadioGroup.Notification(AComponent: TComponent;
 | 
|---|
| 2024 |   Operation: TOperation);
 | 
|---|
| 2025 | begin
 | 
|---|
| 2026 |   inherited Notification(AComponent, Operation);
 | 
|---|
| 2027 |   if (Operation = opRemove) and (FDataLink <> nil) and
 | 
|---|
| 2028 |     (AComponent = DataSource) then DataSource := nil;
 | 
|---|
| 2029 | end;
 | 
|---|
| 2030 | 
 | 
|---|
| 2031 | function TTntDBRadioGroup.UseRightToLeftAlignment: Boolean;
 | 
|---|
| 2032 | begin
 | 
|---|
| 2033 |   Result := inherited UseRightToLeftAlignment;
 | 
|---|
| 2034 | end;
 | 
|---|
| 2035 | 
 | 
|---|
| 2036 | procedure TTntDBRadioGroup.DataChange(Sender: TObject);
 | 
|---|
| 2037 | begin
 | 
|---|
| 2038 |   if FDataLink.Field <> nil then
 | 
|---|
| 2039 |     Value := GetWideText(FDataLink.Field) else
 | 
|---|
| 2040 |     Value := '';
 | 
|---|
| 2041 | end;
 | 
|---|
| 2042 | 
 | 
|---|
| 2043 | procedure TTntDBRadioGroup.UpdateData(Sender: TObject);
 | 
|---|
| 2044 | begin
 | 
|---|
| 2045 |   if FDataLink.Field <> nil then
 | 
|---|
| 2046 |     SetWideText(FDataLink.Field, Value);
 | 
|---|
| 2047 | end;
 | 
|---|
| 2048 | 
 | 
|---|
| 2049 | function TTntDBRadioGroup.GetDataSource: TDataSource;
 | 
|---|
| 2050 | begin
 | 
|---|
| 2051 |   Result := FDataLink.DataSource;
 | 
|---|
| 2052 | end;
 | 
|---|
| 2053 | 
 | 
|---|
| 2054 | procedure TTntDBRadioGroup.SetDataSource(Value: TDataSource);
 | 
|---|
| 2055 | begin
 | 
|---|
| 2056 |   FDataLink.DataSource := Value;
 | 
|---|
| 2057 |   if Value <> nil then Value.FreeNotification(Self);
 | 
|---|
| 2058 | end;
 | 
|---|
| 2059 | 
 | 
|---|
| 2060 | function TTntDBRadioGroup.GetDataField: WideString;
 | 
|---|
| 2061 | begin
 | 
|---|
| 2062 |   Result := FDataLink.FieldName;
 | 
|---|
| 2063 | end;
 | 
|---|
| 2064 | 
 | 
|---|
| 2065 | procedure TTntDBRadioGroup.SetDataField(const Value: WideString);
 | 
|---|
| 2066 | begin
 | 
|---|
| 2067 |   FDataLink.FieldName := Value;
 | 
|---|
| 2068 | end;
 | 
|---|
| 2069 | 
 | 
|---|
| 2070 | function TTntDBRadioGroup.GetReadOnly: Boolean;
 | 
|---|
| 2071 | begin
 | 
|---|
| 2072 |   Result := FDataLink.ReadOnly;
 | 
|---|
| 2073 | end;
 | 
|---|
| 2074 | 
 | 
|---|
| 2075 | procedure TTntDBRadioGroup.SetReadOnly(Value: Boolean);
 | 
|---|
| 2076 | begin
 | 
|---|
| 2077 |   FDataLink.ReadOnly := Value;
 | 
|---|
| 2078 | end;
 | 
|---|
| 2079 | 
 | 
|---|
| 2080 | function TTntDBRadioGroup.GetField: TField;
 | 
|---|
| 2081 | begin
 | 
|---|
| 2082 |   Result := FDataLink.Field;
 | 
|---|
| 2083 | end;
 | 
|---|
| 2084 | 
 | 
|---|
| 2085 | function TTntDBRadioGroup.GetButtonValue(Index: Integer): WideString;
 | 
|---|
| 2086 | begin
 | 
|---|
| 2087 |   if (Index < FValues.Count) and (FValues[Index] <> '') then
 | 
|---|
| 2088 |     Result := FValues[Index]
 | 
|---|
| 2089 |   else if Index < Items.Count then
 | 
|---|
| 2090 |     Result := Items[Index]
 | 
|---|
| 2091 |   else
 | 
|---|
| 2092 |     Result := '';
 | 
|---|
| 2093 | end;
 | 
|---|
| 2094 | 
 | 
|---|
| 2095 | procedure TTntDBRadioGroup.SetValue(const Value: WideString);
 | 
|---|
| 2096 | var
 | 
|---|
| 2097 |   WasFocused: Boolean;
 | 
|---|
| 2098 |   I, Index: Integer;
 | 
|---|
| 2099 | begin
 | 
|---|
| 2100 |   if FValue <> Value then
 | 
|---|
| 2101 |   begin
 | 
|---|
| 2102 |     FInSetValue := True;
 | 
|---|
| 2103 |     try
 | 
|---|
| 2104 |       WasFocused := (ItemIndex > -1) and (Buttons[ItemIndex].Focused);
 | 
|---|
| 2105 |       Index := -1;
 | 
|---|
| 2106 |       for I := 0 to Items.Count - 1 do
 | 
|---|
| 2107 |         if Value = GetButtonValue(I) then
 | 
|---|
| 2108 |         begin
 | 
|---|
| 2109 |           Index := I;
 | 
|---|
| 2110 |           Break;
 | 
|---|
| 2111 |         end;
 | 
|---|
| 2112 |       ItemIndex := Index;
 | 
|---|
| 2113 |       // Move the focus rect along with the selected index
 | 
|---|
| 2114 |       if WasFocused then
 | 
|---|
| 2115 |         Buttons[ItemIndex].SetFocus;
 | 
|---|
| 2116 |     finally
 | 
|---|
| 2117 |       FInSetValue := False;
 | 
|---|
| 2118 |     end;
 | 
|---|
| 2119 |     FValue := Value;
 | 
|---|
| 2120 |     Change;
 | 
|---|
| 2121 |   end;
 | 
|---|
| 2122 | end;
 | 
|---|
| 2123 | 
 | 
|---|
| 2124 | procedure TTntDBRadioGroup.CMExit(var Message: TCMExit);
 | 
|---|
| 2125 | begin
 | 
|---|
| 2126 |   try
 | 
|---|
| 2127 |     FDataLink.UpdateRecord;
 | 
|---|
| 2128 |   except
 | 
|---|
| 2129 |     if ItemIndex >= 0 then
 | 
|---|
| 2130 |       (Controls[ItemIndex] as TTntRadioButton).SetFocus else
 | 
|---|
| 2131 |       (Controls[0] as TTntRadioButton).SetFocus;
 | 
|---|
| 2132 |     raise;
 | 
|---|
| 2133 |   end;
 | 
|---|
| 2134 |   inherited;
 | 
|---|
| 2135 | end;
 | 
|---|
| 2136 | 
 | 
|---|
| 2137 | procedure TTntDBRadioGroup.CMGetDataLink(var Message: TMessage);
 | 
|---|
| 2138 | begin
 | 
|---|
| 2139 |   Message.Result := Integer(FDataLink);
 | 
|---|
| 2140 | end;
 | 
|---|
| 2141 | 
 | 
|---|
| 2142 | procedure TTntDBRadioGroup.Click;
 | 
|---|
| 2143 | begin
 | 
|---|
| 2144 |   if not FInSetValue then
 | 
|---|
| 2145 |   begin
 | 
|---|
| 2146 |     inherited Click;
 | 
|---|
| 2147 |     if ItemIndex >= 0 then Value := GetButtonValue(ItemIndex);
 | 
|---|
| 2148 |     if FDataLink.Editing then FDataLink.Modified;
 | 
|---|
| 2149 |   end;
 | 
|---|
| 2150 | end;
 | 
|---|
| 2151 | 
 | 
|---|
| 2152 | procedure TTntDBRadioGroup.SetItems(Value: TTntStrings);
 | 
|---|
| 2153 | begin
 | 
|---|
| 2154 |   Items.Assign(Value);
 | 
|---|
| 2155 |   DataChange(Self);
 | 
|---|
| 2156 | end;
 | 
|---|
| 2157 | 
 | 
|---|
| 2158 | procedure TTntDBRadioGroup.SetValues(Value: TTntStrings);
 | 
|---|
| 2159 | begin
 | 
|---|
| 2160 |   FValues.Assign(Value);
 | 
|---|
| 2161 |   DataChange(Self);
 | 
|---|
| 2162 | end;
 | 
|---|
| 2163 | 
 | 
|---|
| 2164 | procedure TTntDBRadioGroup.Change;
 | 
|---|
| 2165 | begin
 | 
|---|
| 2166 |   if Assigned(FOnChange) then FOnChange(Self);
 | 
|---|
| 2167 | end;
 | 
|---|
| 2168 | 
 | 
|---|
| 2169 | procedure TTntDBRadioGroup.KeyPress(var Key: Char{TNT-ALLOW Char});
 | 
|---|
| 2170 | begin
 | 
|---|
| 2171 |   inherited KeyPress(Key);
 | 
|---|
| 2172 |   case Key of
 | 
|---|
| 2173 |     #8, ' ': FDataLink.Edit;
 | 
|---|
| 2174 |     #27: FDataLink.Reset;
 | 
|---|
| 2175 |   end;
 | 
|---|
| 2176 | end;
 | 
|---|
| 2177 | 
 | 
|---|
| 2178 | function TTntDBRadioGroup.CanModify: Boolean;
 | 
|---|
| 2179 | begin
 | 
|---|
| 2180 |   Result := FDataLink.Edit;
 | 
|---|
| 2181 | end;
 | 
|---|
| 2182 | 
 | 
|---|
| 2183 | function TTntDBRadioGroup.ExecuteAction(Action: TBasicAction): Boolean;
 | 
|---|
| 2184 | begin
 | 
|---|
| 2185 |   Result := inherited ExecuteAction(Action) or (DataLink <> nil) and
 | 
|---|
| 2186 |     DataLink.ExecuteAction(Action);
 | 
|---|
| 2187 | end;
 | 
|---|
| 2188 | 
 | 
|---|
| 2189 | function TTntDBRadioGroup.UpdateAction(Action: TBasicAction): Boolean;
 | 
|---|
| 2190 | begin
 | 
|---|
| 2191 |   Result := inherited UpdateAction(Action) or (DataLink <> nil) and
 | 
|---|
| 2192 |     DataLink.UpdateAction(Action);
 | 
|---|
| 2193 | end;
 | 
|---|
| 2194 | 
 | 
|---|
| 2195 | end.
 | 
|---|