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

fiodorprefix

New member
Joined
Feb 21, 2009
Messages
2
Reaction score
0
Age
37
Ребята привет...
Три недели до защиты дипломной, задам очень простой вопрос, решения в котором существует множество, но вот только что-то не могу сооброзить никак. Я только начал писать её, но вопрос не в этом...
Как сделать проверку данных, введено или нет...
Я сделал так.. 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;
 
Last edited by a moderator:

Kotofff

Member
Joined
Sep 28, 2008
Messages
25
Reaction score
38
Location
Россия. Кубань.
Website
kotoff.info
1. Нужно к примеру что-бы напротив строчки ввода имени, если не было введено имя, в label появилось сообщение о том что имя не было введено...
Можно обрабатывать событие OnChange в компоненте TEdit (под именем Name в твоем случае). Что-то типа так :
Code:
procedure TForm1.NameChange(Sender: TObject);
begin
  if Name.Text='' then Label1.Caption := 'Введите имя' 
                       else Label1.Caption := '';
end;
 

qu1ck

New member
Joined
May 4, 2009
Messages
1
Reaction score
0
Ну, в принципе если пробелами заполнено, тоже надо проверить )
 

fsloredo

New member
Joined
Dec 23, 2009
Messages
4
Reaction score
8
Age
42
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

Member
Joined
Nov 25, 2015
Messages
5
Reaction score
0
Можно использовать EhLib, который умеет подсвечивать обязательные для заполнения поля и контролы (HighlightRequired) и автоматически не даст сохранить данные, пока не будут заполнены обязательные поля.
Можно еще найти не введенные данные перебором контролов на форме. Например, нужным эдитам выставить тэг, отличный от 0, и перед попыткой сохранения сделать что-то типа:

Code:
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

New member
Joined
Oct 22, 2006
Messages
2
Reaction score
0
Location
Москва
А зачем использовать отдельный TLabel? Не проще писать прям в TEdit, и подкрашивать его красным? А при получении фокуса стирать написанное и возвращать цвет.
 

newbotanik

Member
Joined
Sep 29, 2015
Messages
6
Reaction score
0
в датасете есть событие BeforeOpen, в нем можно проверить открыть как вариант
if VarIsNull(myquery1.Parameters.parambyname('blabla').value) or VarIsEmpty(myquery1.Parameters.parambyname('blabla').value)
then begin
ShowMessage('не заполнено блабла');
Abort;
end;

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

Pricolist

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

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

OtherSide

Member
Joined
Jun 27, 2016
Messages
5
Reaction score
0
Для приколиста: не стоит грузить на базу чисто клиентские обязанности. Корректность данных намного проще и лучше проверить на клиенте.
 

wolfkb

Member
Joined
Mar 8, 2007
Messages
8
Reaction score
0
Age
39
Location
Пенза
Самый лучший вариант, реализовать процедуру вставки на серверной стороне. А параметры входа процы чекать клиентом. Проще всего у каждого TEdit проверять OnChange. Если какой-то TEdit не заполнен, то передавать NULL в процу(если разрешено передавать пустые значения) .
 

LeshaRB

Premium Member
VIP
Joined
Jun 11, 2022
Messages
320
Reaction score
451
Location
Canada
Deposit
$ 150
Самый лучший вариант, реализовать процедуру вставки на серверной стороне. А параметры входа процы чекать клиентом. Проще всего у каждого TEdit проверять OnChange. Если какой-то TEdit не заполнен, то передавать NULL в процу(если разрешено передавать пустые значения) .

и чем он лучше
 

wolfkb

Member
Joined
Mar 8, 2007
Messages
8
Reaction score
0
Age
39
Location
Пенза
и чем он лучше

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

LeshaRB

Premium Member
VIP
Joined
Jun 11, 2022
Messages
320
Reaction score
451
Location
Canada
Deposit
$ 150
Почему то в последние лет 5 идет негатив, когда вижу вставку напрямую из формы в таблицу БД. Нарушение политик безопасности. Поэтому считаю, что надо разграничивать серверный код от клиентского. А клиентская часть должна дергать только интерфейсную часть сервера. Так же как и запросы из таблиц "по-правильному" делать не стоит, а использовать вьюхи. К тому же создав компоненту в стиле "грид + запрос из вьюхи" можно потом юзать по всему коду, подставляя только имя вьюхи.

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

wolfkb

Member
Joined
Mar 8, 2007
Messages
8
Reaction score
0
Age
39
Location
Пенза
Кусок кода:
myquery1.SQL.Clear;
myQuery1.Sql.Add('insert into hotelfa_clients(id, RegisterDate, Person,

Вижу, прямую вставку в таблицу.
А про условие отбора я выше писал. Проверять при помощи метода OnChange
 

LeshaRB

Premium Member
VIP
Joined
Jun 11, 2022
Messages
320
Reaction score
451
Location
Canada
Deposit
$ 150
Вижу, прямую вставку в таблицу.
А про условие отбора я выше писал. Проверять при помощи метода OnChange

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

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

LeshaRB

Premium Member
VIP
Joined
Jun 11, 2022
Messages
320
Reaction score
451
Location
Canada
Deposit
$ 150
подняли тему 8 летней давности
 

plazmon

Member
Joined
Dec 13, 2006
Messages
7
Reaction score
0
Age
58
Location
Ukraine
Человек уже давно диплом защитил и забыл :)
 
Top