[gelöst] wait - Anweisung spielt in "for to"- Schleife verrückt.

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

Moderator: Moderatoren

MerlinOO
Beiträge: 7
Registriert: Di, 06.12.2022 16:30

[gelöst] wait - Anweisung spielt in "for to"- Schleife verrückt.

Beitrag von MerlinOO »

Hallo erstmal an alle im Forum, schön dass es euch gibt,
noch schöner wenn ihr mir helfen könnt.
Ich habe in einem Spiel für Darter in Calc (in Potable-Version - da diese auf anderen Rechnern ohne Installation laufen soll) eine simple Warteschleife erstellt die einen Countdown herunterzählt mit for x to y step -1 und wait 1000 wird das auch brav gemacht.
Den jeweiligen Wert lasse ich mir ein eine Zelle (B1) anzeigen.
Wenn nun aber während des Zählens über eine Schaltfläche ein Makro gestartet wird und das Programm erneut in die Schleife kommt scheint es als werde die wait-Anweisung ignoriert und die Werte "fliegen" nur so dahin (in B1).
Wenn ich eine Stoppmarke setze und die Prozedur Schritt für schritt durchlaufen lassen funktioniert es. Daher habe ich versucht an verschiedenen stellen wait-Bremsen einzubauen, da ich dachte das irgendein Prozess mehr Zeitbenötigt, aber das hat leider nicht geholfen.
Ich habe auch die For-to Schleife auch schon mit "while until" bze. Do-Loop schleifen versucht aber es tritt immer ein ähnlicher Fehler auf.
Irgendwie stehe ich nach gefühlten 100 Stunden versuchen auf dem Schlauch. Kann das evtl. mit fehlendem Java-Pfad zu tun haben?
Die ganze Datei ist leider zu groß zum Hochladen (863kb) als zip noch 648kb.
daher hier die Passage wo ich Probleme habe:

sub warten 'warten und Zeit in B1 anzeigen
myHeader = "Jacky 4 Check"
myDoc = thisComponent
mySheet = myDoc.sheets.getbyname("Jacky4Check")
mycell = mysheet.getCellByPosition(1,0)
myString = mycell.string
for timex = xxtime to 0 step -1
wait 1000
mycell.string = "Zum Checken: "& timex & " Sek."
next
end sub
Zuletzt geändert von MerlinOO am Mi, 21.12.2022 08:14, insgesamt 2-mal geändert.
8) ..kaum macht man es richtig - schon geht's !
mikeleb
*******
Beiträge: 1316
Registriert: Fr, 09.12.2011 16:50

Re: wait - Anweisung spielt in "for to"- Schleife verrückt.

Beitrag von mikeleb »

Hallo,
Wenn nun aber während des Zählens über eine Schaltfläche ein Makro gestartet wird und das Programm erneut in die Schleife kommt
Wie soll ich mir das vorstellen?
MerlinOO
Beiträge: 7
Registriert: Di, 06.12.2022 16:30

Re: wait - Anweisung spielt in "for to"- Schleife verrückt.

Beitrag von MerlinOO »

..die Spieler haben während die Uhr (Zeitschleife) läuft Zeit eine Aufgabe zu lösen. Wenn sie es schaffen klickt jemand auf einen Button, der ein Makro auslöst, dass entsprechend Punkte einträgt. Dadurch wird diese For-To-Zeitschleife verlassen. Nachdem eine neue Aufgabe angezeigt wird, soll die Uhr wieder von neuem Laufen usw.. Aber wenn das Programm ein zweites Mal in diese Warteschleife kommt, werden in sehr schneller Reihenfolge in B1 Zahlenwerte zwar im Bereich des Möglichen angezeigt, jedoch scheint die "wait-Anweisung" keine Wirkung mehr zu haben und die Schleife wird nur durch Aufruf irgendeines anderen Makros (per Button) wieder verlassen. Ich habe das gestern auf einem win10 Rechner mit fest installiertem OpenOffice und Java getestet,. Es kam leider dasselbe raus. Ich habe auch an verschiedenen Stellen wait oder print-Anweisungen eingbaut, aber konnte das Problem dadurch nicht lösen und schon gar nicht erklären. Wenn ich eine Stopmarke vor der Schleife setze und step by step (F8) weiter mache funktioniert alles wie es soll und die Schleife wird auch wieder verlassen, wenn die Uhr auf Null ist. Weiterhin ist mir aufgefallen, dass beim Durchlaufen der for-to Zeitschleife in dem Sheet bei jeder Wiederholung (for-to) eine Neuberechung durchgeführt wird. Ich erzeuge z.B. in einigen Feldern Zufallszahlen um die Aufgabe zu gestalten, diese Zufallszahlen ändern sich bei jedem Rücksprung von next auf for - to. Aber das ist vielleicht normal und würde mich nicht stören, da die erzeugten Zufallszahlen kopiert und nur die Werte in eine andere Spalte geschrieben werden. Ich würde die Datei gerne zur Verfügung stellen, aber ich bekomme sie nicht kleiner.
8) ..kaum macht man es richtig - schon geht's !
mikeleb
*******
Beiträge: 1316
Registriert: Fr, 09.12.2011 16:50

Re: wait - Anweisung spielt in "for to"- Schleife verrückt.

Beitrag von mikeleb »

Hallo,
ich denke, dass es daran liegt, dass dein warten-Makro nun mehrfach aufgerufen (es wird ja durch das 2. Makro nicht beendet) wird und dadurch mehrfach Daten geschrieben werden.
Ein Lösungsidee findest du anbei. Das zweite Makro startet dabei das warten nicht neu, sondern setzt die Schleifenvariable nur wieder auf den Anfang.
Dateianhänge
countdown.ods
(10.1 KiB) 60-mal heruntergeladen
Gruß,
mikeleb
MerlinOO
Beiträge: 7
Registriert: Di, 06.12.2022 16:30

Re: wait - Anweisung spielt in "for to"- Schleife verrückt.

Beitrag von MerlinOO »

ich denke, dass es daran liegt, dass dein warten-Makro nun mehrfach aufgerufen (es wird ja durch das 2. Makro nicht beendet) wird und dadurch mehrfach Daten geschrieben werden.
Vielen Dank erstmal für die Antworten.
Das was du schreibst klingt logisch. Gibt es denn eine Möglichkeit, ein Makro aufgrund eines Ereignisses (z.B. klick auf Button) per Exit Sub oder End Sub "ordentlich" praktisch von "außerhalb des Makros" zu beenden? Oder kann man z.B. beim Aufruf eines Makros mitgeben, dass es vorher beendet wird um so ein Verhalten zu verhindern?
Das Beispiel mit dem Countdown hatte ich schon gefunden und finde es auch interessant. Wenn das die Lösung ist, werde ich mein Werk umbauen. Nachtrag: Habe grad gesehen dass Du das Coundown-Makro etwas angepasst hast oder - vielen Dank.
8) ..kaum macht man es richtig - schon geht's !
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: wait - Anweisung spielt in "for to"- Schleife verrückt.

Beitrag von Toxitom »

Hey Merlin,
..Gibt es denn eine Möglichkeit, ein Makro aufgrund eines Ereignisses (z.B. klick auf Button) per Exit Sub oder End Sub "ordentlich" praktisch von "außerhalb des Makros" zu beenden?..
Klar. Arbeitest Du einfach mit einem globalen Flag.

Also soetwas wie:

Code: Alles auswählen

dim bFlag as Boolean   'global, also vor der ersten Sub oder Function definieren!

sub warten 
  bFlag = false
....
 for timex = xxtime to 0 step -1
   if bFlag then exit sub
   wait 1000
   mycell.string = "Zum Checken: "& timex & " Sek."
 next

end sub

sub ButtonPressed
   bFlag = true
end sub
Viele Grüße
Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
MerlinOO
Beiträge: 7
Registriert: Di, 06.12.2022 16:30

Re: wait - Anweisung spielt in "for to"- Schleife verrückt.

Beitrag von MerlinOO »

Hallo toxitom, sorry für meine Unkenntnis. Hab noch nie mit "globalem Flag" gearbeitet.
Würde der verhindern, was passiert, wenn ich in obigem Beispiel von mikeleb in das sub "mitteilung" einen Rücksprung in "warten" einfüge? Denn das führt bis zum Programmabsturz.

Code: Alles auswählen

REM  *****  BASIC  *****
global timex

const xxtime=60

sub warten 'warten und Zeit in B1 anzeigen
'myHeader = "Jacky 4 Check"
myDoc = thisComponent
mySheet = myDoc.sheets(0)'.getbyname("Jacky4Check")
mycell = mysheet.getCellByPosition(1,0)
myString = mycell.string
for timex = xxtime to 0 step -1
wait 1000
mycell.string = "Zum Checken: "& timex & " Sek."
next
end sub

sub mitteilung
msgbox "Du hast eine Aufgabe gelöst"
timex=xxtime
warten ' dieser Sprung führt bei mir zum Chaos und Programmabsturz
end sub
Nach dem Beispiel vom mikeleb (im Original) müsste ich einen zweiten Button klicken um das Programm nach der Auswertung/Mitteilung wieder zu starten. Das wollte ich vermeiden.
Ich belese mich mal zum "global Flag"...

Ich glaube ich hab's kapiert. So funktioniert es dann wohl:

Code: Alles auswählen

REM  *****  BASIC  *****
dim bFlag as Boolean   'global, also vor der ersten Sub oder Function definieren!
global timex
const xxtime=6

sub warten 'warten und Zeit in B1 anzeigen
bFlag = false
'myHeader = "Jacky 4 Check"
myDoc = thisComponent
mySheet = myDoc.sheets(0)'.getbyname("Jacky4Check")
mycell = mysheet.getCellByPosition(1,0)
myString = mycell.string
for timex = xxtime to 0 step -1
wait 1000
mycell.string = "Zum Checken: "& timex & " Sek."
next
msgbox "Timeout - Ok für Neustart"
warten
end sub

sub mitteilung
'msgbox "Du hast eine Aufgabe gelöst"
timex=xxtime
bFlag = true
end sub
Am Ende von "warten" muss ich ja noch definieren, was passieren soll, wenn die Zeit abläuft. Das kann ich ja nach oder statt der msgbox "Timeout" machen.

Vielen Dank
8) ..kaum macht man es richtig - schon geht's !
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: wait - Anweisung spielt in "for to"- Schleife verrückt.

Beitrag von Toxitom »

Hey Merlin,

also, es verhindert schon den doppelten oder dreifachen Start des Warten Makros. Aber: Du definierst ja tatsächlich auch die Variable "timex" als globale Variable - und zwar tatsächlich als systemübergreifende, globale Variable. Davon rate ich grundsätzlich ab. Erstens ist es an sich nie wirklich nötig (außer in ganz seltenen Fällen) und zweitens führt dies in der Regel nur zu unberechenbaren Effekten.

Eine mit global definierte Varaible behält Ihren Wert solange eine Instanz von LO geöffnet ist und kann auch von jedem Programm manipuliert werden. Das ist sicher nicht im Sinne Deines Programms!
Mir ist auch nicht klar, warum Du in deinem Programm "mitteilung" die Variable "timex" wieder auf 60 setzt (den WErt der Konstanten xxtime). Völlig sinnlos meiner Ansicht.

Deine Warteschleife setzt den Wert doch sowieso auf einen neuen Ausgangswert.... aber vielleicht hast Du ja noch andere Codeteile, die ich nicht kenne.

Eine vor der ersten Funktion/Sub definierte Variablen (mit dim, Private oder public) gilt solange das Makro läuft und kann Werte über einzelne Aufrufe transportieren. Für Deine "timex'" Variable aber weder nötig noch zielführend...

VG
Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
mikeleb
*******
Beiträge: 1316
Registriert: Fr, 09.12.2011 16:50

Re: wait - Anweisung spielt in "for to"- Schleife verrückt.

Beitrag von mikeleb »

Hallo toxitom,
da das Makro von mir stammt, antworte ich mal:
Mit Global hast du Recht, Public reicht sicher aus.
Mein Ansatz war folgender:
Der Countdown wird gestartet (da ich nicht wusste wodurch, habe ich mal eine Schaltfläche dafür angelegt).
Wenn nun während des Countdown das Makro "mitteilung" gestartet wird (der Spieler hat eine Aufgabe gelöst), setze ich darin die Schleifenvariable (die im Makro "warten") wieder auf ihren Startwert, sodass der Countdown wieder von neuem beginnt (ohne dass das Makro "warten" neu gestartet wird")
Der Neuaufruf des Makro "warten" ist falsch und nicht sinnvoll.
Gruß,
mikeleb
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: wait - Anweisung spielt in "for to"- Schleife verrückt.

Beitrag von Toxitom »

Hey Mikeleb,

ok, das macht Sinn. Dann bräuchte man auch das Flag zum Abbruch nicht ;)
Kann man also so machen :)

Ich mag zwar die Klarheiten einzelner Anweisung mehr und würde die Abbruch-Variante vorziehen schon um Timingprobleme bei weiterlaufenden Dauermakros zu umgehen - aber das ist halt Geschmackssache :mrgreen:

In dem Sinne - auf gutes Gelingen für den Fragesteller :)

VG
Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
MerlinOO
Beiträge: 7
Registriert: Di, 06.12.2022 16:30

Re: wait - Anweisung spielt in "for to"- Schleife verrückt.

Beitrag von MerlinOO »

Vielen Dank für die Mühe. Ganz zufrieden bin ich leider noch nicht.
Zur Info eine kurze Beschreibung

Ablauf des Spiels:
Klick auf Button Start
>im Hintergrund werden 14 Zufallszahlen erzeugt – bleiben aber noch versteckt
>Info über Grenzwerte
>Abfrage des xxtime-Wertes um die Zeitbegrenzung verändern zu können
> Wenn keine Eingabe erfolgt wird der letzte Wert übernommen
> erste Zahl wird gezeigt – Uhr beginnt zu laufen
>wird die Zahl gecheckt muss ein Button Team A oder B geklickt werden
>alternativ kann auch „geschoben“ werden, d.h. die Zahl gilt als nicht gecheckt und keiner erhält Punkte und es folgt die nächste Zahl.
>Punkte werden eingetragen – neue Zahl erscheint – Timer läuft neu.
Am Ende (nach 14 Durchgängen) werden Ergebnisse ausgewertet ect. und das Spiel kann durch Klicken auf Startbutton neu gestartet werden.

…genau da hakt es jetzt noch. Wenn ich ein neues Spiel starte und den alten Zeitwert übernehme rennt meine Zeit wieder durch.

Tom hat damit Recht, dass das setzen von timex in dem Beispiel unnötig ist. Bei vielem Probieren (ohne ausreichendes Grundwissen) habe ich viel experimentiert. Daher hatte ich timex als global gewählt, weil ich den Wert in anderen Sub‘s testweise neu gesetzt habe. Ich habe die Variablen jetzt als public dimensioniert.
Leider habe ich das mit dem Flag noch nicht verstanden.
Wenn ich die Zeitschleife unterbreche (durch Button der andere Makros auslöst) dann muss nach der Auswertung doch die Uhr von neuem laufen. Warum ist dann der Neuaufruf „warten“ dann falsch? Wenn das Programm nach allen „Umwegen“ ja wieder in der For – to Schleife(Countdown) ankommen würde, wäre das schön. Aber das klappt bei mir nicht so. Ich hatte es auch schon, dass der Zeitwert ins minus gelaufen ist.
Daher meine Idee irgendwo in den anderen Makros den xxtime-wert wieder hoch zu setzen.
Ich füge den Code aus diesem Modul mal hier ein. Es gibt noch andere Module die nur die Buttons beeinhalten oder andere Spielvarianten. Die vielen Print Anweisungen sollten mir helfen Fehler zu finden.

Code: Alles auswählen

REM  *****  BASIC  *****
dim bFlag as Boolean
public winteam as string
public GameO as Boolean
public oPlayer1
public bInit
public timex 'as integer
public xxtime as integer
'const xxtime=6
public timeout as Boolean

sub loeschen
myDoc = thisComponent
mySheet = myDoc.sheets.getbyname("Jacky4Check")
mySheet.getCellRangeByName("J3:J16").clearContents(7)
mySheet.getCellRangeByName("N3:N16").clearContents(7)
mySheet.getCellRangeByName("H3:H16").clearContents(7)
End sub

Sub Start
print "Start Gameover", GameO
Dim toCheck(14) As integer
Dim reihe As integer
Dim Von As integer
Dim Bis As Integer
Dim i As integer
Dim i2 As integer
myDoc = thisComponent
mySheet = myDoc.sheets.getbyname("Jacky4Check")
mycell = mysheet.getCellByPosition(5,0) 
Von = mycell.value
mycell = mysheet.getCellByPosition(7,0) 
Bis = mycell.value
MsgBox  "Der Scoring-Bereich ist zwischen "& Von & " und " & Bis & " und kann oben geändert werden. Änderungen gelten im neuen Spiel", 0+64, "Säckchenspiel ***GAME ON***"
myDoc = thisComponent
mySheet = myDoc.sheets.getbyname("Jacky4Check")
Reihe = 0
beep
If Bis = 170 then  ' Pruefen wegen Boogiezahlen - sonst keine 14 Zahlen möglich.
	Bis = 163
	If Von > 149 then Von = 149
End if	
loeschen
For i = 1 to 14
    toCheck(i) = Int((Bis - Von) *Rnd) + Von
	If i > 1 then
		for i2 = 1 to i-1
	 	if toCheck(i) = toCheck(i2) then
		 	i = i - 1
	 		exit for
	 	end if
	 	next
	End if  	 
    mycell = mysheet.getCellByPosition(13,i+1)
	mycell.value = toCheck(i)
	mycell = mysheet.getCellByPosition(14,i+1)
	mycell.value = i
next i
settimeout
'xxtime = sWert
'timex=xxtime
print timex , xxtime
warten
End Sub

sub settimeout
Dim sWert As integer
Dim min as integer
min = 5
myDoc = thisComponent
mySheet = myDoc.sheets.getbyname("Jacky4Check")
mycell = mysheet.getCellByPosition(0,0)
altWert = mycell.value
mineingabe:
sWert = InputBox ("Zeitlimit in Sek. eingeben. Wird nicht innerhalb der Zeit gecheckt, "& _
"kann die Zeit neu gestartet werden oder es werden beiden Teams 0 Punkte eingetragen."& _
"Bei 0 oder 'enter' wird der zuletzt eingegbenen Wert von " & altWert & " Sek. übernommen","Zeitlimit bis zum Timeout")
    'MsgBox ( sWert , 64, "Bestätigung")
if sWert = 0 or "" then
'	mycell = mysheet.getCellByPosition(15,0)
   	sWert = altWert
   	print "Wert bleibt bei: ", sWert
end if
   
if sWert < min then
   	msgbox "Ein Wert unter "& min &" Sekunden macht wenig Sinn. So schnell ist nur ""Bully Boy""."
	goto mineingabe
	'settimeout
end if 
'print "SWert in set ", sWert
'print sWert
xxtime = sWert
'myDoc = thisComponent
'mySheet = myDoc.sheets.getbyname("Jacky4Check")
mycell = mysheet.getCellByPosition(0,0) 
mycell.value = sWert
'print "xxtime vor End Sub", xxtime
End Sub


Sub warten 'warten und Zeit in B1 anzeigen
bFlag = false
'myHeader = "Jacky 4 Check"
myDoc = thisComponent
mySheet = myDoc.sheets.getbyname("Jacky4Check")
mycell = mysheet.getCellByPosition(1,0)
myString = mycell.string
'print "xxtime in warten", xxtime
for timex = xxtime to 0 step -1
wait 1000
mycell.value = timex
next
'msgbox "timeout!" '################################################## TIMEOUT
timeout = true
if MsgBox ("TIMEOUT!- keine der Mannschaften erhält Punkte. --- " & _
" 'Ja' für nächste Zahl  ----  'Nein' = Zeit zurücksetzen und nochmal versuchen. ", 4+48 ,"TIMEOUT - zur nächsten Zahl oder nochmal versuchen?") = IDYES then
timex=xxtime
winteam = "x"
Teamwin
'exit sub
''warten
end if
'print "zurück von Teamwin"
warten
end sub

Sub Teamwin
Dim Zeile as integer
Zeile = 0
odoc = thiscomponent
    oSheet = oDoc.sheets.getbyname("Jacky4Check")
    oCellRange = oSheet.getCellRangeByName("H2:H16")
    oEmptyCells = oCellRange.queryEmptyCells
    oFirstEmptyCell = oEmptyCells(0).getCellByPosition(0,0)
    sColumn = oFirstEmptyCell.Columns(0).Name
    aCelladdress = oFirstEmptyCell.Celladdress
    Zeile = aCelladdress.Row
    myDoc = thisComponent
	'mySheet = myDoc.sheets(0)
	mySheet = myDoc.sheets.getbyname("Jacky4Check")
    mycell = mysheet.getCellByPosition(7, Zeile)
	mycell.string = winteam
	Jacky
	Gameover
	If GameO = true then
		mySheet = myDoc.sheets.getbyname("Jacky4Check")
		mycell = mysheet.getCellByPosition(1,16)
		myString=mycell.string
		MsgBox "GAME OVER - " & myCell.string , 6+64, "OK - für neues Spiel"
		'bFlag = true
		Start
    	Exit Sub
    End If
timex=xxtime
End Sub

Sub Jacky
myDoc = thisComponent
mySheet = myDoc.sheets.getbyname("Jacky4Check")
mycell = mysheet.getCellByPosition(9,0)
myString=mycell.string
Score = mysheet.getCellByPosition(1,2)
myScore = Score.value
myString=mycell.string
If myString = "Jacky" then
	Beep
'	Wait 1000 ' Millisekunden warten 
	Beep
'	S_InitSounds  'aktivieren wenn Soundausgabe möglich ist.
	MsgBox "Wer die " & myScore & " mit der nächsten Aufnahme checkt verdient einen Jacky-Cola (oder ähnliches)!", 6, "J A C K Y  for  C H E C K ! -  für die " & myScore
End If
End Sub

Sub Gameover
GameO = false
'print "sub gameover"
myDoc = thisComponent
mySheet = myDoc.sheets.getbyname("Jacky4Check")
mycell = mysheet.getCellByPosition(2,1)
myString=mycell.string
If myString = "GAME OVER" then
	GameO = true
End If	
End Sub


'*******************************************************************************
'Soundausgabe
Sub S_InitSounds
     if bInit then
         S_Start_New
         exit sub
     endif
     sUrlSound = F_get_Sound_URL("Jacky.m4a")
     dim oPlayer as Object
     If GetGuiType() = 1 Then
         oSounMgr = CreateUnoService("com.sun.star.media.Manager_DirectX")
     Else
         oSounMgr = CreateUnoService("com.sun.star.media.Manager_GStreamer")
     End If
     If NOT IsNull(oSounMgr) Then
        If fileexists(sUrlSound) Then        
            oPlayer1 = oSounMgr.createPlayer(sUrlSound)
            oPlayer1.setPlaybackLoop(False)
            oPlayer1.setMediaTime(0.0)
            oPlayer1.start()
            bInit = true 'nach dem ersten Abspielen true -> beim den nächsten Durchlauf wird kein neuer Player initialisiert, sondern S_Start_New aufgerufen.
        End If
     End If
End Sub

function F_get_Sound_URL(sSoundname)
    sFolderUrl = Replace(ThisComponent.URL, ThisComponent.Title,"")'Bestimmung des aktuellen Verzeichnisses
    F_get_Sound_URL = sFolderUrl & sSoundname
end function


sub S_Start_New
    oPlayer1.setMediaTime(0.0)
    oPlayer1.start()
end sub
'****************************************************************************
8) ..kaum macht man es richtig - schon geht's !
mikeleb
*******
Beiträge: 1316
Registriert: Fr, 09.12.2011 16:50

Re: wait - Anweisung spielt in "for to"- Schleife verrückt.

Beitrag von mikeleb »

Hallo,
Wenn ich die Zeitschleife unterbreche (durch Button der andere Makros auslöst
Genau das passiert nicht wirklich. Das Makro läuft im Hintergrund weiter.
Gruß,
mikeleb
MerlinOO
Beiträge: 7
Registriert: Di, 06.12.2022 16:30

Re: wait - Anweisung spielt in "for to"- Schleife verrückt.

Beitrag von MerlinOO »

Genau das passiert nicht wirklich. Das Makro läuft im Hintergrund weiter.
...wenn dem so ist, dann müsste doch die Schleife beendet werden, wenn ich in dem extern gestartetem Makro den "to-wert"(global oder public) auf sein Maximum (in meinem Fall Minimum da der Zähler -1 ist) setze. Wenn ich das so weiter denke und das Makro aber weiterläuft - eben auch noch nach der Schleife - dann entsteht Chaos, weil sich nachfolgende Ereignisse bei mir stapeln könnten. D.h. laut meiner Logik, das entweder das extern (durch Button) gestartete Makro ein "natürliches" Ende haben muss und/oder nach der Zeitschleife ein Stopp z.B. durch msgbox eingebaut sein muss damit im Hintergrund noch laufende Prozesse beendet werden können(?). Ein Sprung aus dem externen Makro (oder in seiner Folge aufgerufene Makros) wieder in die Zeitschleife verschlimmern den Zustand also eher. Dann würde die Schleife theoretisch mehrfach laufen? Muss ich mir dass in mehreren Dimensionen vorstellen? Denn die in der Zeitschleife belegte(n) Variable(n) können doch immer nur einen Wert gleichzeitig annehmen. Wahrscheinlich tun sie das auch, nur ändert sich dieser bei Überlagerung ständig. Ich habe den Sinn des Flags noch nicht verstanden. Soll der Wert true oder false anzeigen, ob das Makro "warten" aktiv ist? Was bewirkt dann, wenn ich den Wert außerhalb ändere? Es gibt ja keine Abfrage des Flags (if Flag=true then ...). Zum Thema Flag habe ich leider keine Erklärung in der Hilfe gefunden. Gibt es andere Namen dafür?
Sorry, wenn ich euch hier mit meinen Gedanken belaste. Ich versuche nur zu verstehen, was ich (oder auch meine Makros) tun und will nicht nur fremde Schnipsel zusammentragen ohne den Zusammenhang zu verstehen.
8) ..kaum macht man es richtig - schon geht's !
mikeleb
*******
Beiträge: 1316
Registriert: Fr, 09.12.2011 16:50

Re: wait - Anweisung spielt in "for to"- Schleife verrückt.

Beitrag von mikeleb »

Hallo,
Variablen, die nur innerhalb der Sub deklariert sind, haben innerhalb dieser ihren Wert. Wird die Sub mehrmals aufgerufen, dann exisitieren mehrere parallel. Das ist, was du erlebt hast: der Countdown durchläuft alle möglichen Werte (aber nicht wie gewünscht in Sekundentakt), weil die Zelle durch mehrere (gleiche) Subs beschrieben wird.
So ein Flag ist (ähnlich der von global/public deklarierten timex) einfach nur eine Variable, die einen gewissen Status speichern soll und in mehreren Subs ausgewertet/gesetzt wird. Dadurch kann die eine Sub der anderen mitteilen, dass sie z. B. beendet werden soll (if bFlag then exit sub).
Wenn die Variable bFlag durch irgendetwas den Wert 1 erhält, wird die Sub "warten" beendet (und kann dann sauber neu aufgerufen werden).
Es ist also für dein Projekt wichtig, sauber zu analysieren, wann/wodurch welche Sub aufgerufen wird und wann sie beendet werden.
Gruß,
mikeleb
MerlinOO
Beiträge: 7
Registriert: Di, 06.12.2022 16:30

Re: wait - Anweisung spielt in "for to"- Schleife verrückt.

Beitrag von MerlinOO »

..vielen Dank mike. Ich glaube, jetzt hab ich es kapiert.

Nach längerem versuchen und umschreiben habe ich es nun dank eurer Hinweise hinbekommen. Ich habe die Zeitschleife in eine while-wend-Schleife mit dem Flag als Bedingung eingesetzt. Wird nun durch ein anderes Makro die Zeit-Flag auf false gesetzt und das Makro beendet, wird im nächsten wend-Durchlauf die Zeitschleife beendet. Den weiteren Spielablauf habe ich auch in eine while-wend-Schleife gepackt mit Flag = false als Bedingung.
So konnte ich doppelte Aufrufe verhindert und alles weitere jeweils durch If-then Abfragen in der Schleife erledigen.
Vielen Dank.
8) ..kaum macht man es richtig - schon geht's !
Antworten