Wykonanie metod na dynamicznych komponentach

0

Witam,
tworzę dynamicznie po trzy komponenty

  • CheckBox
  • Label
    Chciałbym przypisać metody dla zdarzenia OnClick w komponencie CheckBox, która sprawiałaby, że kliknięcie w checkbox wygasza odpowiedni Label i odznaczenie go 'odgasza' label.
FStatutyCheckBoxy[High(FStatutyCheckBoxy)].OnClick := Zgas;

procedure TKontrahenci.Zgas(Sender: TObject);
begin
  TLabel(FindComponent(TComponent(Sender).Name)).Caption :=TCheckBox(FindComponent(TComponent(Sender).Name)).Checked
end;

Ten kod mi nie działa.
Mam przypisane unikalne nazwy dla komponentów oraz unikalny Tag.

Co tutaj należy poprawić?

1

FindComponent zwraca Ci komponent o określonej w parametrze nazwie - u Ciebie szukasz komponentu, którego nazwa jest zawarta w TComponent(Sender).Name.

Jakie nazwy mają te Twoje checkboxy oraz labele, a co jest wewnątrz TComponent(Sender).Name?

0

Nie działa Ci bo zwraca wyjątek

Incompatible Types: String and Boolean?

. Użyj konwersji: BoolToStr lub zmień kod w zależności od checked

if TCheckbox(...).Checked then
   TLabel(...).caption := ''
else
   TLabel(...).caption := 'coś tam';
1

Dobra zrobiłem.

TLabel(FindComponent('LabelStatusy' + IntToStr(TComponent(Sender).Tag))).Caption := TcxCheckBox(FindComponent(TComponent(Sender).Name)).Name
1

@Kazik1 - referencje do dynamicznie tworzonych komponentów przechowuj sobie co najmniej w jakiejś tablicy (albo liście generycznej); Dzięki temu nie będziesz ich musiał szukać; Natomiast jeśli chodzi o formatowanie ciągów znaków to zamiast plusować składowe, wygodniej i czytelniej jest skorzystać z funkcji Format:

Format('LabelStatusy%d', [TComponent(Sender).Tag])

No i pozbądź się tego rzutowania na Sender; Jako ciekawostkę dodam, że ładnie można to wykonać za pomocą dodatkowej zmiennej lokalnej, zadeklarowanej z wykorzystaniem słówka Absolute;

A tak na marginesie - Sender zawiera już referencję do obiektu komponentu, więc FindComponent i szukanie komponentu po nazwie nie jest w tym przypadku potrzebne.

1 użytkowników online, w tym zalogowanych: 0, gości: 1