Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не присваиваются значения в записи Record 
V
    Опции темы
Akella
  Дата 2.8.2010, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Есть запись
Код

Type
  TStatisticsDatas = record
    dtStart, dtEnd: TDate;
  end;



есть глобальная переменная
Код
StatisticsDatas: TStatisticsDatas;


есть в процедуре код:

Код

  case StatPeriod of
    spToday:    begin StatisticsDatas.dtStart := now; StatisticsDatas.dtEnd := now; end;
    spYesterday:begin StatisticsDatas.dtStart := now - 1; StatisticsDatas.dtEnd := now - 1; end;
    spWeek:     begin StatisticsDatas.dtStart := now - 7; StatisticsDatas.dtEnd := now; end;
    spMounth:   begin StatisticsDatas.dtStart := now - 30; StatisticsDatas.dtEnd := now; end;
    spYear:     begin StatisticsDatas.dtStart := now - 365; StatisticsDatas.dtEnd := now; end;
    spAllPeriod:begin StatisticsDatas.dtStart := 0; StatisticsDatas.dtEnd := Date; end;
  end;


код работает, в Case заходит (пробовал все строки), но значения dtStart и dtEnd не меняются 

Смотрю дебаггером. Как были до присвоения, так и остались: 2,6395166155e-308 и 5,1542870537e-278 соответственно

Сделал обе переменные локальными, так всё работает.
Что не так с типом TDate в записях?
D2007.

Это сообщение отредактировал(а) Akella - 2.8.2010, 12:47
PM MAIL   Вверх
Akella
Дата 2.8.2010, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Странно, если добавить в конце
Код
ShowMessage(DateToStr(StatisticsDatas.dtStart));

то показывается правильная дата %)
PM MAIL   Вверх
Демо
Дата 2.8.2010, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



А структура где-то используется?


--------------------
    
PM MAIL ICQ Skype   Вверх
Akella
Дата 2.8.2010, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



В какой-то из процедур была объявлена ещё одна переменная локально
Код
StatDatas: TStatisticsDatas;

Видать как-то они пересеклись, т.к. после того, как оставил только глобальную, проблема исчезла.
PM MAIL   Вверх
Frees
Дата 2.8.2010, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 9
Всего: 54



может это фича оптимизатора, раз ты только пишешь в StatisticsDatas то это все лишнее, попробуй убрать оптимизацию


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Keeper89
Дата 2.8.2010, 13:15 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 20
Всего: 58



Демо, +1

Akella
вообще, раз 
Код

dtStart, dtEnd: TDate;

лучше использовать везде не now, а Date.


--------------------
PM MAIL WWW   Вверх
xkor
Дата 2.8.2010, 16:30 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 8.1.2007
Где: Питер

Репутация: 1
Всего: 4



Keeper89, чем лучше? Date просто возвращает результат Now отбросив дробную часть.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
k0rvin
Дата 2.8.2010, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(Akella @ 2.8.2010,  12:27)
есть в процедуре код:

Код

  case StatPeriod of
    ...
    spMounth:   begin StatisticsDatas.dtStart := now - 30; StatisticsDatas.dtEnd := now; end;
    spYear:     begin StatisticsDatas.dtStart := now - 365; StatisticsDatas.dtEnd := now; end;
    ...
  end;

как-то это неправильно


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
Keeper89
Дата 2.8.2010, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 20
Всего: 58



xkor, просто насколько я помню Now возвращает TDateTime, а не Date, это конечно не принципиально.

Хотя, не прав и то, и то TDateTime smile

Это сообщение отредактировал(а) Keeper89 - 2.8.2010, 23:50


--------------------
PM MAIL WWW   Вверх
Akella
Дата 3.8.2010, 09:00 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Цитата(Keeper89 @  2.8.2010,  13:15 Найти цитируемый пост)
лучше использовать везде не now, а Date.

Я и использовал именно Date с самого начала



k0rvin
Цитата(k0rvin @  2.8.2010,  17:31 Найти цитируемый пост)
как-то это неправильно 

Почему? Предложи лучший вариант.

Добавлено через 24 секунды
Цитата(Keeper89 @  2.8.2010,  13:15 Найти цитируемый пост)
лучше использовать везде не now, а Date. 

Да пофиг
PM MAIL   Вверх
CodeMonkey
Дата 3.8.2010, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



Цитата(Akella @  3.8.2010,  10:00 Найти цитируемый пост)
Да пофиг 


Потрясающее наплевательство к качеству кода. Кообще-то Keeper прав: использовать надо Date, потому что она возвращает только дату, Now - возвращает дату и время.

Если мне достанется ваш код и я не видел, как вы заполняете запись, то, смотря на объявление:

Код
Type
  TStatisticsDatas = record
    dtStart, dtEnd: TDate;
  end;


а). Я решу, что в dtStart лежит дата и время?
или всё же
б). Я решу, что в dtStart лежит только дата?

Наверное всё же второе, как вы считаете? И тогда я начну делать какие-то проверки и вычисления, и для меня станет полной неожиданностью, что у dtStart ВНЕЗАПНО появляется дробная часть.

Не надо врать компилятору - целее будете. Хотите использовать Now - измените тип на TDateTime. То, что TDateTime = TTime и TDate не имеет никакого значения. Зачем создавать потенциальное место для бага?


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Akella
Дата 3.8.2010, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Цитата(CodeMonkey @  3.8.2010,  10:24 Найти цитируемый пост)
б). Я решу, что в dtStart лежит только дата?

конечно же только дата

Добавлено через 1 минуту и 44 секунды
Цитата(CodeMonkey @  3.8.2010,  10:24 Найти цитируемый пост)
у dtStart ВНЕЗАПНО появляется дробная часть.

откуда она там появится?

Добавлено через 2 минуты и 43 секунды
Цитата(CodeMonkey @  3.8.2010,  10:24 Найти цитируемый пост)
Не надо врать компилятору - целее будете. Хотите использовать Now - измените тип на TDateTime. То, что TDateTime = TTime и TDate не имеет никакого значения. Зачем создавать потенциальное место для бага?

1. Никакой ошибки не будет.
2. Я изначально использовал не now, а date

PM MAIL   Вверх
CodeMonkey
Дата 3.8.2010, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



Цитата(Akella @  3.8.2010,  11:35 Найти цитируемый пост)
откуда она там появится?


Отсюда:
Цитата(Akella @  2.8.2010,  13:27 Найти цитируемый пост)
StatisticsDatas.dtStart := now


Цитата(Akella @  3.8.2010,  11:35 Найти цитируемый пост)
Никакой ошибки не будет.


Да ну.

Пусть:
Код
var
  dtStart: TDate;
begin
  dtStart := Now;


Теперь мы хотим определить, сегодня ли было начало:

Код
if dtStart = Date then // или EncodeDate(2010, 8, 3), если нужно фиксированное число
  ShowMessage('Начало сегодня!')


Надо ли говорить, что никакого сообщения не появится?

Но стоит исправить этот код на правильный вариант:
Код
  dtStart := Date;


Как баг исчезает!


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Akella
Дата 3.8.2010, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Да, т.к. сравнение идёт вещественных чисел. Спасибо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1127 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.