View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0001485 | JEDI VCL | 00 JVCL Components | public | 2004-03-16 17:28 | 2004-03-16 23:23 |
Reporter | anonymous | Assigned To | user72 | ||
Priority | normal | Severity | minor | Reproducibility | always |
Status | resolved | Resolution | fixed | ||
Product Version | |||||
Target Version | Fixed in Version | ||||
Summary | 0001485: TJvDateTimePicker and Delphi 5 | ||||
Description | TJvDateTimePicker supports the nice concept of a NullDate displayed with a special NullText. Unfortunately, under Delphi 5, if the NullDate is ever selected the NullText will continue to be displayed even if subsequently a non-Null date is selected. This is because the CheckNullValue routine uses an IFDEF to exclude the code which resets the control to the formal Format. I see three options here. 1) Exclude NullDate and NullText from the Delphi 5 control, 2) change CheckNullValue so that it resets the format to an empty string when given a non-Null date (this resets the control to the default, at least on my system), or 3) add the Format property to the Delphi 5 control. I'm attaching a patch to do option 3. It has hardly been tested: it works on my Windows XP system, but who knows what different comctrl dlls might do. I haven't seen the Delphi 6 or 7 source, so I don't know if this is what Borland does. | ||||
Additional Information | I also added a setter proc for NullText. Previously, Changing NullText when a NullDate was selected would not update the control; now it will. | ||||
Tags | No tags attached. | ||||
2004-03-16 17:28
|
JvDateTimePicker.pas.diff (3,444 bytes)
--- JvDateTimePicker.pas.orig 2004-03-08 09:48:30.000000000 -0800 +++ JvDateTimePicker.pas 2004-03-16 17:23:40.000000000 -0800 @@ -47,41 +47,49 @@ JvExComCtrls; type {$IFDEF BCB} TDate = TDateTime; {$ENDIF BCB} TJvDateTimePicker = class(TJvExDateTimePicker) private FNullText: string; FNullDate: TDateTime; FDropDownDate: TDate; +{$IFNDEF COMPILER6_UP} + FFormat: string; + procedure SetFormat(const Value: string); +{$ENDIF} procedure CNNotify(var Msg: TWMNotify); message CN_NOTIFY; procedure SetNullDate(const Value: TDateTime); + procedure SetNullText(const Value: string); 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; +{$IFNDEF COMPILER6_UP} + property Format: string read FFormat write SetFormat; +{$ENDIF} // 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 NullText: string read FNullText write SetNullText; property HintColor; property OnMouseEnter; property OnMouseLeave; property OnParentColorChange; end; implementation uses JvJVCLUtils, JvResources; constructor TJvDateTimePicker.Create(AOwner: TComponent); @@ -100,37 +108,52 @@ function TJvDateTimePicker.CheckNullValue: Boolean; begin // Warren added NullText length check so that this feature can be disabled if not used! if Length(NullText)=0 then begin result := false; end else 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 exist in D5: what to do? else SendMessage(Handle, DTM_SETFORMAT, 0, Integer(PChar(Format))); - {$ENDIF COMPILER6_UP} end; procedure TJvDateTimePicker.SetNullDate(const Value: TDateTime); begin FNullDate := Trunc(Value); CheckNullValue; end; +procedure TJvDateTimePicker.SetNullText(const Value: string); +begin + if FNullText <> Value then begin + FNullText:= Value; + CheckNullValue; + end; +end; + +{$IFNDEF COMPILER6_UP} +procedure TJvDateTimePicker.SetFormat(const Value: string); +begin + if FFormat <> Value then begin + FFormat:= Value; + CheckNullValue; + end; +end; +{$ENDIF} + function TJvDateTimePicker.MsgSetDateTime(Value: TSystemTime): Boolean; begin Result := inherited MsgSetDateTime(Value); CheckNullValue; end; procedure TJvDateTimePicker.Change; begin inherited Change; CheckNullValue; end; |
|
> the formal Format. Oops, that should be: the normal Format. |
|
Looks nice, should work. Updated in CVS. Thanks! |
Date Modified | Username | Field | Change |
---|---|---|---|
2004-03-16 17:28 | anonymous | New Issue | |
2004-03-16 17:28 | anonymous | File Added: JvDateTimePicker.pas.diff | |
2004-03-16 17:29 | anonymous | Note Added: 0003357 | |
2004-03-16 23:23 |
|
Status | new => resolved |
2004-03-16 23:23 |
|
Resolution | open => fixed |
2004-03-16 23:23 |
|
Assigned To | => user72 |
2004-03-16 23:23 |
|
Note Added: 0003359 |