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

Вниз

Нестабильно работет 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;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.063 c
15-1420061401
Юрий
2015-01-01 00:30
2015.09.10
С днем рождения ! 1 января 2015 четверг


15-1417013096
ВладОшин
2014-11-26 17:44
2015.09.10
Самое время покупать кондиционер, прошу совета


8-1236500354
deswan
2009-03-08 11:19
2015.09.10
Graphics32 - навигация по изображению


15-1413357927
ВладОшин
2014-10-15 11:25
2015.09.10
Думаю писать StringToТелефоны


15-1413985851
Ламот
2014-10-22 17:50
2015.09.10
Как корректно скопировать /dev/mtd0 в образ и обратно (NAND)?