Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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]

Удалено модератором
Примечание: Создание пустых сообщений


 
Dimka Maslov ©   (2014-04-13 23:23) [41]

EncodeDate никто не пробовал использовать?


 
junglecat   (2014-04-13 23:26) [42]

> [41] Dimka Maslov ©   (13.04.14 23:23)
> EncodeDate никто не пробовал использовать?

а он тоже нестабильно работает?



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

Форум: "Начинающим";
Текущий архив: 2015.09.10;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.047 c
15-1418199716
Юрий Зотов
2014-12-10 11:21
2015.09.10
Концерт


15-1417901404
Юрий
2014-12-07 00:30
2015.09.10
С днем рождения ! 7 декабря 2014 воскресенье


15-1412335282
ProstoTak
2014-10-03 15:21
2015.09.10
MS SQL deadlock


2-1392639364
Васька
2014-02-17 16:16
2015.09.10
Открытие формы


2-1392372907
санек
2014-02-14 14:15
2015.09.10
компонент TdateTime





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский