wloochacz napisał(a)
To oczywista nieprawda, podstawowym typem zdarzenia jest TNotifyEvent
No podstawowym typem, a skoro inne także mogą być wykorzystane, to nie widzę powodu do stwierdzenia, że to nieprawda; Nie napisałem, że nie mogą być inne;
To jak już ogarniesz czytanie własnych postów ze zrozumieniem, to możemy kontynuować...
Napisałeś jak byk, cytuję:
furious programming napisał(a)
Każde zdarzenie musi być typu TNotifyEvent (nazwa typu nawet to sugeruje);
A to, powtarzam, oczywista nieprawda
To tak jak w przypadku np. TStrings - przekazywana klasa musi być TStrings, więc automatycznie oznacza to, że także można użyć zarówno TStrings, jak i TStringList czy nawet THashedStringList; No może nie dokładnie taka sama zasada, ale w tym stylu, bo nie chodzi o dziedziczenie, a o of object
;
Eeeeh... mylisz pojęcia.
Deklaracja of object
nie oznacza tego co napisałeś (a napisałeś o dziedziczeniu właśnie), a oznacza tyle, że procedura obsługi zdarzenia musi być metodą. Mam nadzieję, że nie muszę tłumaczyć czym różni się metoda od procedury lub funkcji?
Poza tym (w kontekście typy parametru zdarzenia TNotifyEvent
), oczywiście, że chodzi o dziedziczenie - spróbuj jako Sender podać interfejs albo rekord. Skompiluje się? Oczywiście, że się nie skompiluje, ponieważ typ parametru jasno definiuje że musi to być cokolwiek co jest TObject. A więc mogą to być Twoje listy, ale i np. TForm, TDatabase i cokolwiek innego byleby dziedziczyło z TObject. A że tak się składa, że w Delphi jakakolwiek (póki co) klasa dziedziczy z TObject
to zupełnie inna sprawa.
Ale nie doprecyzowałem wcześniej - moja wina; W każdym razie trudno użyć jednego typu zdarzenia dla różnych parametrów - opisałem to przecież w nawiasach:
furious programming napisał(a)
Na koniec, jeżeli zdarzenie zostało wcześniej zainicjowane - zostaje ono wywołane z określonymi parametrami (które mogą być różne, zależnie od typu zdarzenia);
wloochacz napisał(a)
No popatrz, a ja zawsze myślałem że zdarzenie to po prostu wskaźnik na procedure of object
...
Nigdzie nie napisałem, że to nie jest pointer na metodę; Uściślając, to procedure (Sender: TObject) of object
, jeśli miałeś na myśli podstawowy typ TNotifyEvent
;
Nie - miałem dokładnie na myśli to co napisałem, nie mieszaj mi tu już z tym TNotifyEvent.
wloochacz napisał(a)
A dlaczego nie published? Co za różnica dla takiej klasy, która nie dziedziczy z TComponent?
No właśnie? jakie to ma znaczenie? Nie napisałem przecież że musi; A skoro nie musi, to niech korzysta z Public, skoro nie potrzebuje udostępniania i nie jest mu potrzebne; Słowo "powinien" nie jest przecież synonimem słowa "musi";
Napisałem jakie to ma znaczenie - w komentarzu.
wloochacz napisał(a)
Moim zdaniem to błąd
Ale które to błąd? Że może sobie zaimplementować ciało zdarzenia, czy że nie musi? I jedno i drugie to prawda - może, ale nie musi - zależnie od przeznaczenia, jednak nie znam wszystkich szczegółów projektu pytacza, stąd opisałem oba przypadki;
Błędem, moim zdaniem, jest jawne wywoływanie zdarzenia w sposób bezpośredni, bez dedykowanej wirtualnej metody.
A gdybyś ciął cytaty mniej niechlujnie i czytał wszystko, to widziałbyś o czym mowa. Bo o banalną manipulację Cię nie podejrzewam - jeszcze ;-)
Dobrze jest sobie to opakować w metodę, jak słusznie podałeś przykład z DoOnChange
- to bardzo popularna technika i szeroko stosowana; Podałem przykład jak się ją wywołuje, a nie napisałem, że koniecznie trzeba to robić ręcznie w każdej metodzie, która musi ją wywołać; Chodziło mi o wywołanie metody na którą wskazuje FOnChange
- nie wiem dlaczego nie zrozumiałeś;
wloochacz napisał(a)
I właśnie dlatego zadeklarowałem metodę DoOnChange jako wirtualną;
I bardzo dobrze zrobiłeś - będzie można ją przedefiniować, czyli rozwinąłeś moje słowa, dotyczące klasy bazowej lub abstrakcyjnej;
W sumie to napisałeś prawie dokładnie to samo co ja, tylko że nieco rozwinąłeś temat i ubrałeś swoją wypowiedź w bardziej "techniczne" słowa, a ja próbowałem wytłumaczyć sprawę jak "laikowi", co dziwnie może wyglądać w oczach osób doświadczonych; Widać nie opłaca się tego robić - chyba lepiej będzie pisać od razu właściwymi słowami.
Powiem Ci co ja myślę; myślę, że wiesz iż mam rację, a teraz po prostu próbujesz odwrócić kota ogonem.
Rozumiem, że pisanie półprawd i nie do końca prawdziwych tez to ma być tłumaczenie laikowi?
OK, można i tak...