Kann von JavaScript nicht zu Blöcken wechseln

Die Fehlermeldung:

Zeile 1: Cannot read properties of undefined (reading ‚attributes‘)

Was kann die Ursache für diesen Fehler sein? Es gibt Projekte, da ändere ich im JavaScript nur eine Ziffer und beim zurück schalten zu Blöcken kommt der Fehler. Früher konnte ich ganze Funktionen in den Quelltext einfügen.

Bei anderen Projekten funktioniert es. Es wird wahrscheinlich am Code oder den Erweiterungen liegen. Geladen ist Funk und Grove.

Ich benutze Windows mit Edge.

Lutz

Der Fehler kann so reproduziert werden:

input.onButtonEvent(Button.A, input.buttonEventClick(), function () {
basic.showNumber(0)
})
input.onButtonEvent(Button.B, ButtonEvent.Click, function () {

})

Immer wenn im Code eine ENUM enthalten ist, kann nach einer Änderung (hier der Ziffer 0) nicht von JavaScript zu Blöcken zurück gewechselt werden. Die ENUM ist hier ButtonEvent und erst im neuen MakeCode hinzu gefügt worden. Wenn man ButtonEvent.Click im JavaScript ersetzt durch input.buttonEventClick(), dann kann wieder zu Blöcken umgeschaltet werden.

Das passierte auch, wenn die Erweiterung radio-broadcast geladen ist. Dort gibt es die ENUM RadioMessage. Hier ist der Fehler inzwischen behoben, weil die Deklaration der ENUM mit in den JavaScript Code eingefügt wird.

enum RadioMessage {
message1 = 49434,
Stop = 61268
}

Die ENUM ButtonEvent selbst in JavaScript zu schreiben führt zu der Fehlermeldung:
Duplicate identifier ‚ButtonEvent‘.

Ich beantrage die Korrektur des Fehlers.

Lutz

Hallo Lutz,

in

input.onButtonEvent(Button.B, ButtonEvent.Click, function () {
basic.showNumber(1)
})

kann ButtonEvent.Click offenbar nicht implizit nach number gecastet werden.

Mit einem expliziten cast

input.onButtonEvent(Button.B, ButtonEvent.Click as number, function () {
basic.showNumber(1)
})

gelingt das und der Typescript Code kann compiliert und im Blockmodus dargestellt werden und der funktioniert dann auch.

Das macht aber viel besser die Funktion

export function buttonEventClick(): number {
return ButtonEvent.Click;
}

in input.ts.

Benutze bitte einfach die, genauso wie in Deinem Button.A Ereignis - Block.

Gruß Raik

Ja … da kann ich aber nicht die neuen Events gedrückt, losgelassen, lange geklickt und halten benutzen. Es funktioniert aber, wenn ich einfach die entsprechende Zahl in das Ereignis schreibe:
image
(Der Block ‚eine Dezimalzahl‘ ist in Mathematik zu finden.)


Das Ereignis ‚halten‘ funktioniert im Simulator nicht. Auf dem Calliope kommt das Ereignis nach ca. 2 Sekunden ohne loslassen. Wenn ich beide Knöpfe halte, kommen allerdings beide Ereignisse. Das habe ich dann im Code abgefangen. So kann ich das jetzt gebrauchen. … Und anstatt ‚halten‘ die ‚5‘ oben rein schreiben.

Lutz

Hallo Lutz,

das verstehe ich nicht ganz.

grafik

Unter „Eingabe / mehr / Ereignisse“ gibt es alles was Du brauchst.

Gruß Raik

Hallo Lutz,

jetzt habe ich es auch gesehen:

Wenn ich das hier

nach Typescript umschalte, macht Makecode folgendes daraus:

input.onButtonEvent(Button.A, ButtonEvent.LongClick, function () {
basic.showNumber(0)
})

input.onButtonEvent(Button.B, ButtonEvent.Up, function () {
basic.showNumber(1)
})

input.onButtonEvent(Button.AB, input.buttonEventClick(), function () {
basic.showNumber(2)
})

Die Unregelmäßigkeit zwischen Click und den beiden neuen Event - Typen ist auffällig.
Ändere ich den Code nicht, kann ich wieder fehlerfrei in den Blockmodus umschalten.

Ändere ich den Code, muss neu compiliert werden, und es kommt zum oben genannten Fehler.

Wenn ich mir mal die neue input.ts ansehe, entdecke ich die Funktion buttonEventValue (die buttenEventClick ist übrigens block - hidden)

Wenn ich jetzt diesen Code im Editormodus einfüge, lässt er sich klaglos in den Blockmodus überführen. Damit entstehen dann oben dargestellte Blöcke.

input.onButtonEvent(Button.A, input.buttonEventValue(ButtonEvent.LongClick), function () {
basic.showNumber(0)
})

input.onButtonEvent(Button.B, input.buttonEventValue(ButtonEvent.Up), function () {
basic.showNumber(1)
})

input.onButtonEvent(Button.AB, input.buttonEventValue(ButtonEvent.Click), function () {
basic.showNumber(2)
})

Meine Vermutung ist, dass der Fehler bereits beim Generieren des Typescript - Codes passiert -
ich vermute die neue Funktion buttonEventValue(ButtonEvent.xxx) sollte besser in allen Fällen generiert werden.

Was meinen die Jörn und Juri dazu?

Gruß Raik

Die Funktion
input.buttonEventValue(ButtonEvent.LongClick)
von Hand in JavaScript eingefügt lässt zwar zu Blöcken zurück schalten, aber dabei wird der neue Code automatisch umgewandelt zu ButtonEvent.LongClick und das Problem stellt sich von selbst wieder her. Es geht also kein zweites Mal.

In der Erweiterung radio-broadcast wird auch eine ENUM verwendet. Die wird dann in den JavaScript Code mit eingefügt. Irgendwie geht das schon.

Lutz

Richtig. Es geht ja schon beim ersten Mal nicht richtig.

Ich hab einen PR mit den nötigen Änderungen an Microsoft gestellt: V4 updates by Amerlander · Pull Request #210 · microsoft/pxt-calliope · GitHub

Wenn der gemerged ist kann das über die MakeCode Beta getestet werden und wenn dort alles gut ist veröffentlichen wir es in die live Version von MakeCode.

3 „Gefällt mir“