2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Контроль ввода
Сообщение06.05.2008, 11:56 


26/04/08
13
Есть поле ввода Edit. Необходимо контролировать вводимую туда дату.
Пример: 06.06.2008
Надо чтобы не было такого: 99.99.9999
Подскажите пожалуйста, как этого добиться.

 Профиль  
                  
 
 
Сообщение06.05.2008, 12:45 


04/02/06
122
СПИИРАН
1. Есть специальный компонент (если это Delphi или C++Builder) MaskEdit.

2. Можно непосредственно контрол(л)ировать ввод (нажатия клавиш или по событию OnChange).

3. Можно использовать специализированный компонент. По мотивам того, который используется для задания IP-адреса.

 Профиль  
                  
 
 
Сообщение06.05.2008, 14:01 


26/04/08
13
Пишу в Delphi 7
Использую MaskEdit
Но там даже используя шаблон, можно вводить не существующую дату, например 77.77.7777
Как же этого избежать?

 Профиль  
                  
 
 
Сообщение06.05.2008, 14:13 
Заслуженный участник
Аватара пользователя


01/08/06
3131
Уфа
К сожалению, MaskEdit не рассчитан на ввод дат и т.п. Он предназначается для ввода, в основном, телефонных номеров.
А компоненты для ввода даты/времени в стандартных компонентах Delphi отсутствуют. Обычно для этих целей используют библиотеки компонентов сторонних производителей, например, JVCL (бесплатная), Raize Components (платная).

 Профиль  
                  
 
 
Сообщение06.05.2008, 14:14 


21/03/06
1545
Москва
neznakomka писал(а):
Но там даже используя шаблон, можно вводить не существующую дату, например 77.77.7777
Как же этого избежать?


OZH писал(а):
2. Можно непосредственно контрол(л)ировать ввод (нажатия клавиш или по событию OnChange).

 Профиль  
                  
 
 
Сообщение11.05.2008, 22:16 


27/11/05
183
Северодонецк
Я так думаю, neznakomka ожидала приблизительно такой код:

Код:

#define LEN   10 // максимальное число символов в дате

#define CODE0  0 // с датой все в порядке
#define CODE1  1 // слишком много символов в дате
#define CODE2  2 // синтаксическая ошибка в дате
#define CODE3  3 // ошибка в дне
#define CODE4  4 // ошибка в месяце
#define CODE5  5 // ошибка в годе


long test_date(char *s)
{
  char temp[LEN + 1], *q, c;
  long cnt_point, day, mon, year;
  long days[] = {31,0,31,30,31,30,31,31,30,31,30,31};

  cnt_point = 0;

  for(q = temp; (c = *s) != 0; ++s)
  {
    switch(c)
    {

    default:
      return(CODE2);

    case '\n': case '\t': case ' ':
      continue;

    case '.':
      if(q == temp || q[-1] == '.' || cnt_point == 2)
        return(CODE2);
      ++cnt_point;

    case '0': case '1': case '2': case '3': case '4':
    case '5': case '6': case '7': case '8': case '9':
      *q++ = c;
    }
  }
 
  if(cnt_point != 2 || q[-1] == '.')
    return(CODE2);

  *q = 0;
  sscanf(temp, "%d.%d.%d", &day, &mon, &year);

  if(year < 1 || year > 9999)
    return(CODE5);

  if(mon < 1 || mon > 12)
    return(CODE4);

  // Получить число дней в феврале
  days[1] = ((year % 4 == 0 && year % 100 !=0) || year % 400 == 0) ? 29 : 28;

  return(day < 1 || day > days[mon - 1] ? CODE3 : CODE0);
}



То есть сначала выполняется ввод без контроля, а потом содержимое
буфера ввода тестируется приведенным выше способом...

 Профиль  
                  
 
 
Сообщение13.05.2008, 10:38 
Аватара пользователя


14/05/05
224
Баку
Подобного рода задачи во многих языках программирования решаются очень легко с применением шаблонов.

Для вашей задачи шаблон, к примеру в C#, будет объявлятся следующим образом

Regex expression = new Regex( @"^([1-9]|0[1-9]|1[012])[- /.]([1-9]|0[1-9]|[12][0-9]|3[01])[- /.][0-9]{4}$" ); // - Сам шаблон

Match isDate = expression.Match(sometext); // - Проверка условия корректности даты (или текста по шаблону)

Эту проверку можно далее привязать к событию OnKeyPress, OnChange, OnKeyDown.

P.S. Так как вы программируете на платформе Delphi, то применить шаблоны вам не удастся. Единственный способ - это либо инкапсулировать готовый элемент MaskEdit и привязать к нему дополнительные условия на корректность ввода диапазона цифр, либо напрямую создать функции контроля вводимых цифр на события OnChange, OnKeyPress и OnKeyDown. А еще лучше перейти на более мощные языки программирования.

 Профиль  
                  
 
 
Сообщение13.05.2008, 12:51 
Заслуженный участник
Аватара пользователя


01/08/06
3131
Уфа
Ринат писал(а):
Подобного рода задачи во многих языках программирования решаются очень легко с применением шаблонов.
Ну, не так-то уж и легко.

Ринат писал(а):
^([1-9]|0[1-9]|1[012])[- /.]([1-9]|0[1-9]|[12][0-9]|3[01])[- /.][0-9]{4}$
Этот шаблон всё ещё пропускает неверные даты, например, 02/31/2007 (формат даты ММ/ДД/ГГГГ).

 Профиль  
                  
 
 
Сообщение13.05.2008, 20:49 


27/11/05
183
Северодонецк
Да-с, современный программист по любому поводу обязательно ищет готовую функцию или язык программирования. Если не находит - расстраивается, вместо того, чтобы сесть за компьютер и реализовать необходимый алгоритм за минут 15.
Тем более, что предлагаемые решения через шаблоны не учитывают високосность... А уж контролировать ввод даты во время ввода - только зря время тратить и нервировать пользователя. Ну, положим, ввел он 29 дней в феврале - это ошибка или нет? Естественно, пока год не ввели, ничего сказать не можем. Или даже для февраля задали 31 день - ну и что? А может я потом одумаюсь и задам месяц в виде января. Такой непрошенный сервис по контролю обычно раздражает. Вот когда я подтверждаю ввод даты - тогда и можно контролировать. А максимум, на что можно рассчитывать при вводе - это стандартной маской контролировать число цифр и что именно цифры должны вводиться. Весь остальной интеллектуальный контроль должен проводиться после ввода.

 Профиль  
                  
 
 
Сообщение14.05.2008, 09:39 


21/03/06
1545
Москва
Цитата:
Тем более, что предлагаемые решения через шаблоны не учитывают високосность... А уж контролировать ввод даты во время ввода - только зря время тратить и нервировать пользователя. Ну, положим, ввел он 29 дней в феврале - это ошибка или нет? Естественно, пока год не ввели, ничего сказать не можем. Или даже для февраля задали 31 день - ну и что? А может я потом одумаюсь и задам месяц в виде января. Такой непрошенный сервис по контролю обычно раздражает. Вот когда я подтверждаю ввод даты - тогда и можно контролировать. А максимум, на что можно рассчитывать при вводе - это стандартной маской контролировать число цифр и что именно цифры должны вводиться. Весь остальной интеллектуальный контроль должен проводиться после ввода.

Полностью согласен.

 Профиль  
                  
 
 
Сообщение14.05.2008, 10:50 


04/02/06
122
СПИИРАН
А что мешает использовать три компонента ввода?

Можно связать между собой события OnChange троих компонентов так, чтобы добиться согласованной проверки вводимых значений.

 Профиль  
                  
 
 
Сообщение14.05.2008, 11:40 
Супермодератор
Аватара пользователя


29/07/05
8248
Москва
Вопрос в том, что следует делать, если пользователь ввел сначала 29 февраля (что потенциально возможно), а затем - невисокосный год. Или сначала число 31, а затем месяц апрель, в котором только 30 дней. Такая комбинация значений является недопустимой, но как на это следует реагировать программе? Она может заблокировать все поля ввода, кроме последнего поля, требуя, чтобы пользователь ввел в него корректное значение. Но, возможно, последнее значение введено правильно, а пользователь захочет исправить предпоследнее.

Наиболее правильно, по-моему, будет обрабатывать события редактирования поля (или полей) и в случае ввода допустимой даты - допускать дальнейшие действия (типа активировать кнопку OK), а в случае недопустимой - дезактивировать.

А вообще, кажется, автор топика уже пропал, поэтому вряд ли последующее обсуждение имеет глубокий смысл.

 Профиль  
                  
 
 
Сообщение14.05.2008, 11:51 


04/02/06
122
СПИИРАН
PAV писал(а):
А вообще, кажется, автор топика уже пропал, поэтому вряд ли последующее обсуждение имеет глубокий смысл.


Всегда можно поразмышлять, пофантазировать и что-то эдакое придумать. Нужна же какая-то пища для ума. Не стоит так быстро отказываться. Даже если это всё выглядит простым упражнением.

 Профиль  
                  
 
 
Сообщение14.05.2008, 13:00 
Супермодератор
Аватара пользователя


29/07/05
8248
Москва
Я ничего против этого не имею. :)

Добавлено спустя 57 минут 28 секунд:

Можно еще предложить выпадающие списки с датами, месяцами и даже годами, варианты выбора в которых уточняются в зависимости от того, что уже выбрано в других полях. Скажем, если пользователь уже выбрал 31 число, то в выпадающем списке месяцев присутствуют только такие, в которых это число присутствует. А если уже выбрано 29 февраля, то в выпадающем списке годов будут только високосные.

 Профиль  
                  
 
 
Сообщение14.05.2008, 15:14 


04/02/06
122
СПИИРАН
А теперь самый главный вопрос: зачем всё это нужно?

Если это --- чьё-то упражнение, то можно много чего накрутить, изголяясь в умении использовать методы и свойства компонентов. Если это --- нужно для чего-нибудь, то кому мешает простой календарик?

Загадка... :roll:

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 17 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group