gelöst: eine Stoppuhr 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: eine Stoppuhr im Dialog

Beitrag von erikafuchs »

Ich habe schon wieder was Neues.
Ein Kollege hätte gerne eine Stoppuhr im Dialog meines Rechenduells. In seinem Buch beschreibt Toxitom wie man ein Fortschrittsbalken im Dialog programmiert, da ist mir allerdings nicht klar wie man dafür sorgt, dass der weiterläuft, oder meine Stoppuhr weiterläuft, wenn der Dialog mit execute() gestartet wird, da bleibt ja doch erstmal alles stehen. ich habe wie in einem anderen Posting beschrieben, zwei Dialoge, in dem mit setvisible geöffneten, läuft die Stoppuhr brav - klar, sobald aber der zweite Dialog mit execute() geöffnet wird, bleibt sie stehen. Gehe ich recht in der Annahme, dass sich das mit der Stoppuhr auch nicht lösen lässt, sobald ein Dialog mit execute() geöffnet wird?
Zuletzt geändert von erikafuchs am Do, 19.03.2020 14:21, insgesamt 1-mal geändert.
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: eine Stoppuhr im Dialog

Beitrag von Toxitom »

Hey Pit,

ja, im Dialog gestartet mit execute() stoppt das darunterliegende Makro an dieser Stelle.

Dennoch kannst Du natürlich eine eigene Funktion (also z.B. eine Stoppuhr) als unabhängige Sub ider function starten und diese dann z.B. ein Textfeld im Dialog ständig aktualisieren lassen.
Start und Stop der Funktion musst Du halt über buttons (evt. geht es auch über Listener und Events) steuern. Und nicht vergessen: Wenn der Dialog geschlossen wird unbedingt auch die Unterfunktion beenden - zumindest dafür Sorge tragen, dass sie beendet wird!

VG
Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
erikafuchs
******
Beiträge: 690
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Re: eine Stoppuhr im Dialog

Beitrag von erikafuchs »

Hallo Tom,
also ginge meine Stoppuhr doch und meine Überlegung war nicht ganz falsch - wo liegt dann der Fehler:
[img]https://www.dropbox.com/s/nykhg1yv ... dl=0[/img] (mir gelingt es nicht mehr, Bilder hier direkt einzufügen)
Bei Klicken auf Start (1) wird der untere Dialog mit "setvisible" geöffnet (2), dann wählt man bei (3) einen Aufgabentyp, der Dialog (4) mit Aufgaben erscheint (mit execute) und gleichzeitig wird ein Kandidatenpaar ausgelost und bei (5) im unteren Dialog angezeigt. Hier sollte dann auch die Stoppuhr starten.
Ich dachte die Stoppuhr kann man in den Start des ersten Dialogs einbauen:

Code: Alles auswählen

	dDialogZu=0	
	z=0
	do while not dDialogZu
		dDialog.SetVisible(True)
		dDialog.getControl("Stoppuhr").text=z
		wait 1000
		z=z+1
	loop
diese Schleife sollte entweder dauernd durchlaufen werden, man kann sie aber auch durch Klicken auf "Fenster schließen" beenden - hier wird dDialogZu auf 1 gesetzt.
Die Stoppuhr bleibt aber sofort stehen wenn der zweite Dialog geöffnet wird.
Außerdem scheint der Klick auf den "Fenster schließen" Button nicht immer zu funktionieren
... was mache ich falsch?
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: eine Stoppuhr im Dialog

Beitrag von Toxitom »

Hey Pit,

wir drehen uns im Kreis. Deine Strategie wird nicht aufgehen. Zu viel Dialoge - und Basic ist nicht multi-Task fähig!!

1. Dialog mit setVisible angezeigt. Eine Endlosschleife verhindert das Schliessen des Dialoges. soweit ok. Die Schleife läuft, der Task auch. Dein gepostetet Code ist natürlich nicht ideal - der Aufruf "setVisible" gehört natürlich vor die do.. while Schleife und soll auch nur einmal ausgeführt werden. Führt aber hier nicht zu einem Fehler, ist ja nur eine Eigenschaft des Dialoges (Fenster).
2. Dialog wird gestartet durch ein Ereignis im ersten Dialog? oder durch ein Ereignis auf dem Tabellenblatt? (Bild kann ich nicht aufrufen). Hier würde ja nun ein zweiter Task beginnen, der mit Execute() gestoppt wird.

Wenn Du nun die Tasks wechselst, läuft immer nur der, der gerade aktiv ist - also das aktivierte Fenster. der Rest ruht.

Warum überhaupt der Umstand mit unterschiedlichen Fenstern etc. Pack doch alles in einen Dialog - teil den geschickt auf, vergib unterschiedliche Ebenen und ordne die die gebrauchten oder benötigten Kontrollelemente auf den einzelnen Ebenen an. Die können dann bei Bedarf ein oder ausgeblendet werden - und schon kannst Du all Deine Funktionen in einem Dialog (Task) unterbringen. Stoppuhr, Auswahl, Fragen etc. Das erspart Dir ne Menge Probleme und Ungereimtheiten....

VG
Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: eine Stoppuhr im Dialog

Beitrag von balu »

Hallo Pit,
Toxitom hat geschrieben: und Basic ist nicht multi-Task fähig!!
Und das Office ist ein sturer oller störischer Esel.

Mal angenommen bei einem läuft alles Super und es sind 10 Sekunden vergangen. Freude hoch 10, Bestzeit!

Bei einem anderen läuft es noch besser, nur 8 Sekunden. Lasst den Champus Fliesen!


TRÖÖÖÖÖÖÖÖÖÖT!!!!!!!!


Fehler im System!

Es ist nur einem einzigen aufgefallen das es nicht 8, sondern 11 Sekunden waren. Also nix mit Champus. *heul-snief*

Aber wie kommt dann die Zeit zustande?
Weil wegem dem Esel-Effekt.

Wenn in den Optionen die "Autowiederherstellungsinfo" aktiviert ist, wird sich das schnell Früher oder Später negativ bemerkbar machen. Denn wenn die Stoppuhr aktiviert ist, und diese genannte Info vom Office geschrieben wird, bleibt die Uhr stehen, sie tickt nicht weiter. Der Grund liegt am Office selber, denn während dieser Zeit lässt es keine, und zwar ABSOLUT KEINE weitere Aktionen zu. Und da dein Rechentrainer ja schon so seine Zeit zum normalen Öffnen und Speichern braucht, da ist ja wohl nix mehr mit weniger als 1 Sekunde, wird fast die gleiche Zeit auch für das schreiben der "Autowiederherstellungsinfo" benötigt. Erst wenn dies erledigt ist, läuft die Zeit wieder weiter. Das ist halt Praxiserfahrung.

Und wenn auch noch "Automatisches Speichern" und/oder "Backup erstellen" aktiviert ist, sind das weitere Kandidaten die die Stoppuhr eingefrieren lassen. Du siehst, da sind doch so ein paar Stolpersteine die Du irgendwie geregelt bekommen musst, damit es nicht zum Esel-Effekt kommt. Fragt sich nur wie?



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Hiker
******
Beiträge: 590
Registriert: Mo, 08.09.2014 21:34
Wohnort: Berlin

Re: eine Stoppuhr im Dialog

Beitrag von Hiker »

balu hat geschrieben: Do, 06.02.2020 20:37 Fragt sich nur wie?
Hallo,

dies Problem lässt sich noch halbwegs einfach lösen, indem er sich in jedem Schleifendurchlauf die Systemzeit holt und jedesmal die Differenz zur Startzeit bildet.

Ich hatte mich mehr gefragt, ob die Bedienbarkeit nicht leidet, wenn das Programm dauernd Denkpausen einlegt, anstatt direkt zu reagieren. Aber da die Oberfläche wohl autonom von BASIC reagiert, merkt man das beim heutigen CPU--Tempo wohl nicht mehr.

Mfg, Jörn
Libre Office 6.3.1 (Win 10 Pro) / Libre Office 6.0.7 (Win8.1 Pro, Win 7 Pro) / AOO (Win 7)
erikafuchs
******
Beiträge: 690
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Re: eine Stoppuhr im Dialog

Beitrag von erikafuchs »

Jhr Lieben!
Vielen Dank für die Mühe! Zunächst zu Balus Einwand: Das mit den genauen Zeiten ist nicht wirklich wichtig. Es handelt sich ja um ein Duell, der Schnellere bekommt den Punkt. bei den Probeläufen in der Schule habe ich jetzt entsetzt feststellen müssen, wie schlecht die Kids Kopfrechnen könne, da sind Schüler im 7ten Schuljahr mit 9 mal 12 komplett überfordert. Daher die Idee, die Zeit (wenigstens etwa) zu messen und nach einer angemessenen Zeit, beiden einen halben Punkt abzuziehen, Das passiert jetzt mit einem Button, nach gefühlter Zeit. Das mit der Stoppuhr hätte halt mehr hergemacht.
Und zu Tom, ja, das hatte ich ja schon befürchtet, dass das mit der Stoppuhr nicht so einfach ist. Das mit den zwei Dialogen hat sich so entwickelt: Der Rechentrainer fragt Aufgaben aus 35 Aufgabengebieten ab. Da habe ich für verschiedene Aufgabentypen mehrere Dialoge entwerfen müssen, für die Bruchrechnung brauche ich Felder für 3 gemischte Zahlen, für die Umrechnung Bruch in Komma und umgekehrt, zweimal Brüche (mit Zähler und Nenner) und ein Feld für die Kommazahl und dann halt noch eins für die anderen Aufgaben und noch für Wertetabellen... Der entsprechende Dialog wird geöffnet, füllt sich nach Eingabe der richtigen Lösung mit neuen Aufgaben und geht nach 10 Aufgaben zu. Dann gibt es noch Lösungen, Hilfen und das in einer normalen Version und einmal als Test, mit Benotung - ach ja, und bei vielen Aufgaben werden dann noch Grafiken angezeigt, u.A. auch ein Koordinatensystem, das auch per Makrocode erstellt wird und das zwischenzeitlich auch einigermaßen Parabeln zeigt (dazu gibt es einen anderen Post). Das Rechenduell ist jetzt als zusätzliche Option zum "normalen" Rechentrainer dazugekommen und wird in einem eigenen Tabellenblatt genutzt. Wenn ich da jetzt einen Dialog draus erstellen muss, komme ich garantiert durcheinander, oder ich muss alle bestehend Dialoge mit den Duellangaben ergänzen. Das gibt garantiert Chaos. Mal sehen, ob ich mich da drantraue.
Aber noch zwei Fragen: Vorausgesetzt ich hätte nur einen Dialog (den ich möglichst mit execute() öffnen möchte (damit der Nutzer z.B. nicht in den Grafiken rumbasteln kann). Wie würde ich da eine Stoppuhr einbinden, diese sollte loslaufen, sobald eine neue Aufgabe eingefügt wird, dies passiert durch Abfrage des Tastendrucks im Dialogergebnis (bzw. den verschiedenen Ergebnissen - bei der Bruchrechnung), nachdem das Ergebnis als richtig eingestuft wurde.
Wie würde das mit den Ebenen funktionieren, kann ich da die Felder der obengenannten Dialogvorlagen jeweils gruppieren, die Gruppen übereinanderlegen und jeweils eine komplette Gruppe einblenden? Das könnte ich mir vorstellen.
Und dann noch: Ich kann keine Bilder mehr hier einfügen. Die liegen in der Dropbox und wenn ich sie einfügen will, bekomme ich die Meldung, dass deren Größe nicht überprüft werden könne, Verkleinern der Bilder hilft auch nicht. Ich hatte die Bilder jetzt als Link eingefügt, bei mir klappt das, bei euch anscheinend nicht.
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: eine Stoppuhr im Dialog

Beitrag von balu »

Hoi Pit,
Toxitom hat geschrieben: vergib unterschiedliche Ebenen
Keine Ahnung was für eine Sprache Tom da spricht, oder ob das in LO mittlerweile seit der 6er Linie anders heisst. Ich persönlich kenne keine Ebenen, sondern nur Seiten.

Wie würde das mit den Ebenen funktionieren
Wenn es sich also bei Ebenen um Seiten handelt, dann befasse dich mal hiermit.
4.1.6 Wie kann man mehrseitige Dialoge erstellen?
Das wäre so gesehen der Grundstein zum besseren Verständnis was das mit Seiten auf sich hat.

Und als nächstes kannst Du dir mal anschauen was ich mit Mehrseitigen Dialogen so angestellt habe. Teilweise habe ich das System von der verlinkten Seite übernommen, und teilweise habe ich auch natürlich so gesehen etwas eigenes kreiert.

Auch wenn ich es dort geschrieben habe, so schreib ich es auch hier noch mal extra und ganz bewusst:

Bitte erst den dortigen Text lesen!

Also denne, Klick mich!



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
erikafuchs
******
Beiträge: 690
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Re: eine Stoppuhr im Dialog

Beitrag von erikafuchs »

Ich sitze immer noch an der Stoppuhr.
@toxitom und @balu (Dein Beispiel finde ich eindrucksvoll - vielleicht mache ich da was mit), ich habe mich mit den mehrseitigen Dialogen beschäftigt, das passt irgendwie nicht. Ich unterscheide jetzt zwischen der "normalen" Nutzung (da starte ich den Aufgabendialog mit execute) und der Arbeit mit der Duellfunktion (da öffne ich die zwei Dialoge mit setvisble).
das funktioniert auch gut ... meistens. Auf meinem Standardcomputer fast immer, bei meinen Testern nur eine Zeitlang, dann hängt sich das Programm auf. Das habe ich gemacht:
Bild
Bei "Wartezeit" gibt man die Wartezeit (variable: 'zeit') ein, wählt durch Klicken links eine Aufgabenart aus, der Aufgabendialog erscheint. Nach der eingestellten Wartezeit erscheint der Kandidatendialog (lieber @Balu, ob dies genau Sekunden sind, ist nicht so wichtig). Man gibt das Ergebnis ein und klickt auf den entsprechenden Kandidaten. Nach Klicken auf "nächste Aufgabe" wechselt die Aufgabe und nach der Wartezeit kommt das nächste Kandidatenpaar. Nach der voreingestellten Aufgabenzahl (hier) 10 gehen beide Dialoge zu.
Mein Code zum Öffnen der Dialoge:

Code: Alles auswählen

		dDialog.SetVisible(false)
		oDialog.setVisible(True)
		aweiter=0									'stoppt die Schleife nach  der Auslosung der neuen Kandidaten
		Zeit=dusheet.getCellByPosition(8,1).value*(-1)  	'die Zelle mit der Wartezeit
		DialogeAuf=1
		do while DialogeAuf
			dDialog.getControl("Stoppuhr").text=Zeit
			dusheet.getCellByPosition(8,0).value=zeit
			oDialog.GetControl("Eingabe").setFocus()					
			if Zeit>=0 then dDialog.SetVisible(True)
			wait 1000
			Zeit=Zeit+1
		loop
		dDialog.SetVisible(false)
		oDialog.setVisible(false)
... und bei Klick auf "nächste Aufgabe:

Code: Alles auswählen

	dDialog.SetVisible(false)
	Zeit=dusheet.getCellByPosition(8,1).value*(-1)
	AWeiter=1
Zur Kontrolle habe ich oben über der Zelle mit der Wartezeit den Wert von 'Zeit' angezeigt. Das funktioniert 20 mal oder 30 mal und irgendwann bleibt "Zeit" stehen, das kann man in der Zelle über "Wartezeit" sehen. Ist mein Code falsch oder muss ich woanders suchen?
Vielleicht traut sich ja auch jemand an meine Datei? ich habe sie von 720kb auf 130kb abgespeckt. Nur die Aufgaben der Grundschule funktionieren:
Rechentrainer Dialoggerüst2.ods
(127.36 KiB) 186-mal heruntergeladen
erikafuchs
******
Beiträge: 690
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Re: eine Stoppuhr im Dialog

Beitrag von erikafuchs »

Ist mein Code falsch oder muss ich woanders suchen?
... mir scheint, der gezeigte Code ist nicht das Problem. Ich habe den Code geändert und blende jetzt den 2.Dialog nicht mehr aus, sondern blende die Kandidaten erst nach der Wartezeit ein:

Code: Alles auswählen

		dDialog.SetVisible(true)
		oDialog.setVisible(True)
		'if zeile<19 or zeile>22 then oDialog.GetControl("Eingabe").setFocus()					
		aweiter=0
		zeit=dusheet.getCellByPosition(8,1).value*(-2)
		n=0
		DialogeAuf=1
		do while DialogeAuf
			dDialog.getControl("Kandidat1").getModel().BackgroundColor=standard
			dDialog.getControl("Kandidat2").getModel().BackgroundColor=standard			
			dDialog.getControl("Stoppuhr").text=zeit\2
			dDialog.getControl("Kandidat1").text=string(n,"*")
			dDialog.getControl("Kandidat2").text=string(n,"*")					
			if zeile<19 or zeile>22 then oDialog.GetControl("Eingabe").setFocus()
			if zeit>=0 then
				dDialog.getControl("Kandidat1").text=kandi1name
				oStyle=oDoc.StyleFamilies.getByName("CellStyles").getByName(kandi1farbe)
				dDialog.getControl("Kandidat1").getModel().BackgroundColor=oStyle.CellBackColor
				dDialog.getControl("Kandidat2").text=kandi2name
				oStyle=oDoc.StyleFamilies.getByName("CellStyles").getByName(kandi2farbe)
				dDialog.getControl("Kandidat2").getModel().BackgroundColor=oStyle.CellBackColor				
			end if					
			'if zeit>=0 then dDialog.SetVisible(True)
			wait 500
			zeit=zeit+1
			n=n+1
			if dusheet.getCellByPosition(8,2).value>0 then
				if zeit/2 > dusheet.getCellByPosition(8,2).value then 
					zeit=0
					neuekandi
				end if
			end if
			if zeit>100 then exit do
		loop
		dDialog.dispose
		oDialog.dispose		
Manchmal gibt es keine neuen Kandidaten (da liegt wohl der Fehler) - das kann man aber durch erneutes Klicken auf "neue Aufgabe" überspringen.
... nun ja, vielleicht interessiert es ja jemanden. Das komplette Duell gibt es hier: https://medien.bildung.hessen.de/liz/re ... duell.html
Antworten