2.22 :init()

Die eingebaute Methode :init() ist eine vordefinierte, überschreibbare Methode. Das heißt diese Methode wird intern immer nach dem Anlegen eines Objektes ausgeführt, nur kann der Benutzer diese Methode redefinieren und eine eigene Initialisierung angeben. Dem Benutzer steht frei, wie die Reihenfolge der Initialisierung sein soll; ob zuerst das Vaterobjekt und dann die Kindobjekte oder gar erst teilweise den Vater, dann die Kindobjekte und danach die restliche Initialisierung des Vaters.

Die :init()-Methode kann nicht direkt aufgerufen werden.Sie hat vordefinierte Parameter auf die innerhalb der Methode zugegriffen werden kann. Die Methode hat keinen Rückgabewert (also void).

Definition

void :init
(
  object  Model     input,
  object  Parent    input,
  object  Module    input,
  integer Type      input,
  boolean Invisible input
)

Parameter

Die vordefinierten Parameter sind:

object Model input
Entspricht this.model.
object Parent input
Entspricht this.parent.
object Module input
Entspricht this.module.
integer Type input
Entspricht this.scope.
boolean Invisible input
Abhängig vom create()-Aufruf.

Redefinition

Die Methode kann direkt am Objekt überschrieben werden.

:init()
{
  // Regelcode wie gehabt
}

Bei der Redefinition werden weder die vordefinierten Parameter angegeben noch können zusätzliche Parameter angegeben werden.

Aufruf

Die Methode kann nicht direkt aufgerufen werden. Sie kann nur durch das Laden eines Moduls/Dialogs oder durch das dynamische Erzeugen von neuen Objekten mit den Funktionen create() oder DM_CreateObject() ausgelöst werden. Der direkte Aufruf wird ignoriert bzw. führt zu einem Fehler.

Ereignisverarbeitung nach dem Laden

Die :init()-Methode wird vor der start-Regel des Dialogs ausgeführt. Eventuelle Ereignisse können nicht berücksichtigt werden, sie werden nicht verarbeitet! Ebenso werden changed-Ereignisse nicht verarbeitet, es werden also keine on changed Regeln ausgelöst!

this:super()

Benutzung der Modellmethoden

Oftmals werden am Modell auch Initialisierungsmethoden definiert, diese sollen ebenfalls ausgeführt werden. Mit dem Aufruf von this:super() (ohne Parameter) werden die Modellmethoden ausgelöst.

Steuerung der Kinder

Existiert keine Modellmethode mehr und wird this:super() aufgerufen, dann werden die :init()-Methoden der Kinder aufgerufen. Existieren keine Kinder wird ohne Fehlermeldung zurückgekehrt. Besitzen die Kinder keine :init()-Methoden, dann wird an den Kindeskindern die :init()-Methoden aufgerufen. Damit kann der Benutzer steuern, wann und ob die Kinder initialisiert werden. Die Kinder des Dialoges werden nicht durch this:super() gesteuert.

Wichtiger Hinweis

Die Nutzung von fail() und pass this:super() sollte in der :init()-Methode unbedingt unterbleiben. In beiden Fällen werden auftretende Fehler ansonsten nicht mehr in den Trace- bzw. Logfile ausgegeben (Ausgabe von ***ERROR IN EVAL unterbleibt). Dies erschwert bzw. unterbindet eine Fehlererkennung beträchtlich.

Beispiel 1

dialog D1

model window MW
{
  :init()
  {
    static variable integer I := 1;
    !! Instanzen reichen uns zur Berechnung
    if Type = 3 then
      this.title := "Fenster Nr. " + I;
      I := I + 1;
    endif
  }
}

Beispiel 2

dialog D2

model record MRecWin
{
  !! einige wichtige Daten
  string Wichtig[100];
}

model window MW
{
  !! speichere hier den korrespondierenden Record
  object MyRec;
  :init()
  {
    this.MyRec := create(MRecWin, D);
  }
}

Anmerkung

Das obige Beispiel dient nur zur Illustration, das Beispiel lässt sich wesentlich einfacher formulieren:

dialog D2_Besser

 model window MW
{
  record MyRec
  {
    !! einige wichtige Daten
    string Wichtig[100];
  }
}

Beispiel 3

dialog D3

model window MW
{
  child groupbox G
  {
    :init()
    {
      !! mache etwas mit G
    }
  }
  :init()
  {
    !! mache etwas bevor :init() von den Kindern aufgerufen wird
    !! ...
    this:super();
    !! mache etwas nachdem :init() der Kinder ausgefuehrt wurde
    !! ...
  }
}

Beispiel 4

dialog D4

model window MW1
{
  child groupbox G
  {
    :init()
    {
      !! mache etwas mit G
    }
  }
  :init()
  {
    if Type = 3 then
      !! G wird nur initialisiert, wenn das this-Objekt kein Modell ist
      this:super ();
    endif
  }
}

model MW1 MW2
{
  :init()
  {
    !! mache etwas mit dem Objekt, hier wird die Methode von MW1 ausgefuehrt
    this:super ();
    !! mache noch etwas mit dem Objekt
  }
}

Beispiel 5

dialog D5

model groupbox MG
{
  :init()
  {
    print Parent;
    print Model;
    print Module;
    print Type;
    print Invisible;
  }
}
window W
{
}
on dialog start
{
  MG:create(W);
}

Ausgabe

W
MG
D5
3
false