Spis treści

Wyszukiwanie obiektów w drzewie

Po stworzeniu kompletnego drzewa obiektów, nie ma bezpośredniego dostępu do żadnego z nich, oprócz obiektu głównego, klasy Application. Jakiś dostęp jednak jest potrzebny, można go uzyskać na trzy sposoby:

Wyszukiwanie dynamiczne działa następująco: każdy obiekt, jaki będzie później wyszukiwany, ma atrybut MUIA_UserData ustawiony na określoną, unikalną wartość. Następnie w dowolnym momencie można uzyskać wskaźnik do tego obiektu wywołując metodę MUIM_FindUData() na jego obiekcie (bezpośrednio lub pośrednio) nadrzędnym, na przykład na obiekcie aplikacji, który jest nadrzędny dla wszystkich innych.
#define OBJ_JAKIS_PRZYCISK 36

/* Gdzieś w wartościach początkowych dla atrybutów obiektu */
MUIA_UserData, OBJ_JAKIS_PRZYCISK,
/* ... */

/* Chcemy uzyskać wskaźnik do obiektu */

Object *jakis_przycisk;

jakis_przycisk = (Object*)DoMethod(App, MUIM_FindUData, OBJ_JAKIS_PRZYCISK);

Ponieważ to bardzo często wykonywana operacja, wygodnie jest opakować ją w makro:

#define findobj(id, parent) (Object*)DoMethod(parent, MUIM_FindUData, id)

jakis_przycisk = findobj(OBJ_JAKIS_PRZYCISK, App);

Makro można oczywiście bezpośrednio wywoływać w innych funkcjach, na przykład przy zmianie atrybutów, albo w notyfikacjach. Oto przykład zmieniający tekst przycisku:

set(findobj(OBJ_JAKIS_PRZYCISK, App), MUIA_Text_Contents, "Kliknij");

Trzeba zauważyć, że makro findobj() nie jest zdefiniowane w systemowych plikach nagłówkowych MUI, trzeba je zdefiniować samodzielnie w kodzie programu.