|
Тема
|
nullable TDateTimePicker
|
|
Автор | koko (Нерегистриран) |
Публикувано | 05.10.06 13:28 |
|
Издирва се по белия свят компонент подобен на TDateTimePicker, където спокойно можеш да си слагаш null стойности, а не да се появяват дати от предния век:)
Ако някой вече е борил проблема, нека признае:)
| |
Тема
|
Re: nullable TDateTimePicker
[re: koko]
|
|
Автор | Timo (Нерегистриран) |
Публикувано | 05.10.06 21:03 |
|
Да и аз имам същият проблем, не зная как да настроя датата да показва денят в който се отваря TDateTimePicker все ми показва датата на която съм сложил TDateTimePicker в формата.
Ако някой знае как става, моля да сподели
| |
Тема
|
Re: nullable TDateTimePicker
[re: koko]
|
|
Автор |
NDeu (динозавър) |
Публикувано | 05.10.06 22:35 |
|
DateTimePicker1.ShowCheckbox:=True;
..............................................................
If DateTimePicker1.Checked
then Label1.Caption:=DateTimeToStr(DateTimePicker1.Date)
else Label1.Caption:='Те това е NULL';
| |
Тема
|
Re: nullable TDateTimePicker
[re: Timo]
|
|
Автор |
NDeu (динозавър) |
Публикувано | 05.10.06 22:37 |
|
procedure TForm1.FormCreate(Sender: TObject);
begin
DateTimePicker1.Date:=Date;
end;
| |
Тема
|
Re: nullable TDateTimePicker
[re: NDeu]
|
|
Автор | koko (Нерегистриран) |
Публикувано | 10.10.06 09:02 |
|
Да, да, ама не:)
Признавам, че върши функционалността на nullable DateTimePicker, но ако се опиташ да вкараш дата през клавиатурата, а не да избираш при включен checkbox поведението на контрола е доста досадно - непрекъснато ти връща фокуса на checkbox-a и не можеш спокойно да си въведеш датата. Така, че издирването на нещо нормално, където можеш да избираш дата или да въвеждаш от клавиатурата или изобщо нищо да не правиш си остава:)
| |
Тема
|
Re: nullable TDateTimePicker
[re: koko]
|
|
Автор |
ИвKo (особняк) |
Публикувано | 16.10.06 12:20 |
|
unit apDateTimePicker;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, ComCtrls;
type
TimiDateTimePicker = class(TDateTimePicker)
private
FHintColor: TColor;
FSaved: TColor;
FOnMouseEnter: TNotifyEvent;
FOnMouseLeave: TNotifyEvent;
FOnParentColorChanged: TNotifyEvent;
FNullText: string;
FNullDate: TDateTime;
FDropDownDate: TDate;
procedure MouseEnter(var Msg: TMessage); message CM_MOUSEENTER;
procedure MouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;
procedure CMParentColorChanged(var Msg: TMessage); message CM_PARENTCOLORCHANGED;
procedure CNNotify(var Msg: TWMNotify); message CN_NOTIFY;
procedure SetNullDate(const Value: TDateTime);
protected
function WithinDelta(Val1, Val2: TDateTime): Boolean; virtual;
// returns True if NullDate matches Date or frac(NullDate) matches frac(Time) depending on Kind
function CheckNullValue: Boolean; virtual;
procedure Change; override;
function MsgSetDateTime(Value: TSystemTime): Boolean; override;
public
constructor Create(AOwner: TComponent); override;
published
// The initial date to display when the drop-down calendar is shown and NullDate = Date/Time
property DropDownDate: TDate read FDropDownDate write FDropDownDate;
// The Date/Time (depending on the Kind property) that represents an empty "null" value, default is 1899-12-31
property NullDate: TDateTime read FNullDate write SetNullDate;
// The text to display when NullDate = Date/Time
property NullText: string read FNullText write FNullText;
property HintColor: TColor read FHintColor write FHintColor default clInfoBk;
property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
property OnParentColorChange: TNotifyEvent read FOnParentColorChanged write FOnParentColorChanged;
end;
procedure Register;
implementation
uses
CommCtrl;
resourcestring
SNullText = '(none)';
procedure Register;
begin
RegisterComponents('EXTRAS', [TimiDateTimePicker]);
end;
{$IFNDEF COMPILER6_UP}
function TryStrToDateTime(const S: string; out Value: TDateTime): Boolean;
begin
try
Value := StrToDateTime(S);
Result := True;
except
Result := False;
end;
end;
{$ENDIF}
constructor TimiDateTimePicker.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FHintColor := clInfoBk;
ControlStyle := ControlStyle + [csAcceptsControls];
FNullText := SNullText;
FDropDownDate := SysUtils.Date;
end;
procedure TimiDateTimePicker.CMParentColorChanged(var Msg: TMessage);
begin
inherited;
if Assigned(FOnParentColorChanged) then
FOnParentColorChanged(Self);
end;
procedure TimiDateTimePicker.MouseEnter(var Msg: TMessage);
begin
FSaved := Application.HintColor;
// for D7...
if csDesigning in ComponentState then
Exit;
Application.HintColor := FHintColor;
if Assigned(FOnMouseEnter) then
FOnMouseEnter(Self);
end;
procedure TimiDateTimePicker.MouseLeave(var Msg: TMessage);
begin
Application.HintColor := FSaved;
if Assigned(FOnMouseLeave) then
FOnMouseLeave(Self);
end;
function TimiDateTimePicker.WithinDelta(Val1, Val2: TDateTime): Boolean;
const
cOneSecond = 1 / 86400;
begin
Result := Abs(Frac(Val1) - Frac(Val2)) <= cOneSecond;
end;
function TimiDateTimePicker.CheckNullValue: Boolean;
begin
Result := ((Kind = dtkDate) and (Trunc(DateTime) = Trunc(NullDate)) or
((Kind = dtkTime) and WithinDelta(DateTime, NullDate)));
if Result then
SendMessage(Handle, DTM_SETFORMAT, 0, Integer(PChar(FNullText)))
{$IFDEF COMPILER6_UP}
// (p3) the Format property doesn't exists in D5: what to do?
else
SendMessage(Handle, DTM_SETFORMAT, 0, Integer(PChar(Format)));
{$ENDIF}
end;
procedure TimiDateTimePicker.SetNullDate(const Value: TDateTime);
begin
FNullDate := Trunc(Value);
CheckNullValue;
end;
function TimiDateTimePicker.MsgSetDateTime(Value: TSystemTime): Boolean;
begin
Result := inherited MsgSetDateTime(Value);
CheckNullValue;
end;
procedure TimiDateTimePicker.Change;
begin
inherited Change;
CheckNullValue;
end;
function IsBlankSysTime(const St: TSystemTime): Boolean;
begin
with St do
Result := (wYear = 0) and (wMonth = 0) and
(wDayOfWeek = 0) and (wDay = 0) and
(wHour = 0) and (wMinute = 0) and
(wSecond = 0) and (wMilliseconds = 0);
end;
procedure TimiDateTimePicker.CNNotify(var Msg: TWMNotify);
var
ACal: THandle;
St: TSystemTime;
Dt: TDateTime;
AllowChange: Boolean;
begin
with Msg, NMHdr^ do
case code of
DTN_DROPDOWN:
begin
inherited;
if CheckNullValue then
begin
ACal := DateTime_GetMonthCal(Handle);
if ACal <> 0 then
begin
DateTimeToSystemTime(FDropDownDate, St);
if not IsBlankSysTime(St) then
MonthCal_SetCurSel(ACal, St);
end;
end;
end;
DTN_USERSTRING:
begin
with PNMDateTimeString(NMHdr)^ do
begin
if not TryStrToDateTime(pszUserString, Dt) then
Dt := NullDate;
if Assigned(OnUserInput) then
begin
AllowChange := True;
OnUserInput(Self, pszUserString, Dt, AllowChange);
dwFlags := Ord(not AllowChange);
end
else
dwFlags := Ord(False);
DateTimeToSystemTime(Dt, St);
end;
end;
else
inherited;
end;
end;
end.
| |
Тема
|
Re: nullable TDateTimePicker
[re: ИвKo]
|
|
Автор | koko (Нерегистриран) |
Публикувано | 16.10.06 12:59 |
|
Ох, сигурно чавка ми е изпила ума, но след инсталиране не виждам особена разлика от нормалния TDateTimePicker. Не мога да изтрия датата или поне да я докарам до TimiDateTimePicker.NullDate. Иска ми се потребителя просто да може да остави празен контрола ако не иска да ограничава времеви интервал.
Мерси за труда и вниманието:)
| |
Тема
|
Re: nullable TDateTimePicker
[re: koko]
|
|
Автор | xи (Нерегистриран) |
Публикувано | 31.10.06 21:02 |
|
ehlib component
| |
|
|
|
|