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.
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.
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
@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.
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;
?
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
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.
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
).