Как я могу оптимизировать этот код с помощью SENDER? - PullRequest
3 голосов
/ 01 октября 2011

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

//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;

спасибо.

Ответы [ 3 ]

9 голосов
/ 01 октября 2011

Если все флажки и изменения имеют одинаковые имена, вы можете добавить это событие 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;
3 голосов
/ 02 октября 2011

Я предлагаю вам сохранить указатели 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;
1 голос
/ 03 октября 2011

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

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

...