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
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
Abgesehen davon sollte der Code funktionieren.
Wobei mir nicht klar ist, was das "(1)" bei
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
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

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

)
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
Nimm diese entweder komplett raus oder änder sie in
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
