Одна процедура на все проверки как?

В моей форме есть 30 или более TCheckbox с TNumberBox перед ними. Каждый TCheckbox и TNumberBox связаны так, что имя CheckBox1 — это C1, а NumberBox — это C1E, Checkbox2 — это C2, а NumberBox2 — это C2E и так далее. Если отмечен C1, C1E будет включен. Я не хочу использовать разные события onclick для каждого Tcheckbox. Я просто хочу использовать одну процедуру для всех событий TCheckbox onclick. Как я могу это сделать ?


person Jo3    schedule 25.10.2017    source источник
comment
Я думаю, вы могли бы использовать FindComponent после приведения Sender к TCheckBox, получения имени и добавления 'E'.   -  person Rudy Velthuis    schedule 25.10.2017
comment
Может быть, TDictionary<TCheckBox, TNumberBox> для отслеживания пар? Или используйте TComponent.Tag флажка, чтобы сохранить указатель на числовое поле.   -  person nil    schedule 25.10.2017
comment
Это 30 одинаковых вещей для чего-то, что могло бы быть n, и вы остановились на 30, потому что больше 30 точно никогда не понадобится? Являются ли элементы управления во время разработки правильным ответом? Это звучит как работа для списка.   -  person J...    schedule 25.10.2017
comment
Вы можете создать собственный компонент для этого, см. delp/45724216#45724216">это   -  person Nasreddine Galfout    schedule 25.10.2017
comment
Я бы использовал TFrame, на котором есть 1 TCheckBox и 1 TNumberBox, с событием on OnClick по мере необходимости, а затем использовал 30 экземпляров этого фрейма в форме.   -  person Remy Lebeau    schedule 25.10.2017


Ответы (2)


Вы можете назначить следующий обработчик OnClick (или что-то подобное) каждому из флажков:

procedure TYourFormName.CheckBoxClick(Sender: TObject);
var
  Assoc: TControl;
  ChkName: string;
begin
  ChkName := TCheckBox(Sender).Name;                // e.g. 'C1', 'C2', ...
  Assoc := TControl(FindComponent(ChkName + 'E'));  // e.g. 'C1E', 'C2E', ...
  if Assigned(Assoc) then
    Assoc.Enabled := TCheckBox(Sender).Checked;
end;
person Rudy Velthuis    schedule 25.10.2017
comment
Не работает для меня. Assoc.enable или видимое несогласие существует. - person Jo3; 25.10.2017
comment
@Jo3 Думаю, Руди имел в виду Assoc: TControl; и Assoc := FindComponent('Name + 'E'') as TControl;. - person nil; 25.10.2017
comment
Теперь все работает хорошо, спасибо Руди за помощь и @nil за информирование. - person Jo3; 25.10.2017
comment
@Remy: спасибо за редактирование. У меня не было Delphi, так что это по памяти. - person Rudy Velthuis; 25.10.2017

Если вы создали эти флажки и числовые поля во время разработки, вы можете использовать живые привязки. Откройте LiveBindings Designer и найдите свои компоненты. Добавьте свойство visible в свои числовые поля (нажав тройную точку внизу члена). Затем соедините свойство IsChecked флажка со свойством Visible числового поля (щелкните и перетащите).

person Sebastian Proske    schedule 25.10.2017
comment
Я могу использовать живое связывание, но для компонентов более 30, и я не знаю, сколько их будет, потому что программа еще не готова. - person Jo3; 25.10.2017