#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-код (который встроен в конечный исполняемый файл) содержит меньше почти идентичных повторяющихся данных.