Difference between revisions of "Przeciążanie metody OM GET()"

From MorphOS Library

(Translation started.)
 
m (Formatting.)
 
(2 intermediate revisions by the same user not shown)
Line 4: Line 4:
  
  
The ''OM_GET()'' method, used for getting an attribute from an object, receives an opGet structure as its message. The structure is defined in the ''<intuition/classusr.h>'' header file:
+
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
 
  struct opGet
 
  {
 
  {
   ULONG  MethodID;          /* always OM_GET (0x104) */
+
   ULONG  MethodID;          /* zawsze OM_GET (0x104) */
 
   ULONG  opg_AttrID;
 
   ULONG  opg_AttrID;
 
   ULONG *opg_Storage;
 
   ULONG *opg_Storage;
 
  };
 
  };
  
Unlike ''[[Overriding OM_SET()|OM_SET()]]'', this method handles only one attribute at a time. The attribute is placed in the ''opg_AttrID'' field. The field ''opg_Storage'' is a '''pointer''' to a place where the attribute value should be stored. It is defined as a pointer to ULONG, but it may point to anything (for example to some larger structure). It allows for passing attributes not fitting in a 32-bit variable. Because ''OM_GET()'' does not have a taglist iteration loop, its implementation is simple:
+
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 19: Line 19:
 
   switch (msg->opg_AttrID)
 
   switch (msg->opg_AttrID)
 
   {
 
   {
     case Some_Integer_Tag:
+
     case Tag_Liczbowy:
       *msg->opg_Storage = /* value of the tag */;
+
       *msg->opg_Storage = /* wartość atrybutu */;
 
     return TRUE;
 
     return TRUE;
 
   
 
   
     case Some_String_Tag:
+
     case Tag_Tekstowy:
       *(char**)msg->opg_Storage = "a fixed string value";
+
       *(char**)msg->opg_Storage = "stały tekst";
 
     return TRUE;
 
     return TRUE;
 
   }
 
   }
Line 31: Line 31:
 
  }
 
  }
  
The implementation consists of a ''switch'' statement with ''cases'' for all recognized attributes. If an attribute is recognized, the method should return ''TRUE''. It is very important, as [[Event Driven Programming, Notifications#Notifications in MUI|MUI notifications]] rely on OM_GET() and will not work on the attribute if ''TRUE'' is not returned. Unknown attributes are passed to the superclass. The ''DoSuperMethodA()'' call may be alternatively placed as the ''default'' clause of the ''switch'' statement. It is important that ''msg->opg_Storage'' is '''dereferenced''' when storing the attribute value. If the value type is not integer, a typecast is needed. For a value type ''T'', the dereferencing combined with typecast is denoted as ''*(T*)''.
+
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*)''.

Latest revision as of 10:38, 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*).