[gelöst] Weshalb geht das nicht mit einer Variablen?

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

Moderator: Moderatoren

wega
****
Beiträge: 148
Registriert: So, 03.06.2007 21:37

[gelöst] Weshalb geht das nicht mit einer Variablen?

Beitrag von wega »

Hallo zusammen,

ich möchte mir aus einem Writerdokument heraus einen Katalog erstellen.

Im Writerdokument gebe ich Startvariablen wie:
Laufwerk und Suchbegriff vor. (Hierzu den Bildanhang)

Mit einem Makro übernehme ich die Variablen ordnungsgemäß. Ich kann diese auch sichtbar machen durch
msgbox ....

Wenn ich den Suchbegriff in die Variable "myString" packe, ob mit Anfüngrungszeichen vorne und hinten, also
chr(34) & myString & chr(34), oder ohne, bricht die Funktion mit Out of Index Range ab.

Gebe ich aber den Suchbegriff von Hand ein, z.B. als ".ini", dann funktioniert das Ganze und ich bekomme meinen
Katalog.

Woran kann das liegen?

Ich lege meinen Code hier mal bei.

Code: Alles auswählen

Sub Katalog
'  REM Rahmenbedingungen
	GlobalScope.BasicLibraries.LoadLibrary("Tools")
	
	Dim oDoc , oForm , CtrlTextBox as Object
	Dim VerzeichnisAlt,VerzeichnisNeu,VerzeichnisTemp,MyText as string
	Dim Laufwerk, myString as String
	oDoc = thisComponent
	oform=odoc.drawpage.forms.getbyindex(0)
	CtrlTextBox = oForm.getByName("Textfeld1")
	Laufwerk = CtrlTextBox.text
	CtrlTextBox = oForm.getByName("Textfeld2")
	myString = CtrlTextBox.text ' <-- Textfelder werden richtig ausgelesen !!
	'Jetzt geht es zu auslesen

	erg=getDirs(liste(),0,Laufwerk)
	VerzeichnisAlt = ""
	
	REM Leeres Dokument erzeugen
	leerDoku
	
	for Zaehler = 0 to (erg - 1)
	VerzeichnisTemp = ConvertFromURL(Liste(Zaehler))
	VerzeichnisNeu = DirectoryNameoutofPath(VerzeichnisTemp,"\")
		If VerzeichnisNeu = VerzeichnisAlt then
			oDocument.getText().insertString(oViewC, chr(13) & (Liste(Zaehler))& chr(13), False)
		else 
			oViewC = oDocument.getCurrentController().getViewCursor()
			oDocument.getText().insertString(oViewC, chr(13) & (Liste(Zaehler))& chr(13), False)
		end if
		
		VerzeichnisAlt = VerzeichnisNeu
	next Zaehler
	msgbox "fertig"
end sub


Sub leerDoku
	Dim mArgs()
	oDocument = StarDesktop.loadComponentFromURL ("private:factory/swriter","_blank",0,mArgs())
	oDocument.title = "Katalog"
	REM Neues Dokument geöffnet
End Sub


function getdirs( liste(),z, folder) as integer

	sFolderUrl = ConvertToUrl( Folder )
	oSimpleFileAccess = createUnoService( "com.sun.star.ucb.SimpleFileAccess" )
    on error resume next
	aFolders = oSimpleFileAccess.getFolderContents( sFolderUrl,true )

	For i = LBound( aFolders ) To UBound( aFolders )-1
		sFile = aFolders( i )
		Endung = lcase(right(sFile,4))
		If oSimpleFileAccess.isFolder( sFile ) Then
			getdirs( liste(),z, sFile)
		Else
			
			'if Ucase(Endung) = Ucase(chr(34) & myString & chr(34)) then <-- funktioiert nicht !!
			'if Ucase(Endung) = Ucase(myString) then <-- funktioiert nicht !!
			if Ucase(Endung) = Ucase(".ini") then '<-- funktioiert !!
				liste(z) = sFile
				z = z + 1
			end if
		end if
	next i
	getdirs = z
	
end function
mit Gruß
Werner
Dateianhänge
Katalog-01.jpg
Katalog-01.jpg (5.41 KiB) 786 mal betrachtet
Zuletzt geändert von wega am Fr, 17.09.2010 17:57, insgesamt 1-mal geändert.
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Weshalb geht das nicht mit einer Variablen?

Beitrag von DPunch »

Aloha
wega hat geschrieben:Wenn ich den Suchbegriff in die Variable "myString" packe, ob mit Anfüngrungszeichen vorne und hinten, also
chr(34) & myString & chr(34), oder ohne, bricht die Funktion mit Out of Index Range ab.
An welcher Stelle bricht er mit "Index out of range" ab?
Der von Dir markierte Codeteil enthält eigentlich nichts, was eine solche Fehlermeldung begründen könnte.

Vom ersten Blick auf Deinen Code her fällt mir jedenfalls nur eines auf:
Hast Du die Variable "myString" global oder zumindest modulweit deklariert?
Wenn nein, dann tu dies, sonst kann die Variable logischerweise nicht in der Funktion "getdirs" bekannt sein.
Wenn ja, dann nimm die erneute Deklaration aus der Prozedur "Katalog" raus, sonst verschwindet die globale Variable "myString" und es gibt ab dem Zeitpunkt nur noch eine in der Prozedur "Katalog" gültige Variable "myString".

Code: Alles auswählen

Sub Katalog
'  REM Rahmenbedingungen
   GlobalScope.BasicLibraries.LoadLibrary("Tools")
   
   Dim oDoc , oForm , CtrlTextBox as Object
   Dim VerzeichnisAlt,VerzeichnisNeu,VerzeichnisTemp,MyText as string
   Dim Laufwerk, myString as String '<--------------------------------
wega
****
Beiträge: 148
Registriert: So, 03.06.2007 21:37

Re: Weshalb geht das nicht mit einer Variablen?

Beitrag von wega »

Hallo DPunch,

erst mal Danke für Deine Antwort.

Die Fehlermeldung kommt aus den Systemroutinen.

Ich habe mal ein Bildschirmfoto beigelegt. An den unten abgebildeten Reitern siehst Du, wo der Fehler auftritt.



mit freundlichem Gruß
Werner
Dateianhänge
Index_auszerhalb_des_Bereiches.jpg
Index_auszerhalb_des_Bereiches.jpg (59.96 KiB) 754 mal betrachtet
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Weshalb geht das nicht mit einer Variablen?

Beitrag von DPunch »

Aloha

Die Fehlermeldung bedeutet, dass Du der Tools-Funktion "DirectoryNameoutofPath" einen Leerstring übergibst, sprich in Deiner Variable "Liste" stehen nicht nur Filenamen, sondern auch Leerstrings.

Code: Alles auswählen

   for Zaehler = 0 to (erg - 1)
   VerzeichnisTemp = ConvertFromURL(Liste(Zaehler))
   VerzeichnisNeu = DirectoryNameoutofPath(VerzeichnisTemp,"\") '<----------------------------
wega
****
Beiträge: 148
Registriert: So, 03.06.2007 21:37

Re: Weshalb geht das nicht mit einer Variablen?

Beitrag von wega »

Hallo DPunch,

nochmals Danke für Deine Antworten.
Sie zeigen genau den richtigen Weg, schon Deine erste Antwort.

Ich habe die Variable myString als Private deklariert und schon funktioniert alles wie gewünscht.

Danke, ohne deine Hilfe hätte ich noch lang gesucht.

mit freundlichem Gruß
Werner
Antworten