Wykonanie metod na dynamicznych komponentach

Wykonanie metod na dynamicznych komponentach
K1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 93
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.
Kopiuj
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ć?

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
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?

woolfik
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1611
0

Nie działa Ci bo zwraca wyjątek

Kopiuj
Incompatible Types: String and Boolean?

. Użyj konwersji: http://4programmers.net/Delphi/BoolToStr lub zmień kod w zależności od checked

Kopiuj
if TCheckbox(...).Checked then
   TLabel(...).caption := ''
else
   TLabel(...).caption := 'coś tam';
K1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 93
1

Dobra zrobiłem.

Kopiuj
TLabel(FindComponent('LabelStatusy' + IntToStr(TComponent(Sender).Tag))).Caption := TcxCheckBox(FindComponent(TComponent(Sender).Name)).Name
flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12269
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:

Kopiuj
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.