Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Edit


Автор: Лена 29.1.2009, 18:03
В Edit пользователь может вводить только значания типа: 29.01.2009 12:30:00
Как отследить после вода пользователя, что он ввел, например, буквы и предупредить об этом.
Например 29.01.2009 12:30:00сс. Мне надо понять, что присутсвуют буквы любого регистра. 
Надо проанализировать уже после ввода пользователя, а не вовремя ввода...

Автор: Comm 29.1.2009, 18:11
Суть вопроса в "как проверить присутсвуют  ли буквы любого регистра" или "как проанализировать уже после ввода пользователя, а не вовремя ввода..."  ?!

Автор: Лена 29.1.2009, 18:16
Цитата(Comm @  29.1.2009,  18:11 Найти цитируемый пост)
Суть вопроса в "как проверить присутсвуют  ли буквы любого регистра" или "как проанализировать уже после ввода пользователя, а не вовремя ввода..." 


Надо проанализировать уже после ввода пользователя.
Это web приложение. Проверять ввод будет код сервера. Пользователь введет данные на html странице. Поэтому после ввода пользователя мне надо проверить серверным кодом, наличие букв любого регистра и отослать пользователю сообщение о не верном вводе если есть буквы. 

Автор: taiven 29.1.2009, 18:50
если значения будут только типа 29.01.2009 12:30:00, то не проще ли проверять каждый символ строки на несовпадение с одним из допустимых символов?

Автор: Лена 29.1.2009, 18:57
Цитата(taiven @  29.1.2009,  18:50 Найти цитируемый пост)
если значения будут только типа 29.01.2009 12:30:00, то не проще ли проверять каждый символ строки на несовпадение с одним из допустимых символов?


Здесь будет любое дата время 11.01.2010 15:30:00 и т.п.
Мне также надо отследить наличие пробела, если пользователь напишет так 11.01.201015:30:00 то предупредить его вставить пробел.

Автор: taiven 29.1.2009, 20:07
ну, как вариант приблизительно так можно сделать:
Код

#include <cctype>
//...
bool is_text_ok(AnsiString S, AnsiString templ)
{
    if(templ.Length() != S.Length()) return false;
    for(int i = 1; i <= templ.Length(); i++)
        switch(templ[i])
        {
            case 'd' : if(!isdigit(S[i])) return false; break;
            case '.' : if(S[i] != templ[i]) return false; break;
            case ':' : if(S[i] != templ[i]) return false; break;
            case ' ' : if(S[i] != templ[i]) return false; break;
            default : return false;
        }

    return true;
}


Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    if(!is_text_ok(Edit1->Text, "dd.dd.dddd dd:dd:dd"))
        ShowMessage("Error!");
}

Автор: mrbrooks 30.1.2009, 10:11
Лена, ты как я понимаю юзаешь компоненты IntraWeb. В данном случае IWEdit. Я бы использовал класс TMask

Код

#include <mask.hpp>
TMask *mask;
//---------------------------------------------------------------------------
__fastcall TIWForm1::TIWForm1(TComponent* Owner)
        : TIWAppForm(Owner)
{
mask = new TMask("[0-9][0-9].[0-9][0-9].[0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]");
Edt->Text = "00.00.0000 00:00:00";
}
//---------------------------------------------------------------------------

void setAsMainForm() {
  TIWForm1::SetAsMainForm();
 }
#pragma startup setAsMainForm
//---------------------------------------------------------------------------
void __fastcall TIWForm1::IWButton1Click(TObject *Sender)
{

if(mask->Matches(Edt->Text)) EdtMsg->Text = "Айс";
else EdtMsg->Text = "Не айс";
}
//---------------------------------------------------------------------------
void __fastcall TIWForm1::IWAppFormDestroy(TObject *Sender)
{
delete mask;
}
//---------------------------------------------------------------------------


Добавлено через 1 минуту и 14 секунд
ЗЫ. Жаль что самой маски в IWEdit вроде нет. Хотя быть может она где-то и зарыта  smile 

Автор: Лена 30.1.2009, 11:33
Цитата(mrbrooks @  30.1.2009,  10:11 Найти цитируемый пост)
Лена, ты как я понимаю юзаешь компоненты IntraWeb


Совершенно верно. smile 

Если использовать маски, то я так понимаю, мне придется делать несколько масок.
Ведь дата типа 
9.01.2009 12:30:00
или
29.01.2009 8:30:00
тоже корректны...
Дата время введенное пользователем используется в коде так:
t->ADOQuery2->Parameters->ParamByName("datastart")->Value = IWEdit1->Text;

Сейчас у меня реализовано ряд проверок, но выглядит это криво:
Код


try
   {
   TDateTime T;
   T = IWEdit1->Text;
   T = IWEdit2->Text;
   }
   catch(...)
       {
        ShowMessage("Не правильный формат даты. Пример: 29.01.2009 12:30:00");
        return;
       }

 //если пользователь убрал пробел между датой и временем, то catch выше не срабатывает
//поэтому далее проверки 
 AnsiString datas = IWEdit1->Text.TrimLeft().TrimRight();
  if(datas.Pos(" ") == 0)
  {
   ShowMessage("Не правильный формат даты начала маршрута. Пример c пробелом между датой и временем: 29.01.2009 12:30:00");
   IWEdit1->SetFocus();
   return;
  }

  AnsiString datas1 = IWEdit2->Text.TrimLeft().TrimRight();
  if(datas1.Pos(" ") == 0)
  {
   ShowMessage("Не правильный формат даты конца маршрута. Пример c пробелом между датой и временем: 29.01.2009 12:30:00");
   IWEdit2->SetFocus();
   return;
  }

//есди пользователь написал так 29.01.2009 12:30:00сс
//то плюс эта проверка
  if((datas.Length() > 19) || (datas1.Length() > 19))
  {
   ShowMessage("Проверти правельность ввода даты и времени. Пример: 29.01.2009 12:30:00");
   return;
  }





Цитата(mrbrooks @  30.1.2009,  10:11 Найти цитируемый пост)
 Жаль что самой маски в IWEdit 


Жаль что нет нормального компонета выбора даты времени в IntraWEB  smile 


Автор: mrbrooks 30.1.2009, 11:49
Цитата(Лена @  30.1.2009,  11:33 Найти цитируемый пост)
Если использовать маски, то я так понимаю, мне придется делать несколько масок.

не обязательно, можно и так: 
Код

mask = new TMask("*[0-9].*[0-9].[0-9][0-9][0-9][0-9] *[0-9]:*[0-9]:*[0-9]");


Добавлено через 32 секунды
Цитата(Лена @  30.1.2009,  11:33 Найти цитируемый пост)
йчас у меня реализовано ряд проверок, но выглядит это криво:

 smile 

Автор: Лена 30.1.2009, 12:15
>Edt->Text = "00.00.0000 00:00:00";

Это я так понимаю шаблон, чтобы при старте приложения пользователь его увидел?

У меня заполнение этих полей происходит при первом заходе пользователя на страницу.
Я по умолчанию предлагаю пользователю текущие сутки:
TDateTime T(Now());
IWEdit1->Text = T.DateString() + " 0:00:00";
T = T + 1;
IWEdit2->Text = T.DateString() + " 23:59:59";
Я так понимаю, в коде с TMask ничего менять не надо?


А может написать так:
IWEdit1->Text = T.DateString() + " 00:00:00";
Тогда принудить к жесткой маске:
mask = new TMask("[0-9][0-9].[0-9][0-9].[0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]");

Это:
TMask *mask;
я объявлю в классе формы т.к. в статье написано, что глобальные переменные не приветсвуются в IntraWeb.

Автор: mrbrooks 30.1.2009, 12:21

Цитата(Лена @  30.1.2009,  12:15 Найти цитируемый пост)
dt->Text = "00.00.0000 00:00:00";
Это я так понимаю шаблон, чтобы при старте приложения пользователь его увидел?

совершенно верно.

Цитата(Лена @  30.1.2009,  12:15 Найти цитируемый пост)
TDateTime T(Now());
IWEdit1->Text = T.DateString() + " 0:00:00";
T = T + 1;
IWEdit2->Text = T.DateString() + " 23:59:59";
Я так понимаю, в коде с TMask ничего менять не надо?

код не совсем мне ясен - но если конечная строка ровна моему шаблону то да  smile 

Цитата(Лена @  30.1.2009,  12:15 Найти цитируемый пост)
TMask *mask;
я объявлю в классе формы т.к. в статье написано, что глобальные переменные не приветсвуются в IntraWeb.

конечно. глобальная переменная введена чисто для примера.  глобальные переменные везде зло. не только в  IntraWeb smile 

Автор: Лена 30.1.2009, 12:59
Вообщем все работает как надо с маской  smile 

Только оставила эту проверку также в коде:
Код

 try
   {
   TDateTime T;
   T = IWEdit1->Text;
   T = IWEdit2->Text;
   }
   catch(...)
       {
        ShowMessage("Не правильный формат даты. Пример: 29.01.2009 12:30:00");
        return;
       }


т.к. пользователь может случайно указать что в году, например, 15 месяцев smile 

Автор: mrbrooks 30.1.2009, 13:04

Цитата(Лена @  30.1.2009,  12:59 Найти цитируемый пост)
т.к. пользователь может случайно указать что в году, например, 15 месяцев smile  

это запросто  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)