Seltsame Fehlermeldung

  • Hallo,

    gestern habe ich mal wieder an einem komplexen Programm für den Unterrichtseinsatz gebastelt und bekam plötzlich beim Start des Programms folgende Fehlermeldung: „ObjListLinkObjectsToTree: Visible setzen geht für Vis-Objekte nicht“. Diese Meldung stammt noch aus der Zeit, als R-BASIC begann, mit Objekten zu arbeiten und sollte mich nur auf einen blöden Programmierfehler aufmerksam machen.
    Nach einiger Zeit Suche kam ich darauf, dass der Fehler diesmal damit zutun hat, wie R-BASIC die Objekte auf die verschiedenen Objektblöcke verteilt. Falls nämlich R-BASIC eine Tree von Vis-Objekten (VisObj, VisText, VisContent und LargeText die per Child/Parent miteinander verbunden sind) auf verschiedene Objektblöcke verteilt, kommt es zu diesem Fehler. Damit kommt offensichtlicher der Linker, der beim Programmstart die Child/Parent-Verbindungen wiederherstellt, nicht klar. Das muss ich damals übersehen haben oder ich habe einfach vergessen, es für Vis-Objekte zu implementieren. Für Nicht-Vis-Objekte (Groups, Buttons usw.) existiert dieses Problem nicht.

    Abhilfe schafft der Befehl ForceNewObjBlock. Er bewirkt, dass die folgenden Objekte in einen neuen Objektblock geschrieben werden. Man muss ihn vor dem problematischen Vis-Objekt-Tree platzieren. Direkt davor muss nicht sein, ich habe ihn vor das zugehörige Primary gesetzt.
    Damit kann man quasi die SDK-Version nachbilden, wo man die Objekte manuell in die passenden Objektblöcke platziert. Konzeptionell ist es sowieso eine gute Idee, Objekte, die funktionell zusammengehören, z.B. im gleichen Dialog zu sehen sind, in den gleichen Objektblock zu packen.

    Für den sehr seltenen Fall, dass man extrem viele im UI-Code definierte Vis-Objekte im gleichen Tree hat und R-BASIC sie deshalb trotzdem selbständig auf verschiedene Objektblöcke verteilt, muss man selber Hand anlegen. Man muss den Tree mit mehreren ForceNewObjBlock geschickt splitten, die Objekte im UI-Code nicht via Children-Anweisung über die Objektblock-Grenzen hinaus verbinden, sondern das manuell beim Programmstart nachholen. Im SDK (z.B. bei R-BASIC) muss man auch so vorgehen, wenn man die Objekt-Deklarationen auf mehrere Dateien verteilt.

    Letzte Bemerkung: Die VisContent-Methoden CreateVisObj und DestroyVisObj handeln die die Objektblöcke ebenfalls selbständig, sollten aber das oben beschriebene Problem nicht haben, weil sie nur zur Laufzeit eingesetzt werden können. Entsprechende Tests, was passiert, wenn man mehrere Objektblöcke braucht, habe ich damals vorgenommen :)

    Viele Grüße
    Rainer