Hi,

As pointed in bug http://bugs.freepascal.org/view.php?id=19075 converting from vardate variants (variants with TDateTime values) to string is done differently in Delphi and fpc. According to http://support.embarcadero.com/article/35913 the conversion is done with the default OS format option independent of shortdatetime.

In the other way (converting from a string variant to a TDateTime) is not allowed at all in Delphi.

Running this code in Delphi 7 gives the exception below:

var
  V: Variant;
  D: TDateTime;
begin
ShortDateFormat := 'dd/mm/yyyy'; // the problem occurs regardless of the format option
  V := '20/04/2011';
  D := V;
Memo1.Lines.Add('Date: ' + DateToStr(D)); // required to avoid dead code elimination
end;

raised exception class EVariantTypeCastError with message 'Could not convert variant of type (String) into type (Double)'

Can someone check with more recent Delphi if this is still true?

My guess is that Delphi recognizes vardate variants as vardouble so it expects the string compatible with double type. This code works:

var
  V: Variant;
  D: TDateTime;
begin
  V := FloatToStr(Date);
  D := V;
  Memo1.Lines.Add('Date: ' + DateToStr(D));
end;


in fpc:
The same code will do the conversion dependent of the shortdateformat setting, i.e., changing to an incompatible format will raise the exception:

  ShortDateFormat := 'dd/mm/yyyy';
// Uncomment below to raise an exception EVariantError : Invalid variant type cast
  //ShortDateFormat := 'mm/dd/yyyy';
  V := '20/04/2011';
  D := V;
  WriteLn('Date: ' + DateToStr(D));

This has the consequence that, assuming the compatibility fix of my initial patch (that now i see as partially wrong), the following code will not work:

  ShortDateFormat := 'mm/dd/yyyy';
  V := Date;
  S := V;
  V2 := S;

So, what should be done?

1) Be totally compatible with Delphi: convert date to string with hardcoded format and raise exception when doing the conversion back? 2) Use the hardcoded format used to convert from vardate variant to string and vice versa? 3) Use shortdateformat to convert from vardate variant to string and vice versa?

As pointed in http://support.embarcadero.com/article/35913 the hardcoded is not hardcoded at all. It's the default system setting.

It's a mater of considering where is the Delphi bug. It should use ShortDateFormat to do the vardate to string conversion ? Should the inverse conversion (string to vardate) be allowed at all?

Someone with a more recent Delphi could help to see if one of these bugs were fixed.

Luiz
_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to