Проверка ввода данных... Введено или нет.

fiodorprefix

Турист
Регистрация
21 Фев 2009
Сообщения
2
Реакции
0
Credits
0
Ребята привет...
Три недели до защиты дипломной, задам очень простой вопрос, решения в котором существует множество, но вот только что-то не могу сооброзить никак. Я только начал писать её, но вопрос не в этом...
Как сделать проверку данных, введено или нет...
Я сделал так.. if (Name.Text='') then Showmessage('ошибка тт');
Но это не кактит, просто слишком..
1. Нужно к примеру что-бы напротив строчки ввода имени, если не было введено имя, в label появилось сообщение о том что имя не было введено...


Кусок кода:

myquery1.SQL.Clear;
myQuery1.Sql.Add('insert into hotelfa_clients(id, RegisterDate, Person, Hotel, CheckInDate, CheckOutDate, CustomerName, NumberOfPeople, SeatsRoom, RoomNumber, AmountOfCash, Valiute, PaymentMethod, AccountNumber, Comment, Name, Surename, PasportNumber, PersonalCode)');
myQuery1.Sql.Add('Values:)id, :RegisterDate, :person, :Hotel, :CheckInDate, :CheckOutDate, :CustomerName, :NumberOfPeople, :SeatsRoom, :RoomNumber, :AmountOfCash, :Valiute, :paymentMethod, :AccountNumber, :Comment, :Name, :Surename, :pasportNumber, :personalCode)');
myquery1.Params[1].asdate:=strtodate(RegisterDate.Text);
myquery1.Params[2].asstring:=Person.Text;
myquery1.Params[3].asstring:=Hotel.Text;
myquery1.Params[4].asdate:=strtodate(CheckInDate.Text);
myquery1.Params[5].asdate:=strtodate(CheckOutDate.Text);
myquery1.Params[6].asstring:=CustomerName.Text;
myquery1.Params[7].asstring:=NumberOfPeople.Text;
myquery1.Params[8].asstring:=SeatsRoom.Text;
myquery1.Params[9].asstring:=RoomNumber.Text;
myquery1.Params[10].asstring:=AmountOfCash.Text;
myquery1.Params[11].asstring:=Valiute.Text;
myquery1.Params[12].asstring:=PaymentMethod.Text;
myquery1.Params[13].asstring:=AccountNumber.Text;
myquery1.Params[14].asstring:=Comment.Text;
myquery1.Params[15].asstring:=Name.Text;
myquery1.Params[16].asstring:=SureName.Text;
myquery1.Params[17].asstring:=PasportNumber.Text;
myquery1.Params[18].asstring:=PersonalCode.Text;
if (Name.Text='') then Showmessage('Ошибка');
myquery1.Execute;
 
Последнее редактирование модератором:

Kotofff

Premium
Регистрация
28 Сен 2008
Сообщения
28
Реакции
41
Credits
52
1. Нужно к примеру что-бы напротив строчки ввода имени, если не было введено имя, в label появилось сообщение о том что имя не было введено...
Можно обрабатывать событие OnChange в компоненте TEdit (под именем Name в твоем случае). Что-то типа так :
Код:
procedure TForm1.NameChange(Sender: TObject);
begin
  if Name.Text='' then Label1.Caption := 'Введите имя' 
                       else Label1.Caption := '';
end;
 

qu1ck

Турист
Регистрация
4 Май 2009
Сообщения
1
Реакции
0
Credits
2
Ну, в принципе если пробелами заполнено, тоже надо проверить )
 

fsloredo

Местный
Регистрация
24 Дек 2009
Сообщения
4
Реакции
8
Credits
8
I'm not sure about your goals but as suggestion I think you maybe should put myquery1.Execute after an else command to get a efficient code, or use Exit; or Abort; after show the error dialog.
 

MikaelBox

Турист
Регистрация
25 Ноя 2015
Сообщения
5
Реакции
0
Credits
10
Можно использовать EhLib, который умеет подсвечивать обязательные для заполнения поля и контролы (HighlightRequired) и автоматически не даст сохранить данные, пока не будут заполнены обязательные поля.
Можно еще найти не введенные данные перебором контролов на форме. Например, нужным эдитам выставить тэг, отличный от 0, и перед попыткой сохранения сделать что-то типа:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  i: byte;
begin
  {$B-}
  for i := 0 to ComponentCount - 1 do
    if (Components[i].ClassType = TEdit) and
       (TEdit(Components[i]).Tag = 100) and  { нужный тэг }
       (TEdit(Components[i]).Text = '') then { нет текста }
      begin
        TEdit(Components[i]).SetFocus;        
        {
          Сообщение об ошибке?
        }
      end;
end;
 

GSergey

Турист
Регистрация
22 Окт 2006
Сообщения
2
Реакции
0
Credits
4
А зачем использовать отдельный TLabel? Не проще писать прям в TEdit, и подкрашивать его красным? А при получении фокуса стирать написанное и возвращать цвет.
 

newbotanik

Турист
Регистрация
29 Сен 2015
Сообщения
6
Реакции
0
Credits
12
в датасете есть событие BeforeOpen, в нем можно проверить открыть как вариант
if VarIsNull(myquery1.Parameters.parambyname('blabla').value) or VarIsEmpty(myquery1.Parameters.parambyname('blabla').value)
then begin
ShowMessage('не заполнено блабла');
Abort;
end;

что-то типа этого
 

Pricolist

Турист
Регистрация
17 Окт 2008
Сообщения
6
Реакции
0
Credits
12
Сделай проще, вставь проверку для вводимого поля в OnExit.
В конце ещё добавь SELECT * FROM ... к базе с вводимой информацией, чтобы узнать попали ли данные в базу.
И ещё в самой базе используй ТРИГГЕР AFTER чтобы он передавал флаг в программу, что данные в базе.

Добавлено через 3 минуты
Можно ещё в базе задействовать Триггер BEFORE который перед вставкой будет проверять переданные данные на предмет заполненности и передавать флаг в программу, что данные введены не полностью.
Или в базе такие поля должны иметь признак как "ОБЯЗАТЕЛЬНОЕ ПОЛЕ" и проводить обработку ошибок выдаваемых в базе и выводить сообщение с указанием не верно заполненных полей.
 
Последнее редактирование модератором:

OtherSide

Турист
Регистрация
27 Июн 2016
Сообщения
5
Реакции
0
Credits
20
Для приколиста: не стоит грузить на базу чисто клиентские обязанности. Корректность данных намного проще и лучше проверить на клиенте.
 

wolfkb

Турист
Регистрация
8 Мар 2007
Сообщения
8
Реакции
0
Credits
16
Самый лучший вариант, реализовать процедуру вставки на серверной стороне. А параметры входа процы чекать клиентом. Проще всего у каждого TEdit проверять OnChange. Если какой-то TEdit не заполнен, то передавать NULL в процу(если разрешено передавать пустые значения) .
 

LeshaRB

Свой
Регистрация
11 Июн 2007
Сообщения
320
Реакции
467
Credits
39
Самый лучший вариант, реализовать процедуру вставки на серверной стороне. А параметры входа процы чекать клиентом. Проще всего у каждого TEdit проверять OnChange. Если какой-то TEdit не заполнен, то передавать NULL в процу(если разрешено передавать пустые значения) .

и чем он лучше
 

wolfkb

Турист
Регистрация
8 Мар 2007
Сообщения
8
Реакции
0
Credits
16

Почему то в последние лет 5 идет негатив, когда вижу вставку напрямую из формы в таблицу БД. Нарушение политик безопасности. Поэтому считаю, что надо разграничивать серверный код от клиентского. А клиентская часть должна дергать только интерфейсную часть сервера. Так же как и запросы из таблиц "по-правильному" делать не стоит, а использовать вьюхи. К тому же создав компоненту в стиле "грид + запрос из вьюхи" можно потом юзать по всему коду, подставляя только имя вьюхи.
 

LeshaRB

Свой
Регистрация
11 Июн 2007
Сообщения
320
Реакции
467
Credits
39
Почему то в последние лет 5 идет негатив, когда вижу вставку напрямую из формы в таблицу БД. Нарушение политик безопасности. Поэтому считаю, что надо разграничивать серверный код от клиентского. А клиентская часть должна дергать только интерфейсную часть сервера. Так же как и запросы из таблиц "по-правильному" делать не стоит, а использовать вьюхи. К тому же создав компоненту в стиле "грид + запрос из вьюхи" можно потом юзать по всему коду, подставляя только имя вьюхи.

Ты вообще читаешь, что пишет ТС?
 

wolfkb

Турист
Регистрация
8 Мар 2007
Сообщения
8
Реакции
0
Credits
16

LeshaRB

Свой
Регистрация
11 Июн 2007
Сообщения
320
Реакции
467
Credits
39
Вижу, прямую вставку в таблицу.
А про условие отбора я выше писал. Проверять при помощи метода OnChange

Как сделать проверку данных, введено или нет...
Я сделал так.. if (Name.Text='') then Showmessage('ошибка тт');
Но это не кактит, просто слишком..
1. Нужно к примеру что-бы напротив строчки ввода имени, если не было введено имя, в label появилось сообщение о том что имя не было введено...

Ему нужна проверка на уровне клиента, чтоб все данные были заполнены