Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.06;
Скачать: CL | DM;

Вниз

Исключение EConvertError c SInvalidDateTime   Найти похожие ветки 

 
Германн ©   (2005-10-15 00:53) [0]

Ткните меня плиииз носом в дерьмо, если кто знает как подобное исключение может выдаваться в таком варианте:
               try
                 FieldByName("EvDateTime").AsDateTime:=StrToDateTime(BCDDateTimeToStr(Dt));
               except
                 on EConvertError do
                   FieldByName("EvDateTime").AsDateTime:=StrToDateTime("01.01.80 00:00");
               end;

или в таком
               try
                 FieldByName("EvDateTime").AsDateTime:=StrToDateTime(BCDDateTimeToStr(Dt));
               except
                 FieldByName("EvDateTime").AsDateTime:=StrToDateTime("01.01.80 00:00");
               end;


P.S. работа не под отладчиком.

Проверил всю свою программу. Явно, функция StrToDateTime вызывается только там. Неявные её вызовы, вроде бы, в программе отсутствуют. (XXX:=TStringField.AsDateTime не пользую. TDateTimeField.AsString:=... - то же. Фильтр на таблицу - то же не использую. Это все возможные вызовы StrToDateTime, которые я накопал в Delphi\Source. Есть ещё, правда и IniFiles, но это я исключил, поскольку в нём я не использую ДатуВремя.

P.P.S.
 Нифига не понял, зачем было в Consts объявлять ещё раз константу SInvalidDateTime, которая уже объявлена в SysConsts, но с другим форматом вывода!


 
GuAV ©   (2005-10-15 02:23) [1]

Да хотя бы так:

 DateSeparator := "/";
 StrToDateTime("01.01.80 00:00");


Причём, DateSeparator изначально берётся из настроек системы, поэтому поведение может различатся на различных машинах.

В D7 я бы порекомендовал другую overloaded версию. В данном случае, видимо, следует явно задать DateSeparator или писать дату числом (const 01_01_80__18_00=29221).

Может исключение и не здесь. Следовало бы запомнить дату, указанную в тескте исключения.


 
GuAV ©   (2005-10-15 02:30) [2]


> Это все возможные вызовы StrToDateTime, которые я
> накопал в Delphi\Source.


А варианты ? Или их в четвёрке ещё нет ?


 
Германн ©   (2005-10-15 02:39) [3]

2 GuAV ©   (15.10.05 02:23) [1]

Запоминать дату тут нет нужды. В тексте исключения приведено: "  ", т.е. пробел.


 
Германн ©   (2005-10-15 02:43) [4]


> GuAV ©   (15.10.05 02:30) [2]
>
>
> > Это все возможные вызовы StrToDateTime, которые я
> > накопал в Delphi\Source.
>
>
> А варианты ? Или их в четвёрке ещё нет ?
>


Не понял! Это ты об чём?


 
GuAV ©   (2005-10-15 02:45) [5]

Тогда два варианта. Или следует поискать вызовы ещё, или настолько тяжелый (и невероятный) случай, что память под константу портится. У меня, ктати grep search выдал много результатов, не только IniFiles.


 
GuAV ©   (2005-10-15 02:46) [6]


>> А варианты ? Или их в четвёрке ещё нет ?
>>
>
>
> Не понял! Это ты об чём?


D:\Program Files\Borland\Delphi7\Source\Indy\IdFTPList.pas
   362 AItem.ModifiedDate := StrToDateTime(LModified);

D:\Program Files\Borland\Delphi7\Source\Indy\IdGlobal.pas
   209 function GmtOffsetStrToDateTime(S: string): TDateTime;
  1228 function GmtOffsetStrToDateTime(S: string): TDateTime;
  1257 DateTimeOffset := GmtOffsetStrToDateTime(S);

D:\Program Files\Borland\Delphi7\Source\Rtl\Common\IniFiles.pas
   225 Result := StrToDateTime(DateStr);

D:\Program Files\Borland\Delphi7\Source\Rtl\Sys\SysUtils.pas
  2248 { StrToDateTime converts the given string to a date and time value. The
  2253 function StrToDateTime(const S: string): TDateTime; overload;
  2254 function StrToDateTime(const S: string;
  2257 function StrToDateTimeDef(const S: string;
  2259 function StrToDateTimeDef(const S: string; const Default: TDateTime;
  2262 function TryStrToDateTime(const S: string;
  2264 function TryStrToDateTime(const S: string; out Value: TDateTime;
  2375 ""at" hh:mm AM/PM", StrToDateTime("2/15/95 10:30am"));
 12650 function StrToDateTime(const S: string): TDateTime;
 12652 if not TryStrToDateTime(S, Result) then
 12656 function StrToDateTime(const S: string;
 12659 if not TryStrToDateTime(S, Result, FormatSettings) then
 12663 function StrToDateTimeDef(const S: string; const Default: TDateTime): TDateTime;
 12665 if not TryStrToDateTime(S, Result) then
 12669 function StrToDateTimeDef(const S: string; const Default: TDateTime;
 12672 if not TryStrToDateTime(S, Result, FormatSettings) then
 12676 function TryStrToDateTime(const S: string; out Value: TDateTime): Boolean;
 12696 function TryStrToDateTime(const S: string; out Value: TDateTime;

D:\Program Files\Borland\Delphi7\Source\Rtl\Sys\VarUtils.pas
   795 Dest.VDate := StrToDateTime(WideString(LSource.VOleStr));
  1133 Result := CResult[TryStrToDateTime(strIn, dateOut)];

D:\Program Files\Borland\Delphi7\Source\ToolsAPI\DesignEditors.pas
  1963 else DT := StrToDateTime(Value);

D:\Program Files\Borland\Delphi7\Source\Vcl\ComCtrls.pas
 21517 DT := StrToDateTime(pszUserString);

D:\Program Files\Borland\Delphi7\Source\Vcl\DB.pas
  4317 Result := StrToDateTime(GetAsString);
  5160 DateTime := StrToDateTime(Value);

D:\Program Files\Borland\Delphi7\Source\Vcl\DBCommon.pas
   927 DateTime := StrToDateTime(string(TVarData(Value).VString)) else

D:\Program Files\Borland\Delphi7\Source\Vcl\IBSQL.pas
  1241 SetAsDateTime(StrToDateTime(Value))

D:\Program Files\Borland\Delphi7\Source\Vcl\SqlTimSt.pas
   609 Result := TryStrToDateTime(S, DT);

D:\Program Files\Borland\Delphi7\Source\WebSnap\xmlutil.pas
   562 Date := StrToDateTime(DateStr);


 
GuAV ©   (2005-10-15 02:57) [7]

FloatToDateTime и EncodeDateTime, DecodeDateTime из DateUtils тоже понимают это исключение, а


 
Германн ©   (2005-10-15 03:01) [8]

2 GuAV ©   (15.10.05 02:46) [6]
Ну, так это же от Д7. А у меня Д4.

2 GuAV ©   (15.10.05 02:45) [5]
>Или следует поискать вызовы ещё, или настолько тяжелый (и невероятный) случай, что память под константу портится.
Имхо, может и портится, но как?


 
Германн ©   (2005-10-15 03:12) [9]

2 GuAV ©   (15.10.05 02:57) [7]
Ну дык ещё раз! В Д4 - оборзел, тьфу ты, обозрел :) всё, что смог! Но ничего не нашёл!


 
sniknik ©   (2005-10-15 14:45) [10]

что за функция BCDDateTimeToStr? и нет ли там же где взял эту другой BCDDateTimeToDateTime?


 
Германн ©   (2005-10-15 18:54) [11]

2 sniknik ©   (15.10.05 14:45) [10]

Не.  BCDDateTimeToStr - это моя собственная.


 
sniknik ©   (2005-10-15 19:47) [12]

> это моя собственная.
aaa... а ошибку значит ищеш в стандартной, проверенной многими и многими  ее использовавшими...
> ... Явно, функция StrToDateTime вызывается только там. Неявные её вызовы ...

========================================
- гражданин, чего это вы тут под фанарем на карачках ползаете?
- да, я там в подворотне десятку потерял, вот ищу...
- чего вы ее здесь ищете? если там потеряли.
- а здесь светлее!


 
Германн ©   (2005-10-16 00:02) [13]

sniknik ©   (15.10.05 19:47) [12]

> > это моя собственная.
> aaa... а ошибку значит ищеш в стандартной, проверенной многими
> и многими  ее использовавшими...
> > ... Явно, функция StrToDateTime вызывается только там.
>  Неявные её вызовы ...

Блин, ну ты и написал. Вопрос то хоть прочёл? Или "как всегда"?

Не ищу я ошибки в стандартной StrToDateTime!
Я ищу Как ёклмн Исключение указанное в сабже вылезло из блока try except end. Кстати в той самой моей функции происходит как раз  преобразование данных в строку.


 
beglec   (2005-10-16 00:47) [14]

это тебе и пытаются объяснить что случаев может быть множетсво и не только тут
но внимательно прочитав суть твоего вопроса и написанный код "запудырил" следующее :)

try
FieldByName("EvDateTime").AsDateTime:=StrToDateTime(BCDDateTimeToStrDt));
except
FieldByName("EvDateTime").AsDateTime:=StrToDateTime("01.01.80 00:00"); шибка здесь
end;

Если шибка в этой строчке то тебе ни один Try Except не поможет - так что разбирайся
проблемы могут быть в следующей
1. в системе Windows используется разделитель [,] вместо [.] - самая распространенная ошибка. сам делаю постоянно.
2. не правильны формат записи даты - может быть первым указывает год и т.д. а 80 дня или месяца не бывает - сам понимаешь
3. скорее всего см. п.1.


 
sniknik ©   (2005-10-16 00:56) [15]

Германн ©   (16.10.05 00:02) [13]
> Не ищу я ошибки в стандартной StrToDateTime!
а где же ты это ищеш? сам то перечитай свой вопрос. или "как всегда" пишем одно, на уме другое?

> Я ищу Как ёклмн Исключение указанное в сабже вылезло из
> блока try except end. Кстати в той самой моей функции происходит
> как раз  преобразование данных в строку.

ну так ёклмн ищи это в своей функции! то что ты ее не приводиш конечно должно нас уверить что она идеальна, и написана безукоризненно....

и кстати покажи мне в вопросе где написано то что написано в [13]. перечитал еше раз и не нашол там ничего о выходе исключения за блок... видать это в прикрепленной телепатограмме.

по ответу, раз непонятно, коментарий кодом (примерный сценарий разумеется)
procedure TForm1.Button1Click(Sender: TObject);
var
 TempDate: TDateTime;

 function BCDDateTimeToStr(dt: TDateTime): string;
 begin
   DateSeparator:= "/";
   result:= DateTimeToStr(dt);
 end;

begin
 try
   TempDate:= StrToDateTime(BCDDateTimeToStr(Now()));
 except
   on EConvertError do
     TempDate:= StrToDateTime("01.01.80 00:00");
 end;
end;

вот это к примеру гарантированно выйдет за блок try except т.к. вызовет двойное исключение сначала в блоке а после в обработке исключения.


 
Германн ©   (2005-10-16 01:37) [16]

2 beglec   (16.10.05 00:47) [14]
2 sniknik ©   (16.10.05 00:56) [15]

Сначала вам обоим. Да обсуждаемая прога написана не очень корректно. Но уж так сложилось исторически. Но в ответе:

> Германн ©   (15.10.05 02:39) [3]
>
> 2 GuAV ©   (15.10.05 02:23) [1]
>
> Запоминать дату тут нет нужды. В тексте исключения приведено:
>  "  ", т.е. пробел.
>
т.е. сообщение об исключении выглядит так
29.09.2005 11:22:23-EConvertError : " " is not a valid date and time
Это запись из лог-файла, который записывается моей программой следущим образом :
procedure TFMain.SaveLog(E: Exception; EStr, PlaceSt: String);  
var
 i : Integer;
 FT : TextFile;
 St : String;
begin
 St:=ChangeFileExt(Application.ExeName,"."+FormatDateTime("yymm",Now)+".log.txt");
 AssignFile(FT,St);
 if FileExists(St) then Append(FT) else ReWrite(FT);
 if E <> nil then begin
   St:=DateTimeToStr(Now)+"-"+ E.ClassName+" : "+E.Message;
   Writeln(FT,St);
 end;
 ... тут следуют некие проверки E.ClassName и особые реакции на некоторые их них

Вы пробовали получить такое сообщение об ошибке при вызове StrToDateTime("01.01.80 00:00") с неправильными DateSeparator или
TimeSeparator? Имхл нет. Поскольку тогда бы сообщение об ошибке выглядело бы так:
29.09.2005 11:22:23-EConvertError : "01.01.80 00:00" is not a valid date and time

Теперь лично к sniknik ©   (16.10.05 00:56) [15]
> а где же ты это ищеш? сам то перечитай свой вопрос. или "как всегда"
пишем одно, на уме другое?

В программе возникает исключение указанное в сабже. Прошерстил исходники идущие с Д4. Нашел, что данное исключение вызывается только в функции StrToDateTime. Прошерстил исходники своей программы.StrToDateTime вызывается только в тех двух случаях, которые указаны в вопросе. (Это я проясняю термин "явный вызов".) Далее прошерстил снова исходники Дельфи на предмет вызова сей функции внутри VCL или RTL. Нашел несколько этих вызовов. Убедился, что они в моей программе не испльзуются. (Это я пояснил термин "неявный вызов".)

Вот поэтому-то "Я ищу Как ёклмн Исключение указанное в сабже вылезло из блока try except end." :(


 
GuAV ©   (2005-10-16 01:54) [17]

Даже не знаю..

Код из [0] был приведен Ctrl+C, Ctrl+V и употреблений только 2  штуки ? Может быть except получился относящимся к другому try...

Точно ли исполняется этот код, а не другая копия ?

Память под строки не затирается (признаком чего м.б. AV и INvalidPointer при выходе) ?


 
Германн ©   (2005-10-16 02:11) [18]

2 GuAV ©   (16.10.05 01:54) [17]

> Код из [0] был приведен Ctrl+C, Ctrl+V и употреблений только
> 2  штуки ? Может быть except получился относящимся к другому
> try...
ДА. Только "Copy&Paste" и "только две штуки".


> Точно ли исполняется этот код, а не другая копия ?
Да.


> Память под строки не затирается (признаком чего м.б. AV
> и INvalidPointer при выходе) ?

Лог-файл, ведение которого я описал в [16] свидетельствует, что ни AV, ни ещё чего нибудь нет. Указанная процедура вызывается в Application.OnException.


 
неважно   (2005-10-16 02:35) [19]


try
                FieldByName("EvDateTime").AsDateTime:=StrToDateTime(BCDDateTimeToStr(Dt));
              except
                FieldByName("EvDateTime").AsDateTime:=Now
              end;


А так? Тоже исключение???


 
неважно   (2005-10-16 02:38) [20]

Кстати,Вы так и не показали проверяете ли Вы формат даты\времени??? Какие настройки в ОС??? Может Вам надо так :

StrToDateTime("01.01.80 00:00 PM"); // или
StrToDateTime("01.01.80 00:00 AM");


 
Германн ©   (2005-10-16 02:44) [21]

2 неважно   (16.10.05 02:35) [19]
А что это меняет в "осмыслении причин сабжа"?


 
Германн ©   (2005-10-16 02:48) [22]

2 неважно   (16.10.05 02:38) [20]

> Кстати,Вы так и не показали проверяете ли Вы формат даты\времени?
> ?? Какие настройки в ОС???

Имхо, на сей вопрос я уже ответил.


 
неважно   (2005-10-16 02:54) [23]

>А что это меняет в "осмыслении причин сабжа"?
Многое. Если [19] выполняется,то ошибка явно в формате.

З.Ы. В конце концов,проверьте Ваш сабж на более поздних версия D.


 
Германн ©   (2005-10-16 03:08) [24]

2 неважно   (16.10.05 02:54) [23]

>>А что это меняет в "осмыслении причин сабжа"?
>Многое. Если [19] выполняется,то ошибка явно в формате.

Ну опять дважды-два! :(
Меня не интересует реализация [19].

>З.Ы. В конце концов,проверьте Ваш сабж на более поздних версия D.
А Вы мне оплатите сию работу? Готов обсудить варианты!


 
неважно   (2005-10-16 03:28) [25]

2 Германн ©   (16.10.05 03:08) [24]
>Меня не интересует реализация [19]
Странно. Да хотя бы просто убедится и все...  сообщить нам результат.

>А Вы мне оплатите сию работу?
А я тут при чем? Я почему предложил...дело в том,что на borland.public.delphi частенько пишут о различных bug-фиксах.Точно помню,что был такой при использовании IBX.Возникал при переводе\установке даты\времени. Как раз на 4!!!

З.Ы. Нельзя быть таким ЗЛЫМ. Что я Вам сделал??? Я просто хотел помочь. Ну Вас...


 
sniknik ©   (2005-10-16 11:19) [26]

нда уж. ничего не хочеш менять, ничего не желаеш проверять, не показываеш то что просят, никакого диалога только раздраженные нападки на отвечающих, и хочеш точного ответа только на то, что тебе кажется важным... а ведь чаще всего ошибки не там где ищут а там где и не предполагают и важность савершенно в другом (была бы там где кажется, сам бы нашол. да и искать бы не пришлось ты ведь "знаеш" глюк вот тут. а отвечавшие тебя отвлекают, раздражают... в разные другие места тычут... "а там темно, а тебе удобнее искать под фонарем. пусть даже глюк перейдет в разряд нерешаемых "чудес", типа в дельфе ошибка").
дейстсвительно
> Ну Вас...

p.s.
Германн ©   (16.10.05 01:37) [16]
> т.е. сообщение об исключении выглядит так
> 29.09.2005 11:22:23-EConvertError : " " is not a valid date and time
важно, но поздно. (надоело)
пример ошибочного кода который может привести к подобного рода ошибке с пустой датой. "забыта" инициализация всех нужных параметров
procedure TForm1.Button1Click(Sender: TObject);
var
 TempDate: TDateTime;

 function BCDDateTimeToStr(dt: TDateTime): string;
 var
   FormatSettings: TFormatSettings;
 begin
   FormatSettings.DateSeparator:= "/";
   result:= DateTimeToStr(dt, FormatSettings);;
 end;

begin
 try
   TempDate:= StrToDateTime(BCDDateTimeToStr(Now()));
 except
   on EConvertError do
     TempDate:= StrToDateTime("01.01.80 00:00");
 end;
end;

но это конечно не вывалится. т.к. это опять догадка.


 
Германн ©   (2005-10-16 17:15) [27]

2 sniknik ©   (16.10.05 11:19) [26]
Ну хорошо, хорошо допустим, что я ничего не хочу и т.д. и т.п.
Но в чём смысл примера
>  ошибочного кода который может привести к подобного рода
> ошибке с пустой датой
, если он не может в принципе привести к к подобного рода
> ошибке с пустой датой будучи выполненным не под отладчиком?


 
sniknik ©   (2005-10-16 19:09) [28]

смысл? ну если ты не видиш смысла в более точной локализации места глюка... и продолжаеш искать его в стандартной StrToDateTime. вместо поиска своего кода порождающего эту пустую строку. пример подобного кода и был дан.
и естественно он в принципе не приводит такой ситуации потому как это мой код, а предполагается аналог в твоем, а в нем ты принципиально не ищеш. как и не делаеш посоветованных исправлений которые теоретически или вообше исключают глюки перевода строк в дату (BCDDateTimeToDateTime) либо позволяют исключить данный участок кода из "подозреваемых" > неважно   (16.10.05 02:35) [19]

я вообще не знаю о чем тогда с тобой разговаривать. тяжолое это вообще дело, неблагодарное.
боюсь даже очередное предположение о безграмотности написания SaveLog которое присваевается OnException выдвигать... хотя это и может быть связано с глюком, но к хорошему не приведет, а только к очередной скандальной зашите "родного" кода. не стоит в общем.

хотя иногда и весело...
особенно это
> А Вы мне оплатите сию работу? Готов обсудить варианты!
оплату за поиски глюка в собственном коде требовать? с человека который вам помогает (пытается) абсоолютно бескорыстно... круто. это ШЕДЕВР. достойный занесения в анналы местной ореховой рощи. имхо.


 
Германн ©   (2005-10-16 19:36) [29]

2 sniknik ©   (16.10.05 19:09) [28]

Да я вообще и не думал искать какие-то ошибки в стандартной StrToDateTime!
Я ищу варианты невозможного. Как исключение произощедшее внутри защищённого блока всё-таки вылезло из оного наружу.

Кстати а что это за BCDDateTimeToDateTime, которую ты уже не первый раз указываешь? У меня такой нет!
А если ты про мою BCDDateTimeToStr то вот её текст:

function BCD2Byte(BCD: Byte): Byte;
begin
 BCD2Byte:=(BCD shr 4)*10+(BCD and $0F);
end;

function BCDDateTimeToStr(DT: BCDDateTime): String;
begin
 Result:=LeftPad(IntToStr(BCD2Byte(DT[3])),"0",2)+"."+LeftPad(IntToStr(BCD2Byte(DT[4])),"0",2)+"."+
 LeftPad(IntToStr(BCD2Byte(DT[5])),"0",2)+"   "+LeftPad(IntToStr(BCD2Byte(DT[2])),"0",2)+":"+
 LeftPad(IntToStr(BCD2Byte(DT[1])),"0",2)+":"+LeftPad(IntToStr(BCD2Byte(DT[0])),"0",2);
end;


 
sniknik ©   (2005-10-16 19:47) [30]

> У меня такой нет!
ну так вот и сделай. тогда вообще отпадет надобность в последующем конвертировании.

и я указывал, я спросил
> что за функция BCDDateTimeToStr? и нет ли там же где взял эту другой BCDDateTimeToDateTime?
если ты одну придумал, то значит и другую сможеш. более правильную. т.к. операции с числами от форматов не зависят.


 
Германн ©   (2005-10-16 19:52) [31]

2 sniknik ©   (16.10.05 19:47) [30]

Не ну ты суть вопроса не понял. То что у меня в функцию StrToDateTime передаётся неверная строка это очевидно. С прибора пришла лажа, бывает. Меня то волнует почему происходящее при этом исключение не глушится в защищённом блоке.


 
sniknik ©   (2005-10-16 20:16) [32]

это ты сути ответов не понял. пришла лажа? - обрабатывай! сам генери исключения по этому поводу. не плоди кучи преобразований  которые поотенциально источники глюков. не думай что в обработчике ошибки не может возникнуть другой ошибки, ведь у тебя и там преобразования (OnException тоже касается).
и т.д. ищи глюки в своем коде.
а на try except не греши, не может этого быть, чтобы не глушилось... потоков же у тебя в них нет, насколько код приведен. (если из зашишенного блока вызов потока/сом обьекта, и уже в нем исключение... имхо, это единственная возможность "упустить" исключение из блока)

и кстати. этой "сути" в вопросе нет, только в дополнениях. а это не равнозначно, потому что изначально тебе на другое отвечали.


 
Германн ©   (2005-10-16 20:33) [33]

2 sniknik ©   (16.10.05 20:16) [32]
> не может этого быть, чтобы не глушилось...

(Грустно) Вот и я об том же :(

> ищи глюки в своем коде.
Ищу. Но не нахожу пока.



Страницы: 1 вся ветка

Текущий архив: 2005.11.06;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.03 c
14-1129636023
Stranger53
2005-10-18 15:47
2005.11.06
Новые версии Delphi


11-1110119068
Владимир Кладов
2005-03-06 17:24
2005.11.06
версия 2.06


14-1129379058
race1
2005-10-15 16:24
2005.11.06
Железо


1-1129192785
Friend
2005-10-13 12:39
2005.11.06
Pos в RichEdit


9-1117662227
Темас
2005-06-02 01:43
2005.11.06
Реалистичная траектория падения снежинки Как сделать ?