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

fiodorprefix

Пользователь
Регистрация
21.02.09
Сообщения
2
Реакции
0
Баллы
2
Возраст
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;
 
Последнее редактирование модератором:

Kotofff

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

fsloredo

Пользователь
Регистрация
24.12.09
Сообщения
3
Реакции
0
Баллы
6
Возраст
41
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.
 

test1c

Пользователь
Регистрация
25.07.10
Сообщения
23
Реакции
0
Баллы
6
Но это не кактит, просто слишком..
Это ошибка. "Просто" и есть как правило лучшее. Посмотрите на проги монстров на десктопе.
Подсветка словами не заполненного не так явна в отличии диалога. Этот способ введен как правило в вебе, что бы не гонять запросы туда сюда и не выводить диалог боксы, которые в вебе не приветствуются.
Плюс вывод сообщений жрет место в форме. А формы в отличии от веб страниц не резиновые, вниз как правило не разворачиваются.
Я если надо длинное пояснение сделать?
 

PhotOn1

Пользователь
Регистрация
27.04.09
Сообщения
3
Реакции
0
Баллы
1
Возраст
35
А для запроса верного значения, или сразу всех значений удобно использовать InputQuery
 

pprometey

Пользователь
Регистрация
23.09.10
Сообщения
17
Реакции
0
Баллы
2
Возраст
13
Для проверки лучше использовать регулярные выражения. И как правильно сказали выше - использовать событие OnChange
 

MikaelBox

Пользователь
Регистрация
25.11.15
Сообщения
11
Реакции
0
Баллы
2
Можно использовать 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.10.06
Сообщения
2
Реакции
0
Баллы
2
Адрес
Москва
А зачем использовать отдельный TLabel? Не проще писать прям в TEdit, и подкрашивать его красным? А при получении фокуса стирать написанное и возвращать цвет.
 

MAFyodorov

Пользователь
Регистрация
29.12.06
Сообщения
5
Реакции
0
Баллы
6
Адрес
Россия
А зачем использовать отдельный TLabel? Не проще писать прям в TEdit, и подкрашивать его красным? А при получении фокуса стирать написанное и возвращать цвет.

Хороший вариант. Больше смахивает на WEB.
У себя делал чаще по старинке через сообщения.
 

newbotanik

Пользователь
Регистрация
29.09.15
Сообщения
5
Реакции
0
Баллы
2
в датасете есть событие BeforeOpen, в нем можно проверить открыть как вариант
if VarIsNull(myquery1.Parameters.parambyname('blabla').value) or VarIsEmpty(myquery1.Parameters.parambyname('blabla').value)
then begin
ShowMessage('не заполнено блабла');
Abort;
end;

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

Pricolist

Пользователь
Регистрация
17.10.08
Сообщения
3
Реакции
0
Баллы
2
Сделай проще, вставь проверку для вводимого поля в OnExit.
В конце ещё добавь SELECT * FROM ... к базе с вводимой информацией, чтобы узнать попали ли данные в базу.
И ещё в самой базе используй ТРИГГЕР AFTER чтобы он передавал флаг в программу, что данные в базе.

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

OtherSide

Пользователь
Регистрация
27.06.16
Сообщения
5
Реакции
0
Баллы
2
Для приколиста: не стоит грузить на базу чисто клиентские обязанности. Корректность данных намного проще и лучше проверить на клиенте.
 

wolfkb

Пользователь
Регистрация
08.03.07
Сообщения
6
Реакции
0
Баллы
2
Возраст
39
Адрес
Пенза
Самый лучший вариант, реализовать процедуру вставки на серверной стороне. А параметры входа процы чекать клиентом. Проще всего у каждого TEdit проверять OnChange. Если какой-то TEdit не заполнен, то передавать NULL в процу(если разрешено передавать пустые значения) .
 

LeshaRB

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

и чем он лучше
 

wolfkb

Пользователь
Регистрация
08.03.07
Сообщения
6
Реакции
0
Баллы
2
Возраст
39
Адрес
Пенза

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

LeshaRB

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

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

wolfkb

Пользователь
Регистрация
08.03.07
Сообщения
6
Реакции
0
Баллы
2
Возраст
39
Адрес
Пенза

LeshaRB

Пользователь
Регистрация
11.06.07
Сообщения
112
Реакции
0
Баллы
56
Адрес
Минск
Вижу, прямую вставку в таблицу.
А про условие отбора я выше писал. Проверять при помощи метода OnChange

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

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