Tabellenzelle mit SetzeWert füllen?

abakus shared this question 4 years ago
Answered

Hallo,

ich möchte eine bisher leere Tabellenzelle mit Hilfe eines Script-Befehls füllen.

SetzeWert[A3,55] funktioniert aber nicht (selbst wenn die Zelle nicht mehr leer ist und schon eine andere Zahl drin steht.)

Da schließt sich gleich eine andere Frage an: kann man auf Zellen mit dem Objekt-Befehl zugreifen?

Objekt["A"+3] liefert mir auf alle Fälle nicht die Zahl in Zelle A3.


Was ich außerdem festgestellt habe: Es ist unmöglich, mit SetzeWert ein einzelnes Element einer Liste zu ändern.

SetzeWert[Element[Liste1,4],77] ändert nicht die vierte Zahl der Liste1 in die Zahl 77.


Viele Grüße

Abakus

Comments (3)

photo
1

Hallo Abakus


SetzeWert[] funktioniert nur wenn das Objekt:

- existiert

- ein freies Objekt ist oder ein Punkt auf einem Pfad

- kein Bild ist, keine Schaltfläche ist, vermutlich noch weitere

- der Skript nicht (vorher, aufgrund eines Fehlers) abgebrochen wurde

- der Skript auf Grund eines Fehlers nicht deaktiviert wurde (ob das heute noch so ist bin ich nicht sicher)

- Das Ereignis (für den Skript-Befehl) stattgefunden hat (Ich code irrtümlich oft in OnClick statt in OnUpdate, inzwischen finde ich diesen Fehler recht rasch).


SetzeWert[A3,55] müsste also funktionieren wenn obige Bedingungen erfüllt.

Ansonsten Beispiel senden. Uebrigens: eine mit Ziehen duplizierte Zelle ist nicht frei, da sie nicht den freien Wert sondern einen Bezug enthält.


Listen Elemente lassen sich verändern mit:

SetzeWert[<liste>, <index>, <wert>] es gelten obige Regeln (vermutlich für die ganze Tabelle, sicher für das Element)

auch Anfügen nach dem Letzten in der Liste ist möglich (Länge[<liste>]+1).


Objekt[] und Name[] funktionieren meistens nicht, Aber immer in der Eingabezeile, sofern sie grundsätzlich richtig sind (auch Objekt["A"+3]) weil dann die folgende Regel erfüllt ist:

"Es muss gewährleistet sein dass die betroffenen Objekte im KonstruktionsProtokoll vor der Anwendung dieser Befehle stehen." (so stand es mal im alten wiki)

In Skripts ist das fast nicht machbar. Es scheint aber noch andere Gründe zu geben warum es nicht läuft. Ich lass meist die Finger davon und verwende stattdessen:

Ausführen[{"SetValue[A"+<variable>+","+<variable>+"]"}]

Ausführen[{"SetValue["+UnicodeToLetter[<spaltenNummer>+64]+""+<zeilennummer>+","+<wert>+"]"}]


Anstelle die Tabellen-Inhalte mit Skripts anzupassen ist es vielleicht vorteilhafter die Werte mit Folge[] oder Zip[] aufzubereiten und sie als abhängige Objekte in die Tabelle zu übertragen. Das geht mit: Ctrl Taste drücken und halten (erst) dann Liste zu einer Tabellen-Zelle ziehen. Es erscheint ein Auswahlfenster (wie kopiert werden soll).

Uebrigens: man kann mit einer Folge auch Scripts generieren

<name>= Folge["<skript-befehl>", n,1,100] oder allenfalls mit Parametern: Anfügen[Folge["<skript-befehl>", n,1,100],%1] (ungetestet)

Ausführen[<name>]


Ich möchte Dich (der noch mit GGB 3.0 gearbeitet hat) eigentlich nicht vom Skripten abhalten. Aber falls Deine Gehversuche mit Skripts für Tabellenelemente resp Listen im Zusammenhang mit "PowerMod[]" erfolgen, müsste es alternativ mit Iteration[] machbar sein (ein etwas hübscherer Würgaround als mit Skripts, aber immer noch ein Würgaround). Dazu müsste man anstelle von mod[] mit einer selbst gebastelten adequaten Funktion arbeiten.


Gruss

Raymond

photo
1

Hallo Abakus


SetzeWert[] funktioniert nur wenn das Objekt:

- existiert

- ein freies Objekt ist oder ein Punkt auf einem Pfad

- kein Bild ist, keine Schaltfläche ist, vermutlich noch weitere

- der Skript nicht (vorher, aufgrund eines Fehlers) abgebrochen wurde

- der Skript auf Grund eines Fehlers nicht deaktiviert wurde (ob das heute noch so ist bin ich nicht sicher)

- Das Ereignis (für den Skript-Befehl) stattgefunden hat (Ich code irrtümlich oft in OnClick statt in OnUpdate, inzwischen finde ich diesen Fehler recht rasch).


SetzeWert[A3,55] müsste also funktionieren wenn obige Bedingungen erfüllt.

Ansonsten Beispiel senden. Uebrigens: eine mit Ziehen duplizierte Zelle ist nicht frei, da sie nicht den freien Wert sondern einen Bezug enthält.


Listen Elemente lassen sich verändern mit:

SetzeWert[<liste>, <index>, <wert>] es gelten obige Regeln (vermutlich für die ganze Tabelle, sicher für das Element)

auch Anfügen nach dem Letzten in der Liste ist möglich (Länge[<liste>]+1).


Objekt[] und Name[] funktionieren meistens nicht, Aber immer in der Eingabezeile, sofern sie grundsätzlich richtig sind (auch Objekt["A"+3]) weil dann die folgende Regel erfüllt ist:

"Es muss gewährleistet sein dass die betroffenen Objekte im KonstruktionsProtokoll vor der Anwendung dieser Befehle stehen." (so stand es mal im alten wiki)

In Skripts ist das fast nicht machbar. Es scheint aber noch andere Gründe zu geben warum es nicht läuft. Ich lass meist die Finger davon und verwende stattdessen:

Ausführen[{"SetValue[A"+<variable>+","+<variable>+"]"}]

Ausführen[{"SetValue["+UnicodeToLetter[<spaltenNummer>+64]+""+<zeilennummer>+","+<wert>+"]"}]


Anstelle die Tabellen-Inhalte mit Skripts anzupassen ist es vielleicht vorteilhafter die Werte mit Folge[] oder Zip[] aufzubereiten und sie als abhängige Objekte in die Tabelle zu übertragen. Das geht mit: Ctrl Taste drücken und halten (erst) dann Liste zu einer Tabellen-Zelle ziehen. Es erscheint ein Auswahlfenster (wie kopiert werden soll).

Uebrigens: man kann mit einer Folge auch Scripts generieren

<name>= Folge["<skript-befehl>", n,1,100] oder allenfalls mit Parametern: Anfügen[Folge["<skript-befehl>", n,1,100],%1] (ungetestet)

Ausführen[<name>]


Ich möchte Dich (der noch mit GGB 3.0 gearbeitet hat) eigentlich nicht vom Skripten abhalten. Aber falls Deine Gehversuche mit Skripts für Tabellenelemente resp Listen im Zusammenhang mit "PowerMod[]" erfolgen, müsste es alternativ mit Iteration[] machbar sein (ein etwas hübscherer Würgaround als mit Skripts, aber immer noch ein Würgaround). Dazu müsste man anstelle von mod[] mit einer selbst gebastelten adequaten Funktion arbeiten.


Gruss

Raymond

Hallo Raymond,

ich danke dir herzlich für die viele Mühe, die du dir machst.

SetzeWert[A3,55] hat heute mit einer ansonsten leeren Datei funktioniert.


Gestern versuchte ich das im Rahmen einer vorhandenen Datei, die schon eine ganze Reihe von Objekten hatte, da ging es nicht.


Ich habe mir gerade eine Liste mit 10 Nullen erstellt mit

L=Folge[0,n,1,10]

und

SetzeWert[L, 3, 88]

nachgeschoben (in der Hoffnung, aus der dritten Null eine 88 zu machen.

Es ging nicht. Aber ich habe jetzt den Grund: Bei einer manuell erstellten Liste geht es, nur nicht bei einer Folge.

Viele Grüße

Abakus

photo
1

Hallo Abakus,


Bei einer manuell erstellten Liste geht es, nur nicht bei einer Folge.


KopiereFreiesObjekt[] hilft da weiter.

Das ist ein Skript-Befehl. Bei Eingabe in der Eingabezeile wird das Objekt erzeugt, der Befehl dazu ist danach "weg".

Das Bedeutet: Folge[KopiereFreiesObjekt[n], n, 1, 10] funktioniert nicht (leider)


Lösung:

L1={}

L2=Folge[n,n,1,<variable>]

Skript in L2 OnUpdate

SetzeWert[L1, KopiereFreiesObjekt[L2]]


Gruss

Raymond

https://ggbm.at/569969

© 2019 International GeoGebra Institute