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 |