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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.03.2012, 01:16   #1
Obey177
Форумчанин
 
Регистрация: 29.08.2010
Сообщений: 159
Радость Защита от неправильного ввода

Ув. юзеры вот смотрите у меня есть массив, вводить в него нужно только числа, как сделать что бы при вводе буквы выдавало ошибку ?
Obey177 вне форума Ответить с цитированием
Старый 18.03.2012, 02:21   #2
Delphi_ProGer
Форумчанин
 
Регистрация: 30.10.2010
Сообщений: 524
По умолчанию

Смотря где ты вводишь, в консоле, в TEdit или где-нибудь иначе...
Вариант 1: проверять ввод, т.е. находиться ли вводимое значение в пределах цыфр.
Вариант 2: запихнуть в Try...Except
Delphi_ProGer вне форума Ответить с цитированием
Старый 18.03.2012, 08:57   #3
Obey177
Форумчанин
 
Регистрация: 29.08.2010
Сообщений: 159
По умолчанию

у меня компонент StringGrid1
Свойство Значение
ColCount 10
FixedCols 0
RowCount 1
DefaultRowHeight 24
Height 24
DefaultColWidth 64
Width 656
Options . goEditing True
Options . AlwaysShowEditing True
Options .goTabs True


Код:
procedure TForm1.StringGridlKeyPress(Sender: TObject; var Key: Char);

begin


case Key of


#8,'0'..'9' : ; // öèôðû è <Backspace>


#13: // êëàâèøà <Enter>


if StringGridl.Col<StringGridl.ColCount-1


then StringGridl.Col:=StringGridl.Col + 1; '.',',':

// ðàçäåëèòåëü öåëîé è äðîáíîé ÷àñòåé ÷èñëà 

begin


if Key <> DecimalSeparator then


Key := DecimalSeparator; // çàìåíèì ðàçäåëèòåëü 


// íà äîïóñòèìûé


if Pos(StringGridl.Cells[StringGridl.Col,0],


DecimalSeparator) <> 0 

then Key := Chr(O); // çàïðåò ââîäà âòîðîãî 


// ðàçäåëèòåëÿ end;


' -' : // ìèíóñ ìîæíî ââåñòè òîëüêî ïåðâûì ñèìâîëîì,

// ò. å. êîãäà ÿ÷åéêà ïóñòàÿ 


if Length(StringGrid1.Cells[StringGrid1.Col, 0]) <>0 then

Key := Chr(0) ;


else // îñòàëüíûå ñèìâîëû çàïðåùåíû 


key := Chr(0);

end; 

end;
Obey177 вне форума Ответить с цитированием
Старый 18.03.2012, 10:31   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Ув. юзеры вот смотрите у меня есть массив, вводить в него нужно только числа
В приведенном коде не вижу массива. Есть только визуальный компонент таблица (stringGrid).

Код:
else // îñòàëüíûå ñèìâîëû çàïðåùåíû 
  begin
  ShowMessage('Уважаемый пользователь, то что вы сейчас ввели нам не подходит');
  key := Chr(0);
  end;
end;
соччувствую пользователю, которому после каждой ошибки придется отвлекаться от клавиатуры чтобы взять мышку и нажать на ОК. Не эфективное решение.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 18.03.2012 в 10:35.
evg_m вне форума Ответить с цитированием
Старый 18.03.2012, 12:11   #5
Obey177
Форумчанин
 
Регистрация: 29.08.2010
Сообщений: 159
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
В приведенном коде не вижу массива. Есть только визуальный компонент таблица (stringGrid).

Код:
else // îñòàëüíûå ñèìâîëû çàïðåùåíû 
  begin
  ShowMessage('Уважаемый пользователь, то что вы сейчас ввели нам не подходит');
  key := Chr(0);
  end;
end;
соччувствую пользователю, которому после каждой ошибки придется отвлекаться от клавиатуры чтобы взять мышку и нажать на ОК. Не эфективное решение.
массив там есть который сам вводишь...лаба такая не я придумываю такие задания...
Obey177 вне форума Ответить с цитированием
Старый 18.03.2012, 12:31   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
ShowMessage('Уважаемый пользователь, то что вы сейчас ввели нам не подходит');
Это нужно убрать. Или по другому:
Код:
procedure TForm1.StringGridlKeyPress(Sender: TObject; var Key: Char);
var d:double;
begin
 if key=#13 then begin
  if not TryStrToFloat(TEdit(Sender).Text,d) then
   ShowMessage('Уважаемый пользователь, то что вы сейчас ввели нам не подходит');
 end;
end;
Но тогда обязательно требуется нажимать энтер после ввода
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.03.2012, 12:32   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

проще не ошибку выдавать, а запретить вводить всё, кроме цифр.
у грида есть событие OnKeyPress
вставьте туда такой код:
Код:
procedure TForm2.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
  if not (Key in ['0'..'9']) then Key:=#0;
end;
и нельзя будет ничего ввести кроме цифр.


Цитата:
Код:
if key=#13 then begin...
Stilet, к сожалению существует множество способов выйти из режима редактирования текущей ячейки без нажатия Enter.
(самый простой из них - мышкой ткнуть в другое поле). и всё. код проверки не сработает...

Последний раз редактировалось Serge_Bliznykov; 18.03.2012 в 12:36.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.03.2012, 12:54   #8
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Цитата:
проще не ошибку выдавать, а запретить вводить всё, кроме цифр.
Из всех подобных процедур мне больше нравится эта...
1. Не даст поставить разделитель до ввода первого символа.
2. Заменит точку или запятую на decimalseparator, установленный в региональных настройках винды.
3. Не даст записать лишние цифры после разделителя.

Код:
procedure TAddForm.Edit1KeyPress(Sender: TObject; var Key: Char);
var vrPos, vrLength, vrSelStart: byte;
const
  I: byte = 1; //К-во знаков после запятой - 2 знака
begin
  with Sender as TEdit do
  begin
    vrLength := Length(Text);
    vrPos := Pos(decimalseparator, Text);
    vrSelStart := SelStart;
  end;
  case Key of
    '0'..'9':
      begin
        if (vrPos > 0) and (vrLength - vrPos > I) and (vrSelStart >= vrPos) then
          Key := #0;
      end;
    ',', '.':
      begin
        if (vrPos > 0) or (vrSelStart = 0) or (vrLength = 0) then
          Key := #0
        else
          Key := decimalseparator;
      end;
    #8: ;
  else
    Key := #0;
  end;
_SERGEYX_ вне форума Ответить с цитированием
Старый 18.03.2012, 13:00   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
и всё. код проверки не сработает.
Именно поэтому если по ТЗ требуется вывод сообщения, такие вещи делают не при вводе а во время вычислений, того что ввели.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.03.2012, 14:36   #10
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

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

Я пользуюсь всегда в таком случае событие стринггрида OnSetEditText - он срабатывает именно тогда когда сформирован текст для вставки в редактируемую ячейку. Проверять на цифру обычным TryInttoStr
phomm вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Защита от некорректного ввода.Вопрос Denis147 Общие вопросы C/C++ 6 15.01.2012 16:42
Запрет нажатия кнопки и запрет неправильного ввода данных De_Kurlzz Помощь студентам 1 15.06.2011 15:14
onKeyPress. Защита от неправильного ввода. Антон Лысенко Помощь студентам 5 23.02.2011 17:20
Защита от неправильного ввода Christina_2010 PHP 2 09.06.2010 13:28
Защита от кривого ввода на С++ survavior Помощь студентам 4 13.04.2010 17:56