2014 dxdy logo

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

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




На страницу 1, 2  След.
 
 Контроль ввода
Сообщение06.05.2008, 11:56 
Есть поле ввода Edit. Необходимо контролировать вводимую туда дату.
Пример: 06.06.2008
Надо чтобы не было такого: 99.99.9999
Подскажите пожалуйста, как этого добиться.

 
 
 
 
Сообщение06.05.2008, 12:45 
1. Есть специальный компонент (если это Delphi или C++Builder) MaskEdit.

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

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

 
 
 
 
Сообщение06.05.2008, 14:01 
Пишу в Delphi 7
Использую MaskEdit
Но там даже используя шаблон, можно вводить не существующую дату, например 77.77.7777
Как же этого избежать?

 
 
 
 
Сообщение06.05.2008, 14:13 
Аватара пользователя
К сожалению, MaskEdit не рассчитан на ввод дат и т.п. Он предназначается для ввода, в основном, телефонных номеров.
А компоненты для ввода даты/времени в стандартных компонентах Delphi отсутствуют. Обычно для этих целей используют библиотеки компонентов сторонних производителей, например, JVCL (бесплатная), Raize Components (платная).

 
 
 
 
Сообщение06.05.2008, 14:14 
neznakomka писал(а):
Но там даже используя шаблон, можно вводить не существующую дату, например 77.77.7777
Как же этого избежать?


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

 
 
 
 
Сообщение11.05.2008, 22:16 
Я так думаю, 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 
Аватара пользователя
Подобного рода задачи во многих языках программирования решаются очень легко с применением шаблонов.

Для вашей задачи шаблон, к примеру в 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 
Аватара пользователя
Ринат писал(а):
Подобного рода задачи во многих языках программирования решаются очень легко с применением шаблонов.
Ну, не так-то уж и легко.

Ринат писал(а):
^([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 
Да-с, современный программист по любому поводу обязательно ищет готовую функцию или язык программирования. Если не находит - расстраивается, вместо того, чтобы сесть за компьютер и реализовать необходимый алгоритм за минут 15.
Тем более, что предлагаемые решения через шаблоны не учитывают високосность... А уж контролировать ввод даты во время ввода - только зря время тратить и нервировать пользователя. Ну, положим, ввел он 29 дней в феврале - это ошибка или нет? Естественно, пока год не ввели, ничего сказать не можем. Или даже для февраля задали 31 день - ну и что? А может я потом одумаюсь и задам месяц в виде января. Такой непрошенный сервис по контролю обычно раздражает. Вот когда я подтверждаю ввод даты - тогда и можно контролировать. А максимум, на что можно рассчитывать при вводе - это стандартной маской контролировать число цифр и что именно цифры должны вводиться. Весь остальной интеллектуальный контроль должен проводиться после ввода.

 
 
 
 
Сообщение14.05.2008, 09:39 
Цитата:
Тем более, что предлагаемые решения через шаблоны не учитывают високосность... А уж контролировать ввод даты во время ввода - только зря время тратить и нервировать пользователя. Ну, положим, ввел он 29 дней в феврале - это ошибка или нет? Естественно, пока год не ввели, ничего сказать не можем. Или даже для февраля задали 31 день - ну и что? А может я потом одумаюсь и задам месяц в виде января. Такой непрошенный сервис по контролю обычно раздражает. Вот когда я подтверждаю ввод даты - тогда и можно контролировать. А максимум, на что можно рассчитывать при вводе - это стандартной маской контролировать число цифр и что именно цифры должны вводиться. Весь остальной интеллектуальный контроль должен проводиться после ввода.

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

 
 
 
 
Сообщение14.05.2008, 10:50 
А что мешает использовать три компонента ввода?

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

 
 
 
 
Сообщение14.05.2008, 11:40 
Аватара пользователя
Вопрос в том, что следует делать, если пользователь ввел сначала 29 февраля (что потенциально возможно), а затем - невисокосный год. Или сначала число 31, а затем месяц апрель, в котором только 30 дней. Такая комбинация значений является недопустимой, но как на это следует реагировать программе? Она может заблокировать все поля ввода, кроме последнего поля, требуя, чтобы пользователь ввел в него корректное значение. Но, возможно, последнее значение введено правильно, а пользователь захочет исправить предпоследнее.

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

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

 
 
 
 
Сообщение14.05.2008, 11:51 
PAV писал(а):
А вообще, кажется, автор топика уже пропал, поэтому вряд ли последующее обсуждение имеет глубокий смысл.


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

 
 
 
 
Сообщение14.05.2008, 13:00 
Аватара пользователя
Я ничего против этого не имею. :)

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

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

 
 
 
 
Сообщение14.05.2008, 15:14 
А теперь самый главный вопрос: зачем всё это нужно?

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

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

 
 
 [ Сообщений: 17 ]  На страницу 1, 2  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group