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

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: [gelöst][Array] gleich mit String-Elementen vorbelegen

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

von opiWahn » Mi, 06.04.2011 14:33

Hallo DPunch,

zunächst mal wieder - vielen Dank für deine sehr hilfreich Erklärung :D
oText(i).text = Replace(TempText, Chr(10)+ Chr(13), "")
war ursprünglich schon so gedacht, und funktionierte auch zusammen.
Das Ergebnis war, daß dieses Memofeld aus der AccessDB im Textfeld so aussah, daß unnötige Leerzeichen genauso gelöscht wurden wie Zeilenumbrüche.
Ich hatte, sofern vorhanden, jeweils eine Zeile Text.
Entweder-Oder funktioniert wie du es vorausgesagt hast.
´Hab mich jetzt für chr(13) entschieden, obgleich es dann immer noch unnötige chr(10) gibt.
Wende ich jedoch chr(10) an zieht er alles in einem Rutsch zusammen.
Aber das ist dann eher ein Schönheitsfehler, mit dem man notfalls leben kann.

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

von DPunch » Mi, 06.04.2011 14:00

Aloha
opiWahn hat geschrieben:hab das ganze aufgesplittet in oFeld(10) und oText(10) beide als Variant.
Hättest Du nicht gemusst, durch die Deklaration als Variant hättest Du auch mit einem Array arbeiten können.
Übrigens ist die Deklaration

Code: Alles auswählen

oFeld(10)
insofern überflüssig, als dass Dein Array durch die Zuweisung

Code: Alles auswählen

oFeld() = Array("o_anrede", "o_name", "o_titel", "o_strasse", "o_ort", "r_anrede", "r_name", "r_titel", "r_strasse", "r_ort", "langtext")
sowieso neu dimensioniert wird.
Ich vermute auch, dass diese Zeile

Code: Alles auswählen

oText(i).text = Replace(TempText, Chr(10)+ Chr(13), "")
eher gedacht war als

Code: Alles auswählen

oText(i).text = Replace(TempText, Chr(10), "")
Einfache carriage returns bzw linefeeds werden mit Deinem Vorgehen *nicht* ersetzt, sondern nur die Stellen, wo beides hintereinander auftritt. Das

Code: Alles auswählen

Chr(10)+ Chr(13)
bewirkt eine Stringverkettung, der zu ersetzende Teil wird also nur gefunden, wenn genau diese Kombination auftritt.
opiWahn hat geschrieben:Wie spreche ich die Checkbox korrekt an bzw. wie prüfe ich ob sie an oder aus ist.
Per Event. Bei Rechtsklick auf die Checkbox -> Kontrollfeld -> Ereignisse -> Status geändert ein Makro zuweisen, dieses wird immer ausgeführt, wenn sich der Status der Checkbox ändert.

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

von opiWahn » Mi, 06.04.2011 08:41

Ich weiß was, was Google nicht weiß :)
Als ich meinen PC, unbd letztlich auch mich, schon zur Ruhe legte dämmerte mir dann auch die Lösung:

Code: Alles auswählen

		for i = 0 to 10
			oText(i).text = trim(QueryErg.GetString(i+1))
			if i = 10 then
				TempText = trim(QueryErg.GetString(i+1))
				oText(i).text = Replace(TempText, Chr(10)+ Chr(13), "")
			end if
		next i
Die Ausgabe der Query kann natürlich nicht bei 0 beginnen!
Dummerweise klemmts jetzt am Replace. Keine Fehlermeldung, aber auch keine Funktion :?

Andere Frage: Wie spreche ich die Checkbox korrekt an bzw. wie prüfe ich ob sie an oder aus ist. Bestenfalls zur gesamten Laufzeit, also in der Zeit zwischen Daten holen/eingeben bis zum Speichern. Ist chkEdit an tuh was (z.b. ReadOnly auf False setzen) wird sie wieder ausgeschaltet setze ReadOnly auf true.

Code: Alles auswählen

		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
				oText(i).BackgroundColor = RGB(0,0,0)
			 	oText(i).Border(0)
		end if

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

von opiWahn » Di, 05.04.2011 22:58

ein wenig weiter bin ich dann mal gekommen.
hab das ganze aufgesplittet in oFeld(10) und oText(10) beide als Variant.
Mittels der ersten Schleife klappt dann auch die Zuordnung:

Code: Alles auswählen

Dim oForm As Object, oEdit As Object
Dim oFeld(10)
Dim oText(10)
Dim TempText
...
	oFeld() = Array("o_anrede", "o_name", "o_titel", "o_strasse", "o_ort", "r_anrede", "r_name", "r_titel", "r_strasse", "r_ort", "langtext")

		for i = 0 to 10
			oText(i) = oForm.getByName(oFeld(i))
		next i
...
Aber hier (in der 2. Schleife) bekomme ich dann die Fehlermeldung: "ungültiger descriptor-index" aus com.sun.star.sdbc.SQLException ?

Code: Alles auswählen

...
		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
...
Google konnte mit dieser Meldung auch nichts anfangen.

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

von DPunch » Di, 05.04.2011 14:42

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 ;)

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

von opiWahn » Di, 05.04.2011 14:08

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

von komma4 » Di, 05.04.2011 13:49

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

von opiWahn » Di, 05.04.2011 12:15

das habe ich gemacht, mit dem Ergebnis, daß die Textfelder leer blieben

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

von komma4 » Di, 05.04.2011 12:04

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

von opiWahn » Di, 05.04.2011 11:56

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

von komma4 » Di, 05.04.2011 07:22

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

von opiWahn » Mo, 04.04.2011 17:09

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

von opiWahn » Mo, 04.04.2011 15:52

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

von DPunch » Mo, 04.04.2011 15:13

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

von opiWahn » Mo, 04.04.2011 11:42

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

Nach oben