Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.10.2016, 01:14   #1
CraZZZy-GameRRR
Пользователь
 
Регистрация: 15.04.2010
Сообщений: 98
По умолчанию Проверка переменной на null

На форме есть поле для ввода времени (DateTimePicker). Это значение нужно присвоить переменной типа TTime (а точнее свойству класса в реальном проекте, но пока упростим). Суть в том, что поле не обязательно и можно его не заполнять. Для этого у компонента отображается галочка (ShowCheckbox = True). Чтобы определить задано время или нет, добавлять отдельную переменную а-ля IsTimeSet не очень удобно, поэтому делаю так: если галка не стоит - пишу в переменную null. Потом дальше, где я орабатываю значение этой переменной мне нужно проверить null она или нет. Я делаю это либо так:
Код:
if VarIsNull(t) then
либо так:
Код:
if t = null then
и в любом случае, если переменная равна null, происходит исключение:
snap01001.png

Вот код:
Код:
procedure TForm1.DateTimePicker1Change(Sender: TObject);
var
  t: TTIme;
begin
  // Записываем время в переменную
  if DateTimePicker1.Checked = False then
    t := null
  else
    t := DateTimePicker1.Time;

  // Тут что-нибудь делаем ещё ...
  // ....

  //
  if {VarIsNull(t)} t = null then
    Memo1.Text := 'Время не задано!'
  else
    Memo1.Text := 'Задано время: ' + TimeToStr(DateTimePicker1.Time);
end;
Архив с проектом прилагаю:
timetest.zip
CraZZZy-GameRRR вне форума Ответить с цитированием
Старый 22.10.2016, 01:30   #2
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,542
По умолчанию

TTime это тип Double, а null - Variant. Используйте вместо null, например, 0.
Arigato вне форума Ответить с цитированием
Старый 22.10.2016, 01:37   #3
CraZZZy-GameRRR
Пользователь
 
Регистрация: 15.04.2010
Сообщений: 98
По умолчанию

Тогда как отличить '00:00:00' от 0?
CraZZZy-GameRRR вне форума Ответить с цитированием
Старый 22.10.2016, 09:34   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от CraZZZy-GameRRR Посмотреть сообщение
Тогда как отличить '00:00:00' от 0?
никак.
попробуйте отрицательные значения (-1, например)
если не получится - тогда используйте дополнительную переменную isTimeSet
или вообще обращайтесь к значению чекбокса, который за это отвечает.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.10.2016, 09:43   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Tdatetimepicker это в том числе и поле для ВВОДа и стало быть есть его строковое представление.
Код:
if datetimepicker1.text='' then showmessage('время не задано')
else t:=datetimepicker1.time;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 22.10.2016, 12:49   #6
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Tdatetimepicker это в том числе и поле для ВВОДа и стало быть есть его строковое представление
У DateTimePicker есть свойство .Text???
О-о-о...
kropotkina-alice вне форума Ответить с цитированием
Старый 22.10.2016, 16:54   #7
DIONISKA
Форумчанин
 
Регистрация: 07.11.2011
Сообщений: 160
По умолчанию

TTime это тот-же TDatetime, который double, причем DateTimePicker возвращает одно и то-же значение для Time, Date, Datetime(можете заглянуть в ComCtrls). На всякий напомню: дробная часть это время, а целая - дата. Если нужно только время, то можно поступить так:

Код:
var
  t: TTIme;
  //...
begin
 if DateTimePicker1.Checked = False then
    t := 1
  else
    t := frac(DateTimePicker1.Time); 
  // ....
 if  t = 1 then //<-- значение времени принимает вид -1<Time< 1
    Memo1.Text := 'Время не задано!'
  else
    Memo1.Text := 'Задано время: ' + TimeToStr(t);
DIONISKA вне форума Ответить с цитированием
Старый 22.10.2016, 17:26   #8
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

Мудрено как-то...
А если:
Код:
procedure TForm1.DateTimePicker1Change(Sender: TObject);
begin
  if DateTimePicker1.Checked = False then
    Memo1.Text := 'Время не задано!'
  else
    Memo1.Text := 'Задано время: ' + TimeToStr(DateTimePicker1.Time);
  // Тут что-нибудь делаем ещё ...
end;
Зачем вводить какую-то переменную t?
kropotkina-alice вне форума Ответить с цитированием
Старый 22.10.2016, 18:24   #9
DIONISKA
Форумчанин
 
Регистрация: 07.11.2011
Сообщений: 160
По умолчанию

Цитата:
Сообщение от kropotkina-alice Посмотреть сообщение
...
Зачем вводить какую-то переменную t?
У ТС в рабочем проекте значение t - некое свойство класса(если я правильно понял), его методы могут к примеру выполнятся вне главного потока, а обращение к vcl из другого потока это уже потенциальные проблемы с синхронизацией Например может быть что-то такое:
Код:
 TWorkthread=class(TThread)
   ftime:TTime;
   constructor Create(createsuspended:Boolean; begintime:TTime=1); override;
      protected
   procedure Execute; override;
      public
   procedure SetTime(value:TTime);
    property Time:TTime read ftime write SetTime;
  end;
Впрочем не пойму почему ТС отказывается завести ещё одно свойство у своего класса, которое будет учитывать необходимость указания времени.
DIONISKA вне форума Ответить с цитированием
Старый 22.10.2016, 19:55   #10
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,542
По умолчанию

Код:
t := Infinity; // дата не установлена
...
if IsInfinite(t) then // не установлена
else // установлена
Arigato вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка переменной PHP на пустоту js-ом Artsiom JavaScript, Ajax 8 24.10.2016 13:26
Сервер отправляет объект не null, а клиент принимает null (C# WCF) NewLamer&Programer Общие вопросы .NET 3 22.04.2016 18:55
Проверка переменной на принадлежность к числовому типу KPOBOCiCb Общие вопросы C/C++ 11 05.06.2015 07:22
Pascal: проверка переменной WheelieJoe Помощь студентам 0 28.05.2011 13:53
SQL запрос. Не выводит строки, где в одном поле присутствует NULL, хотя идет проверка lyle_200490 SQL, базы данных 7 07.04.2011 22:41