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

fiodorprefix

New member
Joined
month_2_short 21, 2009
Messages
2
Reaction score
0
Age
39
Ребята привет...
Три недели до защиты дипломной, задам очень простой вопрос, решения в котором существует множество, но вот только что-то не могу сооброзить никак. Я только начал писать её, но вопрос не в этом...
Как сделать проверку данных, введено или нет...
Я сделал так.. 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
month_9_short 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
month_5_short 4, 2009
Messages
1
Reaction score
0
Ну, в принципе если пробелами заполнено, тоже надо проверить )
 

fsloredo

New member
Joined
month_12_short 23, 2009
Messages
4
Reaction score
8
Age
43
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
month_11_short 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
month_10_short 22, 2006
Messages
2
Reaction score
0
Location
Москва
А зачем использовать отдельный TLabel? Не проще писать прям в TEdit, и подкрашивать его красным? А при получении фокуса стирать написанное и возвращать цвет.
 

newbotanik

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

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

OtherSide

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

wolfkb

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

LeshaRB

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

и чем он лучше
 

wolfkb

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

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

LeshaRB

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

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

wolfkb

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

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

LeshaRB

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

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

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