Auslösen des "Bei Update"-Ereignisses

Ruben Stachowitz shared this question 2 months ago
Answered

Hallo!


Ich würde gerne wissen, warum das "Bei Update"-Skript eines Objektes nur dann ausgeführt wird, wenn man das Objekt selbst (also direkt) verändert und nicht, wenn es per Skript durch ein weiteres Objekt verändert wird. Das "Bei Update"-Skript einer Checkbox beispielsweise wird nicht ausgeführt, wenn der Wahrheitswert durch ein anderes Objekt bzw. Ereignis von true auf false oder von false auf true gesetzt wird. Das macht die Programmierung von Dateien, die ein hohes Maß an Steuerungs-Logik enthalten, ungleich viel komplizierter, da man den betreffenden Code, von dem man möchte, dass er ausgeführt wird, nicht bei einem Objekt "zentral" hinterlegen kann, sondern diesen in das "Bei Update"-Skript aller involvierten Objekte kopieren muss. Und natürlich muss man ihn dann gegebenenfalls auch überall wieder abändern, wenn sich der Code ändert! Wäre hier eine Anpassung der Implementierung möglich?

Gruß, Ruben

Comments (4)

photo
1

Zitat: Ich würde gerne wissen, warum....

In Deinem Beispiel ist die CheckBox ein freies Objekt, ansonsten könnte man die CheckBox nicht anklicken und sie würde am Bildschirm gar nicht erscheinen. Nur abhängige Objekte lösen das onUpdate automatisch aus, freie Objekte nur dann, wenn die Veränderung durch den Benutzer erfolgt (zB: der freie Punkt wurde durch den Benutzer bewegt).

--------------------------------

Vermutlich aus Performance-Gründen wurde Dein berechtigter Einwand/Vorschlag (damals) verworfen und stattdessen die Skript-Befehle "SkriptBeiUpdateAusführen( <Objekt> )" und "SkriptBeiMausklickAusführen( <Objekt> )" eingeführt. Diese können verwendet werden um Skript-Code nicht redundant kopieren zu müssen.

Alternativ und extrem hilfreich kann die Verwendung von sogenannten Skript-Listen sein. Dort besteht die Möglichkeit beim Aufruf (Ausführen) Parameter zu übergeben (sodass für nur leicht abweichende Varianten, nicht (teilweise) redundante Skripts erstellt werden müssen). Die Skript-Listen werden normalerweise als List-Objekte in der AlgebraAnsicht erstellt und von andern ("normalen") Skripten mit Ausführen() aufgerufen.

.

Und zuletzt aber am Wichtigsten:

Eine geschickte Verwendung der automatisch gepflegten Abhängigkeiten durch GGB (intern selbst) kann die Menge und die Abhängigkeits-Verwaltung der Skripte stark bis sehr stark reduzieren. Das erhöht nebst der Transparenz auch die Performance.

photo
1

Super! Tausend Dank für deine Antwort, Rami. Das hilft mir enorm weiter, da mir weder diese Skript-Befehle bekannt waren, noch die Existenz der Skript-Listen!


Ruben

photo
2

Sorry,

soeben glaube ich herausgefunden zu haben, dass meine Begründung (nur Abhängige Objekte ...) falsch resp. nur für CheckBoxen richtig ist. Die Texte unterhalb der Begründung sind aber voll gültig.

.

Siehe beigelegten Test (erweiterte Version: mit zweiter CheckBox)

Der freie Punkt A wird durch den Skript in der Schaltfläche bewegt, das scheint offensichtlich den Skript OnUpdate in A anzustossen.

.

Uebrigens: die Regeln scheinen sich gelegentlich zu ändern (immer seltener oder gar nicht mehr). Es gibt keine Doku dazu. Auch nach mehrmaligem Nachfragen (damals) habe ich keine Antwort bekommen.

photo
1

Ja, dass man auch mit freien Objekten das OnUpdate-Ereignis auslösen kann, wusste ich von meinen eigenen Dateien. Daher hat es mich ja auch so irritiert, dass man bei den Checkboxen eine davon abweichende Implementierung gewählt hat. (Sind das wirklich die einzigen Objekte die sich hier abweichend verhalten?)


Nochmal vielen Dank für deinen Hinweis auf die beiden mir bis dato unbekannten Skript-Befehle und die Skript-Listen. Das ist eine echte Bereicherung für mich. Und auch dafür, dass du dir die Mühe gemacht hast, eine Extra-Demo-Datei für mich zu erstellen.


Ruben

© 2019 International GeoGebra Institute