next up previous contents
Next: Konfigurationsoptionen Up: Verkapselung von Tk-Objekten für Previous: Konstruktor

Der Typ GUIOBJECT und die Klasse GUIObject

Der Typ GUIOBJECT ist die interne Repräsentation der verschiedenen Oberflächen-Objekte (im wesentlichen Widgets, Canvas-Objekte, Menüelemente, aber auch spezielleres wie z.B. Text-Tags oder Canvas-Tags). Diese interne Repräsentation durch einen Typen ermöglicht z.B. Listen verschiedener Objekte im internen Status zu halten oder als Funktions-Argumente zu übergeben.

Der GUIOBJECT-Wert muß jedoch normalerweise nicht selbst konstruiert werden, hierzu gibt es spezielle Funktionen (z.B. createGUIObject im Modul Core, createCanvasItem im Modul CanvasItemAux). Aussehen tut er wie folgt:

data GUIOBJECT = GUIOBJECT ObjectID (Ref OST) | ROOT

Den ROOT-Konstruktor möchte ich hier nicht weiter erläutern. Er hat eine spezielle Bedeutung und steht für die Wish-Instanz bzw. das Hauptfenster, dies muß man aber jetzt nicht verstehen. Für ,,normale'' GUI-Objekte wird ein dem ersten Konstruktor entsprechender Wert erzeugt. Dieser enthält die ObjectID, die dieses spezielle Objekt eindeutig identifiziert und eine Referenz auf das zu diesem Objekt gehörende Statusobjekt (die ObjectID und das Statusobjekt werden jedoch von obiger Funktion automatisch erzeugt, daher will ich hier auch darauf nicht weiter eingehen).

Der externe Typ muß immer eine Instanz der Klasse GUIObject sein:

class GUIObject w where
  toGUIObject     :: w -> GUIOBJECT  -- Wandeln in interne Repräsentation
  cname           :: w -> String     -- textelle Repräsentation
  cset            :: GUIValue a => w -> ConfigID -> a -> IO w   -- vordefiniert
  cget            :: GUIValue a => w -> ConfigID -> IO a        -- vordefiniert

Die Instanz für ein Objekt sieht dann z.B. für ein Label aus wie folgt:

instance GUIObject (Label a) where 
  toGUIObject (Label w) = w
  cname _ = "Label"

So kann bei Bedarf durch die Klassenmethode toGUIObject der externe Typ in die interne Repräsentation gewandelt werden. Die cname-Methode liefert lediglich eine textuelle Repräsentation des Objekttyps und kann z.B. für Debug-Ausgaben benutzt werden. Die Methoden cset und cget sind wichtig bei der Implementierung von Objekt-Konfigurationen und werden im folgenden besprochen.



Christoph Lueth
Wed May 29 14:12:28 MEST 2002