Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверка ввода в DBGrid, правильность ввода 
:(
    Опции темы
Ale}{y
Дата 29.3.2005, 07:47 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Help me please!!!
БД - Paradox, компоненты - Table, DBGrid

Как осуществить проверку правильности ввода в определенных полях таблицы. Например, в поле "Фамилия" - разрешить ввод только русских букв и тире, в поле "год рождения" - разрешить ввод только цифр.
В компоненте TEdit все понятно - событие OnKeyPress, а вот как быть с DBGrid???
  Вверх
DimW
Дата 29.3.2005, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

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



Все оказалось довольно просто:
Код

procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
if (form1.DBGrid1.SelectedField.FieldNo=1)then
if not (key in ['0'..'9',#8]) then key:=chr(0);
end;


в поле под номером 1 будет разрешать ввод цифр и BackSpace...
PM MAIL ICQ   Вверх
Guest
Дата 29.3.2005, 10:10 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(DimW @ 29.3.2005, 10:01)
Все оказалось довольно просто:
Код

procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
if (form1.DBGrid1.SelectedField.FieldNo=1)then
if not (key in ['0'..'9',#8]) then key:=chr(0);
end;


в поле под номером 1 будет разрешать ввод цифр и BackSpace...

Действительно, просто,но почему-то не работает... smile
  Вверх
DimW
Дата 29.3.2005, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

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



Вот блин у меня работает, а утебя нет....

проблема может быть в том что SelectedField.FieldNo возвращает не то значение которое ты ожидаешь. я тоже думал что в гриде второе поле имеет индекс 1, а оказалось что 5.
это из за того что некоторые поля у меня visible:=false. навернека у тыбя тоже самое...
PM MAIL ICQ   Вверх
Guest
Дата 29.3.2005, 10:40 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(DimW @ 29.3.2005, 10:37)
Вот блин у меня работает, а утебя нет....

проблема может быть в том что SelectedField.FieldNo возвращает не то значение которое ты ожидаешь. я тоже думал что в гриде второе поле имеет индекс 1, а оказалось что 5.
это из за того что некоторые поля у меня visible:=false. навернека у тыбя тоже самое...

Точняк! Ура!!!
Спасибо!!!
Млин, иногда с собственной тупости поражаюсь просто! smile
  Вверх
Pseex
Дата 20.12.2008, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(DimW @ 29.3.2005,  10:01)
Все оказалось довольно просто:
Код

procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
if (form1.DBGrid1.SelectedField.FieldNo=1)then
if not (key in ['0'..'9',#8]) then key:=chr(0);
end;


в поле под номером 1 будет разрешать ввод цифр и BackSpace...

Парни, я запарился решать похожую проблему, где в поле можно было бы вводить не только положительные числа, но и отрицательные (использую Rx компоненты):

Код

procedure TForm1.RxDBGrid1KeyPress(Sender: TObject; var Key: Char);
var
 dbgrid:TRxDBGrid;
begin
 dbgrid:= sender as TRxDBGrid;
 if (dbgrid.Col <= 1) then
  begin
   key:=#0;     //запрет ввода данных вполя индекса
  end
 else                                              
  begin                      
   case key of        
    '0'..'9', #8, '-' :;
   else key := #0;
  end;
 end;
end;


однако, возникает проблема проверки корректности конечного числа, так как можно ввести несколько символов "-", решил так:
Код

procedure TForm1.ADOTable1BeforePost(DataSet: TDataSet);
var
 znach: string;
 zn : integer;
begin

if (Length(kol)<>0) then  // kol - имя поля, где проверяется на корректность введёное значение, у меня - это глобальная переменная
 begin
  znach := ADOTable1[kol]; // то что сейчас в этом поле
  try
   zn := StrToInt(znach); // вызываем ошибку, если неверное значение
  except
   ShowMessage('Ошибка ввода, посмотрите ещё раз, всё ли правильно!');
   zn := 0;
   abort;
  end;

и всё бы классно, однако только если ввести в поле значение и переместиться на соседнее поле клавишами управление (вверх,ввниз и т.п.), НО если ввести значение в поле и "ткнуться" мышою куданить в другую ячейку - возникает исключение, с которым не знаю как бороться...пока вижу вариант блокировать мыху, если что-то ввожу в поле, но это както...



Это сообщение отредактировал(а) Pseex - 20.12.2008, 10:53
PM MAIL ICQ   Вверх
Pseex
Дата 20.12.2008, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вроде получилось, значится, ADOTable1 подключена к таблице из двух полей: первое - счётчик, второе - стринговое. Чтоб в стринговое поле записывалось как положительное так и отрицательное значение:
Код

procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
 case key of
  '0'..'9', #8, '-':;
 else key := #0;
 end;
end;

procedure TForm1.ADOTable1BeforePost(DataSet: TDataSet);
var
 s,s_begin,znach : string;
 pozic           : integer;
begin
 znach := ADOTable1.fieldByName(DBGrid1.SelectedField.FieldName).AsString;
 try
  StrToInt(znach);
 except
  if (Length(znach) <> 0) then
   begin
    s_begin := copy(znach,1,1);  // запоминаем что на первом месте
    s       := copy(znach,2,length(znach)); // ищем "-" со второй позиции
    repeat
     pozic   := pos('-', s);                           // позиция "-"
     if (pozic <> 0) then delete(s,pozic,1);           // удаление лишнего "-"
    until (pozic = 0);
  end
  else ShowMessage('Введите данные');
  if (s <> '') then ADOTable1.fieldByName(DBGrid1.SelectedField.FieldName).AsString := s_begin + s
  else ADOTable1.fieldByName(DBGrid1.SelectedField.FieldName).AsString := '0';
 end;
end;

ну и дальше StrToInt из таблицы и делаю всё остальное..
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

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

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


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


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

FAQ раздела лежит здесь!


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

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


 




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


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

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