Delphi TCollectionItem a udalosti
Pracujem na vlastnej komponente(Toolbar podporujúci 32 bitové alfa transparentné ikony). Komponenta je odvodená z TCustomControl-u a obsahuje inštanciu potomka TCollection v published časti(tzn. že sa zobrazuje v Object Inspectore), Jednotlivé tlačítka sú potomkami TCollectionItem a v tom je kameň úrazu. Každý buton má vlastné eventy(OnClick atd) no pri pokuse o vytvorenie obslužnej procedúry(v Object Inspectore) mi prostredie vyhodí výnimku "Cannot create a method for an unnamed component." Samozrejme že inštancia triedy TCollectionItem nemôže mať názov keďže neni potomkom TComponent. Skúšal som vytvoriť property Name a generovať názov komponenty v konštruktore, ale nepomohlo to. Vie mi niekto poradiť čo s tým?
Moc sa do delphi nevyznam ale OnClick podla mna nemozes vytvorit na Tcollectionitem, ale len na triede ktora definuje samotny button, alebo na triede odvodenej od nejakeho okna, resp. niecoho co dostava Windows messages (TCollection je ak to spravne chapem len subor nejakych objektov v pamati). Ale neviem mozno sa mylim.
TCollection s TCollectionItems je takove lepsi pole zaznamu, vytvorene pomoci objektu.
Jasné že TCollectionItem nemôže sám o sebe obslúžiť správu windows o kliknutí na inštanciu inej triedy ako potomka TControl. Lenže ten klik odchytí už toolbar a ak zistí že bol kurzor nad oblasťou buttonu potom toolbar zavolá udalosť OnClick toho buttonu.
Zavola onclick buttonu, ale IMHO nie OnClick triedy TCollectionItem, button musi mat nejaku vlastnu triedu, nie? Ak nema, tak musis urobit onclick na niecom co dostava spravy (napr. toolbar) a zavlat si tam vlastnu metodu triedy buttonu.
Bežne sa podobné situácie riešia tak že každý button je kontrol(odvodený od TControl), ktorý odchytáva správy.
Moje (netradičné) riešenie je nasledovné: Keď kliknem na hociaké miesto na toolbare, odchytí správu toolbar keď toolbar zistí že súradnice kurzoru sa nachádzali nad buttonom zavolá sa event buttonu(button som spravil ako nevizuálnu komponentu takže správy odchytávať nemôže), žiaden button(odvodený od triedy TControl) tam ale v skutočnosti nie je, vpodstate button len nesie informáciu o vlastnostiach ale všetku prácu za neho vykonáva toolbar. Ono to aj funguje.
Problém je v časti vizuálneho návrhu v IDE. IDE mi nechce dovoliť automaticky vytvoriť obslužnú procedúru eventu buttonu pretože button nemá žiaden názov(keďže nie je odvodený od triedy TComponent ktorá obsahuje property Name) IDE si nevie vycucať z prsta na základe čoho má vygenerovať názov obslužnej procedúry. A musím ju teda vytvárať ručne.
Mám taký pocit že to budem musieť celé prerobiť a namiesto TCollection použijem TList, a button odvodím od TComponent.
Otazkou je, zda jsi zvolil spravny pristup. Podle mne by bylo lepsi pouzit misto TCollection v tomto pripade potomka TObjectList - kolekci objektu. Tam samozrejme muzes mit i udalosti...
Hneď to skúsom dík.