Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Edit, отследить ввод букв 
:(
    Опции темы
Лена
Дата 29.1.2009, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В Edit пользователь может вводить только значания типа: 29.01.2009 12:30:00
Как отследить после вода пользователя, что он ввел, например, буквы и предупредить об этом.
Например 29.01.2009 12:30:00сс. Мне надо понять, что присутсвуют буквы любого регистра. 
Надо проанализировать уже после ввода пользователя, а не вовремя ввода...
PM MAIL   Вверх
Comm
Дата 29.1.2009, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


Это сообщение отредактировал(а) Comm - 29.1.2009, 18:11


--------------------
=)))))
user posted image
PM MAIL ICQ   Вверх
Лена
Дата 29.1.2009, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


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

PM MAIL   Вверх
taiven
Дата 29.1.2009, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



если значения будут только типа 29.01.2009 12:30:00, то не проще ли проверять каждый символ строки на несовпадение с одним из допустимых символов?
PM   Вверх
Лена
Дата 29.1.2009, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


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

PM MAIL   Вверх
taiven
Дата 29.1.2009, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

#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!");
}


Это сообщение отредактировал(а) taiven - 29.1.2009, 20:21
PM   Вверх
mrbrooks
Дата 30.1.2009, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


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

Репутация: 167
Всего: 306



Лена, ты как я понимаю юзаешь компоненты 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 
PM MAIL   Вверх
Лена
Дата 30.1.2009, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(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 



Это сообщение отредактировал(а) Лена - 30.1.2009, 11:34
PM MAIL   Вверх
mrbrooks
Дата 30.1.2009, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


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

Репутация: 167
Всего: 306



Цитата(Лена @  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 
PM MAIL   Вверх
Лена
Дата 30.1.2009, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



>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.


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


трололомен
****


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

Репутация: 167
Всего: 306




Цитата(Лена @  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 
PM MAIL   Вверх
Лена
Дата 30.1.2009, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вообщем все работает как надо с маской  smile 

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

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


т.к. пользователь может случайно указать что в году, например, 15 месяцев smile 
PM MAIL   Вверх
mrbrooks
Дата 30.1.2009, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


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

Репутация: 167
Всего: 306




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

это запросто  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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