Seite 1 von 2

[gelöst][Array] gleich mit String-Elementen vorbelegen

Verfasst: Mo, 04.04.2011 09:56
von opiWahn
Hallo,

in der einschlägigen Literatur und im Net werden Arrays am Beispeil von Integerwerten erklärt, welche nachträglich zugewiesen werden.
Geht das auch wie in anderen Sprachen, z.B. in dieser Form:

myArray ("Hund", "Katze", "Maus") as String
oder mit Zahlenreihen
myArray (0815, 4711) as Integer

... um dann über eine Schleife diese Werte einzulesen oder direkt anzusprechen mit oText.text = myArray(3)

Re: [Array] gleich mit Elementen vorbelegen - Typ String

Verfasst: Mo, 04.04.2011 10:09
von komma4
Das geht -aber nicht bei der Deklaration!

Code: Alles auswählen

Dim mArray(2) as String

mArray() = Array( "Hund", "Katze", "Maus" )

HIlft Dir das?

Re: [Array] gleich mit Elementen vorbelegen - Typ String

Verfasst: Mo, 04.04.2011 10:41
von opiWahn
Danke schon mal für die Erleuchtung :)
komma4 hat geschrieben:

Code: Alles auswählen

mArray() = Array( "Hund", "Katze", "Maus" )
ich gehe mal davon aus, daß anstelle von "Array" auch ein anderer "Sammelbegriff" stehen könnte, der mArray innerhalb der Sub zugeordnet wird.
Muß dieser Sammelbegriff nicht auch deklariert werden?

Re: [Array] gleich mit Elementen vorbelegen - Typ String

Verfasst: Mo, 04.04.2011 11:01
von Karolus
Hallo
Ich gehe mal davon aus, daß anstelle von "Array" auch ein anderer "Sammelbegriff" stehen könnte, der mArray innerhalb der Sub zugeordnet wird.
Falsch, 'array()' ist eine runtime-function die die Zeichenfolge: "Hund", "Katze", "Maus" in ein Array-objekt mit den Elementen "Hund" , "Katze" und "Maus" überführt.

Eigne dir mal ein paar Grundlagen an viewtopic.php?f=18&t=1553#p5832

Gruß Karo

Re: [Array] gleich mit Elementen vorbelegen - Typ String

Verfasst: Mo, 04.04.2011 11:42
von opiWahn
Hallo Karolus,

daß ich noch einiges, vorallem an Grundlagen, lernen muß weiss ich und mach ich auch. Hierzu hab' ich mir vor etwa 2 Wochen auch einen Wälzer für Schlappe 50,- Euronen zugelegt. Das Kapitel zu Thema Arrays umfasst jedoch nur 3 Seiten und geht auf die direkte Zuweisung nicht ein, zumindest nicht was Strings betrifft.

Soweit ich das verstanden habe sollte folgender Code auch funktionieren:

Code: Alles auswählen

' Database
Dim Context As Object, DB As Object, Connection As Object, QueryErg As Object
Dim DBName As String, SQL As String
Dim Statement As Variant

' FormObjects
Dim oForm As Object
Dim oText(11) as String

Sub Value_ANr

	oANr = inputBox ("Auftragsnummer","Eingabe erforderlich","Bitte Auftragsnummer eingeben")
	oForm = thisComponent.drawpage.forms.getbyindex(0)
	oText() = Array ("o_anrede", "o_name", "o_titel", "o_strasse", "o_ort", "r_anrede", "r_name", "r_titel", "r_strasse", "r_ort", "langtext")

        For i = 1 to 11
	  oText(i) = oForm.getByName(i)
        next i

	oEdit = oForm.getByName("chk_edit")
	
   		DBName = "REPARATUR"
		Context = createUnoService("com.sun.star.sdb.DatabaseContext")
		DB = Context.GetByName (DBName)
		Connection = DB.GetConnection ("","")
		Sql = "SELECT `objekt_anrede`,`objekt_name`,`objekt_titel`,`objekt_strasse`,`objekt_ort`,`rechnung_anrede`,`rechnung_name`,`rechnung_titel`,`rechnung_strasse`,`rechnung_ort`,`langtext` FROM `REPARATUR` WHERE `key` = '"+oANr+"';"	
		
		Statement = Connection.CreateStatement
		QueryErg = Statement.ExecuteQuery(SQL)
		
		for i = 1 to 11
			oText(i).text = trim(QueryErg.GetString(i))
			if i = 11 then
				TempText = trim(QueryErg.GetString(i))
				oText(i).text = Replace(TempText, Chr(10)+ Chr(13), "")
			end if
		next i
				
		Connection.Close()
		
		if oEdit.state(1) then
			for i = 1 to 10
				oText(i).ReadOnly = false			
			next i
		end if
	
End Sub
bis jetzt, und das möchte ich ändern/verkürzen, sieht das so aus:

Code: Alles auswählen

' Database
Dim Context As Object, DB As Object, Connection As Object, QueryErg As Object
Dim DBName As String, SQL As String
Dim Statement As Variant

' FormObjects
Dim oForm As Object
Dim oText(11) 

Sub Value_ANr

	oANr = inputBox ("Auftragsnummer","Eingabe erforderlich","Bitte Auftragsnummer eingeben")
	oForm = thisComponent.drawpage.forms.getbyindex(0)
	oText(1) = oForm.getByName("o_anrede")
	oText(2) = oForm.getByName("o_name")
	oText(3) = oForm.getByName("o_titel")
	oText(4) = oForm.getByName("o_strasse")
	oText(5) = oForm.getByName("o_ort")
	oText(6) = oForm.getByName("r_anrede")
	oText(7) = oForm.getByName("r_name")
	oText(8) = oForm.getByName("r_titel")
	oText(9) = oForm.getByName("r_strasse")
	oText(10) = oForm.getByName("r_ort")
	oText(11) = oForm.getByName("langtext")
	oEdit = oForm.getByName("chk_edit")
	
   		DBName = "REPARATUR"
		Context = createUnoService("com.sun.star.sdb.DatabaseContext")
		DB = Context.GetByName (DBName)
		Connection = DB.GetConnection ("","")
		Sql = "SELECT `objekt_anrede`,`objekt_name`,`objekt_titel`,`objekt_strasse`,`objekt_ort`,`rechnung_anrede`,`rechnung_name`,`rechnung_titel`,`rechnung_strasse`,`rechnung_ort`,`langtext` FROM `REPARATUR` WHERE `key` = '"+oANr+"';"	
		
		Statement = Connection.CreateStatement
		QueryErg = Statement.ExecuteQuery(SQL)
		
		for i = 1 to 11
			oText(i).text = trim(QueryErg.GetString(i))
			if i = 11 then
				TempText = trim(QueryErg.GetString(i))
				oText(i).text = Replace(TempText, Chr(10)+ Chr(13), "")
			end if
		next i
				
		Connection.Close()
		
		if oEdit.state(1) then
			for i = 1 to 10
				oText(i).ReadOnly = false			<-- geht nicht (?)
			next i
		end if
	
End Sub

Re: [Array] gleich mit Elementen vorbelegen - Typ String

Verfasst: Mo, 04.04.2011 15:13
von DPunch
Aloha
opiWahn hat geschrieben:Soweit ich das verstanden habe sollte folgender Code auch funktionieren:
In dieser Form nicht.
Arrays sind nullbasiert, sofern nichts anderes angegeben wird, das erste Element ist also bei Index 0, nicht bei Index 1

Code: Alles auswählen

        For i = 0 to 10
     oText(i) = oForm.getByName(i)
        next i
Abgesehen davon sollte der Code funktionieren.
Wobei mir nicht klar ist, was das "(1)" bei

Code: Alles auswählen

if oEdit.state(1) then
zu suchen hat, bzw. welchen Zweck es erfüllen soll.

Re: [Array] gleich mit Elementen vorbelegen - Typ String

Verfasst: Mo, 04.04.2011 15:52
von opiWahn
Hi DPunch,

klar fangen die Elemnete im Array bei 0 an. Hab so noch drin, weil es ursprünglich ein Element 0 gab, welches ich aber rausgeworfen habe weils unrelevant geworden ist.
Bei "if oEdit.state(1) then ..." will ich eigendlich nur abfragen ob der Status der Checkbox (Edit) 1 also an ist, um dann den ReadOnly-Status der Textfelder 0-10 auf false zu setzen.

Re: [Array] gleich mit Elementen vorbelegen - Typ String

Verfasst: Mo, 04.04.2011 17:09
von opiWahn
Habs jetzt mal versucht, allerdings wird an der 2. Schleife gemeckert, daß "oText" bereits anders definiert ist!
Abhilfe?

Code: Alles auswählen

' Database
Dim Context As Object, DB As Object, Connection As Object, QueryErg As Object
Dim DBName As String, SQL As String
Dim Statement As Variant

' FormObjects
Dim oForm As Object
Dim oText(10) as String
Dim aOpt1(), aOpt2(), aOpt3(), aOpt4()
Dim s1_1 As String, s1_2 As String, s2_1 As String, s2_2 As String, s3_1 As String, s3_2 As String, s4_1 As String, s4_2 As String

' ErrorProof
Dim grpfail1 As Variant, grpfail2 As Variant, grpfail3 As Variant, grpfail4 As Variant 
Dim errormsg1 as String

' save odt/PDF 
Dim datname As String, path As String, extension As String, odturl As String, pdfurl As String

' addForm
dim document   as object
dim dispatcher as object


'--------------------------------------------------------------------------------------------- Baustelle!
'Sub clearForm

'end Sub


'--------------------------------------------------------------------------------------------- Teilbaustelle!
Sub Value_ANr

'clearForm  
  
	oANr = inputBox ("Auftragsnummer","Eingabe erforderlich","Bitte Auftragsnummer eingeben")
	oForm = thisComponent.drawpage.forms.getbyindex(0)
	oText() = Array ("o_anrede", "o_name", "o_titel", "o_strasse", "o_ort", "r_anrede", "r_name", "r_titel", "r_strasse", "r_ort", "langtext")

' |--- sollte mit o.g. Array ersetzt werden -----------|
	'oText(1) = oForm.getByName("o_anrede")
	'oText(2) = oForm.getByName("o_name")
	'oText(3) = oForm.getByName("o_titel")
	'oText(4) = oForm.getByName("o_strasse")
	'oText(5) = oForm.getByName("o_ort")
	'oText(6) = oForm.getByName("r_anrede")
	'oText(7) = oForm.getByName("r_name")
	'oText(8) = oForm.getByName("r_titel")
	'oText(9) = oForm.getByName("r_strasse")
	'oText(10) = oForm.getByName("r_ort")
	'oText(11) = oForm.getByName("langtext")
'|----------------------------------------------------------|
		for i = 0 to 10
			oText(i) = oForm.getByName(i)
		next i
		
	oEdit = oForm.getByName("chk_edit")
	
   		DBName = "REPARATUR"
		Context = createUnoService("com.sun.star.sdb.DatabaseContext")
		DB = Context.GetByName (DBName)
		Connection = DB.GetConnection ("","")
		Sql = "SELECT `objekt_anrede`,`objekt_name`,`objekt_titel`,`objekt_strasse`,`objekt_ort`,`rechnung_anrede`,`rechnung_name`,`rechnung_titel`,`rechnung_strasse`,`rechnung_ort`,`langtext` FROM `REPARATUR` WHERE `key` = '"+oANr+"';"	
		
		Statement = Connection.CreateStatement
		QueryErg = Statement.ExecuteQuery(SQL)
		
		for i = 0 to 10
			oText(i).text = trim(QueryErg.GetString(i))
			if i = 10 then
				TempText = trim(QueryErg.GetString(i))
				oText(i).text = Replace(TempText, Chr(10)+ Chr(13), "")
			end if
		next i
				
		Connection.Close()
		
' wenn Checkbox "an", dann Textfelder 0-9 ReadOnly = false
		if oEdit.state(1) then
			for i = 0 to 9
				oText(i).ReadOnly = false			
			next i
		end if
	
End Sub

Re: [Array] gleich mit Elementen vorbelegen - Typ String

Verfasst: Di, 05.04.2011 07:22
von komma4
Abhilfe?

Die korrekte Syntax benutzen!

In einem Text-Array oText() gibt es keine Eigenschaft .text

Code: Alles auswählen

oText(i) = trim(QueryErg.GetString(i))

Re: [Array] gleich mit Elementen vorbelegen - Typ String

Verfasst: Di, 05.04.2011 11:56
von opiWahn
und wie soll ich ohne .text dann den Text (Inhalt) aus der Query zuweisen?
In der Form geht's, außer daß er mir trim und replace nicht mehr macht.
Und auf die Schleife bei oEdit.state hat er schon gar keine Lust.

Code: Alles auswählen

Sub Value_ANr

'clearForm  
  
	oANr = inputBox ("Auftragsnummer","Eingabe erforderlich","Bitte Auftragsnummer eingeben")
	oForm = thisComponent.drawpage.forms.getbyindex(0)
	'oText() = Array ("o_anrede", "o_name", "o_titel", "o_strasse", "o_ort", "r_anrede", "r_name", "r_titel", "r_strasse", "r_ort", "langtext")
	' nachfolgender Bereich soll durch Array oben ersetzt werden
	oText(1) = oForm.getByName("o_anrede")
	oText(2) = oForm.getByName("o_name")
	oText(3) = oForm.getByName("o_titel")
	oText(4) = oForm.getByName("o_strasse")
	oText(5) = oForm.getByName("o_ort")
	oText(6) = oForm.getByName("r_anrede")
	oText(7) = oForm.getByName("r_name")
	oText(8) = oForm.getByName("r_titel")
	oText(9) = oForm.getByName("r_strasse")
	oText(10) = oForm.getByName("r_ort")
	oText(11) = oForm.getByName("langtext")
	
	'	for i = 0 to 10
	'		oText(i) = oForm.getByName(i)
	'	next i
		
	oEdit = oForm.getByName("chk_edit")
	
   		DBName = "REPARATUR"
		Context = createUnoService("com.sun.star.sdb.DatabaseContext")
		DB = Context.GetByName (DBName)
		Connection = DB.GetConnection ("","")
		Sql = "SELECT `objekt_anrede`,`objekt_name`,`objekt_titel`,`objekt_strasse`,`objekt_ort`,`rechnung_anrede`,`rechnung_name`,`rechnung_titel`,`rechnung_strasse`,`rechnung_ort`,`langtext` FROM `REPARATUR` WHERE `key` = '"+oANr+"';"	
		
		Statement = Connection.CreateStatement
		QueryErg = Statement.ExecuteQuery(SQL)
		
		for i = 1 to 11
			oText(i).text = trim(QueryErg.GetString(i))
			if i = 11 then
				TempText = trim(QueryErg.GetString(i))
				oText(i).text = Replace(TempText, Chr(10)+ Chr(13), "")
			end if
		next i
				
		Connection.Close()
		
' Checkbox "Edit" soll in diesem Fall auf "aus" stehen und muss aktiv eingeschaltet werden, dann
' ReadOnly = false
' Hintergrund der Textfelder "grau" mit Rahmen
' wird Checkbox wieder ausgeschaltet bleiben geänderte Werte stehen
' ReadOnly = true
' Hintergrund der Textfelder "weiss" ohne Rahmen

		if oEdit.state then
			for i = 1 to 10
				oText(i).ReadOnly = false
				oText(i).BackgroundColor = RGB(211,211,211)
			 	oText(i).Border(2)				
			next i
		else
				oText(i).ReadOnly = true	
		end if
	
End Sub

Re: [Array] gleich mit Elementen vorbelegen - Typ String

Verfasst: Di, 05.04.2011 12:04
von komma4
opiWahn hat geschrieben:und wie soll ich ohne .text dann den Text (Inhalt) aus der Query zuweisen?
Genauso, wie ich es bereits im letzten Codebeispiel gemacht habe :D

Re: [Array] gleich mit Elementen vorbelegen - Typ String

Verfasst: Di, 05.04.2011 12:15
von opiWahn
das habe ich gemacht, mit dem Ergebnis, daß die Textfelder leer blieben

Re: [Array] gleich mit Elementen vorbelegen - Typ String

Verfasst: Di, 05.04.2011 13:49
von komma4
TRIM ist eine Laufzeitfunktion, welche Leerzeichen entfernt.
Wenn nach einem

Code: Alles auswählen

oText( 1 ) = TRIM( QueryErg.GetString( 1 ) )
Dein oText( 1 ) leer ist, dann war vorher auch nichts vorhanden.


Eine Funktion REPLACE kennt mein OOo (und Dein Codebeispiel) nicht.


Und nochmals: es gibt keine Eigenschaft .text eines Arrays von Strings!
Mir unerklärlich, warum Du an dieser Stelle keine Fehlermeldung "Funktion oder Eigenschaft nicht gefunden" bekommst


Benutze XRAY zum Untersuchen Deiner Objekte!
(das war nun mein 134. Hinweis auf dieses Tool 8) )

Re: [Array] gleich mit Elementen vorbelegen - Typ String

Verfasst: Di, 05.04.2011 14:08
von opiWahn
Hallo Winfried,

bis zu meiner wahnwitzigen Idee möglichst viel mit Arrays und Schleifen zu lösen, hat der Code ohne Fehler so funkltioniert.
Trim für die möglichen Leerzeichen ging genauso, als auch Replace für das mehrzeilige Textfeld um z.B. Umbrüche zu entfernen.
Den Tipp hatte ich von DPunch und auch in der Ooo-Doku/Wiki ist Replace mit dieser Wirkung beschrieben.
Zwar "ursprünglich" für Calc, scheint aber auch unterm Writer zu funktionieren.

"Und das ist alles was ich dazu sagen kann ..." :)

Die Handhabung von xray ist mir noch nicht so geläufig.

Re: [Array] gleich mit Elementen vorbelegen - Typ String

Verfasst: Di, 05.04.2011 14:42
von DPunch
Aloha

Dein Fehler ist die Variablendeklaration

Code: Alles auswählen

Dim oText(10) as String
Nimm diese entweder komplett raus oder änder sie in

Code: Alles auswählen

Dim oText()
dann sollte Dein Code auch laufen.
Diese falsche Deklaration habe ich übersehen, als ich das erste Mal einen kurzen Blick auf Deinen Code geworfen hatte.
komma4 hat geschrieben:Eine Funktion REPLACE kennt mein OOo (und Dein Codebeispiel) nicht.
REPLACE ist eine anscheinend undokumentierte Runtime-Funktion von OOo ;)