Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Проверка ввода в DBGrid


Автор: Ale}{y 29.3.2005, 07:47
Help me please!!!
БД - Paradox, компоненты - Table, DBGrid

Как осуществить проверку правильности ввода в определенных полях таблицы. Например, в поле "Фамилия" - разрешить ввод только русских букв и тире, в поле "год рождения" - разрешить ввод только цифр.
В компоненте TEdit все понятно - событие OnKeyPress, а вот как быть с DBGrid???

Автор: 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...

Автор: Guest 29.3.2005, 10:10
Цитата(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
Вот блин у меня работает, а утебя нет....

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

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

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

Точняк! Ура!!!
Спасибо!!!
Млин, иногда с собственной тупости поражаюсь просто! smile

Автор: Pseex 20.12.2008, 00:23
Цитата(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, 12:04
Вроде получилось, значится, 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 из таблицы и делаю всё остальное..

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