Difference between revisions of "Przeciążanie metody OM GET()"
From MorphOS Library
(Translation in progress.) |
(Translation finished.) |
||
Line 12: | Line 12: | ||
}; | }; | ||
− | + | W przeciwieństwie do ''[[Przeciążanie metody OM_SET()|OM_SET()]]'', ta metoda w jednym wywołaniu odczytuje zawsze jeden atrybut. Jego identyfikator umieszcza się w polu ''opg_AttrID''. Pole ''opg_Storage'' jest '''wskaźnikiem''' na miejsce w pamięci, gdzie zostanie umieszczona odczytana wartość atrybutu. Pole to jest zdefiniowane jako wskaźnik na ''ULONG'', ale może wskazywać na cokolwiek (na przykład jakąś większą strukturę). Dzięki temu można odczytywać wartości nie mieszczące się w 32 bitach. Ponieważ metoda ''OM_GET()'' nie ma pętli przeglądania [[Taglists|taglisty]], jej implementacja jest prosta: | |
IPTR MyClassGet(Class *cl, Object *obj, struct opGet *msg) | IPTR MyClassGet(Class *cl, Object *obj, struct opGet *msg) | ||
Line 18: | Line 18: | ||
switch (msg->opg_AttrID) | switch (msg->opg_AttrID) | ||
{ | { | ||
− | case | + | case Tag_Liczbowy: |
− | *msg->opg_Storage = /* | + | *msg->opg_Storage = /* wartość atrybutu */; |
return TRUE; | return TRUE; | ||
− | case | + | case Tag_Tekstowy: |
− | *(char**)msg->opg_Storage = " | + | *(char**)msg->opg_Storage = "stały tekst"; |
return TRUE; | return TRUE; | ||
} | } | ||
Line 30: | Line 30: | ||
} | } | ||
− | + | Funkcja metody ''OM_GET()'' składa się z wyrażenia ''switch'' z przypadkami dla wszystkich rozpoznawanych atrybutów. Jeżeli atrybut jest rozpoznany, wynikiem funkcji powinna być wartość logiczna ''TRUE''. To bardzo ważne, ponieważ [[Programowanie sterowane zdarzeniami, notyfikacje#Notyfikacje w MUI|notyfikacje]] nie będą działały na danym atrybucie jeżeli ''OM_GET()'' zwróci po prostu zero. Nierozpoznane atrybuty są przekazywane do klasy nadrzędnej. Wywołanie funkcji ''DoSuperMethodA()'' może być alternatywnie umieszczone w przypadku ''default'' wyrażenia ''switch''. Trzeba zwrócić uwagę na fakt, że przy zapisywaniu wartości atrybutu odwołujemy się do '''wartości wskazywanej''' przez ''msg->opg_Storage''. Jeżeli typem wartości nie jest liczba całkowita, niezbędne jest rzutowanie typu. Dla wartości typu ''T'', odwołanie się do niej wraz z rzutowaniem jest zapisywane w C jako ''*(T*)''. |
Revision as of 09:33, 26 January 2011
Grzegorz Kraszewski
Ten artykuł w innych językach: angielski
Metoda OM_GET() służy do odczytywania wartości atrybutu obiektu. Otrzymuje strukturę opGet jako strukturę parametrów. Struktura opGet jest zdefiniowana w pliku nagłówkowym <intuition/classusr.h>:
struct opGet { ULONG MethodID; /* zawsze OM_GET (0x104) */ ULONG opg_AttrID; ULONG *opg_Storage; };
W przeciwieństwie do OM_SET(), ta metoda w jednym wywołaniu odczytuje zawsze jeden atrybut. Jego identyfikator umieszcza się w polu opg_AttrID. Pole opg_Storage jest wskaźnikiem na miejsce w pamięci, gdzie zostanie umieszczona odczytana wartość atrybutu. Pole to jest zdefiniowane jako wskaźnik na ULONG, ale może wskazywać na cokolwiek (na przykład jakąś większą strukturę). Dzięki temu można odczytywać wartości nie mieszczące się w 32 bitach. Ponieważ metoda OM_GET() nie ma pętli przeglądania taglisty, jej implementacja jest prosta:
IPTR MyClassGet(Class *cl, Object *obj, struct opGet *msg) { switch (msg->opg_AttrID) { case Tag_Liczbowy: *msg->opg_Storage = /* wartość atrybutu */; return TRUE; case Tag_Tekstowy: *(char**)msg->opg_Storage = "stały tekst"; return TRUE; } return DoSuperMethodA(cl, obj, (Msg)msg); }
Funkcja metody OM_GET() składa się z wyrażenia switch z przypadkami dla wszystkich rozpoznawanych atrybutów. Jeżeli atrybut jest rozpoznany, wynikiem funkcji powinna być wartość logiczna TRUE. To bardzo ważne, ponieważ notyfikacje nie będą działały na danym atrybucie jeżeli OM_GET() zwróci po prostu zero. Nierozpoznane atrybuty są przekazywane do klasy nadrzędnej. Wywołanie funkcji DoSuperMethodA() może być alternatywnie umieszczone w przypadku default wyrażenia switch. Trzeba zwrócić uwagę na fakt, że przy zapisywaniu wartości atrybutu odwołujemy się do wartości wskazywanej przez msg->opg_Storage. Jeżeli typem wartości nie jest liczba całkowita, niezbędne jest rzutowanie typu. Dla wartości typu T, odwołanie się do niej wraz z rzutowaniem jest zapisywane w C jako *(T*).