home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2001 September
/
Chip_2001-09_cd1.bin
/
zkuste
/
delphi
/
kolekce
/
d6
/
RX275D6.ZIP
/
Units
/
ToolEdit.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
2001-06-24
|
72KB
|
2,611 lines
{*******************************************************}
{ }
{ Delphi VCL Extensions (RX) }
{ }
{ Copyright (c) 1995, 1996 AO ROSNO }
{ Copyright (c) 1997, 1998 Master-Bank }
{ }
{*******************************************************}
unit ToolEdit;
interface
{$I RX.INC}
uses Windows, RTLConsts, Variants, Classes,
StdCtrls, Controls, Messages, SysUtils, Forms, Graphics, Menus, Buttons,
Dialogs, RxCtrls, FileCtrl, Mask, DateUtil;
const
scAltDown = scAlt + vk_Down;
DefEditBtnWidth = 21;
type
{$IFDEF WIN32}
TFileExt = type string;
{$ENDIF}
{ TPopupWindow }
TCloseUpEvent = procedure (Sender: TObject; Accept: Boolean) of object;
TPopupAlign = (epaRight, epaLeft);
TPopupWindow = class(TCustomControl)
private
FEditor: TWinControl;
FCloseUp: TCloseUpEvent;
procedure WMMouseActivate(var Message: TMessage); message WM_MOUSEACTIVATE;
protected
procedure CreateParams(var Params: TCreateParams); override;
{$IFDEF WIN32}
function GetValue: Variant; virtual; abstract;
procedure SetValue(const Value: Variant); virtual; abstract;
{$ELSE}
procedure CreateWnd; override;
function GetValue: string; virtual; abstract;
procedure SetValue(const Value: string); virtual; abstract;
{$ENDIF}
procedure InvalidateEditor;
procedure PopupMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure CloseUp(Accept: Boolean); virtual;
public
constructor Create(AOwner: TComponent); override;
function GetPopupText: string; virtual;
procedure Hide;
procedure Show(Origin: TPoint);
property OnCloseUp: TCloseUpEvent read FCloseUp write FCloseUp;
end;
{ TCustomComboEdit }
TEditButton = class(TRxSpeedButton)
private
FNoAction: Boolean;
protected
procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); override;
{$IFDEF WIN32}
procedure Paint; override;
{$ENDIF WIN32}
public
constructor Create(AOwner: TComponent); override;
procedure Click; override;
end;
TGlyphKind = (gkCustom, gkDefault, gkDropDown, gkEllipsis);
TCustomComboEdit = class(TCustomMaskEdit)
private
FButton: TEditButton;
FBtnControl: TWinControl;
FOnButtonClick: TNotifyEvent;
FClickKey: TShortCut;
FReadOnly: Boolean;
FDirectInput: Boolean;
FAlwaysEnable: Boolean;
FAlignment: TAlignment;
FPopupVisible: Boolean;
FFocused: Boolean;
FPopupAlign: TPopupAlign;
FGlyphKind: TGlyphKind;
procedure SetEditRect;
procedure RecreateGlyph;
procedure UpdateBtnBounds;
procedure EditButtonClick(Sender: TObject);
function GetMinHeight: Integer;
function GetTextHeight: Integer;
procedure SetShowCaret;
function GetGlyph: TBitmap;
procedure SetGlyph(Value: TBitmap);
function GetPopupVisible: Boolean;
function GetNumGlyphs: TNumGlyphs;
procedure SetNumGlyphs(Value: TNumGlyphs);
function GetButtonWidth: Integer;
procedure SetButtonWidth(Value: Integer);
function GetButtonHint: string;
procedure SetButtonHint(const Value: string);
function GetDirectInput: Boolean;
procedure SetDirectInput(Value: Boolean);
procedure SetReadOnly(Value: Boolean);
procedure SetAlignment(Value: TAlignment);
function IsCustomGlyph: Boolean;
function BtnWidthStored: Boolean;
procedure SetGlyphKind(Value: TGlyphKind);
procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED;
procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED;
procedure CMCancelMode(var Message: TCMCancelMode); message CM_CANCELMODE;
procedure CMEnter(var Message: TMessage); message CM_ENTER;
procedure CNCtlColor(var Message: TMessage); message
{$IFDEF WIN32} CN_CTLCOLOREDIT {$ELSE} CN_CTLCOLOR {$ENDIF};
procedure WMSize(var Message: TWMSize); message WM_SIZE;
procedure WMKillFocus(var Message: TWMKillFocus); message WM_KILLFOCUS;
procedure WMSetFocus(var Message: TMessage); message WM_SETFOCUS;
procedure WMPaste(var Message: TWMPaste); message WM_PASTE;
procedure WMCut(var Message: TWMCut); message WM_CUT;
{$IFDEF WIN32}
procedure CMCtl3DChanged(var Message: TMessage); message CM_CTL3DCHANGED;
{$ENDIF}
{$IFDEF RX_D4}
procedure CMBiDiModeChanged(var Message: TMessage); message CM_BIDIMODECHANGED;
{$ENDIF}
protected
FPopup: TCustomControl;
FDefNumGlyphs: TNumGlyphs;
function GetDefaultBitmap(var DestroyNeeded: Boolean): TBitmap; virtual;
procedure PopupDropDown(DisableEdit: Boolean); virtual;
procedure PopupCloseUp(Sender: TObject; Accept: Boolean);
procedure ShowPopup(Origin: TPoint); virtual;
procedure HidePopup; virtual;
procedure UpdatePopupVisible;
procedure DoChange;
{$IFDEF WIN32}
function AcceptPopup(var Value: Variant): Boolean; virtual;
procedure AcceptValue(const Value: Variant); virtual;
procedure SetPopupValue(const Value: Variant); virtual;
function GetPopupValue: Variant; virtual;
{$ELSE}
function AcceptPopup(var Value: string): Boolean; virtual;
procedure AcceptValue(const Value: string); virtual;
procedure SetPopupValue(const Value: string); virtual;
function GetPopupValue: string; virtual;
{$ENDIF}
procedure Change; override;
procedure PopupChange; virtual;
procedure CreateParams(var Params: TCreateParams); override;
procedure CreateWnd; override;
function EditCanModify: Boolean; override;
function GetReadOnly: Boolean; virtual;
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
procedure KeyPress(var Key: Char); override;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); override;
procedure ButtonClick; dynamic;
property Alignment: TAlignment read FAlignment write SetAlignment default taLeftJustify;
property AlwaysEnable: Boolean read FAlwaysEnable write FAlwaysEnable default False;
property Button: TEditButton read FButton;
property ClickKey: TShortCut read FClickKey write FClickKey
default scAltDown;
property Glyph: TBitmap read GetGlyph write SetGlyph stored IsCustomGlyph;
property GlyphKind: TGlyphKind read FGlyphKind write SetGlyphKind default gkCustom;
property ButtonWidth: Integer read GetButtonWidth write SetButtonWidth
stored BtnWidthStored;
property NumGlyphs: TNumGlyphs read GetNumGlyphs write SetNumGlyphs;
property ButtonHint: string read GetButtonHint write SetButtonHint;
property DirectInput: Boolean read GetDirectInput write SetDirectInput default True;
property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
property PopupAlign: TPopupAlign read FPopupAlign write FPopupAlign default epaRight;
property PopupVisible: Boolean read GetPopupVisible;
property OnButtonClick: TNotifyEvent read FOnButtonClick write FOnButtonClick;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure DoClick;
procedure SelectAll;
end;
{ TComboEdit }
TComboEdit = class(TCustomComboEdit)
public
property Button;
published
property Alignment;
property AutoSelect;
property BorderStyle;
property ButtonHint;
property CharCase;
property ClickKey;
property Color;
property Ctl3D;
property DirectInput;
property DragCursor;
property DragMode;
property EditMask;
property Enabled;
property Font;
property GlyphKind;
{ Ensure GlyphKind is published before Glyph and ButtonWidth }
property Glyph;
property ButtonWidth;
property HideSelection;
{$IFDEF RX_D4}
property Anchors;
property BiDiMode;
property Constraints;
property DragKind;
property ParentBiDiMode;
{$ENDIF}
{$IFDEF WIN32}
{$IFNDEF VER90}
property ImeMode;
property ImeName;
{$ENDIF}
{$ENDIF}
property MaxLength;
property NumGlyphs;
property OEMConvert;
property ParentColor;
property ParentCtl3D;
property ParentFont;
property ParentShowHint;
property PopupMenu;
property ReadOnly;
property ShowHint;
property TabOrder;
property TabStop;
property Text;
property Visible;
property OnButtonClick;
property OnChange;
property OnClick;
property OnDblClick;
property OnDragDrop;
property OnDragOver;
property OnEndDrag;
property OnEnter;
property OnExit;
property OnKeyDown;
property OnKeyPress;
property OnKeyUp;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
{$IFDEF WIN32}
property OnStartDrag;
{$ENDIF}
{$IFDEF RX_D5}
property OnContextPopup;
{$ENDIF}
{$IFDEF RX_D4}
property OnEndDock;
property OnStartDock;
{$ENDIF}
end;
{ TFileDirEdit }
{ The common parent of TFilenameEdit and TDirectoryEdit }
{ For internal use only; it's not intended to be used separately }
{$IFNDEF WIN32}
const
MaxFileLength = SizeOf(TFileName) - 1;
{$ENDIF}
type
TExecOpenDialogEvent = procedure(Sender: TObject; var Name: string;
var Action: Boolean) of object;
TFileDirEdit = class(TCustomComboEdit)
private
FErrMode: Cardinal;
FAcceptFiles: Boolean;
FMultipleDirs: Boolean;
FOnDropFiles: TNotifyEvent;
FOnBeforeDialog: TExecOpenDialogEvent;
FOnAfterDialog: TExecOpenDialogEvent;
procedure SetDragAccept(Value: Boolean);
procedure SetAcceptFiles(Value: Boolean);
procedure WMDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES;
protected
procedure CreateHandle; override;
procedure DestroyWindowHandle; override;
function GetDefaultBitmap(var DestroyNeeded: Boolean): TBitmap; override;
{$IFDEF WIN32}
function GetLongName: string; virtual; abstract;
function GetShortName: string; virtual; abstract;
{$ENDIF}
procedure DoAfterDialog(var FileName: string; var Action: Boolean); dynamic;
procedure DoBeforeDialog(var FileName: string; var Action: Boolean); dynamic;
procedure ReceptFileDir(const AFileName: string); virtual; abstract;
procedure ClearFileList; virtual;
procedure DisableSysErrors;
procedure EnableSysErrors;
property GlyphKind default gkDefault;
property MaxLength {$IFNDEF WIN32} default MaxFileLength {$ENDIF};
public
constructor Create(AOwner: TComponent); override;
{$IFDEF WIN32}
property LongName: string read GetLongName;
property ShortName: string read GetShortName;
{$ENDIF}
published
property AcceptFiles: Boolean read FAcceptFiles write SetAcceptFiles default False;
property OnBeforeDialog: TExecOpenDialogEvent read FOnBeforeDialog
write FOnBeforeDialog;
property OnAfterDialog: TExecOpenDialogEvent read FOnAfterDialog
write FOnAfterDialog;
property OnDropFiles: TNotifyEvent read FOnDropFiles write FOnDropFiles;
property OnButtonClick;
end;
{ TFilenameEdit }
TFileDialogKind = (dkOpen, dkSave {$IFDEF RX_D3}, dkOpenPicture,
dkSavePicture {$ENDIF});
TFilenameEdit = class(TFileDirEdit)
private
FDialog: TOpenDialog;
FDialogKind: TFileDialogKind;
procedure CreateEditDialog;
function GetFileName: string;
function GetDefaultExt: TFileExt;
function GetFileEditStyle: TFileEditStyle;
function GetFilter: string;
function GetFilterIndex: Integer;
function GetInitialDir: string;
function GetHistoryList: TStrings;
function GetOptions: TOpenOptions;
function GetDialogTitle: string;
function GetDialogFiles: TStrings;
procedure SetDialogKind(Value: TFileDialogKind);
procedure SetFileName(const Value: string);
procedure SetDefaultExt(Value: TFileExt);
procedure SetFileEditStyle(Value: TFileEditStyle);
procedure SetFilter(const Value: string);
procedure SetFilterIndex(Value: Integer);
procedure SetInitialDir(const Value: string);
procedure SetHistoryList(Value: TStrings);
procedure SetOptions(Value: TOpenOptions);
procedure SetDialogTitle(const Value: string);
function IsCustomTitle: Boolean;
function IsCustomFilter: Boolean;
protected
procedure ButtonClick; override;
procedure ReceptFileDir(const AFileName: string); override;
procedure ClearFileList; override;
{$IFDEF WIN32}
function GetLongName: string; override;
function GetShortName: string; override;
{$ENDIF}
public
constructor Create(AOwner: TComponent); override;
property Dialog: TOpenDialog read FDialog;
property DialogFiles: TStrings read GetDialogFiles;
published
property DialogKind: TFileDialogKind read FDialogKind write SetDialogKind
default dkOpen;
property DefaultExt: TFileExt read GetDefaultExt write SetDefaultExt;
property FileEditStyle: TFileEditStyle read GetFileEditStyle write SetFileEditStyle
default fsEdit;
property FileName: string read GetFileName write SetFileName stored False;
property Filter: string read GetFilter write SetFilter stored IsCustomFilter;
property FilterIndex: Integer read GetFilterIndex write SetFilterIndex default 1;
property InitialDir: string read GetInitialDir write SetInitialDir;
property HistoryList: TStrings read GetHistoryList write SetHistoryList;
property DialogOptions: TOpenOptions read GetOptions write SetOptions
default [ofHideReadOnly];
property DialogTitle: string read GetDialogTitle write SetDialogTitle
stored IsCustomTitle;
property AutoSelect;
property ButtonHint;
property BorderStyle;
property CharCase;
property ClickKey;
property Color;
property Ctl3D;
property DirectInput;
property DragCursor;
property DragMode;
property EditMask;
property Enabled;
property Font;
property GlyphKind;
{ Ensure GlyphKind is declared before Glyph and ButtonWidth }
property Glyph;
property ButtonWidth;
property HideSelection;
{$IFDEF RX_D4}
property Anchors;
property BiDiMode;
property Constraints;
property DragKind;
property ParentBiDiMode;
{$ENDIF}
{$IFDEF WIN32}
{$IFNDEF VER90}
property ImeMode;
property ImeName;
{$ENDIF}
{$ENDIF}
property NumGlyphs;
property ParentColor;
property ParentCtl3D;
property ParentFont;
property ParentShowHint;
property PopupMenu;
property ReadOnly;
property ShowHint;
property TabOrder;
property TabStop;
property Text;
property Visible;
property OnChange;
property OnClick;
property OnDblClick;
property OnDragDrop;
property OnDragOver;
property OnEndDrag;
property OnEnter;
property OnExit;
property OnKeyDown;
property OnKeyPress;
property OnKeyUp;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
{$IFDEF WIN32}
property OnStartDrag;
{$ENDIF}
{$IFDEF RX_D5}
property OnContextPopup;
{$ENDIF}
{$IFDEF RX_D4}
property OnEndDock;
property OnStartDock;
{$ENDIF}
end;
{ TDirectoryEdit }
{$IFDEF WIN32}
TDirDialogKind = (dkVCL, dkWin32);
{$ENDIF}
TDirectoryEdit = class(TFileDirEdit)
private
FOptions: TSelectDirOpts;
FInitialDir: string;
{$IFDEF WIN32}
FDialogText: string;
FDialogKind: TDirDialogKind;
{$ENDIF}
protected
procedure ButtonClick; override;
procedure ReceptFileDir(const AFileName: string); override;
{$IFDEF WIN32}
function GetLongName: string; override;
function GetShortName: string; override;
{$ENDIF}
public
constructor Create(AOwner: TComponent); override;
published
{$IFDEF WIN32}
property DialogKind: TDirDialogKind read FDialogKind write FDialogKind
default dkVCL;
property DialogText: string read FDialogText write FDialogText;
{$ENDIF}
property DialogOptions: TSelectDirOpts read FOptions write FOptions default [];
property InitialDir: string read FInitialDir write FInitialDir;
property MultipleDirs: Boolean read FMultipleDirs write FMultipleDirs default False;
property AutoSelect;
property ButtonHint;
property BorderStyle;
property CharCase;
property ClickKey;
property Color;
property Ctl3D;
property DirectInput;
property DragCursor;
property DragMode;
property EditMask;
property Enabled;
property Font;
property GlyphKind;
{ Ensure GlyphKind is declared before Glyph and ButtonWidth }
property Glyph;
property NumGlyphs;
property ButtonWidth;
property HideSelection;
{$IFDEF RX_D4}
property Anchors;
property BiDiMode;
property Constraints;
property DragKind;
property ParentBiDiMode;
{$ENDIF}
{$IFDEF WIN32}
{$IFNDEF VER90}
property ImeMode;
property ImeName;
{$ENDIF}
{$ENDIF}
property ParentColor;
property ParentCtl3D;
property ParentFont;
property ParentShowHint;
property PopupMenu;
property ReadOnly;
property ShowHint;
property TabOrder;
property TabStop;
property Text;
property Visible;
property OnChange;
property OnClick;
property OnDblClick;
property OnDragDrop;
property OnDragOver;
property OnEndDrag;
property OnEnter;
property OnExit;
property OnKeyDown;
property OnKeyPress;
property OnKeyUp;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
{$IFDEF WIN32}
property OnStartDrag;
{$ENDIF}
{$IFDEF RX_D5}
property OnContextPopup;
{$ENDIF}
{$IFDEF RX_D4}
property OnEndDock;
property OnStartDock;
{$ENDIF}
end;
{ TCustomDateEdit }
TCalendarStyle = (csPopup, csDialog);
TYearDigits = (dyDefault, dyFour, dyTwo);
const
{$IFDEF DEFAULT_POPUP_CALENDAR}
dcsDefault = csPopup;
{$ELSE}
dcsDefault = csDialog;
{$ENDIF DEFAULT_POPUP_CALENDAR}
type
TExecDateDialog = procedure(Sender: TObject; var ADate: TDateTime;
var Action: Boolean) of object;
TCustomDateEdit = class(TCustomComboEdit)
private
FTitle: PString;
FOnAcceptDate: TExecDateDialog;
FDefaultToday: Boolean;
FHooked: Boolean;
FPopupColor: TColor;
FCheckOnExit: Boolean;
FBlanksChar: Char;
FCalendarHints: TStrings;
FStartOfWeek: TDayOfWeekName;
FWeekends: TDaysOfWeek;
FWeekendColor: TColor;
FYearDigits: TYearDigits;
FDateFormat: string[10];
FFormatting: Boolean;
function GetDate: TDateTime;
procedure SetDate(Value: TDateTime);
procedure SetYearDigits(Value: TYearDigits);
function GetPopupColor: TColor;
procedure SetPopupColor(Value: TColor);
function GetDialogTitle: string;
procedure SetDialogTitle(const Value: string);
function IsCustomTitle: Boolean;
function GetCalendarStyle: TCalendarStyle;
procedure SetCalendarStyle(Value: TCalendarStyle);
procedure SetCalendarHints(Value: TStrings);
procedure CalendarHintsChanged(Sender: TObject);
procedure SetWeekendColor(Value: TColor);
procedure SetWeekends(Value: TDaysOfWeek);
procedure SetStartOfWeek(Value: TDayOfWeekName);
procedure SetBlanksChar(Value: Char);
function TextStored: Boolean;
function FourDigitYear: Boolean;
function FormatSettingsChange(var Message: TMessage): Boolean;
procedure CMExit(var Message: TCMExit); message CM_EXIT;
protected
procedure Change; override;
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
procedure KeyPress(var Key: Char); override;
procedure CreateWindowHandle(const Params: TCreateParams); override;
procedure DestroyWindowHandle; override;
{$IFDEF WIN32}
function AcceptPopup(var Value: Variant): Boolean; override;
procedure AcceptValue(const Value: Variant); override;
procedure SetPopupValue(const Value: Variant); override;
{$ELSE}
function AcceptPopup(var Value: string): Boolean; override;
{$ENDIF}
function GetDateFormat: string;
procedure ApplyDate(Value: TDateTime); virtual;
function GetDefaultBitmap(var DestroyNeeded: Boolean): TBitmap; override;
procedure UpdateFormat;
procedure UpdatePopup;
procedure ButtonClick; override;
property BlanksChar: Char read FBlanksChar write SetBlanksChar default ' ';
property CalendarHints: TStrings read FCalendarHints write SetCalendarHints;
property CheckOnExit: Boolean read FCheckOnExit write FCheckOnExit default False;
property DefaultToday: Boolean read FDefaultToday write FDefaultToday
default False;
property DialogTitle: string read GetDialogTitle write SetDialogTitle
stored IsCustomTitle;
property EditMask stored False;
property Formatting: Boolean read FFormatting;
property GlyphKind default gkDefault;
property PopupColor: TColor read GetPopupColor write SetPopupColor
default clBtnFace;
property CalendarStyle: TCalendarStyle read GetCalendarStyle
write SetCalendarStyle default dcsDefault;
property StartOfWeek: TDayOfWeekName read FStartOfWeek write SetStartOfWeek default Mon;
property Weekends: TDaysOfWeek read FWeekends write SetWeekends default [Sun];
property WeekendColor: TColor read FWeekendColor write SetWeekendColor default clRed;
property YearDigits: TYearDigits read FYearDigits write SetYearDigits default dyDefault;
property OnAcceptDate: TExecDateDialog read FOnAcceptDate write FOnAcceptDate;
property MaxLength stored False;
property Text stored TextStored;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure CheckValidDate;
function GetDateMask: string;
procedure UpdateMask; virtual;
property Date: TDateTime read GetDate write SetDate;
property PopupVisible;
end;
{ TDateEdit }
TDateEdit = class(TCustomDateEdit)
public
constructor Create(AOwner: TComponent); override;
property EditMask;
published
property AutoSelect;
property BlanksChar;
property BorderStyle;
property ButtonHint;
property CalendarHints;
property CheckOnExit;
property ClickKey;
property Color;
property Ctl3D;
property DefaultToday;
property DialogTitle;
property DirectInput;
property DragCursor;
property DragMode;
property Enabled;
property Font;
property GlyphKind;
{ Ensure GlyphKind is declared before Glyph and ButtonWidth }
property Glyph;
property ButtonWidth;
property HideSelection;
{$IFDEF RX_D4}
property Anchors;
property BiDiMode;
property Constraints;
property DragKind;
property ParentBiDiMode;
{$ENDIF}
{$IFDEF WIN32}
{$IFNDEF VER90}
property ImeMode;
property ImeName;
{$ENDIF}
{$ENDIF}
property MaxLength;
property NumGlyphs;
property ParentColor;
property ParentCtl3D;
property ParentFont;
property ParentShowHint;
property PopupAlign;
property PopupColor;
property PopupMenu;
property ReadOnly;
property ShowHint;
property CalendarStyle;
property StartOfWeek;
property Weekends;
property WeekendColor;
property YearDigits;
property TabOrder;
property TabStop;
property Text;
property Visible;
property OnAcceptDate;
property OnButtonClick;
property OnChange;
property OnClick;
property OnDblClick;
property OnDragDrop;
property OnDragOver;
property OnEndDrag;
property OnEnter;
property OnExit;
property OnKeyDown;
property OnKeyPress;
property OnKeyUp;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
{$IFDEF WIN32}
property OnStartDrag;
{$ENDIF}
{$IFDEF RX_D5}
property OnContextPopup;
{$ENDIF}
{$IFDEF RX_D4}
property OnEndDock;
property OnStartDock;
{$ENDIF}
end;
EComboEditError = class(Exception);
{ Utility routines }
procedure DateFormatChanged;
function EditorTextMargins(Editor: TCustomComboEdit): TPoint;
function PaintComboEdit(Editor: TCustomComboEdit; const AText: string;
AAlignment: TAlignment; StandardPaint: Boolean;
var ACanvas: TControlCanvas; var Message: TWMPaint): Boolean;
implementation
uses ShellAPI, Consts, {$IFDEF RX_D3} ExtDlgs, {$ENDIF} RXCConst, VCLUtils,
rxStrUtils, FileUtil, PickDate, MaxMin;
{$IFDEF WIN32}
{$R *.R32}
{$ELSE}
{$R *.R16}
{$ENDIF}
const
sFileBmp = 'FEDITBMP'; { Filename and directory editor button glyph }
sDateBmp = 'DEDITBMP'; { Date editor button glyph }
{ Utility routines }
function EditorTextMargins(Editor: TCustomComboEdit): TPoint;
var
DC: HDC;
SaveFont: HFont;
I: Integer;
SysMetrics, Metrics: TTextMetric;
begin
with Editor do begin
{$IFDEF WIN32}
if NewStyleControls then begin
if BorderStyle = bsNone then I := 0
else if Ctl3D then I := 1
else I := 2;
Result.X := SendMessage(Handle, EM_GETMARGINS, 0, 0) and $0000FFFF + I;
Result.Y := I;
end
else begin
{$ENDIF}
if BorderStyle = bsNone then I := 0
else begin
DC := GetDC(0);
GetTextMetrics(DC, SysMetrics);
SaveFont := SelectObject(DC, Font.Handle);
GetTextMetrics(DC, Metrics);
SelectObject(DC, SaveFont);
ReleaseDC(0, DC);
I := SysMetrics.tmHeight;
if I > Metrics.tmHeight then I := Metrics.tmHeight;
I := I div 4;
end;
Result.X := I;
Result.Y := I;
{$IFDEF WIN32}
end;
{$ENDIF}
end;
end;
function PaintComboEdit(Editor: TCustomComboEdit; const AText: string;
AAlignment: TAlignment; StandardPaint: Boolean;
var ACanvas: TControlCanvas; var Message: TWMPaint): Boolean;
var
AWidth, ALeft: Integer;
Margins: TPoint;
R: TRect;
DC: HDC;
PS: TPaintStruct;
S: string;
{$IFDEF RX_D4}
ExStyle: DWORD;
const
AlignStyle: array[Boolean, TAlignment] of DWORD =
((WS_EX_LEFT, WS_EX_RIGHT, WS_EX_LEFT),
(WS_EX_RIGHT, WS_EX_LEFT, WS_EX_LEFT));
{$ENDIF}
begin
Result := True;
with Editor do begin
{$IFDEF RX_D4}
if UseRightToLeftAlignment then ChangeBiDiModeAlignment(AAlignment);
{$ENDIF}
if StandardPaint {$IFDEF WIN32} and not
(csPaintCopy in ControlState) {$ENDIF} then
begin
{$IFDEF RX_D4}
if SysLocale.MiddleEast and HandleAllocated and (IsRightToLeft) then
begin { This keeps the right aligned text, right aligned }
ExStyle := DWORD(GetWindowLong(Handle, GWL_EXSTYLE)) and (not WS_EX_RIGHT) and
(not WS_EX_RTLREADING) and (not WS_EX_LEFTSCROLLBAR);
if UseRightToLeftReading then
ExStyle := ExStyle or WS_EX_RTLREADING;
if UseRightToLeftScrollbar then
ExStyle := ExStyle or WS_EX_LEFTSCROLLBAR;
ExStyle := ExStyle or
AlignStyle[UseRightToLeftAlignment, AAlignment];
if DWORD(GetWindowLong(Handle, GWL_EXSTYLE)) <> ExStyle then
SetWindowLong(Handle, GWL_EXSTYLE, ExStyle);
end;
{$ENDIF RX_D4}
Result := False;
{ return false if we need to use standard paint handler }
Exit;
end;
{ Since edit controls do not handle justification unless multi-line (and
then only poorly) we will draw right and center justify manually unless
the edit has the focus. }
if ACanvas = nil then begin
ACanvas := TControlCanvas.Create;
ACanvas.Control := Editor;
end;
DC := Message.DC;
if DC = 0 then DC := BeginPaint(Handle, PS);
ACanvas.Handle := DC;
try
ACanvas.Font := Font;
if not Enabled and NewStyleControls and not
(csDesigning in ComponentState) and
(ColorToRGB(Color) <> ColorToRGB(clGrayText)) then
ACanvas.Font.Color := clGrayText;
with ACanvas do begin
R := ClientRect;
if {$IFDEF WIN32} not (NewStyleControls and Ctl3D) and {$ENDIF}
(BorderStyle = bsSingle) then
begin
Brush.Color := clWindowFrame;
FrameRect(R);
InflateRect(R, -1, -1);
end;
Brush.Color := Color;
S := AText;
AWidth := TextWidth(S);
Margins := EditorTextMargins(Editor);
if PopupVisible then ALeft := Margins.X
else begin
if ButtonWidth > 0 then Inc(AWidth);
case AAlignment of
taLeftJustify:
ALeft := Margins.X;
taRightJustify:
ALeft := ClientWidth - ButtonWidth - AWidth - Margins.X - 2;
else
ALeft := (ClientWidth - ButtonWidth - AWidth) div 2;
end;
end;
{$IFDEF RX_D4}
if SysLocale.MiddleEast then UpdateTextFlags;
{$ENDIF}
TextRect(R, ALeft, Margins.Y, S);
end;
finally
ACanvas.Handle := 0;
if Message.DC = 0 then EndPaint(Handle, PS);
end;
end;
end;
{ TEditButton }
constructor TEditButton.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
{$IFDEF WIN32}
ControlStyle := ControlStyle + [csReplicatable];
{$ELSE}
Style := bsWin31;
{$ENDIF}
ParentShowHint := True;
end;
{$IFDEF WIN32}
procedure TEditButton.Paint;
begin
inherited Paint;
if (FState <> rbsDown) then
with Canvas do begin
if NewStyleControls then Pen.Color := clBtnFace
else Pen.Color := clBtnShadow;
MoveTo(0, 0);
LineTo(0, Self.Height - 1);
Pen.Color := clBtnHighlight;
MoveTo(1, 1);
LineTo(1, Self.Height - 2);
end;
end;
{$ENDIF WIN32}
procedure TEditButton.MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
begin
if (Button = mbLeft) then
with TCustomComboEdit(Owner) do begin
FNoAction := (FPopup <> nil) and FPopupVisible;
if not FPopupVisible then begin
if TabStop and CanFocus and (GetFocus <> Handle) then SetFocus;
end
else PopupCloseUp(FPopup, True);
end;
inherited MouseDown(Button, Shift, X, Y);
end;
procedure TEditButton.Click;
begin
if not FNoAction then inherited Click else FNoAction := False;
end;
{ TPopupWindow }
constructor TPopupWindow.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FEditor := TWinControl(AOwner);
{$IFDEF WIN32}
ControlStyle := ControlStyle + [csNoDesignVisible, csReplicatable,
csAcceptsControls];
{$ELSE}
ControlStyle := ControlStyle + [csAcceptsControls];
{$ENDIF}
Ctl3D := False;
ParentCtl3D := False;
Visible := False;
Parent := FEditor;
OnMouseUp := PopupMouseUp;
end;
procedure TPopupWindow.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
with Params do begin
Style := WS_POPUP or WS_BORDER or WS_CLIPCHILDREN;
{$IFDEF WIN32}
ExStyle := WS_EX_TOOLWINDOW;
{$ENDIF}
WindowClass.Style := WindowClass.Style or CS_SAVEBITS;
end;
end;
{$IFNDEF WIN32}
procedure TPopupWindow.CreateWnd;
begin
inherited CreateWnd;
if (csDesigning in ComponentState) then SetParent(nil);
end;
{$ENDIF}
procedure TPopupWindow.WMMouseActivate(var Message: TMessage);
begin
Message.Result := MA_NOACTIVATE;
end;
function TPopupWindow.GetPopupText: string;
begin
Result := '';
end;
procedure TPopupWindow.InvalidateEditor;
var
R: TRect;
begin
if (FEditor is TCustomComboEdit) then begin
with TCustomComboEdit(FEditor) do
SetRect(R, 0, 0, ClientWidth - FBtnControl.Width - 2, ClientHeight + 1);
end
else R := FEditor.ClientRect;
InvalidateRect(FEditor.Handle, @R, False);
UpdateWindow(FEditor.Handle);
end;
procedure TPopupWindow.PopupMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then CloseUp(PtInRect(Self.ClientRect, Point(X, Y)));
end;
procedure TPopupWindow.CloseUp(Accept: Boolean);
begin
if Assigned(FCloseUp) then FCloseUp(Self, Accept);
end;
procedure TPopupWindow.Hide;
begin
SetWindowPos(Handle, 0, 0, 0, 0, 0, SWP_NOZORDER or
SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE or SWP_HIDEWINDOW);
Visible := False;
end;
procedure TPopupWindow.Show(Origin: TPoint);
begin
SetWindowPos(Handle, HWND_TOP, Origin.X, Origin.Y, 0, 0,
SWP_NOACTIVATE or SWP_SHOWWINDOW or SWP_NOSIZE);
Visible := True;
end;
{ TCustomComboEdit }
constructor TCustomComboEdit.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
{$IFDEF RX_D3}
ControlStyle := ControlStyle + [csCaptureMouse];
{$ENDIF}
AutoSize := False;
FDirectInput := True;
FClickKey := scAltDown;
FPopupAlign := epaRight;
FBtnControl := TWinControl.Create(Self);
{$IFDEF WIN32}
with FBtnControl do
ControlStyle := ControlStyle + [csReplicatable];
{$ENDIF}
FBtnControl.Width := DefEditBtnWidth;
FBtnControl.Height := 17;
FBtnControl.Visible := True;
FBtnControl.Parent := Self;
FButton := TEditButton.Create(Self);
FButton.SetBounds(0, 0, FBtnControl.Width, FBtnControl.Height);
FButton.Visible := True;
FButton.Parent := FBtnControl;
TEditButton(FButton).OnClick := EditButtonClick;
Height := 21;
FDefNumGlyphs := 1;
FGlyphKind := gkCustom;
end;
destructor TCustomComboEdit.Destroy;
begin
FButton.OnClick := nil;
inherited Destroy;
end;
procedure TCustomComboEdit.CreateParams(var Params: TCreateParams);
const
Alignments: array[TAlignment] of Longword = (ES_LEFT, ES_RIGHT, ES_CENTER);
begin
inherited CreateParams(Params);
Params.Style := Params.Style or ES_MULTILINE or WS_CLIPCHILDREN
or Alignments[FAlignment];
end;
procedure TCustomComboEdit.CreateWnd;
begin
inherited CreateWnd;
SetEditRect;
end;
procedure TCustomComboEdit.HidePopup;
begin
TPopupWindow(FPopup).Hide;
end;
procedure TCustomComboEdit.ShowPopup(Origin: TPoint);
begin
TPopupWindow(FPopup).Show(Origin);
end;
procedure TCustomComboEdit.PopupDropDown(DisableEdit: Boolean);
var
P: TPoint;
Y: Integer;
begin
if (FPopup <> nil) and not (ReadOnly or FPopupVisible) then begin
P := Parent.ClientToScreen(Point(Left, Top));
Y := P.Y + Height;
if Y + FPopup.Height > Screen.Height then
Y := P.Y - FPopup.Height;
case FPopupAlign of
epaRight:
begin
Dec(P.X, FPopup.Width - Width);
if P.X < 0 then Inc(P.X, FPopup.Width - Width);
end;
epaLeft:
begin
if P.X + FPopup.Width > Screen.Width then
Dec(P.X, FPopup.Width - Width);
end;
end;
if P.X < 0 then P.X := 0
else if P.X + FPopup.Width > Screen.Width then
P.X := Screen.Width - FPopup.Width;
{$IFDEF WIN32}
if Text <> '' then SetPopupValue(Text)
else SetPopupValue(Null);
{$ELSE}
SetPopupValue(Text);
{$ENDIF}
if CanFocus then SetFocus;
ShowPopup(Point(P.X, Y));
FPopupVisible := True;
if DisableEdit then begin
inherited ReadOnly := True;
HideCaret(Handle);
end;
end;
end;
procedure TCustomComboEdit.PopupCloseUp(Sender: TObject; Accept: Boolean);
var
{$IFDEF WIN32}
AValue: Variant;
{$ELSE}
AValue: string;
{$ENDIF}
begin
if (FPopup <> nil) and FPopupVisible then begin
if GetCapture <> 0 then SendMessage(GetCapture, WM_CANCELMODE, 0, 0);
AValue := GetPopupValue;
HidePopup;
try
try
if CanFocus then begin
SetFocus;
if GetFocus = Handle then SetShowCaret;
end;
except
{ ignore exceptions }
end;
SetDirectInput(DirectInput);
Invalidate;
if Accept and AcceptPopup(AValue) and EditCanModify then begin
AcceptValue(AValue);
if FFocused then inherited SelectAll;
end;
finally
FPopupVisible := False;
end;
end;
end;
procedure TCustomComboEdit.DoChange;
begin
inherited Change;
end;
{$IFDEF WIN32}
function TCustomComboEdit.GetPopupValue: Variant;
{$ELSE}
function TCustomComboEdit.GetPopupValue: string;
{$ENDIF}
begin
if FPopup <> nil then Result := TPopupWindow(FPopup).GetValue
else Result := '';
end;
{$IFDEF WIN32}
procedure TCustomComboEdit.SetPopupValue(const Value: Variant);
{$ELSE}
procedure TCustomComboEdit.SetPopupValue(const Value: string);
{$ENDIF}
begin
if FPopup <> nil then TPopupWindow(FPopup).SetValue(Value);
end;
{$IFDEF WIN32}
procedure TCustomComboEdit.AcceptValue(const Value: Variant);
begin
if Text <> VarToStr(Value) then begin
{$ELSE}
procedure TCustomComboEdit.AcceptValue(const Value: string);
begin
if Text <> Value then begin
{$ENDIF}
Text := Value;
Modified := True;
UpdatePopupVisible;
DoChange;
end;
end;
{$IFDEF WIN32}
function TCustomComboEdit.AcceptPopup(var Value: Variant): Boolean;
{$ELSE}
function TCustomComboEdit.AcceptPopup(var Value: string): Boolean;
{$ENDIF}
begin
Result := True;
end;
function TCustomComboEdit.EditCanModify: Boolean;
begin
Result := not FReadOnly;
end;
procedure TCustomComboEdit.Change;
begin
if not PopupVisible then DoChange
else PopupChange;
end;
procedure TCustomComboEdit.PopupChange;
begin
end;
procedure TCustomComboEdit.KeyDown(var Key: Word; Shift: TShiftState);
begin
inherited KeyDown(Key, Shift);
if (FClickKey = ShortCut(Key, Shift)) and (ButtonWidth > 0) then begin
EditButtonClick(Self);
Key := 0;
end;
end;
procedure TCustomComboEdit.KeyPress(var Key: Char);
begin
if (Key = Char(VK_RETURN)) or (Key = Char(VK_ESCAPE)) then
begin
if PopupVisible then begin
PopupCloseUp(FPopup, Key = Char(VK_RETURN));
Key := #0;
end
else begin
{ must catch and remove this, since is actually multi-line }
GetParentForm(Self).Perform(CM_DIALOGKEY, Byte(Key), 0);
if Key = Char(VK_RETURN) then begin
inherited KeyPress(Key);
Key := #0;
Exit;
end;
end;
end;
inherited KeyPress(Key);
end;
procedure TCustomComboEdit.MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
begin
if (FPopup <> nil) and (Button = mbLeft) then begin
if CanFocus then SetFocus;
if not FFocused then Exit;
if FPopupVisible then PopupCloseUp(FPopup, False);
{else if (not ReadOnly or AlwaysEnable) and (not DirectInput) then
PopupDropDown(True);}
end;
inherited MouseDown(Button, Shift, X, Y);
end;
function TCustomComboEdit.GetButtonWidth: Integer;
begin
Result := FButton.Width;
end;
procedure TCustomComboEdit.SetButtonWidth(Value: Integer);
begin
if ButtonWidth <> Value then begin
FBtnControl.Visible := Value > 1;
if (csCreating in ControlState) then begin
FBtnControl.Width := Value;
FButton.Width := Value;
with FButton do
ControlStyle := ControlStyle - [csFixedWidth];
RecreateGlyph;
end
else if (Value <> ButtonWidth) and (Value < ClientWidth) then begin
FButton.Width := Value;
with FButton do
ControlStyle := ControlStyle - [csFixedWidth];
if HandleAllocated then RecreateWnd;
RecreateGlyph;
end;
end;
end;
function TCustomComboEdit.GetButtonHint: string;
begin
Result := FButton.Hint;
end;
procedure TCustomComboEdit.SetButtonHint(const Value: string);
begin
FButton.Hint := Value;
end;
function TCustomComboEdit.GetGlyph: TBitmap;
begin
Result := FButton.Glyph;
end;
procedure TCustomComboEdit.SetGlyph(Value: TBitmap);
begin
FButton.Glyph := Value;
FGlyphKind := gkCustom;
end;
function TCustomComboEdit.GetNumGlyphs: TNumGlyphs;
begin
Result := FButton.NumGlyphs;
end;
procedure TCustomComboEdit.SetNumGlyphs(Value: TNumGlyphs);
begin
if FGlyphKind in [gkDropDown, gkEllipsis] then FButton.NumGlyphs := 1
else if FGlyphKind = gkDefault then FButton.NumGlyphs := FDefNumGlyphs
else FButton.NumGlyphs := Value;
end;
procedure TCustomComboEdit.SetEditRect;
var
Loc: TRect;
begin
SetRect(Loc, 0, 0, ClientWidth - FBtnControl.Width - 2, ClientHeight + 1);
SendMessage(Handle, EM_SETRECTNP, 0, LongInt(@Loc));
end;
procedure TCustomComboEdit.UpdateBtnBounds;
var
BtnRect: TRect;
begin
{$IFDEF WIN32}
if NewStyleControls then begin
if Ctl3D and (BorderStyle = bsSingle) then
BtnRect := Bounds(Width - FButton.Width - 4, 0,
FButton.Width, Height - 4)
else begin
if BorderStyle = bsSingle then
BtnRect := Bounds(Width - FButton.Width - 2, 2,
FButton.Width, Height - 4)
else
BtnRect := Bounds(Width - FButton.Width, 0,
FButton.Width, Height);
end;
end
else
BtnRect := Bounds(Width - FButton.Width, 0, FButton.Width, Height);
{$ELSE}
BtnRect := Bounds(Width - FButton.Width, 0, FButton.Width, Height);
{$ENDIF}
with BtnRect do
FBtnControl.SetBounds(Left, Top, Right - Left, Bottom - Top);
FButton.Height := FBtnControl.Height;
SetEditRect;
end;
{$IFDEF WIN32}
procedure TCustomComboEdit.CMCtl3DChanged(var Message: TMessage);
begin
inherited;
UpdateBtnBounds;
end;
{$ENDIF}
procedure TCustomComboEdit.WMSize(var Message: TWMSize);
var
MinHeight: Integer;
begin
inherited;
if not (csLoading in ComponentState) then begin
MinHeight := GetMinHeight;
{ text edit bug: if size to less than MinHeight, then edit ctrl does
not display the text }
if Height < MinHeight then begin
Height := MinHeight;
Exit;
end;
end
else begin
if (FPopup <> nil) and (csDesigning in ComponentState) then
FPopup.SetBounds(0, Height + 1, 10, 10);
end;
UpdateBtnBounds;
end;
function TCustomComboEdit.GetTextHeight: Integer;
var
DC: HDC;
SaveFont: HFont;
SysMetrics, Metrics: TTextMetric;
begin
DC := GetDC(0);
try
GetTextMetrics(DC, SysMetrics);
SaveFont := SelectObject(DC, Font.Handle);
GetTextMetrics(DC, Metrics);
SelectObject(DC, SaveFont);
finally
ReleaseDC(0, DC);
end;
Result := Min(SysMetrics.tmHeight, Metrics.tmHeight);
end;
function TCustomComboEdit.GetMinHeight: Integer;
var
I: Integer;
begin
I := GetTextHeight;
Result := I + GetSystemMetrics(SM_CYBORDER) * 4 +
1 {$IFNDEF WIN32} + (I div 4) {$ENDIF};
end;
procedure TCustomComboEdit.UpdatePopupVisible;
begin
FPopupVisible := (FPopup <> nil) and FPopup.Visible;
end;
function TCustomComboEdit.GetPopupVisible: Boolean;
begin
Result := (FPopup <> nil) and FPopupVisible;
end;
procedure TCustomComboEdit.CMFontChanged(var Message: TMessage);
begin
inherited;
if HandleAllocated then SetEditRect;
end;
procedure TCustomComboEdit.CMEnabledChanged(var Message: TMessage);
begin
inherited;
FButton.Enabled := Enabled;
end;
procedure TCustomComboEdit.CMCancelMode(var Message: TCMCancelMode);
begin
if (Message.Sender <> Self) and (Message.Sender <> FPopup) and
(Message.Sender <> FButton) and ((FPopup <> nil) and
not FPopup.ContainsControl(Message.Sender)) then
PopupCloseUp(FPopup, False);
end;
procedure TCustomComboEdit.CMEnter(var Message: TMessage);
begin
if AutoSelect and not (csLButtonDown in ControlState) then SelectAll;
inherited;
end;
procedure TCustomComboEdit.CNCtlColor(var Message: TMessage);
var
TextColor: Longint;
begin
inherited;
if NewStyleControls then begin
TextColor := ColorToRGB(Font.Color);
if not Enabled and (ColorToRGB(Color) <> ColorToRGB(clGrayText)) then
TextColor := ColorToRGB(clGrayText);
SetTextColor(Message.WParam, TextColor);
end;
end;
procedure TCustomComboEdit.WMKillFocus(var Message: TWMKillFocus);
begin
inherited;
FFocused := False;
PopupCloseUp(FPopup, False);
end;
procedure TCustomComboEdit.WMSetFocus(var Message: TMessage);
begin
inherited;
FFocused := True;
SetShowCaret;
end;
{$IFDEF RX_D4}
procedure TCustomComboEdit.CMBiDiModeChanged(var Message: TMessage);
begin
inherited;
if FPopup <> nil then FPopup.BiDiMode := BiDiMode;
end;
{$ENDIF}
procedure TCustomComboEdit.SetShowCaret;
const
CaretWidth: array[Boolean] of Byte = (1, 2);
begin
CreateCaret(Handle, 0, CaretWidth[fsBold in Font.Style], GetTextHeight);
ShowCaret(Handle);
end;
procedure TCustomComboEdit.EditButtonClick(Sender: TObject);
begin
if (not FReadOnly) or AlwaysEnable then ButtonClick;
end;
procedure TCustomComboEdit.DoClick;
begin
EditButtonClick(Self);
end;
procedure TCustomComboEdit.ButtonClick;
begin
if Assigned(FOnButtonClick) then FOnButtonClick(Self);
if FPopup <> nil then begin
if FPopupVisible then PopupCloseUp(FPopup, True) else PopupDropDown(True);
end;
end;
procedure TCustomComboEdit.SelectAll;
begin
if DirectInput then inherited SelectAll;
end;
function TCustomComboEdit.GetDirectInput: Boolean;
begin
Result := FDirectInput;
end;
procedure TCustomComboEdit.SetDirectInput(Value: Boolean);
begin
inherited ReadOnly := not Value or FReadOnly;
FDirectInput := Value;
end;
procedure TCustomComboEdit.WMPaste(var Message: TWMPaste);
begin
if not FDirectInput or ReadOnly then Exit;
inherited;
end;
procedure TCustomComboEdit.WMCut(var Message: TWMCut);
begin
if not FDirectInput or ReadOnly then Exit;
inherited;
end;
function TCustomComboEdit.GetReadOnly: Boolean;
begin
Result := FReadOnly;
end;
procedure TCustomComboEdit.SetReadOnly(Value: Boolean);
begin
if Value <> FReadOnly then begin
FReadOnly := Value;
inherited ReadOnly := Value or not FDirectInput;
end;
end;
procedure TCustomComboEdit.SetAlignment(Value: TAlignment);
begin
if FAlignment <> Value then begin
FAlignment := Value;
RecreateWnd;
end;
end;
function TCustomComboEdit.BtnWidthStored: Boolean;
begin
if (FGlyphKind = gkDefault) and (Glyph <> nil) then
Result := ButtonWidth <> Max(Glyph.Width div FButton.NumGlyphs + 6,
DefEditBtnWidth)
else if FGlyphKind = gkDropDown then
Result := ButtonWidth <> GetSystemMetrics(SM_CXVSCROLL)
{$IFNDEF WIN32} + 1{$ENDIF}
else Result := ButtonWidth <> DefEditBtnWidth;
end;
function TCustomComboEdit.IsCustomGlyph: Boolean;
begin
Result := FGlyphKind = gkCustom;
end;
procedure TCustomComboEdit.SetGlyphKind(Value: TGlyphKind);
begin
if FGlyphKind <> Value then begin
FGlyphKind := Value;
if (FGlyphKind = gkCustom) and (csReading in ComponentState) then begin
Glyph := nil;
end;
RecreateGlyph;
if (FGlyphKind = gkDefault) and (Glyph <> nil) then
ButtonWidth := Max(Glyph.Width div FButton.NumGlyphs + 6, FButton.Width)
else if FGlyphKind = gkDropDown then begin
ButtonWidth := GetSystemMetrics(SM_CXVSCROLL){$IFNDEF WIN32} + 1{$ENDIF};
with FButton do
ControlStyle := ControlStyle + [csFixedWidth];
end;
end;
end;
function TCustomComboEdit.GetDefaultBitmap(var DestroyNeeded: Boolean): TBitmap;
begin
Result := nil;
end;
procedure TCustomComboEdit.RecreateGlyph;
function CreateEllipsisGlyph: TBitmap;
var
W, G, I: Integer;
begin
Result := TBitmap.Create;
with Result do
try
Monochrome := True;
Width := Max(1, FButton.Width - 6);
Height := 4;
W := 2;
G := (Result.Width - 3 * W) div 2;
if G <= 0 then G := 1;
if G > 3 then G := 3;
I := (Width - 3 * W - 2 * G) div 2;
PatBlt(Canvas.Handle, I, 1, W, W, BLACKNESS);
PatBlt(Canvas.Handle, I + G + W, 1, W, W, BLACKNESS);
PatBlt(Canvas.Handle, I + 2 * G + 2 * W, 1, W, W, BLACKNESS);
except
Free;
raise;
end;
end;
var
NewGlyph: TBitmap;
DestroyNeeded: Boolean;
begin
case FGlyphKind of
gkDefault:
begin
DestroyNeeded := False;
NewGlyph := GetDefaultBitmap(DestroyNeeded);
try
FButton.Glyph.Assign(NewGlyph);
NumGlyphs := FDefNumGlyphs;
finally
if DestroyNeeded then NewGlyph.Destroy;
end;
end;
gkDropDown:
begin
FButton.Glyph.Handle := LoadBitmap(0, PChar(32738));
NumGlyphs := 1;
end;
gkEllipsis:
begin
NewGlyph := CreateEllipsisGlyph;
try
FButton.Glyph := NewGlyph;
NumGlyphs := 1;
finally
NewGlyph.Destroy;
end;
end;
end;
end;
const
FileBitmap: TBitmap = nil;
DateBitmap: TBitmap = nil;
{ TFileDirEdit }
constructor TFileDirEdit.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
OEMConvert := True;
{$IFNDEF WIN32}
MaxLength := MaxFileLength;
{$ENDIF}
ControlState := ControlState + [csCreating];
try
GlyphKind := gkDefault; { force update }
finally
ControlState := ControlState - [csCreating];
end;
end;
function TFileDirEdit.GetDefaultBitmap(var DestroyNeeded: Boolean): TBitmap;
begin
DestroyNeeded := False;
if FileBitmap = nil then begin
FileBitmap := TBitmap.Create;
FileBitmap.Handle := LoadBitmap(hInstance, sFileBmp);
end;
Result := FileBitmap;
end;
procedure TFileDirEdit.DoBeforeDialog(var FileName: string;
var Action: Boolean);
begin
if Assigned(FOnBeforeDialog) then FOnBeforeDialog(Self, FileName, Action);
end;
procedure TFileDirEdit.DoAfterDialog(var FileName: string;
var Action: Boolean);
begin
if Assigned(FOnAfterDialog) then FOnAfterDialog(Self, FileName, Action);
end;
procedure TFileDirEdit.CreateHandle;
begin
inherited CreateHandle;
if FAcceptFiles then SetDragAccept(True);
end;
procedure TFileDirEdit.DestroyWindowHandle;
begin
SetDragAccept(False);
inherited DestroyWindowHandle;
end;
procedure TFileDirEdit.SetDragAccept(Value: Boolean);
begin
if not (csDesigning in ComponentState) and (Handle <> 0) then
DragAcceptFiles(Handle, Value);
end;
procedure TFileDirEdit.SetAcceptFiles(Value: Boolean);
begin
if FAcceptFiles <> Value then begin
SetDragAccept(Value);
FAcceptFiles := Value;
end;
end;
procedure TFileDirEdit.DisableSysErrors;
begin
FErrMode := SetErrorMode(SEM_NOOPENFILEERRORBOX or SEM_FAILCRITICALERRORS);
end;
procedure TFileDirEdit.EnableSysErrors;
begin
SetErrorMode(FErrMode);
FErrMode := 0;
end;
procedure TFileDirEdit.WMDropFiles(var Msg: TWMDropFiles);
var
AFileName: array[0..255] of Char;
I, Num: Cardinal;
begin
Msg.Result := 0;
try
{$IFDEF WIN32}
Num := DragQueryFile(Msg.Drop, $FFFFFFFF, nil, 0);
{$ELSE}
Num := DragQueryFile(Msg.Drop, $FFFF, nil, 0);
{$ENDIF}
if Num > 0 then begin
ClearFileList;
for I := 0 to Num - 1 do begin
DragQueryFile(Msg.Drop, I, PChar(@AFileName), Pred(SizeOf(AFileName)));
ReceptFileDir(StrPas(AFileName));
if not FMultipleDirs then Break;
end;
if Assigned(FOnDropFiles) then FOnDropFiles(Self);
end;
finally
DragFinish(Msg.Drop);
end;
end;
procedure TFileDirEdit.ClearFileList;
begin
end;
{ TFilenameEdit }
function ClipFilename(const FileName: string): string;
var
Params: string;
begin
if FileExists(FileName) then Result := FileName
else SplitCommandLine(FileName, Result, Params);
end;
function ExtFilename(const FileName: string): string;
begin
if (Pos(' ', FileName) > 0) and (FileName[1] <> '"') then
Result := Format('"%s"', [FileName])
else Result := FileName;
end;
constructor TFilenameEdit.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
CreateEditDialog;
end;
procedure TFilenameEdit.CreateEditDialog;
var
NewDialog: TOpenDialog;
begin
case FDialogKind of
dkOpen: NewDialog := TOpenDialog.Create(Self);
{$IFDEF RX_D3}
dkOpenPicture: NewDialog := TOpenPictureDialog.Create(Self);
dkSavePicture: NewDialog := TSavePictureDialog.Create(Self);
{$ENDIF}
else {dkSave} NewDialog := TSaveDialog.Create(Self);
end;
try
if FDialog <> nil then begin
with NewDialog do begin
DefaultExt := FDialog.DefaultExt;
FileEditStyle := FDialog.FileEditStyle;
FileName := FDialog.FileName;
Filter := FDialog.Filter;
FilterIndex := FDialog.FilterIndex;
InitialDir := FDialog.InitialDir;
HistoryList := FDialog.HistoryList;
Files.Assign(FDialog.Files);
Options := FDialog.Options;
Title := FDialog.Title;
end;
FDialog.Free;
end
else begin
NewDialog.Title := LoadStr(SBrowse);
NewDialog.Filter := LoadStr(SDefaultFilter);
NewDialog.Options := [ofHideReadOnly];
end;
finally
FDialog := NewDialog;
end;
end;
function TFilenameEdit.IsCustomTitle: Boolean;
begin
Result := CompareStr(LoadStr(SBrowse), FDialog.Title) <> 0;
end;
function TFilenameEdit.IsCustomFilter: Boolean;
begin
Result := CompareStr(LoadStr(SDefaultFilter), FDialog.Filter) <> 0;
end;
procedure TFilenameEdit.ButtonClick;
var
Temp: string;
Action: Boolean;
begin
inherited ButtonClick;
Temp := inherited Text;
Action := True;
Temp := ClipFilename(Temp);
DoBeforeDialog(Temp, Action);
if not Action then Exit;
if ValidFileName(Temp) then
try
if DirExists(ExtractFilePath(Temp)) then
SetInitialDir(ExtractFilePath(Temp));
if (ExtractFileName(Temp) = '') or
not ValidFileName(ExtractFileName(Temp)) then Temp := '';
FDialog.FileName := Temp;
except
{ ignore any exceptions }
end;
FDialog.HelpContext := Self.HelpContext;
DisableSysErrors;
try
Action := FDialog.Execute;
finally
EnableSysErrors;
end;
if Action then Temp := FDialog.FileName;
if CanFocus then SetFocus;
DoAfterDialog(Temp, Action);
if Action then begin
inherited Text := ExtFilename(Temp);
SetInitialDir(ExtractFilePath(FDialog.FileName));
end;
end;
function TFilenameEdit.GetFileName: string;
begin
Result := ClipFilename(inherited Text);
end;
procedure TFilenameEdit.SetFileName(const Value: string);
begin
if (Value = '') or ValidFileName(ClipFilename(Value)) then begin
inherited Text := ExtFilename(Value);
ClearFileList;
end
else raise EComboEditError.CreateFmt(ResStr(SInvalidFilename), [Value]);
end;
{$IFDEF WIN32}
function TFilenameEdit.GetLongName: string;
begin
Result := ShortToLongFileName(FileName);
end;
function TFilenameEdit.GetShortName: string;
begin
Result := LongToShortFileName(FileName);
end;
{$ENDIF WIN32}
procedure TFilenameEdit.ClearFileList;
begin
FDialog.Files.Clear;
end;
procedure TFilenameEdit.ReceptFileDir(const AFileName: string);
begin
if FMultipleDirs then begin
if FDialog.Files.Count = 0 then SetFileName(AFileName);
FDialog.Files.Add(AFileName);
end
else SetFileName(AFileName);
end;
function TFilenameEdit.GetDialogFiles: TStrings;
begin
Result := FDialog.Files;
end;
function TFilenameEdit.GetDefaultExt: TFileExt;
begin
Result := FDialog.DefaultExt;
end;
function TFilenameEdit.GetFileEditStyle: TFileEditStyle;
begin
Result := FDialog.FileEditStyle;
end;
function TFilenameEdit.GetFilter: string;
begin
Result := FDialog.Filter;
end;
function TFilenameEdit.GetFilterIndex: Integer;
begin
Result := FDialog.FilterIndex;
end;
function TFilenameEdit.GetInitialDir: string;
begin
Result := FDialog.InitialDir;
end;
function TFilenameEdit.GetHistoryList: TStrings;
begin
Result := FDialog.HistoryList;
end;
function TFilenameEdit.GetOptions: TOpenOptions;
begin
Result := FDialog.Options;
end;
function TFilenameEdit.GetDialogTitle: string;
begin
Result := FDialog.Title;
end;
procedure TFilenameEdit.SetDialogKind(Value: TFileDialogKind);
begin
if FDialogKind <> Value then begin
FDialogKind := Value;
CreateEditDialog;
end;
end;
procedure TFilenameEdit.SetDefaultExt(Value: TFileExt);
begin
FDialog.DefaultExt := Value;
end;
procedure TFilenameEdit.SetFileEditStyle(Value: TFileEditStyle);
begin
FDialog.FileEditStyle := Value;
end;
procedure TFilenameEdit.SetFilter(const Value: string);
begin
FDialog.Filter := Value;
end;
procedure TFilenameEdit.SetFilterIndex(Value: Integer);
begin
FDialog.FilterIndex := Value;
end;
procedure TFilenameEdit.SetInitialDir(const Value: string);
begin
FDialog.InitialDir := Value;
end;
procedure TFilenameEdit.SetHistoryList(Value: TStrings);
begin
FDialog.HistoryList := Value;
end;
procedure TFilenameEdit.SetOptions(Value: TOpenOptions);
begin
if Value <> FDialog.Options then begin
FDialog.Options := Value;
FMultipleDirs := ofAllowMultiSelect in FDialog.Options;
if not FMultipleDirs then ClearFileList;
end;
end;
procedure TFilenameEdit.SetDialogTitle(const Value: string);
begin
FDialog.Title := Value;
end;
{ TDirectoryEdit }
constructor TDirectoryEdit.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FOptions := [];
end;
procedure TDirectoryEdit.ButtonClick;
var
Temp: string;
Action: Boolean;
begin
inherited ButtonClick;
Temp := Text;
Action := True;
DoBeforeDialog(Temp, Action);
if not Action then Exit;
if (Temp = '') then begin
if (InitialDir <> '') then Temp := InitialDir
else Temp := '\';
end;
if not DirExists(Temp) then Temp := '\';
DisableSysErrors;
try
{$IFDEF WIN32}
if NewStyleControls and (DialogKind = dkWin32) then
Action := BrowseDirectory(Temp, FDialogText, Self.HelpContext)
else Action := SelectDirectory(Temp, FOptions, Self.HelpContext);
{$ELSE}
Action := SelectDirectory(Temp, FOptions, Self.HelpContext);
{$ENDIF}
finally
EnableSysErrors;
end;
if CanFocus then SetFocus;
DoAfterDialog(Temp, Action);
if Action then begin
SelText := '';
if (Text = '') or not MultipleDirs then Text := Temp
else Text := Text + ';' + Temp;
if (Temp <> '') and DirExists(Temp) then InitialDir := Temp;
end;
end;
procedure TDirectoryEdit.ReceptFileDir(const AFileName: string);
var
Temp: string;
begin
if FileExists(AFileName) then Temp := ExtractFilePath(AFileName)
else Temp := AFileName;
if (Text = '') or not MultipleDirs then Text := Temp
else Text := Text + ';' + Temp;
end;
{$IFDEF WIN32}
function TDirectoryEdit.GetLongName: string;
var
Temp: string;
Pos: Integer;
begin
if not MultipleDirs then Result := ShortToLongPath(Text)
else begin
Result := '';
Pos := 1;
while Pos <= Length(Text) do begin
Temp := ShortToLongPath(ExtractSubstr(Text, Pos, [';']));
if (Result <> '') and (Temp <> '') then Result := Result + ';';
Result := Result + Temp;
end;
end;
end;
function TDirectoryEdit.GetShortName: string;
var
Temp: string;
Pos: Integer;
begin
if not MultipleDirs then Result := LongToShortPath(Text)
else begin
Result := '';
Pos := 1;
while Pos <= Length(Text) do begin
Temp := LongToShortPath(ExtractSubstr(Text, Pos, [';']));
if (Result <> '') and (Temp <> '') then Result := Result + ';';
Result := Result + Temp;
end;
end;
end;
{$ENDIF WIN32}
{ TCustomDateEdit }
function NvlDate(DateValue, DefaultValue: TDateTime): TDateTime;
begin
if DateValue = NullDate then Result := DefaultValue
else Result := DateValue;
end;
constructor TCustomDateEdit.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FBlanksChar := ' ';
FTitle := NewStr(LoadStr(SDateDlgTitle));
FPopupColor := clBtnFace;
FDefNumGlyphs := 2;
FStartOfWeek := Mon;
FWeekends := [Sun];
FWeekendColor := clRed;
FYearDigits := dyDefault;
FCalendarHints := TStringList.Create;
TStringList(FCalendarHints).OnChange := CalendarHintsChanged;
ControlState := ControlState + [csCreating];
try
UpdateFormat;
{$IFDEF DEFAULT_POPUP_CALENDAR}
FPopup := TPopupWindow(CreatePopupCalendar(Self
{$IFDEF RX_D4}, BiDiMode {$ENDIF}));
TPopupWindow(FPopup).OnCloseUp := PopupCloseUp;
TPopupWindow(FPopup).Color := FPopupColor;
{$ENDIF DEFAULT_POPUP_CALENDAR}
GlyphKind := gkDefault; { force update }
finally
ControlState := ControlState - [csCreating];
end;
end;
destructor TCustomDateEdit.Destroy;
begin
if FHooked then begin
Application.UnhookMainWindow(FormatSettingsChange);
FHooked := False;
end;
if FPopup <> nil then TPopupWindow(FPopup).OnCloseUp := nil;
FPopup.Free;
FPopup := nil;
TStringList(FCalendarHints).OnChange := nil;
FCalendarHints.Free;
FCalendarHints := nil;
DisposeStr(FTitle);
inherited Destroy;
end;
procedure TCustomDateEdit.CreateWindowHandle(const Params: TCreateParams);
begin
inherited CreateWindowHandle(Params);
if Handle <> 0 then begin
UpdateMask;
if not (csDesigning in ComponentState) and not (IsLibrary or FHooked) then
begin
Application.HookMainWindow(FormatSettingsChange);
FHooked := True;
end;
end;
end;
procedure TCustomDateEdit.DestroyWindowHandle;
begin
if FHooked then begin
Application.UnhookMainWindow(FormatSettingsChange);
FHooked := False;
end;
inherited DestroyWindowHandle;
end;
procedure TCustomDateEdit.UpdateFormat;
begin
FDateFormat := DefDateFormat(FourDigitYear);
end;
function TCustomDateEdit.GetDateFormat: string;
begin
Result := FDateFormat;
end;
function TCustomDateEdit.TextStored: Boolean;
begin
Result := not IsEmptyStr(Text, [#0, ' ', DateSeparator, FBlanksChar]);
end;
procedure TCustomDateEdit.CheckValidDate;
begin
if TextStored then
try
FFormatting := True;
try
SetDate(StrToDateFmt(FDateFormat, Text));
finally
FFormatting := False;
end;
except
if CanFocus then SetFocus;
raise;
end;
end;
procedure TCustomDateEdit.Change;
begin
if not FFormatting then inherited Change;
end;
procedure TCustomDateEdit.CMExit(var Message: TCMExit);
begin
if not (csDesigning in ComponentState) and CheckOnExit then
CheckValidDate;
inherited;
end;
function TCustomDateEdit.GetDefaultBitmap(var DestroyNeeded: Boolean): TBitmap;
begin
DestroyNeeded := False;
if DateBitmap = nil then begin
DateBitmap := TBitmap.Create;
DateBitmap.Handle := LoadBitmap(hInstance, sDateBmp);
end;
Result := DateBitmap;
end;
procedure TCustomDateEdit.SetBlanksChar(Value: Char);
begin
if Value <> FBlanksChar then begin
if (Value < ' ') then Value := ' ';
FBlanksChar := Value;
UpdateMask;
end;
end;
procedure TCustomDateEdit.UpdateMask;
var
DateValue: TDateTime;
OldFormat: string[10];
begin
DateValue := GetDate;
OldFormat := FDateFormat;
UpdateFormat;
if (GetDateMask <> EditMask) or (OldFormat <> FDateFormat) then begin
{ force update }
EditMask := '';
EditMask := GetDateMask;
end;
UpdatePopup;
SetDate(DateValue);
end;
function TCustomDateEdit.FormatSettingsChange(var Message: TMessage): Boolean;
begin
Result := False;
if (Message.Msg = WM_WININICHANGE)
{$IFDEF WIN32} and Application.UpdateFormatSettings {$ENDIF} then
UpdateMask;
end;
function TCustomDateEdit.FourDigitYear: Boolean;
begin
Result := (FYearDigits = dyFour) or ((FYearDigits = dyDefault) and
(DateUtil.FourDigitYear));
end;
function TCustomDateEdit.GetDateMask: string;
begin
Result := DefDateMask(FBlanksChar, FourDigitYear);
end;
function TCustomDateEdit.GetDate: TDateTime;
begin
if DefaultToday then Result := SysUtils.Date
else Result := NullDate;
Result := StrToDateFmtDef(FDateFormat, Text, Result);
end;
procedure TCustomDateEdit.SetDate(Value: TDateTime);
var
D: TDateTime;
begin
if not ValidDate(Value) or (Value = NullDate) then begin
if DefaultToday then Value := SysUtils.Date
else Value := NullDate;
end;
D := Date;
if Value = NullDate then Text := ''
else Text := FormatDateTime(FDateFormat, Value);
Modified := D <> Date;
end;
procedure TCustomDateEdit.ApplyDate(Value: TDateTime);
begin
SetDate(Value);
SelectAll;
end;
function TCustomDateEdit.GetDialogTitle: string;
begin
Result := FTitle^;
end;
procedure TCustomDateEdit.SetDialogTitle(const Value: string);
begin
AssignStr(FTitle, Value);
end;
function TCustomDateEdit.IsCustomTitle: Boolean;
begin
Result := (CompareStr(LoadStr(SDateDlgTitle), DialogTitle) <> 0) and
(FTitle <> NullStr);
end;
procedure TCustomDateEdit.UpdatePopup;
begin
if FPopup <> nil then SetupPopupCalendar(FPopup, FStartOfWeek,
FWeekends, FWeekendColor, FCalendarHints, FourDigitYear);
end;
procedure TCustomDateEdit.SetYearDigits(Value: TYearDigits);
begin
if FYearDigits <> Value then begin
FYearDigits := Value;
UpdateMask;
end;
end;
function TCustomDateEdit.GetPopupColor: TColor;
begin
if FPopup <> nil then Result := TPopupWindow(FPopup).Color
else Result := FPopupColor;
end;
procedure TCustomDateEdit.SetPopupColor(Value: TColor);
begin
if Value <> PopupColor then begin
if FPopup <> nil then TPopupWindow(FPopup).Color := Value;
FPopupColor := Value;
end;
end;
function TCustomDateEdit.GetCalendarStyle: TCalendarStyle;
begin
if FPopup <> nil then Result := csPopup
else Result := csDialog;
end;
procedure TCustomDateEdit.SetCalendarStyle(Value: TCalendarStyle);
begin
if Value <> CalendarStyle then begin
case Value of
csPopup:
begin
if FPopup = nil then
FPopup := TPopupWindow(CreatePopupCalendar(Self
{$IFDEF RX_D4}, BiDiMode {$ENDIF}));
TPopupWindow(FPopup).OnCloseUp := PopupCloseUp;
TPopupWindow(FPopup).Color := FPopupColor;
UpdatePopup;
end;
csDialog:
begin
FPopup.Free;
FPopup := nil;
end;
end;
end;
end;
procedure TCustomDateEdit.SetCalendarHints(Value: TStrings);
begin
FCalendarHints.Assign(Value);
end;
procedure TCustomDateEdit.CalendarHintsChanged(Sender: TObject);
begin
TStringList(FCalendarHints).OnChange := nil;
try
while (FCalendarHints.Count > 4) do
FCalendarHints.Delete(FCalendarHints.Count - 1);
finally
TStringList(FCalendarHints).OnChange := CalendarHintsChanged;
end;
if not (csDesigning in ComponentState) then UpdatePopup;
end;
procedure TCustomDateEdit.SetWeekendColor(Value: TColor);
begin
if Value <> FWeekendColor then begin
FWeekendColor := Value;
UpdatePopup;
end;
end;
procedure TCustomDateEdit.SetWeekends(Value: TDaysOfWeek);
begin
if Value <> FWeekends then begin
FWeekends := Value;
UpdatePopup;
end;
end;
procedure TCustomDateEdit.SetStartOfWeek(Value: TDayOfWeekName);
begin
if Value <> FStartOfWeek then begin
FStartOfWeek := Value;
UpdatePopup;
end;
end;
procedure TCustomDateEdit.KeyDown(var Key: Word; Shift: TShiftState);
begin
if (Key in [VK_PRIOR, VK_NEXT, VK_LEFT, VK_UP, VK_RIGHT, VK_DOWN,
VK_ADD, VK_SUBTRACT]) and
PopupVisible then
begin
TPopupWindow(FPopup).KeyDown(Key, Shift);
Key := 0;
end
else if (Shift = []) and DirectInput then begin
case Key of
VK_ADD:
begin
ApplyDate(NvlDate(Date, Now) + 1);
Key := 0;
end;
VK_SUBTRACT:
begin
ApplyDate(NvlDate(Date, Now) - 1);
Key := 0;
end;
end;
end;
inherited KeyDown(Key, Shift);
end;
procedure TCustomDateEdit.KeyPress(var Key: Char);
begin
if (Key in ['T', 't', '+', '-']) and PopupVisible then begin
TPopupWindow(FPopup).KeyPress(Key);
Key := #0;
end
else if DirectInput then begin
case Key of
'T', 't':
begin
ApplyDate(Trunc(Now));
Key := #0;
end;
'+', '-':
begin
Key := #0;
end;
end;
end;
inherited KeyPress(Key);
end;
procedure TCustomDateEdit.ButtonClick;
var
D: TDateTime;
Action: Boolean;
begin
inherited ButtonClick;
if CalendarStyle = csDialog then begin
D := Self.Date;
Action := SelectDate(D, DialogTitle, FStartOfWeek, FWeekends,
FWeekendColor, FCalendarHints);
if CanFocus then SetFocus;
if Action then begin
if Assigned(FOnAcceptDate) then FOnAcceptDate(Self, D, Action);
if Action then begin
Self.Date := D;
if FFocused then inherited SelectAll;
end;
end;
end;
end;
{$IFDEF WIN32}
function TCustomDateEdit.AcceptPopup(var Value: Variant): Boolean;
{$ELSE}
function TCustomDateEdit.AcceptPopup(var Value: string): Boolean;
{$ENDIF}
var
D: TDateTime;
begin
Result := True;
if Assigned(FOnAcceptDate) then begin
{$IFDEF WIN32}
if VarIsNull(Value) or VarIsEmpty(Value) then D := NullDate
else
try
D := VarToDateTime(Value);
except
if DefaultToday then D := SysUtils.Date else D := NullDate;
end;
{$ELSE}
if DefaultToday then D := SysUtils.Date else D := NullDate;
D := StrToDateDef(Value, D);
{$ENDIF}
FOnAcceptDate(Self, D, Result);
{$IFDEF WIN32}
if Result then Value := VarFromDateTime(D);
{$ELSE}
if Result then Value := FormatDateTime(FDateFormat, D);
{$ENDIF}
end;
end;
{$IFDEF WIN32}
procedure TCustomDateEdit.SetPopupValue(const Value: Variant);
begin
inherited SetPopupValue(StrToDateFmtDef(FDateFormat, VarToStr(Value),
SysUtils.Date));
end;
procedure TCustomDateEdit.AcceptValue(const Value: Variant);
begin
SetDate(VarToDateTime(Value));
UpdatePopupVisible;
if Modified then inherited Change;
end;
{$ENDIF}
{ TDateEdit }
constructor TDateEdit.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
UpdateMask;
end;
{ Utility routines }
procedure DateFormatChanged;
procedure IterateControls(AControl: TWinControl);
var
I: Integer;
begin
with AControl do
for I := 0 to ControlCount - 1 do begin
if Controls[I] is TCustomDateEdit then
TCustomDateEdit(Controls[I]).UpdateMask
else if Controls[I] is TWinControl then
IterateControls(TWinControl(Controls[I]));
end;
end;
var
I: Integer;
begin
if Screen <> nil then
for I := 0 to Screen.FormCount - 1 do
IterateControls(Screen.Forms[I]);
end;
procedure DestroyLocals; far;
begin
FileBitmap.Free;
FileBitmap := nil;
DateBitmap.Free;
DateBitmap := nil;
end;
{$IFDEF WIN32}
initialization
finalization
DestroyLocals;
{$ELSE}
initialization
AddExitProc(DestroyLocals);
{$ENDIF}
end.