Seite 1 von 1
gelöst: Schleife im Dialog
Verfasst: Sa, 15.03.2014 15:08
von erikafuchs
Hallo zusammen,
in meinem Programm (Rechentrainer - einige kennen es ja!) ist ein grundsätzlicher Fehler den ich endlich ausmerzen muss. Ich bekomme es aber nicht hin. Ich habe ein Beispielprogramm hier angehängt.
Ich habe ein Dialog der mit Aufgaben zum Einmalein gefüllt wird. Ist die Eingabe richtig sollen neue Aufgaben kommen, bei falscher Eingabe die Anzeige "Falsch". Und das Ganze in einer Schleife für 10 Aufgaben. Mein Code ist hier:
Code: Alles auswählen
dim oDialog as object, oA as Object, oB as Object, oC as Object, oText as object
dim iA as integer, iB as integer, iC as integer
dim iErg as integer
Sub Main
oDialog=createUnoDialog(DialogLibraries.Standard.Dialog1)
oA=oDialog.getControl("a")
oB=oDialog.getControl("b")
oC=oDialog.getControl("c")
oText=oDialog.getControl("Text")
iA=Cint(rnd()*9+1)
iB=Cint(rnd()*9+1)
oA.text=iA
oB.text=iB
iC=iA*iB
oDialog.execute()
End Sub
sub Richtig
if oC.text=iC then
oText.text ="richtig!"
else
oText.text ="falsch!"
endif
end sub
Die sub Richtig ist mit dem Ereignis "Text modifiziert" verbunden. Wie baue ich eine Schleife ein, die 10 mal durchlaufen wird?
Grüße
Pit
Re: Schleife im Dialog
Verfasst: Sa, 15.03.2014 17:20
von Karolus
Re: Schleife im Dialog
Verfasst: Sa, 15.03.2014 19:16
von erikafuchs
Lieber Karolus,
vielen Dank erstmal. Das mit for ... next kenne ich natürlich. Mir gelingt es aber nicht, dass das Dialogfenster stehen bleibt und die Werte "erneuert" werden.
Bisher habe ich das so gemacht:
Code: Alles auswählen
dim oDialog as object, oA as Object, oB as Object, oC as Object, oText as object, oEvt as object
dim iA as integer, iB as integer, iC as integer
dim iErg as integer, n as integer
Sub Main
oDialog=createUnoDialog(DialogLibraries.Standard.Dialog1)
oA=oDialog.getControl("a")
oB=oDialog.getControl("b")
oC=oDialog.getControl("c")
oText=oDialog.getControl("Text")
n=0
neueZahlen
oDialog.execute()
End Sub
sub neueZahlen
if n=10 then
oDialog.endexecute()
exit sub
end if
iA=Cint(rnd()*9+1)
iB=Cint(rnd()*9+1)
oA.text=iA
oB.text=iB
iC=iA*iB
end sub
sub Richtig (oEvt)
if oEvt.keychar=chr(13) then
if oC.text=iC then
oText.text ="richtig!"
wait(1000)
oC.text=""
oText.text=""
n=n+1
neueZahlen
else
oText.text ="falsch!"
endif
endif
end sub
... das funktioniert zwar, es taugt aber nichts, weil das Programm immer mehr Routinen aufmacht.
Grüße
Pit
Re: Schleife im Dialog
Verfasst: So, 16.03.2014 16:11
von mikeleb
Hallo,
bei mir lief dein Makro erstmal gar nicht, also nur bis zur Eingabe. Ich habe nun dem Ergebnis das Tastaturereignis zugeordnet und anstelle keychar keycode verwendet.
Nun läuft es und eigentlich macht es das, was du willst: 10 Aufgaben und dann ist Schluss (ich habe mal eine Aufgabennummer "dazugebaut").
Re: Schleife im Dialog
Verfasst: So, 16.03.2014 18:02
von erikafuchs
Lieber Mikeleb,
vielen Dank für deine Mühe. Das Tastaturereignis war wohl verlorengegangen. Den keycode=1280 kannte ich allerdings noch nicht. Ich nehme an, das ist auch die Returntaste? Ich hatte bisher entweder KeyCode = com.sun.star.awt.Key.RETURN oderKeyChar=chr(13) benutzt, wobei der erste auf dem Mac nicht zu funktionieren scheint.
Zurück zum Problem: Mein Programm ist ja umfangreicher und da taucht manchmal das Problem auf, dass anscheinend zwei Dialogfenster vorhanden sind. Das heißt eine Aufgabe wiederholt sich, die Antwort die meine Schüler eingeben wird als falsch gewertet und wenn sie sich die Lösung anzeigen lassen gehört diese zu einer Aufgabe die nicht angezeigt wurde. Ich hatte gehofft, man kann den ganzen Aufbau verändern, er scheint ja aber irgendwie in Ordnung zu sein. Ich habe jetzt den Code so geändert, dass ich den Befehl "oDialog.execute()" durch "if n=1 then oDialog.execute()" ersetzt habe, jetzt habe ich den Fehler nicht mehr. Ich fürchte, das klingt verwirrend und ist auch wahrscheinlich nicht logisch, vielleicht funktioniert es ja aber jetzt. Wenn du willst, schicke ich dir auch mal mein ganzes Programm, das ist aber nur was für starke Nerven.
Viele Grüße
Pit
Re: Schleife im Dialog
Verfasst: So, 16.03.2014 20:13
von mikeleb
Hallo erikafuchs,
das Programm würde mich schon interessieren! (Ich halte meine Nerven im Zaum

)
Bei mir (Linux, Libreoffice) liefert KeyChar bei der Returntaste nur eine 0 und ist somit nicht weiter auswertbar (seltsam, seltsam).
Wenn bei dir der Dialog mehrfach geöffnet wird, scheint irgendwo die Reihenfolge der Dialogaufrufe durcheinander gekommen zu sein, aber das ist so ins Blaue vermutet und ohne Gesamtcode nicht zu klären.
Re: Schleife im Dialog
Verfasst: So, 16.03.2014 22:45
von erikafuchs
Lieber Mikeleb,
na denn, ich habe dich gewarnt! Hier unten ist eine abgespeckte Version. Wenn du im Jahrgang 6 auf Start klickst, kommen 10 Aufgaben und manchmal (leider zu oft) kommt eine Aufgabe deren Lösung nicht stimmt. Du wirst dann feststellen, dass eine Aufgabe sich wiederholt und der Aufgabenzähler auch stehen bleibt. Die Makrobibliothek "Rechentrainer" ist nicht geschützt.
Solltest du die komplete Datei haben wollen - die findest du auf unserer Homepage "
www.igs-kelsterbach.de" unter "Downloads" -> "Rechentrainer" - möchtest du hier das Passwort haben, dann melde dich (Das Passwort dürfen unsere Schüler natürlich nicht haben - sie bekommen Noten auf ihre Arbeit mit dem RT!).
Viele Grüße
Pit
Re: Schleife im Dialog
Verfasst: Mo, 17.03.2014 18:08
von mikeleb
Hallo,
Respekt!
Mal sehen, wie weit ich komme. Nach einem ersten Blick fällt mir auf, dass
1) der Aufgabenzähler stehen bleibt, wenn man sich die Lösung anzeigen lässt
2) wenn man 4x ein falsches Ergebnis (für die gleiche Aufgabe) eingibt, der Dialog beendet wird (nachdem automatisch die Lösung gezeigt wird).
Ist das so gewollt oder Teil deines Problems?
Re: Schleife im Dialog
Verfasst: Mo, 17.03.2014 21:23
von erikafuchs
Lieber Mikeleb,
das finde ich ja toll, dass du dich wirklich da reinschaffst! Jawohl die beiden Beobachtungen von dir sind so gewollt. Schüler, die eine Aufgabe nicht können, können sich die Lösung anzeigen lassen, bekommen aber eine neue Aufgabe. Und wenn sie eine Aufgabe dreimal falsch haben, bekommen sie eine neue Chance mit einem neuen Start. Ich habe die Beispieldatei (unten als Anhang) nochmal etwas abgespeckt damit sie etwas übersichtlicher ist. Und erstelle gerade ein Flussdiagramm des Programms. ich habe das Gefühl, da ist irgenwo eine Schleife drin, die sich manchmal aufhängt. Leider halt nur bei etwa 5% der Aufgaben der Bruchrechnung (bei den anderen Aufgaben - kommt es sehr selten vor). Ich weiß ja nicht, ob du dir das Makro schon angesehen hast. Ich schreibe hier mal die Reihenfolge der Aufrufe auf:
Start ist bei sub Brueche (Aufgaben) -> DialogStart (Dialoge) -> Dialog -> Aufgabenstellung (Aufgst.lsg) -> UntermenueBrueche - alles zurück bis StartDialog und dort wird das Dialogfenster geöffnet. Wenn die Antwort eingetragen wurde, wird nach Betätigen der Entertaste -> EndeRechnen (Dialoge) -> Loesungsvergleich (Aufgst-Lsg) -> RichtigWerte (Dialoge)-> wieder der Dialog aufgerufen - und da ist wahrscheinlich der Fehler irgendwie in dieser Schleife. (In der Klammer steht immer der Name der Module in der sich die Prozeduren finden).
Viele Grüße
Pit
Re: Schleife im Dialog
Verfasst: Di, 18.03.2014 19:14
von mikeleb
Hallo,
ich habe zwei Fehler entdeckt:
1) in der function gemNenner (der Fehler ist fatal, da er ggf. zu einer Endlosschleife führt(e))
Code: Alles auswählen
function gemNenner
if aN > bN then
gemNenner=aN
do
if gemNenner mod bN = 0 then exit do
gemNenner=gemNenner+aN
loop
else
gemNenner=bN
do
if gemNenner mod aN = 0 then exit do
gemNenner=gemNenner+bN 'hier stand vorher aN'
loop
end if
end function
2) Beim Anzeigen einer Lösung fiel mir auf, dass der Aufgabenzähler manchmal durcheinander kommt und ich (zumindest per Eindruck) mehrmals den Button anklicken konnte bevor die Lösung per msgbox abgezeigt wurde. Hier wurde auch der Dialog erneut gestartet. Vorschlag:
Code: Alles auswählen
sub zeigeLoesung
oDialog.getControl("Loesung").setenable(false) 'Button deaktivieren'
' dSheet=ThisComponent.sheets.getByName("Daten") '
...
Loesungzeigen
aufgabenstellung
aufg=aufg-1 'späteres Rücksetzen des Zähler'
Dialog
oDialog.getControl("Loesung").setenable(true) 'Button wieder aktivieren'
' oDialog.execute() entfernen, da unnötig'
end sub
Soweit scheint es nun zu funktionieren.
Re: Schleife im Dialog
Verfasst: Di, 18.03.2014 20:40
von erikafuchs
Wahnsinn!
In dieser Ecke habe ich nicht gesucht. Das sieht gut aus. Es wäre toll, wenn wir da weiter zusammenarbeiten könnten. Bitte schicke mir deine Emailadresse, dann nehme ich dich in meinen Verteiler auf. Der neueste Rechentrainer (3.82) sollte morgen im Netz sein. Da sind zwar immer noch ein paar Bugs drin, aber die Bruchrechnung hat wirklich genervt. Ich hätte natürlich darauf kommen könne, dass der Fehler irgendwo bei den Brüchen steckt, denn nur da kam oft ein Fehler.
Vielen Dank und Grüße
Pit