📄 toolctrlseh.pas
字号:
{*******************************************************}
{ }
{ EhLib v2.1 }
{ Tool controls }
{ }
{ Copyright (c) 2001 by Dmitry V. Bolshakov }
{ }
{*******************************************************}
unit ToolCtrlsEh;
{$I EhLib.Inc}
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
{$IFDEF EH_LIB_6} Variants, {$ENDIF}
StdCtrls, Mask, Db, DBCtrls, Buttons, ExtCtrls, Menus, ComCtrls, CommCtrl;
const
CM_IGNOREEDITDOWN = WM_USER + 102;
type
IComobEditEh = interface
['{B64255B5-386A-4524-8BC7-7F49DDB410F4}']
procedure CloseUp(Accept: Boolean);
end;
TFieldsArrEh = array of TField;
{ Standard events }
TButtonClickEventEh = procedure(Sender: TObject; var Handled: Boolean) of object;
TButtonDownEventEh = procedure(Sender: TObject; TopButton: Boolean;
var AutoRepeat: Boolean; var Handled: Boolean) of object;
TCloseUpEventEh = procedure(Sender: TObject; Accept: Boolean) of object;
TNotInListEventEh = procedure(Sender: TObject; NewText: String;
var RecheckInList: Boolean) of object;
TUpdateDataEventEh = procedure(Sender: TObject; var Handled: Boolean) of object;
{ TEditButtonControlEh }
TEditButtonStyleEh = (ebsDropDownEh, ebsEllipsisEh, ebsGlyphEh, ebsUpDownEh,
ebsPlusEh, ebsMinusEh);
TEditButtonControlEh = class(TSpeedButton)
private
FActive: Boolean;
FAlwaysDown: Boolean;
FButtonNum: Integer;
FNoDoClick: Boolean;
FOnDown: TButtonDownEventEh;
FStyle: TEditButtonStyleEh;
FTimer: TTimer;
function GetTimer: TTimer;
procedure ResetTimer(Interval: Cardinal);
procedure SetActive(const Value: Boolean);
procedure SetAlwaysDown(const Value: Boolean);
procedure SetStyle(const Value: TEditButtonStyleEh);
procedure TimerEvent(Sender: TObject);
procedure UpdateDownButtonNum(X, Y: Integer);
protected
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
procedure Paint; override;
property Timer: TTimer read GetTimer;
public
procedure Click; override;
procedure EditButtonDown(TopButton: Boolean; var AutoRepeat: Boolean);
procedure SetState(NewState:TButtonState; IsActive:Boolean; ButtonNum:Integer);
procedure SetWidthNoNotify(AWidth:Integer);
property Active: Boolean read FActive write SetActive;
property AlwaysDown: Boolean read FAlwaysDown write SetAlwaysDown;
property Style: TEditButtonStyleEh read FStyle write SetStyle default ebsDropDownEh;
property OnDown: TButtonDownEventEh read FOnDown write FOnDown;
end;
TEditButtonControlLineRec = record
EditButtonControl: TEditButtonControlEh;
ButtonLine: TShape;
end;
TEditButtonControlList = array of TEditButtonControlLineRec;
{ TEditButtonEh }
TEditButtonEh = class(TCollectionItem)
private
FDropdownMenu: TPopupMenu;
FEditControl: TWinControl;
FGlyph: TBitmap;
FHint: String;
FNumGlyphs: Integer;
FOnButtonClick: TButtonClickEventEh;
FOnButtonDown: TButtonDownEventEh;
FOnChanged: TNotifyEvent;
FShortCut: TShortCut;
FStyle: TEditButtonStyleEh;
FVisible: Boolean;
FWidth: Integer;
function GetGlyph: TBitmap;
procedure SetGlyph(const Value: TBitmap);
procedure SetHint(const Value: String);
procedure SetNumGlyphs(Value: Integer);
procedure SetStyle(const Value: TEditButtonStyleEh);
procedure SetVisible(const Value: Boolean);
procedure SetWidth(const Value: Integer);
protected
function CreateEditButtonControl:TEditButtonControlEh; virtual;
procedure Changed; overload;
public
constructor Create(Collection: TCollection); overload; override;
constructor Create(EditControl: TWinControl); reintroduce; overload;
destructor Destroy; override;
procedure Assign(Source: TPersistent); override;
property OnChanged: TNotifyEvent read FOnChanged write FOnChanged;
published
property DropdownMenu: TPopupMenu read FDropdownMenu write FDropdownMenu;
property Glyph: TBitmap read GetGlyph write SetGlyph;
property Hint: String read FHint write SetHint;
property NumGlyphs: Integer read FNumGlyphs write SetNumGlyphs default 1;
//property ShortCut: TShortCut read FShortCut write FShortCut default 32808; //Menus.ShortCut(VK_DOWN, [ssAlt]);
property ShortCut: TShortCut read FShortCut write FShortCut default scNone;
property Style: TEditButtonStyleEh read FStyle write SetStyle default ebsDropDownEh;
property Visible: Boolean read FVisible write SetVisible default False;
property Width: Integer read FWidth write SetWidth default 0;
property OnClick: TButtonClickEventEh read FOnButtonClick write FOnButtonClick;
property OnDown: TButtonDownEventEh read FOnButtonDown write FOnButtonDown;
end;
TEditButtonEhClass = class of TEditButtonEh;
{ TVisibleEditButtonEh }
TVisibleEditButtonEh = class(TEditButtonEh)
public
constructor Create(Collection: TCollection); overload; override;
constructor Create(EditControl: TWinControl); overload;
published
property Visible default True;
property ShortCut default 32808; //Menus.ShortCut(VK_DOWN, [ssAlt]);
end;
{ TEditButtonsEh }
TEditButtonsEh = class(TCollection)
private
FOnChanged: TNotifyEvent;
function GetEditButton(Index: Integer): TEditButtonEh;
procedure SetEditButton(Index: Integer; Value: TEditButtonEh);
protected
FOwner: TPersistent;
function GetOwner: TPersistent; override;
procedure Update(Item: TCollectionItem); override;
public
constructor Create(Owner: TPersistent; EditButtonClass: TEditButtonEhClass);
function Add: TEditButtonEh;
property Items[Index: Integer]: TEditButtonEh read GetEditButton write SetEditButton; default;
property OnChanged: TNotifyEvent read FOnChanged write FOnChanged;
end;
{ TSpecRowEh }
TSpecRowEh = class(TPersistent)
private
FCellsStrings: TStrings;
FCellsText: String;
FColor: TColor;
FFont: TFont;
FOnChanged: TNotifyEvent;
FOwner: TPersistent;
FSelected: Boolean;
FShortCut: TShortCut;
FShowIfNotInKeyList: Boolean;
FUpdateCount: Integer;
FValue: Variant;
FVisible: Boolean;
function GetCellText(Index: Integer): String;
function GetColor: TColor;
function GetFont: TFont;
function IsColorStored: Boolean;
function IsFontStored: Boolean;
function IsValueStored: Boolean;
procedure FontChanged(Sender: TObject);
procedure SetCellsText(const Value: String);
procedure SetColor(const Value: TColor);
procedure SetFont(const Value: TFont);
procedure SetShowIfNotInKeyList(const Value: Boolean);
procedure SetValue(const Value: Variant);
procedure SetVisible(const Value: Boolean);
protected
FColorAssigned: Boolean;
FFontAssigned: Boolean;
function GetOwner: TPersistent; override;
procedure Changed;
public
constructor Create(Owner: TPersistent);
destructor Destroy; override;
function DefaultColor: TColor;
function DefaultFont: TFont;
function LocateKey(KeyValue: Variant): Boolean;
procedure Assign(Source: TPersistent); override;
procedure BeginUpdate;
procedure EndUpdate;
property CellText[Index: Integer]: String read GetCellText;
property Selected: Boolean read FSelected write FSelected;
property UpdateCount: Integer read FUpdateCount;
property OnChanged: TNotifyEvent read FOnChanged write FOnChanged;
published
property CellsText: String read FCellsText write SetCellsText;
property Color: TColor read GetColor write SetColor stored IsColorStored;
property Font: TFont read GetFont write SetFont stored IsFontStored;
property ShortCut: TShortCut read FShortCut write FShortCut default 32814; //Menus.ShortCut(VK_DOWN, [ssAlt]);
property ShowIfNotInKeyList: Boolean read FShowIfNotInKeyList write SetShowIfNotInKeyList default True;
property Value: Variant read FValue write SetValue stored IsValueStored;
property Visible: Boolean read FVisible write SetVisible default False;
end;
{ TDBLookupControl }
TDBLookupControlEh = class;
TLookupCtrlDataLinkEh = class(TDataLink)
private
FDBLookupControl: TDBLookupControlEh;
protected
procedure ActiveChanged; override;
procedure FocusControl(Field: TFieldRef); override;
procedure LayoutChanged; override;
procedure RecordChanged(Field: TField); override;
public
constructor Create;
end;
TLookupCtrlListLinkEh = class(TDataLink)
private
FDBLookupControl: TDBLookupControlEh;
protected
procedure ActiveChanged; override;
procedure DataSetChanged; override;
procedure LayoutChanged; override;
public
constructor Create;
end;
TDBLookupControlEh = class(TCustomControl)
private
FDataFieldName: string;
FDataFields: TFieldsArrEh;
FDataLink: TLookupCtrlDataLinkEh;
FHasFocus: Boolean;
FKeyFieldName: string;
FKeyFields: TFieldsArrEh;
FKeyValue: Variant;
FListActive: Boolean;
FListField: TField;
FListFieldIndex: Integer;
FListFieldName: string;
FListFields: TList;
FListLink: TLookupCtrlListLinkEh;
FLockPosition: Boolean;
FLookupMode: Boolean;
FLookupSource: TDataSource;
FMasterFieldNames:String;
FMasterFields: TFieldsArrEh;
FSearchText: string;
FSpecRow: TSpecRowEh;
function GetDataField: TField;
function GetDataSource: TDataSource;
function GetKeyFieldName: string;
function GetListSource: TDataSource;
function GetReadOnly: Boolean;
procedure CheckNotCircular;
procedure CheckNotLookup;
procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED;
procedure DataLinkRecordChanged(Field: TField);
procedure SetDataFieldName(const Value: string);
procedure SetDataSource(Value: TDataSource);
procedure SetKeyFieldName(const Value: string);
procedure SetKeyValue(const Value: Variant);
procedure SetListFieldName(const Value: string);
procedure SetListSource(Value: TDataSource);
procedure SetLookupMode(Value: Boolean);
procedure SetReadOnly(Value: Boolean);
procedure SetSpecRow(const Value: TSpecRowEh);
procedure WMGetDlgCode(var Message: TMessage); message WM_GETDLGCODE;
procedure WMKillFocus(var Message: TMessage); message WM_KILLFOCUS;
procedure WMSetFocus(var Message: TMessage); message WM_SETFOCUS;
protected
function CanModify: Boolean; virtual;
function GetBorderSize: Integer; virtual;
function GetSpecRowHeight: Integer; virtual;
function GetTextHeight: Integer; virtual;
function LocateKey: Boolean; virtual;
procedure KeyValueChanged; virtual;
procedure ListLinkDataChanged; virtual;
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
procedure ProcessSearchKey(Key: Char); virtual;
procedure SelectKeyValue(const Value: Variant); virtual;
procedure SpecRowChanged(Sender: TObject); virtual;
procedure UpdateDataFields; virtual;
procedure UpdateListFields; virtual;
property DataField: string read FDataFieldName write SetDataFieldName;
property DataSource: TDataSource read GetDataSource write SetDataSource;
property HasFocus: Boolean read FHasFocus;
property KeyField: string read GetKeyFieldName write SetKeyFieldName;
property KeyValue: Variant read FKeyValue write SetKeyValue;
property ListActive: Boolean read FListActive;
property ListField: string read FListFieldName write SetListFieldName;
property ListFieldIndex: Integer read FListFieldIndex write FListFieldIndex default 0;
property ListFields: TList read FListFields;
property ListLink: TLookupCtrlListLinkEh read FListLink;
property ListSource: TDataSource read GetListSource write SetListSource;
property ParentColor default False;
property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
property SearchText: string read FSearchText write FSearchText;
property SpecRow: TSpecRowEh read FSpecRow write SetSpecRow;
property TabStop default True;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
property Field: TField read GetDataField;
end;
{ TDBLookupListBoxEh }
TDBLookupListBoxEh = class(TDBLookupControlEh)
private
FBorderStyle: TBorderStyle;
FKeyFields: TFieldsArrEh;
FKeySelected: Boolean;
FListField: TField;
FMousePos: Integer;
FPopup: Boolean;
FRecordCount: Integer;
FRecordIndex: Integer;
FRowCount: Integer;
FSelectedItem: String;
FShowTitles: Boolean;
FTimerActive: Boolean;
FTracking: Boolean;
function GetKeyIndex: Integer;
procedure CMCtl3DChanged(var Message: TMessage); message CM_CTL3DCHANGED;
procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED;
procedure SelectCurrent;
procedure SelectItemAt(X, Y: Integer);
procedure SelectSpecRow;
procedure SetBorderStyle(Value: TBorderStyle);
procedure SetRowCount(Value: Integer);
procedure SetShowTitles(const Value: Boolean);
procedure StopTimer;
procedure StopTracking;
procedure TimerScroll;
procedure UpdateScrollBar;
procedure WMCancelMode(var Message: TMessage); message WM_CANCELMODE;
procedure WMTimer(var Message: TMessage); message WM_TIMER;
procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL;
protected
FSpecRowHeight: Integer;
FTitleHeight: Integer;
procedure CreateParams(var Params: TCreateParams); override;
procedure CreateWnd; override;
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
procedure KeyPress(var Key: Char); override;
procedure KeyValueChanged; override;
procedure ListLinkDataChanged; override;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
procedure Paint; override;
procedure SpecRowChanged(Sender: TObject); override;
procedure UpdateListFields; override;
public
constructor Create(AOwner: TComponent); override;
function ExecuteAction(Action: TBasicAction): Boolean; override;
function UpdateAction(Action: TBasicAction): Boolean; override;
function UseRightToLeftAlignment: Boolean; override;
procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
property KeyValue;
property SelectedItem: String read FSelectedItem;
property ShowTitles:Boolean read FShowTitles write SetShowTitles;
published
property Align;
property Anchors;
property BiDiMode;
property Constraints;
property DragKind;
property ParentBiDiMode;
property OnEndDock;
property OnStartDock;
{$IFDEF EH_LIB_5}
property OnContextPopup;
{$ENDIF}
property BorderStyle: TBorderStyle read FBorderStyle write SetBorderStyle default bsSingle;
property Color;
property Ctl3D;
property DataField;
property DataSource;
property DragCursor;
property DragMode;
property Enabled;
property Font;
property ImeMode;
property ImeName;
property KeyField;
property ListField;
property ListFieldIndex;
property ListSource;
property ParentColor;
property ParentCtl3D;
property ParentFont;
property ParentShowHint;
property PopupMenu;
property ReadOnly;
property RowCount: Integer read FRowCount write SetRowCount stored False;
property ShowHint;
property SpecRow;
property TabOrder;
property TabStop;
property Visible;
property OnClick;
property OnDblClick;
property OnDragDrop;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -