Rozróżnienie dwóch przycisków dynamicznych

0

Tworzę wiele przycisków dynamicznie, w zależności od danych z pliku. Jedną z kategorii danych są 'Miasta'. Nazwa miasta pojawia się na przycisku jako Caption. Po wciśnięciu przycisku ma się pojawiać karta z danymi i ostatnimi transportami danego miasta. Niestety zdarzyło mi się już, że mam kilka miast o tych samych nazwach. W jaki sposób więc mógłbym rozróżnić które akurat miasto oznacza dany przycisk? Czy da się może dodać do przycisku właściwość np. ID? W pliku każde miasto ma przypisany inny numer ID i to by było rozwiązanie które by mi bardzo pomogło.

4

Nie wiem, jak w Lazarusie, w standardowym Delphi każda kontrolka ma właściwość TAG, którą możesz sobie dowolnie wykorzystać. Możesz tam umieszczać integery, a więc np. jakiś enum lub adres w pamięci.

1

Możesz też utworzyć swoją klasę dziedziczącą po TButton i dodać jej dodatkowe metody/property. Skoro tworzysz to dynamicznie to nawet nie musisz tego instalować w IDE

2

@dani17 - możesz skorzystać tak jak wcześniej napisano z właściwości Tag, ale też możesz przypisać tym przyciskom różne zdarzenia OnClick; Do wyboru do koloru, jednak kilka kwestii należy wyjaścić, bo są niepełne/mylące;

Juhas napisał(a)

Nie wiem, jak w Lazarusie, w standardowym Delphi każda kontrolka ma właściwość TAG, którą możesz sobie dowolnie wykorzystać.

LCL z Lazarusa jest prawie idealną kopią VCL z Delphi, a przynajmniej na tak wysokim poziomie, na jakim są metody klas czy właściwości; Nie ma obawy, że tak podstawowe i znane elementy nie istnieją w LCL;

Możesz tam umieszczać integery, a więc np. jakiś enum lub adres w pamięci.

Właściwość Tag może zawierać dowolne dane, nie tylko liczby typu Integer czy adresy; Może bezpośrednio przechowywać wszystko co ma rozmiar niewiększy niż SizeOf(Integer), liczony w bajtach; Tak więc zmieści się wszystko, co ma rozmiar mniejszy lub równy 32 lub 64 bitom, w zależności od kompilatora; Jednak silne typowanie wymusza rzutowanie przy danych nieliczbowych; Pozostałe dane, które mają większy rozmiar, można przechowywać w postaci wskaźnika.

0

Różne zdarzenia by nie wypaliły, bo byłoby tego za dużo. I w dodatku sam na ten moment nie wiem jakie dane będą w pliku tekstowym, więc trochę ciężko byłoby mi to zrobić. Dlatego próbuję zrobić jedno zdarzenie, w którym będzie sprawdzana ta dodatkowa właściwość i na podstawie jej wartości będą wyświetla dane.

Teraz jeszcze jedna kwestia. Jeśli użyję Tag co zapewne mi całkowicie wystarczy, ewentualnie jak stworzę nową klasę to jak później sprawdzić wartość właściwości w zdarzeniu onClick? Wystarczy if Sender.Tag = 1 then ShowC1 else ShowC2;?

1

No tak. Tag to właściwość, w której możesz se trzymać bezpośrednio, jawnie liczby całkowite. Czyli:

 
Sender.Tag := 0;
if Sender.Tag = 0 then...

Po prostu

0

@dani17 - określ się w końcu, właściwość Tag typu Integer wystarczy, czy nie wystarczy? Jeśli nie wystarczy to chcesz rozwinąć klasę TButton i dodać nową właściwość, czy nie? Podaj konkrety.

0

Sam myślałem nad zbudowaniem nowej klasy po TButton, ale Tag jest rozwiązaniem o które tak na prawdę pytałem. Zwłaszcza, że i tak zamierzałem tam trzymać tylko Integery. Jedyna kwestia to była odwołanie się do tej czy innej właściwości już po kliknięciu w dany przycisk.

1

W takim razie wystarczy, że napiszesz sobie uniwersalne dla tych przycisków zdarzenie (dla kliknięcia), przy dynamicznym tworzeniu przycisków wpiszesz wskaźnik na to zdarzenie do właściwości OnClick przycisku, a w ciele tego zdarzenia skorzystasz z Sender.Tag;

Po to właśnie zdarzenia przekazują referencję całego komponentu w parametrze Sender, aby można było jedno zdarzenie podpiąć pod wiele komponentów i mieć możliwość ich rozróżnienia (na swój sposób, nie tylko na podstawie wartości właściwości Tag).

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