www.pudn.com > TMS.Component.Pack.v5.0.rar > AdvDateTimePicker.pas, change:2009-01-24,size:20985b
{*************************************************************************}
{ TAdvDateTimePicker component }
{ for Delphi & C++Builder }
{ }
{ written by TMS Software }
{ copyright © 2007 - 2008 }
{ Email : info@tmssoftware.com }
{ Website : http://www.tmssoftware.com/ }
{ }
{ The source code is given as is. The author is not responsible }
{ for any possible damage done due to the use of this code. }
{ The component can be freely used in any application. The complete }
{ source code remains property of the author and may not be distributed, }
{ published, given or sold in any form as such. No parts of the source }
{ code can be included in any other component or application without }
{ written authorization of the author. }
{*************************************************************************}
unit AdvDateTimePicker;
{$I TMSDEFS.INC}
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, CommCtrl
{$IFDEF TMSDOTNET}
,System.Drawing
,System.Text
{$ENDIF}
;
const
MAJ_VER = 1; // Major version nr.
MIN_VER = 0; // Minor version nr.
REL_VER = 0; // Release nr.
BLD_VER = 6; // Build nr.
// version history
// v1.0.0.0 : First release
// v1.0.0.1 : Fixed issue with DB-aware version
// v1.0.0.2 : Improved : force milliseconds to zero
// v1.0.0.3 : Improved : position of internal datetimepickers with XP theming enabled
// v1.0.0.4 : Fixed : issue with DB aware version
// v1.0.0.5 : Fixed : issue with timeformat setting
// v1.0.0.6 : Fixed : issue with use in VCL.NET
DROPDOWNBTN_WIDTH = 21;
type
TAdvDateTimeKind = (dkDate, dkTime, dkDateTime);
TCustomDateTimePicker = class(TDateTimePicker)
private
FBorderStyle: TBorderStyle;
FBorderColor: TColor;
FIsThemed: Boolean;
procedure WMSize(var Message: TWMSize); message WM_SIZE;
procedure WMNCPaint(var Message: TMessage); message WM_NCPAINT;
procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
procedure CMCtl3DChanged(var Message: TMessage); message CM_CTL3DCHANGED;
procedure NCPaintProc;
procedure SetBorderColor(const Value: TColor);
protected
procedure CreateParams(var Params: TCreateParams); override;
procedure CreateWnd; override;
procedure SetBorderStyle(const Value: TBorderStyle); virtual;
property BorderStyle: TBorderStyle read FBorderStyle write SetBorderStyle;
property BorderColor: TColor read FBorderColor write SetBorderColor default clBlack;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;
TAdvDateTimePicker = class(TCustomDateTimePicker)
private
FKind: TAdvDateTimeKind;
FOnTimeChange: TNotifyEvent;
FTimeFormat: string;
procedure OnTimePickerChanged(Sender: TObject);
procedure OnTimePickerClicked(Sender: TObject);
procedure WMSize(var Message: TWMSize); message WM_SIZE;
procedure SetKind(const Value: TAdvDateTimeKind);
procedure CMColorChanged(var Message: TMessage); message CM_COLORCHANGED;
procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED;
function GetTimeEx: TTime;
procedure SetTimeEx(const Value: TTime);
function GetDateTimeEx: TDateTime;
function GetFormatEx: String;
procedure SetFormatEx(const Value: String);
function GetTimeFormat: String;
procedure SetTimeFormat(const Value: String);
function GetVersion: string;
procedure SetVersion(const Value: string);
protected
FTimePicker: TCustomDateTimePicker;
procedure CreateTimePicker;
procedure UpdateTimePicker;
procedure SetBorderStyle(const Value: TBorderStyle); override;
procedure CreateWnd; override;
procedure TimePickerChanged; virtual;
procedure TimePickerClicked; virtual;
procedure SetDateTimeEx(const Value: TDateTime); virtual;
procedure TimePickerKeyPress(Sender: TObject; var Key: Char); virtual;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
property BorderColor;
function GetVersionNr: integer;
property OnTimeChange: TNotifyEvent read FOnTimeChange write FOnTimeChange;
published
property BorderStyle;
property Ctl3D;
property DateTime: TDateTime read GetDateTimeEx write SetDateTimeEx;
{$IFDEF DELPHI6_LVL}
property Format: String read GetFormatEx write SetFormatEx;
property TimeFormat: String read GetTimeFormat write SetTimeFormat;
{$ENDIF}
property Kind: TAdvDateTimeKind read FKind write SetKind;
property Time: TTime read GetTimeEx write SetTimeEx;
property Version: string read GetVersion write SetVersion;
end;
implementation
uses
ComStrs;
//------------------------------------------------------------------------------
{$IFNDEF TMSDOTNET}
function IsVista: boolean;
var
hKernel32: HMODULE;
begin
hKernel32 := GetModuleHandle('kernel32');
if (hKernel32 > 0) then
begin
Result := GetProcAddress(hKernel32, 'GetLocaleInfoEx') <> nil;
end
else
Result := false;
end;
//------------------------------------------------------------------------------
function GetFileVersion(FileName:string): Integer;
var
FileHandle:dword;
l: Integer;
pvs: PVSFixedFileInfo;
lptr: uint;
querybuf: array[0..255] of char;
buf: PChar;
begin
Result := -1;
StrPCopy(querybuf,FileName);
l := GetFileVersionInfoSize(querybuf,FileHandle);
if (l>0) then
begin
GetMem(buf,l);
GetFileVersionInfo(querybuf,FileHandle,l,buf);
if VerQueryValue(buf,'\',Pointer(pvs),lptr) then
begin
if (pvs^.dwSignature=$FEEF04BD) then
begin
Result := pvs^.dwFileVersionMS;
end;
end;
FreeMem(buf);
end;
end;
{$ENDIF}
//------------------------------------------------------------------------------
function IsComCtl6: Boolean;
var
i: Integer;
begin
i := GetFileVersion('COMCTL32.DLL');
i := (i shr 16) and $FF;
Result := (i > 5);
end;
//------------------------------------------------------------------------------
function GetTextSize(WinCtrl: TWinControl; Text: string; font: TFont): TSize;
var
Canvas: TCanvas;
R: TRect;
begin
Canvas := TCanvas.Create;
Canvas.Handle := GetWindowDC(WinCtrl.Handle);
Canvas.Font.Assign(font);
{$IFNDEF TMSDOTNET}
R := Rect(0, 0, 1000, 200);
DrawText(Canvas.Handle,PChar(Text),Length(Text), R, DT_CALCRECT or DT_LEFT or DT_SINGLELINE);
{$ELSE}
R := TRect.Create(0,0,1000,200);
DrawText(Canvas.Handle,Text,Length(Text), R, DT_CALCRECT or DT_LEFT or DT_SINGLELINE);
{$ENDIF}
Result.cx := R.Right - R.Left;
Result.cy := R.Bottom - R.Top;
ReleaseDC(WinCtrl.Handle, Canvas.Handle);
Canvas.Free;
end;
//------------------------------------------------------------------------------
{ TCustomDateTimePicker }
constructor TCustomDateTimePicker.Create(AOwner: TComponent);
var
i: Integer;
begin
inherited;
DoubleBuffered := True;
ParentCtl3D := False;
Ctl3D := false;
FBorderStyle := bsNone;
FBorderColor := clBlack;
i := GetFileVersion('COMCTL32.DLL');
i := (i shr 16) and $FF;
FIsThemed := (i > 5);
//CalExceptionClass := nil;
end;
//------------------------------------------------------------------------------
destructor TCustomDateTimePicker.Destroy;
begin
inherited;
end;
//------------------------------------------------------------------------------
procedure TCustomDateTimePicker.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
with Params do
begin
end;
end;
//------------------------------------------------------------------------------
procedure TCustomDateTimePicker.CreateWnd;
begin
inherited;
end;
//------------------------------------------------------------------------------
procedure TCustomDateTimePicker.NCPaintProc;
var
DC: HDC;
//WindowBrush:hBrush;
Canvas: TCanvas;
begin
if Ctl3D then
Exit;
DC := GetWindowDC(Handle);
//WindowBrush := 0;
try
Canvas := TCanvas.Create;
Canvas.Handle := DC;
//WindowBrush := CreateSolidBrush(ColorToRGB(clRed));
if (BorderStyle = bsNone) and (Parent is TWinControl) then
Canvas.Pen.Color := (Parent as TWinControl).Brush.Color
else
begin
if FIsThemed then
Canvas.Pen.Color := $B99D7F
else
Canvas.Pen.Color := BorderColor;
end;
Canvas.MoveTo(0,Height);
Canvas.LineTo(0,0);
Canvas.LineTo(Width - 1,0);
Canvas.LineTo(Width - 1,Height - 1);
Canvas.LineTo(0,Height-1);
if (BorderStyle = bsSingle) and (Parent is TWinControl) then
Canvas.Pen.Color := (Parent as TWinControl).Brush.Color;
if (BorderStyle in [bsNone, bsSingle]) and (Parent is TWinControl) then
begin
Canvas.MoveTo(1,Height - 2);
Canvas.LineTo(1,1);
Canvas.LineTo(Width - 1,1);
end;
Canvas.Free;
// FrameRect(DC, ARect, WindowBrush);
finally
//DeleteObject(WindowBrush);
ReleaseDC(Handle,DC);
end;
end;
//------------------------------------------------------------------------------
procedure TCustomDateTimePicker.WMNCPaint(var Message: TMessage);
begin
inherited;
NCPaintProc;
Message.Result := 0;
end;
//------------------------------------------------------------------------------
procedure TCustomDateTimePicker.WMPaint(var Message: TWMPaint);
var
DC: HDC;
ACanvas: TCanvas;
begin
inherited;
{$IFNDEF TMSDOTNET}
if Ctl3D or not IsVista then
Exit;
DC := GetWindowDC(Handle);
ACanvas := TCanvas.Create;
try
ACanvas.Handle := DC;
if (BorderStyle = bsNone) and (Parent is TWinControl) then
ACanvas.Pen.Color := (Parent as TWinControl).Brush.Color
else
begin
if FIsThemed then
ACanvas.Pen.Color := $B99D7F
else
ACanvas.Pen.Color := BorderColor;
end;
ACanvas.MoveTo(0,Height);
ACanvas.LineTo(0,0);
ACanvas.LineTo(Width - 1,0);
ACanvas.LineTo(Width - 1,Height - 1);
ACanvas.LineTo(0,Height-1);
finally
ACanvas.Free;
ReleaseDC(Handle,DC);
end;
{$ENDIF}
end;
//------------------------------------------------------------------------------
procedure TCustomDateTimePicker.WMSize(var Message: TWMSize);
begin
inherited;
end;
//------------------------------------------------------------------------------
procedure TCustomDateTimePicker.SetBorderStyle(const Value: TBorderStyle);
begin
if (FBorderStyle <> Value) then
begin
FBorderStyle := Value;
{if (FBorderStyle = bsCtl3D) then
begin
ParentCtl3D := True;
Ctl3D := True;
end
else if Ctl3D then
begin
ParentCtl3D := False;
Ctl3D := false;
end;
}
Invalidate;
end;
end;
//------------------------------------------------------------------------------
procedure TCustomDateTimePicker.SetBorderColor(const Value: TColor);
begin
if (FBorderColor <> Value) then
begin
FBorderColor := Value;
Invalidate;
end;
end;
//------------------------------------------------------------------------------
procedure TCustomDateTimePicker.CMCtl3DChanged(var Message: TMessage);
begin
inherited;
Invalidate;
end;
//------------------------------------------------------------------------------
{ TAdvDateTimePicker }
procedure TAdvDateTimePicker.CMEnabledChanged(var Message: TMessage);
begin
inherited;
if Assigned(FTimePicker) then
FTimePicker.Enabled := Enabled;
end;
//------------------------------------------------------------------------------
constructor TAdvDateTimePicker.Create(AOwner: TComponent);
begin
inherited;
{
if (inherited Kind = dtkDate) then
FKind := dkDateTime
else
FKind := dkTime;
}
FTimePicker := nil;
FKind := dkDateTime;
//CreateTimePicker;
BorderStyle := bsSingle;
Ctl3D := true;
end;
//------------------------------------------------------------------------------
procedure TAdvDateTimePicker.CreateTimePicker;
begin
if not Assigned(FTimePicker) then
begin
FTimePicker := TCustomDateTimePicker.Create(Self);
FTimePicker.Width := 90;
FTimePicker.Height := 17;
FTimePicker.Visible := False;
FTimePicker.Parent := Self;
FTimePicker.Enabled := Enabled;
FTimePicker.Kind := dtkTime;
FTimePicker.OnChange := OnTimePickerChanged;
FTimePicker.OnClick := OnTimePickerClicked;
FTimePicker.OnKeyPress := TimePickerKeyPress;
end;
end;
//------------------------------------------------------------------------------
procedure TAdvDateTimePicker.CreateWnd;
var
oldKind: TAdvDateTimeKind;
begin
inherited;
oldKind := FKind;
FKind := dkDate;
Kind := oldKind;
end;
//------------------------------------------------------------------------------
procedure TAdvDateTimePicker.UpdateTimePicker;
var
i,j: Integer;
{$IFNDEF TMSDOTNET}
lpstr: array[0..255] of char;
{$ELSE}
lpstr: StringBuilder;
{$ENDIF}
begin
if Assigned(FTimePicker) then
begin
FTimePicker.Color := Self.Color;
FTimePicker.Enabled := Self.Enabled;
FTimePicker.Visible := (FKind = dkDateTime);
FTimePicker.Time := Self.Time;
FTimePicker.DateTime := Self.DateTime;
{$IFDEF DELPHI6_LVL}
FTimePicker.Format := Self.TimeFormat;
{$ENDIF}
FTimePicker.Font.Assign(Self.Font);
if not FTimePicker.Visible and (csDesigning in ComponentState) then
begin
FTimePicker.Free;
FTimePicker := nil;
end
else
begin
{$IFNDEF TMSDOTNET}
GetWindowText(FTimepicker.Handle, lpstr,255);
i := GetTextSize(Self, strpas(lpstr), Font).cx + DROPDOWNBTN_WIDTH + 10;
{$ELSE}
lpstr := StringBuilder.Create(255);
try
GetWindowText(FTimepicker.Handle, lpstr,255);
i := GetTextSize(Self, lpstr.ToString, Self.Font).cx + DROPDOWNBTN_WIDTH + 10;
finally
lpstr.Free;
end;
{$ENDIF}
{$IFNDEF TMSDOTNET}
if IsVista then
begin
//FTimePicker.SetBounds(Width - i - DROPDOWNBTN_WIDTH - 13, 0, i, Height)
j := 0;
if ((BevelInner <> bvNone) or (BevelOuter <> bvNone)) and (BevelKind <> bkNone) then
j := 4;
if IsComCtl6 then
FTimePicker.SetBounds(Width - i - DROPDOWNBTN_WIDTH - 13 - j, 1, i, Height - 2 - j)
else
FTimePicker.SetBounds(Width - i - DROPDOWNBTN_WIDTH - 2 - j, -2, i, Height - j)
end
else
{$ENDIF}
begin
if Ctl3D then
FTimePicker.SetBounds(Width - i - DROPDOWNBTN_WIDTH, -2, i, Height)
else
FTimePicker.SetBounds(Width - i - DROPDOWNBTN_WIDTH, -2, i, Height);
end;
end;
end;
end;
//------------------------------------------------------------------------------
destructor TAdvDateTimePicker.Destroy;
begin
if Assigned(FTimePicker) then
FTimePicker.Free;
inherited;
end;
//------------------------------------------------------------------------------
procedure TAdvDateTimePicker.SetKind(const Value: TAdvDateTimeKind);
begin
if (FKind <> Value) then
begin
FKind := Value;
if (FKind = dkTime) then
inherited Kind := dtkTime
else
inherited Kind := dtkDate;
if (FKind = dkDateTime) then
CreateTimePicker;
UpdateTimePicker;
end;
end;
//------------------------------------------------------------------------------
procedure TAdvDateTimePicker.WMSize(var Message: TWMSize);
begin
inherited;
UpdateTimePicker;
end;
//------------------------------------------------------------------------------
function TAdvDateTimePicker.GetTimeEx: TTime;
begin
Result := inherited Time;
if (FKind = dkDateTime) and Assigned(FTimePicker) then
Result := FTimePicker.Time;
end;
//------------------------------------------------------------------------------
procedure TAdvDateTimePicker.SetTimeEx(const Value: TTime);
begin
inherited Time := Value;
UpdateTimePicker;
end;
//------------------------------------------------------------------------------
procedure TAdvDateTimePicker.SetBorderStyle(const Value: TBorderStyle);
begin
inherited;
UpdateTimePicker;
end;
//------------------------------------------------------------------------------
procedure TAdvDateTimePicker.CMColorChanged(var Message: TMessage);
begin
inherited;
UpdateTimePicker;
end;
//------------------------------------------------------------------------------
function TAdvDateTimePicker.GetDateTimeEx: TDateTime;
begin
if Assigned(FTimePicker) then
inherited Time := FTimePicker.Time;
Result := inherited DateTime;
end;
//------------------------------------------------------------------------------
procedure TAdvDateTimePicker.SetDateTimeEx(const Value: TDateTime);
var
ho,mi,se,se100:word;
begin
decodetime(value, ho, mi, se, se100);
inherited DateTime := int(value) + encodetime(ho,mi,se,0);
if Assigned(FTimePicker) then
FTimePicker.DateTime := int(value) + encodetime(ho,mi,se,0);
end;
//------------------------------------------------------------------------------
function TAdvDateTimePicker.GetFormatEx: String;
begin
{$IFDEF DELPHI6_LVL}
Result := inherited Format;
{$ELSE}
Result := '';
{$ENDIF}
end;
//------------------------------------------------------------------------------
procedure TAdvDateTimePicker.SetFormatEx(const Value: String);
begin
{$IFDEF DELPHI6_LVL}
inherited Format := Value;
{$ENDIF}
end;
//------------------------------------------------------------------------------
function TAdvDateTimePicker.GetTimeFormat: String;
begin
(*{$IFDEF DELPHI6_LVL}
if Assigned(FTimePicker) then
Result := FTimePicker.Format;
{$ELSE}
Result := '';
{$ENDIF}*)
Result := FTimeFormat;
end;
//------------------------------------------------------------------------------
procedure TAdvDateTimePicker.SetTimeFormat(const Value: String);
begin
{$IFDEF DELPHI6_LVL}
if Assigned(FTimePicker) then
FTimePicker.Format := Value;
FTimeFormat := Value;
UpdateTimePicker;
{$ENDIF}
end;
//------------------------------------------------------------------------------
function TAdvDateTimePicker.GetVersion: string;
var
vn: Integer;
begin
vn := GetVersionNr;
Result := IntToStr(Hi(Hiword(vn)))+'.'+IntToStr(Lo(Hiword(vn)))+'.'+IntToStr(Hi(Loword(vn)))+'.'+IntToStr(Lo(Loword(vn)));
end;
//------------------------------------------------------------------------------
function TAdvDateTimePicker.GetVersionNr: integer;
begin
Result := MakeLong(MakeWord(BLD_VER,REL_VER),MakeWord(MIN_VER,MAJ_VER));
end;
//------------------------------------------------------------------------------
procedure TAdvDateTimePicker.SetVersion(const Value: string);
begin
end;
//------------------------------------------------------------------------------
procedure TAdvDateTimePicker.OnTimePickerChanged(Sender: TObject);
begin
TimePickerChanged;
if Assigned(OnTimeChange) then
OnTimeChange(self);
end;
//------------------------------------------------------------------------------
procedure TAdvDateTimePicker.OnTimePickerClicked(Sender: TObject);
begin
TimePickerClicked;
end;
//------------------------------------------------------------------------------
procedure TAdvDateTimePicker.TimePickerChanged;
begin
if Assigned(OnChange) then
OnChange(Self);
end;
//------------------------------------------------------------------------------
procedure TAdvDateTimePicker.TimePickerClicked;
begin
if Assigned(OnClick) then
OnClick(Self);
end;
//------------------------------------------------------------------------------
procedure TAdvDateTimePicker.TimePickerKeyPress(Sender: TObject;
var Key: Char);
begin
end;
//------------------------------------------------------------------------------
{$IFDEF FREEWARE}
{$I TRIAL.INC}
{$ENDIF}
end.