gelöst: Schleife im Dialog

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

erikafuchs
******
Beiträge: 690
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

gelöst: Schleife im Dialog

Beitrag 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
Dateianhänge
Testprogramm.ods
(11.04 KiB) 80-mal heruntergeladen
Zuletzt geändert von erikafuchs am Mo, 24.03.2014 22:57, insgesamt 1-mal geändert.
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Re: Schleife im Dialog

Beitrag von Karolus »

Code: Alles auswählen

for dummy = 1 to 10
    tu was
next dummy
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
erikafuchs
******
Beiträge: 690
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Re: Schleife im Dialog

Beitrag 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
Dateianhänge
Testprogramm2.ods
(10.35 KiB) 84-mal heruntergeladen
mikeleb
*******
Beiträge: 1427
Registriert: Fr, 09.12.2011 16:50

Re: Schleife im Dialog

Beitrag 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").
Dateianhänge
Testprogramm2_1mal1.ods
(10.18 KiB) 76-mal heruntergeladen
Gruß,
mikeleb
erikafuchs
******
Beiträge: 690
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Re: Schleife im Dialog

Beitrag 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
mikeleb
*******
Beiträge: 1427
Registriert: Fr, 09.12.2011 16:50

Re: Schleife im Dialog

Beitrag 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.
Gruß,
mikeleb
erikafuchs
******
Beiträge: 690
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Re: Schleife im Dialog

Beitrag 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
mikeleb
*******
Beiträge: 1427
Registriert: Fr, 09.12.2011 16:50

Re: Schleife im Dialog

Beitrag von mikeleb »

Hallo,

Respekt! 8)
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?
Gruß,
mikeleb
erikafuchs
******
Beiträge: 690
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Re: Schleife im Dialog

Beitrag 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
Dateianhänge
Rechentrainer de bug 381_Brueche.ods
(124.69 KiB) 83-mal heruntergeladen
mikeleb
*******
Beiträge: 1427
Registriert: Fr, 09.12.2011 16:50

Re: Schleife im Dialog

Beitrag 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.
Gruß,
mikeleb
erikafuchs
******
Beiträge: 690
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Re: Schleife im Dialog

Beitrag 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
Antworten