Как я могу оптимизировать этот код с помощью SENDER?

#delphi #optimization #sender

#delphi #оптимизация #отправитель

Вопрос:

У меня есть форма, которая содержит 16 флажков и 32 TEditBox. Каждые 2 возможности TEditBox зависят от состояния флажка. поэтому я использую этот код, который слишком длинный:

 //T1
procedure TOFAddForm.T1Click(Sender: TObject); 
begin
     Q1.Enabled:=T1.Checked;
     P1.Enabled:=T1.Checked; 
     Q1.OnChange(Sender);
end;

.  
.
.

//T16
procedure TOFAddForm.T16Click(Sender: TObject); 
begin
     Q16.Enabled:=T16.Checked;
     P16.Enabled:=T16.Checked;
     Q1.OnChange(Sender);
end;`
  

Я использовал этот код, но ничего не произошло:

 procedure TOFAddForm.T1Click(Sender: TObject);
var Q, P: TEdit;
begin
     with  Sender as TCheckBox do begin
           Q.Name:='Q' copy(Name,1,2);
           P.Name:='P' Copy(Name,1,2);
           Q.Enabled:=Checked;
           P.Enabled:=Checked;
     end;
     Q1.OnChange(Sender);
end;
  

Спасибо.

Ответ №1:

Если все флажки и изменения имеют одинаковые имена, вы можете добавить это событие OnClick ко всем флажкам:

 procedure TOFAddForm.TClick(Sender: TObject);
var 
  C: TCheckBox;
  Q, P: TEdit;
  N: string;
begin
  C := Sender as TCheckBox;
  N := Copy(C.Name, 2, Length(C.Name));
  Q := FindComponent('Q'   N) as TEdit;
  P := FindComponent('P'   N) as TEdit;
  Q.Enabled := C.Checked;
  P.Enabled := C.Checked;
  Q.OnChange(Sender);
end;
  

Комментарии:

1. Спасибо GolezTrol. это то, что я ищу.

2. не забудьте принять в качестве ответа, это поможет другим и покажет вашу благодарность GolezTrol

3. Вы могли бы опустить второй параметр для копирования, потому что по умолчанию используется значение «в конец источника». Кроме того: ваше решение работает, но использование FindComponent всегда заставляет меня чувствовать себя грязным. Обычно я использую массив записей и использую свойство тега checkbox для индекса. (ой, Реми опередил меня в этом). Тоже не «чистый».

4. Конечно.. Это тоже не мой предпочтительный выбор. Обычно, когда у вас есть такое количество элементов управления, вы также создаете их динамически. Возможно, было бы удобнее написать составной компонент или просто простой класс, который объединяет элементы управления и обрабатывает их события. Но для этого вопроса я подумал, что было бы лучше выбрать простое решение, основанное на уже существующем коде. Детские шаги. 🙂

5. @dummzeuch, ты ошибся насчет Copy b.t.w. Третий параметр является обязательным (по крайней мере, в D2007 и ранее). Я мог бы использовать LeftStr , но это более новая функция, чем Copy . Поскольку я не знаю версию OP на Delphi, я предпочитаю использовать Copy в примерах, подобных этому.

Ответ №2:

Я предлагаю вам сохранить TEdit указатели в массив, а затем использовать TCheckBox.Tag свойство в качестве индекса в массиве, например:

 var
  Edits: array[0..15, 0..1] of TEdit;

procedure TOFAddForm.FormCreate(Sender: TObject);
var
  K: Integer;
begin
  for k := 0 to 15 do
  begin
    Edits[k, 0] := FindComponent('Q'   IntToStr(k 1)) as TEdit;
    Edits[k, 1] := FindComponent('P'   IntToStr(k 1)) as TEdit;
    (FindComponent('T'   IntToStr(k 1)) as TCheckBox).Tag := k;
end;

procedure TOFAddForm.T1Click(Sender: TObject);
begin
  with Sender as TCheckBox do
  begin
    Edits[Tag, 0].Enabled := Checked;
    Edits[Tag, 1].Enabled := Checked;
    Edits[Tag, 0].OnChange(Sender);
  end;
end;
  

Ответ №3:

Я бы настоятельно рекомендовал в подобных случаях создавать элементы управления самостоятельно. В обработчике событий onCreate вызовите TEdit.Create(Self) , сохраните ссылку на объект в структуре данных, которой вы управляете самостоятельно, например, в динамическом массиве, задайте свойства, такие как Parent , SetBounds и обработчики событий, и выполните поиск Sender в вашей коллекции ссылок на объекты (необязательно в зависимости от значения Tag ), это почти всегда более эффективно, чем использование FindComponent .

Дополнительные преимущества в том, что вы можете легко изменять количество повторяющихся элементов управления (даже делать его динамическим во время выполнения!), А dfm-код (который встроен в конечный исполняемый файл) содержит меньше почти идентичных повторяющихся данных.