Как я могу кратко проверить, не изменились ли какие-либо из нескольких полей редактирования по сравнению с их исходными значениями?

Я создал простой проект, содержащий 3 TEdit, 1 TButton и 3 строковой и логической переменных. Как я создаю процедуру или функцию для установки Button.Enable: = True, когда каждое значение в TEdit было изменено. Необходимо сократить кодирование путем создания процедуры или функции вместо кода ниже.

type
TForm1 = class(TForm)
  Edit1: TEdit;
  Edit2: TEdit;
  Edit3: TEdit;
  btnSave: TButton;
  procedure FormCreate(Sender: TObject);
  procedure Edit1Exit(Sender: TObject);
private
  { Private declarations }
public
  strWelcome, strTo, strThailand: String;
  modify1, modify2, modify3 : Boolean;
  { Public declarations }
end;

При создании формы я передаю значение из 3 строк в 3 TEdit.Text и устанавливаю для переменной модификации значение False.

procedure TForm1.FormCreate(Sender: TObject);
 begin
   strWelcome := 'Welcome';
   strTo      := 'To';
   strThailand:= 'Thailand';

   modify1 := false;
   modify2 := false;
   modify3 := false;

   Edit1.text := strWelcome;
   Edit2.text := strTo;
   Edit3.text := strThailand;
end;

Один выход из 3 TEdit назначается Edit1Exit (отправитель: TObject); для проверки текстового значения все равно равно начальному значению или нет? Если некоторые из TEdit.Text были изменены, btnSave будет включен.

procedure TForm1.Edit1Exit(Sender: TObject);
begin
  if Edit1.Text = strWelcome then
    modify1 := False
  else
    modify1 := True;
  if Edit2.Text = strTo then
    modify2 := False
  else
    modify2 := True;
  if Edit3.Text = strThailand then
    modify3 := False
  else
    modify3 := True;
  btnSave.Enabled := modify1 or modify2 or modify3;
end;

Любая идея создать процедуру или функцию, чтобы уменьшить приведенный выше код. :)


person Saneh Saengchan    schedule 24.08.2015    source источник


Ответы (1)


Вы можете использовать массивы, чтобы сделать это более кратким, но всего с тремя элементами это, вероятно, того не стоит. Если это действительно весь рассматриваемый код, я бы написал его так:

procedure TForm1.Edit1Exit(Sender: TObject);
begin    
  btnSave.Enabled :=
    (Edit1.Text <> strWelcome) or
    (Edit2.Text <> strTo) or
    (Edit3.Text <> strThailand);
end;

Вам следует удалить три логических поля. Они больше не используются и в любом случае должны были быть локальными или отображаться как свойства с функциями получения. И вам следует преобразовать переменные strXXX в константы, поскольку я предполагаю, что они не меняются.

Я также предлагаю дать вашим элементам управления редактирования информативные имена.

person David Heffernan    schedule 24.08.2015
comment
Большое спасибо @DavidHeffernan за ваш ответ. У меня более 10 TEdit, таких как edCustname, edCustAddr, edCustAttn, edCustPostCode и т. Д. И начальное значение будет из 'select * from customer where customer.code =' c001 ' . И я присваиваю всю ценность всему TEdit. Как я могу использовать массив в этом случае. - person Saneh Saengchan; 24.08.2015
comment
Поместите элементы управления в массив TEdit. Загрузите значения по умолчанию в массив string. Инициализируйте элементы управления редактированием в цикле for. Точно так же при тестировании, были ли они изменены. - person David Heffernan; 24.08.2015
comment
К вашему сведению, TEdit имеет свойство Modified, которое истинно, если пользователь отредактировал текст, даже если ему было возвращено исходное значение. И я бы предложил использовать TAction вместо события TEdit.OnExit, использовать событие TAction.OnUpdate для включения / отключения кнопки в зависимости от текущего состояния элементов управления TEdit. - person Remy Lebeau; 24.08.2015
comment
@DavidHeffernan Мой элемент управления редактированием настроен на создание формы. Я не знаю, как поместить их в массив TEdit. Найдите ссылку на мой проект кода Источник < / b> - person Saneh Saengchan; 24.08.2015
comment
Назначаем так: Arr[0] := Edit1; Arr[1] := Edit2; ... и т. Д. - person David Heffernan; 24.08.2015
comment
@RemyLebeau Большое спасибо за ваше предложение. Мне нужно было создать одно действие, например actEditChange, и переместить код btnSave.Enable: = (Edit1.Text ‹› strWelcome) или (Edit2.Text ‹› strTo) или (Edit3.Text ›strThailand); на actEditChangeUpdate (Отправитель: TObject); все готово, btnSave будет включаться / отключаться при изменении TEdit. - person Saneh Saengchan; 24.08.2015
comment
@Saneh, включите или отключите действие вместо кнопки (actEditChange.Enabled := ...) в вашем OnUpdate обработчике событий. Это включит или отключит все элементы управления, связанные с этим действием, независимо от того, какие они есть. - person TLama; 25.08.2015