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

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

Moderator: Moderatoren

Benutzeravatar
opiWahn
***
Beiträge: 91
Registriert: Mo, 21.03.2011 15:47
Wohnort: zw. KL und NW

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

Beitrag 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)
Zuletzt geändert von opiWahn am Do, 07.04.2011 15:19, insgesamt 1-mal geändert.
Grüße
opiWahn
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

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

Beitrag 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?
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Benutzeravatar
opiWahn
***
Beiträge: 91
Registriert: Mo, 21.03.2011 15:47
Wohnort: zw. KL und NW

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

Beitrag 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?
Grüße
opiWahn
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

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

Beitrag 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
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
Benutzeravatar
opiWahn
***
Beiträge: 91
Registriert: Mo, 21.03.2011 15:47
Wohnort: zw. KL und NW

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

Beitrag 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
Grüße
opiWahn
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

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

Beitrag 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.
Benutzeravatar
opiWahn
***
Beiträge: 91
Registriert: Mo, 21.03.2011 15:47
Wohnort: zw. KL und NW

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

Beitrag 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.
Grüße
opiWahn
Benutzeravatar
opiWahn
***
Beiträge: 91
Registriert: Mo, 21.03.2011 15:47
Wohnort: zw. KL und NW

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

Beitrag 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
Grüße
opiWahn
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

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

Beitrag 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))
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Benutzeravatar
opiWahn
***
Beiträge: 91
Registriert: Mo, 21.03.2011 15:47
Wohnort: zw. KL und NW

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

Beitrag 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
Zuletzt geändert von opiWahn am Di, 05.04.2011 12:14, insgesamt 1-mal geändert.
Grüße
opiWahn
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

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

Beitrag 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
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Benutzeravatar
opiWahn
***
Beiträge: 91
Registriert: Mo, 21.03.2011 15:47
Wohnort: zw. KL und NW

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

Beitrag von opiWahn »

das habe ich gemacht, mit dem Ergebnis, daß die Textfelder leer blieben
Grüße
opiWahn
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

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

Beitrag 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) )
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Benutzeravatar
opiWahn
***
Beiträge: 91
Registriert: Mo, 21.03.2011 15:47
Wohnort: zw. KL und NW

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

Beitrag 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.
Grüße
opiWahn
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

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

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