An object's attributes are not necessarily static. An application can ask an object to set certain object attributes using the SetAttrs() function: ULONG SetAttrs(APTR myobject, Tag1, Value1, ...); Because Boopsi gadgets require some extra information about their display, they use a special version of this function, SetGadgetAttrs(): ULONG SetGadgetAttrs(struct Gadget *myobject, struct Window *w, struct Requester *r, Tag1, Value1, ...); Here myobject is a pointer to the Boopsi object, w points to the gadget's window, r points to the gadget's requester, and the tag/value pairs are the attributes and their new values. The return value of SetAttrs() and SetGadgetAttrs() is class specific. In general, if the attribute change causes a visual change to some object, the SetAttrs()/SetGadgetAttrs() function should return a non-zero value, otherwise, these functions should return zero (see the Boopsi Class Reference in "Appendix B" of this manual for information on the return values for specific classes). The following is an example of how to set the current integer value and gadget ID of the gadget created in the NewObject() call above: SetGadgetAttrs(mystringgadget, mywindow, NULL, STRINGA_LongVal, 75L, GA_ID, 2L, TAG_END)); This changes two of mystringgadget's attributes. It changes the gadget's current integer value to 75 and it changes the gadget's ID number to 2. Note that it is not OK to call SetGadgetAttrs() on a Boopsi object that isn't a gadget, nor is it OK to call SetAttrs() on a Boopsi gadget. Not all object attributes can be set with SetGadgetAttrs()/SetAttrs(). Some classes are set up so that applications cannot change certain attributes. For example, the imagery for the knob of a proportional gadget cannot be altered after the object has been created. Whether or not a specific attribute is "settable" is class dependent. For more information about the attributes of specific classes, see the Boopsi Class Reference in the Appendix B of this manual.