Variablen über Dialog befüllen

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

Moderator: Moderatoren

2stupid4this
Beiträge: 7
Registriert: Fr, 21.10.2005 23:47

Variablen über Dialog befüllen

Beitrag von 2stupid4this »

Hallo Forumgemeinde,

ich hoffe von Euch kann mir jemand bei meinem Problem helfen. Ich versuche über ein Makro ein neues Dokument aus einer Vorlage zu erstellen. Anschließend sollen über einen Dialog die im Dokument vorhandenen Variablen wie z.B. Anrede und Name befüllt werden.
Soweit hab ich es jetzt bisher:

Code: Alles auswählen

sub DokumentOeffnen
dim args(0) as New com.sun.star.beans.PropertyValue
dim sURL as String
dim oDocument as Object
sURL="file:///d:/Vorlage.ott"
oDesktop=createUnoService("com.sun.star.frame.Desktop")

args(0).Name="AsTemplate"
args(0).Value=True
oDesktop.LoadComponentFromURL(sURL,"_blank",0,args())
Set oDocument = oDesktop.CurrentComponent()
oForm = DialogLibraries.Standard.Dialog1
Dlg = CreateUnoDialog(oForm)
Dlg.execute
end sub
Damit kann ich z.B. ein Textfeld aus dem Dialog auslesen

Code: Alles auswählen

Sub Button1
inhalt = Dlg.GetControl("Textfeld")
MsgBox inhalt.Text
End Sub
Nur wie bekomme ich den Inhalt des Feldes in die Variable des Dokuments

Habe mir auch schon auf http://www.amt-wiesbaden.de die Rechnungsvorlage angeschaut. Würde aber trotzdem lieber bei Variablen bleiben und nicht auf Bookmarks umsteigen.

Danke im voraus für die Unterstützung.

2stupid4this
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey 2stupid4this,

ja, dein Problem ist ja durchaus bekannt und die Frage ist eigentlich eher, bist du dir dessen überhaupt bewusst?
Nicht umsonst wird bei der Rechnungsvorlage mit "Bookmakrs" gearbeitet, die sind einfach leichter zu bedienen. Und wenn du schon per Maske die Daten abfragst, ist das sicher der bessere Weg.

Aber zurück zu Feldern: Felder haben den Sinn, dynamisch Inhalte in ein Dokument einzubinden, die aus einer anderen Quelle stammen. Dabei unterscheidet OOo zwei verschiedene Varianten: Informationen , die aus dem Dokument vom Controller (der steuert die Viewansicht) erzeugt werden (wie beispielsweise Seitenzahlen, Absatzanzahl, URL, etc) und Informationen, die direkt im Dokument vorhanden und gespeichert werden - also zum Beispiel UserFields, Titel, CreateAuthor und so weiter.

Alle Textfelder unterstützen das Modul com.sun.star.text.TextField, dort dfindest du sowohl die entsprechenden Namen als auch die entsprechenden Eigenschaften. Die sind allerdings von Feld zu Feld verschieden.
Manche Felder (es sind die, welche Infos aus dem Dokument nehmen) benötogen zusätzlich den TextfieldMaster, und nur über den kommst du dann an die Eigenschaften heran.

OK, viel Theorie, also, ich bräuchte mehr Inforationen, welche Felder du denn einsetzt? Dann können wir uns Stückweise rantasten.
Zusätzlich brauche ich die Struktur des Textes, denn anders als Bookmarks, die du über einen eindeutigen Namen ansprechen kannst, geht dies bei Textfeldern nicht. Die müssen durchnummeriert und über Service-Abfragen identifizeirt werden, auch ein Argument, Textmarken zu verwenden.

Also, bis denn,

Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
2stupid4this
Beiträge: 7
Registriert: Fr, 21.10.2005 23:47

Beitrag von 2stupid4this »

Hallo Thomas,

vielen Dank für die Begriffserläuterungen. Denke ich bin bei den Variablen schon besser aufgehoben. Im Bereich der Bookmarks denke ich werde ich mich mit abhängigkeiten etwas schwer tun.

Also im Dialog sollen Daten eingegeben werden, die z.B. zur Erstellung eines Briefes notwendig sind, wie Name, Anrede, Strasse. Allesamt Textfelder mit einfacher Belegung, keine Arrays. Des weiteren möchte ich aufgrund der Eingaben weitere Variablen in Abhängigkeit der Eingaben befüllen. z.B. bei Anrede "Herr" im Brief "Sehr geehrter Herr" und dann noch den Namen. Geht sowas auch mit den Bookmarks?

Hab mir mal die API com.sun.star.text angeschaut, finde aber keinen Einstieg.

Bin doch wohl

2stupid4this
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey 2stupid4this,
...wie Name, Anrede, Strasse. Allesamt Textfelder mit einfacher Belegung,...
Ich glaube, wir reden immer noch aneinander vorbei. Werde doch mal konkret: Welche Felder? Felder sind vordefiniert oder können benuterdefiniert angelegt werden. Zu finden unter Einfügen - Feldbefehle - andere.. -> in der Dialogmaske sind alle vorhanden Feldbefehle aufgeführt! Lass den Reiter Datenbank weg, der setzt verbundene und angemeldete Datenquellen voraus - und das fällt bei dir weg.
Also, welche Felder konkret meinst du?
Ich bring dir mal ein Beispiel:
Füge ein Feld über Einfügen - Feldbefehle -andere...-> Variable - Variable setzen ein, und nenn es "MyName" und vergib den Wert "irgentetwas". Als Format stellst du "Text" ein.
Jetzt steht "irgentetwas" in deinem Text, ein benutzerdefiniertes Feld.
Der folgende Code ändert jetzt den Inhalt des Feldes:

Code: Alles auswählen

Sub Textfeldbearbeiten
	oDoc = thiscomponent
	oTxtFelder = oDoc.getTextFields().createEnumeration()
	do while oTxtFelder.hasmoreElements()
		oFeld = oTxtFelder.nextElement
		if oFeld.supportsService("com.sun.star.text.TextField.SetExpression") then
			msgbox oFeld.content
			oFeld.content = "Thomas"
		end if
	loop
	oDoc.getTextFields().refresh()
End Sub
Du siehst die Problematik? Alle Felder lassen sich nur über eine Enumeration erreichen. Dann musst du für jedes Feld überprüfen, ob es sich um das gewünschte handelt. Hier gab es nur ein benuterdefiniertes Feld, da war es noch vergleichsweise einfach. Hast du aber mehrere, musst du innerhalb der IF-Schleife weitere Bedingungen abfragen, zum Beispiel den Namen des Feldes.
Also ich denke: sehr aufwendig.

Viele Grüße
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
ykcim
*****
Beiträge: 324
Registriert: Di, 29.07.2003 15:22
Wohnort: Neu-Isenburg
Kontaktdaten:

Beitrag von ykcim »

Hi Thomas und 2stupid4this,

man kann Variablen direkt über den Namen ansprechen. Dies geht über TextfieldMaster.
Variablen werden in Writer etwas komisch behandelt. Man kann eine Varibale gleichzeitig mit verschiedenen Werten verwenden. Diese stehen dann innerhalb der Variablen in eigenen Textfeldern. Diese Textfelder werden mit getTextFields aufgerufen.
Man kann dies ausprobieren in dem man einfach nacheinander zwei Variablen in einen Text mit dem gleichen Namen setzt. Die Werte dieser Variablen lassen sich dann über die Enumaration auslesen und setzten.
Dabei wird auf den Service "com.sun.star.text.TextField.SetExpression" geprüft. Mit msgbox oFeld.VariableName in der Schleife sieht man den "doppelten" Variablennamen und die verschiedenen Werte.

Die eigentliche Variablenwerte stehen aber in einem eigenen TextFieldMaster-Service, das dynamisch generiert wird und den Namen com.sun.star.text.TextField.SetExpression.Name erhält.

Und auf diesen Master kann über den Namen direkt zugreifen. Diesen muß man aber selber bilden: com.sun.star.text.TextField.SetExpression. + Name.
Nur das man dann daran denken muss dass man jetzt auf den richtigen Wert zugreift. Dies geht nur über den Index. Da man in der Regel aber jede Variable nur einmal einsetzt, ist das dann 0.

Hier zwei Funktionen zum Auslesen und Setzen von Variablen.
Hierbei ist Variable der Name den man selber beim Einfügen gesetzt hat.
Nach dem Setzen sollte man das Dokument aktualisieren (odoc.refresh) sonst sieht man den neuen Werte nicht.

Code: Alles auswählen

Function SetVariable(oDocument as object,Variable as string,Inhalt as string) as string
  Dim Var as String
  Dim oTextfieldMaster As Object
  Dim oPropSet as Object
  Dim oDependentTextFields as Object
  Dim oXDependentTextField as Object
  Dim oTextFields as Object
  On Error Resume Next
  Var ="com.sun.star.text.FieldMaster.SetExpression."+Variable
  oTextfieldMasters = oDocument.getTextFieldMasters()
  oPropSet = oTextfieldMasters.getByName(Var)
  oDependentTextFields = oPropSet.DependentTextFields
  oXDependentTextField = oDependentTextFields(0)
  oXDependentTextField.Content=inhalt
  On Error Goto 0
End Function




Function GetVariable(oDocument as object,Variable) as string
  Dim Var as String
  Dim oTextfieldMaster As Object
  Dim oPropSet as Object
  Dim oDependentTextFields as Object
  Dim oXDependentTextField as Object
  Dim oTextFields as Object
  On Error Resume Next
  Var ="com.sun.star.text.FieldMaster.SetExpression."+Variable
  oTextfieldMasters = oDocument.getTextFieldMasters()
  oPropSet = oTextfieldMasters.getByName(Var)
  oDependentTextFields = oPropSet.DependentTextFields
  oXDependentTextField = oDependentTextFields(0)
  GetVariable= oXDependentTextField.Content
  On Error Goto 0
End Function

mfg
Michael
__
FAQ zu Starbasic -> http://www.starbasicfaq.de
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Michael,
man kann Variablen direkt über den Namen ansprechen. Dies geht über TextfieldMaster.
Ja, da hast du natürlich recht. Aber - so finde ich - wird der Code deswegen auch nicht sehr viel einfacher. Aber - das sollte jeder für sich selbst entscheiden.
Ansonsten: auch eine gute Lösung - dien Code.

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Antworten