Mittels Break oder Continue aus Schachtel-Schleifen raus

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

Mittels Break oder Continue aus Schachtel-Schleifen raus

Beitrag von Delle »

Hallo,

im nachfolgenden Beispiel öffnet sich ein Filerequester und man wählt mehrere Dateien aus.

Danach wird eine Schleife durchlaufen und alles in eine LL geschrieben.

Sofern ein Dateiname schon in der LL vorhanden ist, soll er nicht gespeichert werden.

Das Beispiel funktioniert, sieht aber bischen "billig" aus.

Gibt es keine Möglichkeit das man von If Dateien()\Dateiname=load$" bei Erfolg gleich mittels Break/Continue runter zu Wend springt?

Das würde dieses "abbruch=1" usw. ersparen... Break(2) hilft ja hier auch nichts :-(

Code: Alles auswählen

load$=OpenFileRequester("",ordner$,"Texte (*.txt)|*.txt",0,#PB_Requester_MultiSelection)

If load$

	While load$

		ForEach Dateien()
		
			If Dateien()\Dateiname=load$
			
				MessageRequester("",load$+" ist bereits vorhanden!")
				abbruch=1
				Break
			
			EndIf
		
		Next
		
		If abbruch=1
		
			AddElement(Dateien())
			Dateien()\Dateiname=load$
			abbruch=0
		
		EndIf
		
		load$=NextSelectedFileName()

	Wend

EndIf
PB 6.21 | Win 11
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Mittels Break oder Continue aus Schachtel-Schleifen raus

Beitrag von NicTheQuick »

Ich verstehe bei deinem Beispiel nicht, warum die die Datei wieder hinzufügst, wenn sie schon drin ist.

///Edit:

Du kannst aber auch 'load$' dazu missbrauchen:

Code: Alles auswählen

load$ = OpenFileRequester("", ordner$, "Texte (*.txt)|*.txt", 0, #PB_Requester_MultiSelection)

While load$ <> ""
	ForEach Dateien()
		If Dateien()\Dateiname = load$
			MessageRequester("", load$+" ist bereits vorhanden!")
			load$ = ""
			Break
		EndIf
	Next
	
	If load$ <> "" And AddElement(Dateien())
		Dateien()\Dateiname = load$
	EndIf
	
	load$ = NextSelectedFileName()
Wend
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Mittels Break oder Continue aus Schachtel-Schleifen raus

Beitrag von Kiffi »

@Delle: Nimm ne Map. Die verhindert per Default
identische Einträge:

Code: Alles auswählen

NewMap Dateien.s()

load$=OpenFileRequester("",ordner$,"Texte (*.txt)|*.txt",0,#PB_Requester_MultiSelection)

If load$
  While load$
    Dateien(LCase(load$))=load$
    load$=NextSelectedFileName()
  Wend
EndIf
Außerdem würde ich den Benutzer nicht mit den
Messageboxen nerven.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

Re: Mittels Break oder Continue aus Schachtel-Schleifen raus

Beitrag von Delle »

NicTheQuick hat geschrieben:Ich verstehe bei deinem Beispiel nicht, warum die die Datei wieder hinzufügst, wenn sie schon drin ist.
Ja das sollte eigentlich in den nicht vorhandenen Else-Block ;)
Kiffi hat geschrieben:@Delle: Nimm ne Map. Die verhindert per Default identische Einträge:
Kenn ich nicht, mag ich nicht! :) Nein Spaß... hab noch nie damit gearbeitet, lese es mir aber gleich durch.
Kiffi hat geschrieben:Außerdem würde ich den Benutzer nicht mit den Messageboxen nerven.
Ja denk ich auch... entweder in nem Statusfeld ausgeben oder gar nicht :)
PB 6.21 | Win 11
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Mittels Break oder Continue aus Schachtel-Schleifen raus

Beitrag von ts-soft »

@Kiffi
Der Key einer Map erlaubt ja tatsächlich alle Buchstaben, ich dachte eigentlich Sonderzeichen wären dort nicht erlaubt.
Hab ich auch wieder etwas dazugelernt, danke :allright:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Mittels Break oder Continue aus Schachtel-Schleifen raus

Beitrag von STARGÅTE »

Du kannst das mit einer Fake-Schleife mache (die ich schon öfters im Forum angepriesen hab):

Code: Alles auswählen

Define FileNameList.s = OpenFileRequester("", "", "Texte (*.txt)|*.txt", 0, #PB_Requester_MultiSelection)

If FileNameList
	While FileNameList
		Repeat ; Fake-Schleife
			ForEach Dateien()
				If Dateien()\Dateiname = FileNameList
					Break 2 ; Aus ForEach und der Fake-Schleife springen.
				EndIf
			Next
			; wenn kein Sprung erfolgte, wird das hier ausgeführt
			AddElement(Dateien())
			Dateien()\Dateiname = FileNameList
		Until #True ; Fake-Schleife wird immer verlassen
		FileNameList = NextSelectedFileName()
	Wend
EndIf
@ts-soft: Ein Map-Key ist kein VariableName, dort sind sogar alle Zeichen erlaubt (auch Unicode) außer die NULL halt, weil es einfach n String ist.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten