Seite 1 von 1
For Schleife verlassen
Verfasst: Mi, 07.07.2010 06:50
von clag
Moin liebe Kenner und Könner
hier kommt die Frage einer Basic
SAU (stupid asking user)
wie kann ich eine doppelte FOR () verlassen
und kann man wie angedeutet neue For Schleifen beginnen mit den gleichen Zähler Variablen
in der Annahme die Zählerstände der verlassenen For schleifen werden übernommen ?
Code: Alles auswählen
..........
For X 1-5 ...
For y 1-9 ...
if 1+1=2 print "richtig"
if "hier wahr" go to weiter1
print "hallo "
next
next
:weiter1
For X 1-5 ...
For y 1-9 ...
wie müsste nun diese Zeile "if "hier wahr" go to weiter1 " in richtig aussehen
meine Idee dabei ist die gleichen Schleifen mit einer ersetzten Zeile "if 1+1=2 print "richtig" auzszuführen
aber auslachen gildet nicht

Re: For Schleife verlassen
Verfasst: Mi, 07.07.2010 07:04
von komma4
F1 Onlinehilfe Basic
EXIT FOR um eine Schleife zu verlassen
oder
GOTO Anweisung nutzen
Alternativ die Codierung ändern WHILE-Schleife nutzen, und die Zähler auf Maximalwert setzen:
Code: Alles auswählen
x = 1
y = 1
WHILE ( x<6 AND y<10 )
' wenn verlassen werden soll
x = 6
y = 10
'sonst hochzählen
x = x +1
WEND
Re: For Schleife verlassen
Verfasst: Mi, 07.07.2010 07:08
von Karolus
Hallo
Wenn du die "Zählerstände" der Schleifen übernehmen möchtest die du verlässt, willst du diese garnicht verlassen sondern innerhalb der Schleife ein 'if ... then [else]'
Gruß Karo
Re: For Schleife verlassen
Verfasst: Mi, 07.07.2010 07:30
von clag
Moin Ihr ...
vergesst bitte nicht den einleitenden dezenten Hinweis !
@ Karo
jaaannnein also eigentlich hast du schon recht,
ich möchte erreichen, dass das "if Gebilde" welches ich zum verlassen von for anwende
nach einmaligem wahr nicht Weiter unnötig oft ausgeführt wird,
also ein Sprung zu einem gleichen For For Konstrukt nur ohne "if "hier wahr" go to weiter1 "
und geändertem "if 1+1=2 print "richtig" " auf if 1+3=4 print "auch richtig"
ich befürchte das Beschriebene wird in euren Basic Augen zu massivem Juckreiz führen

Re: For Schleife verlassen
Verfasst: Mi, 07.07.2010 08:45
von Stephan
wie müsste nun diese Zeile "if "hier wahr" go to weiter1 " in richtig aussehen
Einfach in der Programmhilfe (F1) nachsehen - solche Dinge wie IF-THEN-GOTO betreffen die Sprache (StarBasic) und nicht das Objektmodell und sind in der Hilfe (eigentlich vollständig und erschöpfend) beschrieben
bzw. allgemein:
und kann man wie angedeutet neue For Schleifen beginnen mit den gleichen Zähler Variablen
in der Annahme die Zählerstände der verlassenen For schleifen werden übernommen ?
Angedeutet ist da nichts Erkennbares (außer wiederum allgemein zwei Schleifen). So wie Du die FRage stellst muß man das Ganze jedoch klar mit Nein beantworten. Die Zählerstände entsprechen den Werten der Variablen und es ist deshalb nicht direkt möglich mit den gleichen Variablen und vorhandenen Zählerständen fortzusetzen - es gilt eigentlich ohnehin was Karo sagte.
Soll doch mit gleichen Variblen und Zählerständen fortgesetzt werden (wofür es technisch keinen Grund gibt, denn die Nutzung der vorhandenen Zählerstände mit anderen Variablen wäre leichter), müssen halt die Zählerstände zweimal übergeben werden:
Code: Alles auswählen
'...
:weiter1
x1 = X
y1 = Y
For X = x1 To 5
For Y = y1 To 9
'...
Next Y
Next X
ich möchte erreichen, dass das "if Gebilde" welches ich zum verlassen von for anwende
nach einmaligem wahr nicht Weiter unnötig oft ausgeführt wird,
das ist mit Goto, wie auch bereits von Komma4 benannt, möglich z.B.:
(s.o.), da so beide Schleifen verlassen werden, also nichts nochmals wiederholt wird
Gruß
Stephan
Re: For Schleife verlassen
Verfasst: Mi, 07.07.2010 09:00
von clag
Hallo
dank eurer Hilfe "ist Flasch voll und ich habe fertig"
jetzt geht es mir erst einmal um eure Prüfung auf die Korrektheit des zusammengestellten Code bzw ob
1. so wie ich es mit Sprungmarke und den doppelten For For schleifen gemacht habe, hege ich die Hoffnung,
dass die "sp" und "ze" Werte nach dem Sprung mitgenommen werden
und das zweite For For Konstrukt da weitermacht wo das erste verlassen wurde ?
ist diese Hoffnung berechtigt ?
2. eine Lösung ohne sprung Marke, machbar/ sinnvoll weil besser wäre ?
hier die involvierten Threads
viewtopic.php?f=2&t=39940
viewtopic.php?f=18&t=39949
Code: Alles auswählen
Sub BF_markern
oDoc = ThisComponent
oSheet = ThisComponent.CurrentController.getActiveSheet()
oZell = oDoc.getCurrentSelection()
oZell.supportsService("com.sun.star.sheet.SheetCellRange")
oSelect=ThisComponent.CurrentSelection.getRangeAddress
oSelectColumn=ThisComponent.CurrentSelection.Columns
oSelectRow=ThisComponent.CurrentSelection.Rows
CountColumn=oSelectColumn.getCount
CountRow=oSelectRow.getCount
Start_Column=oSelect.StartColumn
End_Column=oSelect.EndColumn
Start_Row =oSelect.StartRow
End_Row=oSelect.EndRow
For sp = Start_Column to End_Column
For ze = Start_Row to End_Row
oSelectSR = oSelect.StartRow + 1
oSelectEC = oSelectColumn.getByIndex(CountColumn-1).getName
oBereich = oSheet.getCellByPosition(sp,ze)
oBedingungen = oBereich.getPropertyValue( "ConditionalFormat" )
BedFormat = oBedingungen.Count
if BedFormat > 0 Then
if oBereich.Annotation.IsVisible = true then
goto sprung1
end if
oSheet.getAnnotations.insertNew(obereich.celladdress(), "Zelle enthält ein BF"
REM hier ggf die BF neu auslesen und in die Kommentare neu einfügen
oBereich.Annotation.setIsVisible( True )
end if
next ze
next sp
msgbox "Die Überprüfung ist abgeschlossen!",64, "BF markern"
exit sub
sprung1:
' print "habe fertig gesprungen :)"
For sp = Start_Column to End_Column
For ze = Start_Row to End_Row
oSelectSR = oSelect.StartRow + 1
oSelectEC = oSelectColumn.getByIndex(CountColumn-1).getName
oBereich = oSheet.getCellByPosition(sp,ze)
oBedingungen = oBereich.getPropertyValue( "ConditionalFormat" )
BedFormat = oBedingungen.Count
if BedFormat > 0 Then
REM hier ggf die BF neu auslesen und in die Kommetare neu einfügen
oBereich.Annotation.setIsVisible( false )
end if
next ze
next sp
msgbox "alle BF Kommentare ausgeblendet ",64, "BF markern"
End Sub
edit
hier noch das Beispiel dazu
PS
basiert alles auf zusammengeklaubten Codestückchen
so copyright by everybody

Re: For Schleife verlassen
Verfasst: Mi, 07.07.2010 09:12
von bst
Morgen,
zwei weitere Alternativen.
cu, Bernd
--
Code: Alles auswählen
REM ***** BASIC *****
Option Explicit
Sub Main
dim x as integer, y as integer, bExit as boolean
for x = 1 to 10
for y = 1 to 5
if x = 3 and y = 4 then
bExit = true
exit for
endif
next
if bExit then exit for
next
print x, y
End Sub
Sub Main2
dim x as integer, y as integer
x = 1
do while x <= 10
for y = 1 to 5
if x = 3 and y = 4 then exit do
next
x = x + 1
loop
print x, y
End Sub
Re: For Schleife verlassen
Verfasst: Mi, 07.07.2010 09:18
von Stephan
1. so wie ich es mit Sprungmarke und den doppelten For For schleifen gemacht habe, hege ich die Hoffnung,
dass die "sp" und "ze" Werte nach dem Sprung mitgenommen werden
und das zweite For For Konstrukt da weitermacht wo das erste verlassen wurde ?
ist diese Hoffnung berechtigt ?
Nein.
Ich hatte auch bereits, am Beispiel der 2 anderen SChleifen, ausführlich erläutert warum nicht!
2. eine Lösung ohne sprung Marke, machbar/
Ja.
Wie bereits von Komma4 benannt, geht auch Exit For, was wegen der speziellen Anforderung nichts zu wiederholen, zweimal ausgeführt, also für innere (Y-Zähler) und äußere Schleife (X-Zähler), werden müßte
sinnvoll weil besser wäre ?
Nein, es ist lediglich ggf. aufwendiger.
Gruß
Stephan
Re: For Schleife verlassen
Verfasst: Mi, 07.07.2010 15:48
von clag
Hallo,
nachdem ich noch eine Weile auf den Info's hier gekaut habe
ist mir nun hoffentlich aufgegangen wie man die Werte aus der ersten ForSchleifenGruppe in eine andere angesprungene ForSchleifenGruppe übernimmt,
um an der Zellposition die man in ForGruppe1 verlassen hat, mit anderen Bedingungen in ForGruppe2 weiter zumachen.
Wenn man es erst einmal geschnallt hat ist es doch ganz logisch ........
Code: Alles auswählen
For sp = Start_Column to End_Column
For ze = Start_Row to End_Row
...........
if BedFormat > 0 Then
if ..... = true then
goto sprung1
end if
........
end if
next ze
next sp
exit sub
sprung1:
For spx = sp to End_Column
For zex = ze_Row to End_Row
.......
if BedFormat > 0 Then
.........
end if
next zex
next spx
End Sub