Форум: "Начинающим";
Текущий архив: 2015.09.10;
Скачать: [xml.tar.bz2];
ВнизНестабильно работет StrToDateTime() Найти похожие ветки
← →
sdfdh (2014-04-10 20:49) [0]Здравствуйте!
Необходимо кодировать текст в дату. Использую следующий код:procedure TForm1.Button1Click(Sender: TObject);
Var
StrDate : string;
Fmt : TFormatSettings;
dt : TDateTime;
begin
fmt.ShortDateFormat:="dd.mm.yyyy";
fmt.DateSeparator :=".";
StrDate:="02.04.2014";
dt:=StrToDateTime(StrDate,Fmt);
end;
Переменной dt присваивается 02.04.2014
Однако, если я тот же код!!! Один в один, вставляю в свое приложение, то этот же код уже не работает. dt=30.12.1899
В чем проблема? Что не так?
← →
Rouse_ © (2014-04-10 20:57) [1]А если вот так? "30.12.1899 12:00"
← →
[ВладОшин] © (2014-04-10 21:05) [2]
> В чем проблема?
а внимательно посмотрели?
рискну, что юзается не та пременная, которая передается, уж больно подозрительно
← →
MBo © (2014-04-10 21:07) [3]На всякий случай - 30.12.1899 означает, что в данной переменной записан (или остался) 0
← →
Германн © (2014-04-10 21:07) [4]
> если я тот же код!!! Один в один
Имхо врешь. Или честно заблуждаешься.
← →
Германн © (2014-04-10 21:25) [5]Предположу что в программе есть две переменные dt.
← →
sdfdh (2014-04-10 21:33) [6]Коллеги, всем спасибо кто ответил!
Вот Скрин из моего приложения, который показывает, что я не вру и не ошибаюсь с переменными:
http://s1.ipicture.ru/uploads/20140410/OUWsouWR.jpg
← →
sdfdh (2014-04-10 21:35) [7]Создал новую переменную с именем, которого ТОЧНО в приложении нет.
Та же фигня:
http://s1.ipicture.ru/uploads/20140410/GsS45WZy.jpg
← →
junglecat (2014-04-10 22:07) [8]а почему не StrToDate, если время не нужно?
← →
sdfdh (2014-04-10 22:16) [9]StrToDate - тот же эффект (т.е. никакой)
← →
Inovet © (2014-04-10 22:44) [10]А если добавить
TFormatSettings.Create
перед заданием форматов?
← →
junglecat (2014-04-10 22:54) [11]Create? у record?
← →
antonn © (2014-04-10 23:02) [12]
>
> Имхо врешь. Или честно заблуждаешься.
локаль
← →
Inovet © (2014-04-10 23:07) [13]> [11] junglecat (10.04.14 22:54)
> Create? у record?
Рекордам Коран запрещает иметь Create?
← →
Inovet © (2014-04-10 23:11) [14]> [12] antonn © (10.04.14 23:02)
> локаль
Вот и надо выяснить. Приложение запускается там же, где и тестовый пример?
← →
SergeyIT © (2014-04-10 23:21) [15]А может таймсепаратор тоже равен "." и крыша съезжает
← →
Sapersky (2014-04-10 23:43) [16]Переменная на стеке, в таймсепараторе и прочих явно не заполняемых полях случайный мусор.
Так что да, Create, либо в старых версиях GetLocaleFormatSettings.
← →
MonoLife © (2014-04-11 05:55) [17]StrToDate(), а там второй параметр нужен что ли?
StrDate:="02.04.2014";
dt:=StrToDateTime(StrDate);
← →
MonoLife © (2014-04-11 06:00) [18]а, пардон, там 2-я же функция есть с параметром форматирования
← →
brother © (2014-04-11 06:46) [19]> Рекордам Коран запрещает иметь Create?
запрещает не коран, а версия делфи, например д7 и ниже не имеют этого...
← →
brother © (2014-04-11 06:53) [20]
procedure TForm1.Button1Click(Sender: TObject);
Var
StrDate : string;
Fmt : TFormatSettings;
dt : TDateTime;
begin
fmt.ShortDateFormat:="dd.mm.yyyy";
fmt.DateSeparator :=".";
StrDate:="02.04.2014";
dt:= 0;
try
dt:=StrToDateTime(StrDate,Fmt);
except
on E : Exception do
Showmessage(e.Message);
end;
showmessage(DateTimeToStr(dt));
end;
вот так попробуйте...
← →
brother © (2014-04-11 06:57) [21]зы. button135 O_o ! Однако хорошая программа ;)
← →
sdfdh (2014-04-11 07:02) [22]To brother
Спасибо! Вот именно этот код заработал!
Не знаю, с чем это связано, но он возвращает то, что нужно 02.04.2014
Еще раз спасибо!
← →
brother © (2014-04-11 07:18) [23]а варнинги надо читать... ну и на всяк проверить на исключения...
← →
brother © (2014-04-11 07:20) [24]хотя, это не ответило на вопрос: почему? ибо Ваш код и так работал...ведь исключения нет?
← →
sdfdh (2014-04-11 07:22) [25]Ну да, исключений не было.
Попытаюсь сегодня поудалять последовательно из Вашего кода строки, посмотреть на какой все становится по старому. Потом отпишусь.
Еще раз спасибо!
← →
Inovet © (2014-04-11 07:23) [26]> [24] brother © (11.04.14 07:20)
> ведь исключения нет?
Давилось.
← →
brother © (2014-04-11 07:24) [27]> dt:= 0;
инициализация, но вообще, если небыло исключения, то StrToDateTime также инициализировало бы переменную, впрочем у меня д7, так что хз что там в д2005...
← →
brother © (2014-04-11 07:24) [28]> Давилось.
в описании к функции сказано, что если что-то не так, то будет исключение...
← →
Inovet © (2014-04-11 07:26) [29]> [28] brother © (11.04.14 07:24)
> то будет исключение
А автор их задавиливает. Не?
← →
brother © (2014-04-11 07:27) [30]а где по коду он их задавливает хз? и мой пример же исключения не вызывает!
← →
MBo © (2014-04-11 07:32) [31]В приведенном коде не видно, чтобы переменная dt использовалась. Компилятор может оптимизировать код, не выполняя ненужную работу
(правда, на скриншоте синяя точка на данной строчке есть)
← →
Inovet © (2014-04-11 07:40) [32]Короче, надо было сразу писать
ShowMessage(DateTimeToStr(dt));
вместо "Я закончил".
← →
brother © (2014-04-11 07:47) [33][32] видимо да, но
> правда, на скриншоте синяя точка на данной строчке есть
← →
Германн © (2014-04-11 10:42) [34]
> правда, на скриншоте синяя точка на данной строчке есть
Но на скриншоте значение dt в тултипе показано. Может отладчик уже про эту переменную забыл?
← →
junglecat (2014-04-11 10:50) [35]а может, это вообще фотошоп?
← →
sdfdh (2014-04-11 21:10) [36]В общем понадобилось тоже самое в другой процедуре. Все то же! Та же ошибка!
Буду ставить другую Delphi и вручную переносить приложение...
← →
sdfdh (2014-04-11 22:40) [37]Коллеги!
За вешающее сообщение с решением! Возможно, кому-то в будущем поможет!
1. Все сообщения выше о том. что "типа "photoshop", конечно полная херня! Конечно, мне заняться больше не чем как верстать Вам страничку с выдуманной ошибкой.
2. ПО всей видимости то, на что я натолкнулся - это ошибка компилятора Delphi. Не знаю какая комбинация событий к ней приводит, так как, как я писал вверху в чистом новом проекте все работает ОК!
3. САМОЕ ГЛАВНОЕ: я нашел комбинацию, приводящую к верному/невернму решению. Комментировать ничего не буду, все и так ясно. Отдельное спасибо brother за правильное направление решения!
Правильный ответ компилятора:
http://s1.ipicture.ru/uploads/20140411/hPeFJft3.jpg
Ошибочный ответ компилятора:
http://s1.ipicture.ru/uploads/20140411/6SIu1Aem.jpg
Блин! посмотрел на скрин. НИХЕРА не видно!
В общем во втором случае я комментул строку:{cName:=DateTimeToStr(DateStartGantt); }
ВОт так!
Всем спасибо!
Проблема решена!
← →
Германн © (2014-04-12 00:21) [38]
> САМОЕ ГЛАВНОЕ: я нашел комбинацию, приводящую к верному/невернму
> решению.
Эта "комбинация" давно уже была названа в MBo © (11.04.14 07:32) [31]
И это не ошибка компилятора. Это ошибка программиста, который не знает как работает оптимизация компилятора Дельфи.
Но с некоторой натяжкой это можно назвать ошибкой отладчика Дельфи.
← →
Inovet © (2014-04-12 00:23) [39]> [38] Германн © (12.04.14 00:21)
Ну я вроде как понял, что в отладчике уже потом было обнаружено, после неправильной работы где-то в программе, где переменная следовательно используется. Или я тогда не понял причину паники.
← →
Германн © (2014-04-12 01:09) [40]Удалено модератором
Примечание: Создание пустых сообщений
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2015.09.10;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.046 c