При разработке приложений на Delphi часто возникает необходимость проверки данных, введенных пользователем, на соответствие определенным критериям. Одной из таких задач является проверка полей в определенном порядке. В стандартной реализации функция ValidateFields проверяет поля в порядке их создания в дизайнере формы. Однако, разработчик может столкнуться с ситуацией, когда необходимо изменить этот порядок. В данной статье мы рассмотрим, как это можно сделать, используя Object Pascal.
Проблема проверки полей
Рассмотрим функцию ValidateFields, которая проверяет, не пусты ли поля ввода:
function TF_config.ValidateFields: Boolean;
var
i: Integer;
begin
for i := 0 to ComponentCount - 1 do
begin
if (Components[i] is TEdit) then
begin
if ((TEdit(Components[i]).Text) = '') then
begin
MessageDlg('Введите данные во все поля', mtWarning, [MBOK], 0);
TEdit(Components[i]).SetFocus;
Result := False;
Exit;
end;
end;
end;
Result := True;
end;
Предположим, что у нас есть поля ID, Name, Address, Phone, Age, и мы хотим проверить их в порядке ID -> Name -> Address -> Age -> Phone. Однако, по умолчанию, порядок проверки соответствует порядку создания компонентов в дизайнере формы, что не всегда удобно.
Решение проблемы
Для контроля порядка проверки полей, можно использовать собственный список компонентов, который будет содержать ссылки на поля ввода в нужном порядке. Это позволит избежать зависимости от порядка создания компонентов в дизайнере формы и даст возможность легко изменять порядок проверки.
Пример использования собственного массива для хранения ссылок на поля ввода:
type
TF_config = class(TForm)
...
private
FEditFields: array[0..4] of TEdit;
procedure FormCreate(Sender: TObject);
function ValidateFields: Boolean;
...
end;
procedure TF_config.FormCreate(Sender: TObject);
begin
FEditFields[0] := IDEdit; // ID
FEditFields[1] := NameEdit; // Name
FEditFields[2] := AddressEdit; // Address
FEditFields[3] := AgeEdit; // Age
FEditFields[4] := PhoneEdit; // Phone
end;
function TF_config.ValidateFields: Boolean;
var
i: Integer;
begin
for i := Low(FEditFields) to High(FEditFields) do
begin
if FEditFields[i].GetTextLen = 0 then
begin
MessageDlg('Введите данные во все поля', mtWarning, [MBOK], 0);
FEditFields[i].SetFocus;
Result := False;
Exit;
end;
end;
Result := True;
end;
Такой подход позволяет не только контролировать порядок проверки, но и упрощает добавление новых полей, так как достаточно добавить ссылку на новое поле в массив FEditFields в методе FormCreate.
Альтернативный подход
Если в приложении используются различные типы контролов, можно использовать единый массив для хранения ссылок на все поля, которые необходимо проверить. Пример такого подхода:
type
TF_config = class(TForm)
...
private
FFields: array[0..4] of TControl;
function ValidateFields: Boolean;
...
end;
procedure TF_config.FormCreate(Sender: TObject);
begin
FFields[0] := IDEdit;
FFields[1] := NameEdit;
FFields[2] := AddressEdit;
FFields[3] := AgeEdit;
FFields[4] := PhoneEdit;
// Добавление других типов контролов, например ComboBox
// FFields[5] := ComboBox1;
// ...
end;
function TF_config.ValidateFields: Boolean;
var
i: Integer;
ctrl: TControl;
begin
Result := True;
for i := Low(FFields) to High(FFields) do
begin
ctrl := FFields[i];
if ctrl is TCustomEdit then // Обработка TEdit и TMemo
begin
if TCustomEdit(ctrl).GetTextLen = 0 then
begin
Result := False;
Break;
end;
end
else if ctrl is TComboBox then // Обработка TComboBox
begin
if TComboBox(ctrl).ItemIndex = -1 then
begin
Result := False;
Break;
end;
end
// Добавление других типов проверок
// ...
end;
if not Result then
begin
MessageDlg('Введите данные во все поля', mtWarning, [MBOK], 0);
ctrl.SetFocus;
end;
end;
Использование единого массива для различных типов контролов позволяет избежать создания множества массивов и упрощает управление порядком проверки.
Заключение
Использование собственного списка компонентов для проверки полей ввода позволяет разработчику контролировать порядок проверки, что является ключевым фактором в обеспечении удобства и логичности пользовательского интерфейса. Приведенные примеры кода на Object Pascal демонстрируют, как можно организовать проверку полей в нужном порядке в приложениях на Delphi.
В статье рассматривается проблема и решения для организации проверки полей ввода в приложениях на Delphi в заданном порядке, независимо от порядка их создания в дизайнере формы.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.