Textfelder per Makro füllen

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

Moderator: Moderatoren

domagic
*
Beiträge: 13
Registriert: Fr, 08.07.2005 11:43

Textfelder per Makro füllen

Beitrag von domagic »

Hallo Freunde,

ich würde gern ein Textfeld per Makro mit Text füllen.

Meine Spur bislang wäre:

Code: Alles auswählen

ThisComponent.GetTextFields
Die Option GetByName scheint es hier unlogischerweise nicht zu geben
Vielleicht mache ich einfach etwas falsch?

Habt ihr eine Idee?
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey domanic,
Die Option GetByName scheint es hier unlogischerweise nicht zu geben
Das ist nicht unlogisch! Wie soll das funktionierern, wenn du beispielsweise das Feld "Author" 10 mal im Dokument einfügst. Welches soll dann gefunden werden?

Also, dein Weg war doch schon mal ein Anfang: Mit

Code: Alles auswählen

oTextFieldCon = thisComponet.getTextFields
erhälst du schon mal den container (als Objekt) aller im Dokument befindlichen Textfelder. Auf diesen wendest du nun die Methode createEnumeration() an, um ein Sammelobjekt aller Textfelder zu erhalten, die du dann in einer Schleife auswerten kannst.

Code: Alles auswählen

oTextFields = oTextFieldCon.createEnumeration()
Die folgend Schleife iteriert nun durch alle Textfelder, jetzt musst du dann nur noch dein gesuchtes finden:

Code: Alles auswählen

Do while oTextFields.hasMoreElements()
  oTextFeld = oTextFields.nextElement()
   .... REM hier folgt der Code, die Textfelder auszuwählen
  loop
So, nun musst du nur noch dein gewünschtes Textfeld suchen. Jedes Textfeld (oder zumindest die meisten) werden einzeln beschrieben im Modul com.sun.star.text.TextField, und dort haben sie einen eigenen Service. Nehmen wir mal an, du suchst nach dem Textfeld "Author", dann würdest du es wie folgt isolieren:

Code: Alles auswählen

if oTextFeld.supportsService("com.sun.star.text.TextField.Author") then
...REM jetzt kannst du irgend etwa tun
    exit do   'Schleife beenden
end if
So, nun hat du dein Textfeld, und kannst beispielsweise über oTextFeld.Content den Inhat auslesen oder auch setzen.

Aber: Manche Textfelder benötigen einen sogenannten TextfieldMaster, und dann wird das ganze noch ein wenig komplizierter.

Viele Grüße
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
domagic
*
Beiträge: 13
Registriert: Fr, 08.07.2005 11:43

Textfelder in Kopfzeile?

Beitrag von domagic »

Hallöchen Toxitom,

vielen Dank für deine Hilfe, aber leider funktioniert dein Beispiel nicht so wie es soll.

Code: Alles auswählen

Dim oDoc As Object
Dim oTextfelder As Object
Dim oTextfeld As Object

oDoc = ThisComponent

oDoc.GetTextFields.CreateEnumeration()

Do while oTextfelder.HasMoreElements()
oTextfeld = oTextfelder.NextElement()

	If oTextfeld.SupportsService("com.sun.star.text.TextField.Titel") Then
		
		oTextfeld.Content = Vorlage(1)
		
    Exit Do
	End If
	
Loop
Liegt es evtl. daran, dass das Textfeld in der Kopfzeile ist?

Eine Fehlermeldung gibt es aber keine.

"Titel" ist der Name des Textfeldes und wird wie oben aufgerufen oder nicht?
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey domagic,
Liegt es evtl. daran, dass das Textfeld in der Kopfzeile ist?
Nein. Bei der Varainte spielt das keine Rolle.
"Titel" ist der Name des Textfeldes und wird wie oben aufgerufen oder nicht?
Der Fehler liegt hier. "Titel" ist eben gerade kein einfaches Textfeld, sondern ein abgeleitetes aus dem Hauptobjekt "docinfo". Diese Feld erhälst du dann wie folgt:

Code: Alles auswählen

oTextfeld.SupportsService("com.sun.star.text.TextField.DocInfo.Title")
P.S. "Title", nicht "Titel" - auch eine Fehlerquelle!

Da jedes Dokument in der Regel einen Tetel besitzt, kannst du diesen natürlich auch auslesen. Also Baue zum Test während der Entwicklung die Zeile

Code: Alles auswählen

msgbox oTextfeld.content 
ein, dann siest du immer, was gerade dort steht und ob die Schleife überhaupt dort hin kommt.
Eine Fehlermeldung gab es natürlich nicht, weil das Textfeld "Title" ja nicht existiert, die Bedingung also nie wahr wurde.

Um den Text auszulesen, wäre folgender Code richtig:

Code: Alles auswählen

Dim oDoc As Object
Dim oTextfelder As Object
Dim oTextfeld As Object

oDoc = ThisComponent

oTextfelder = oDoc.GetTextFields.CreateEnumeration()

Do while oTextfelder.HasMoreElements()
oTextfeld = oTextfelder.NextElement()
   If oTextfeld.SupportsService("com.sun.star.text.TextField.DocInfo.Title") Then
     msgbox oTextfeld.Content
     Exit Do
   End If
   
Loop
Das Setzen des Inhaltes ist hingegen deutlich schwieriger, da du hierfür den Textfield-Master benötigst. Leider hab ich jetzt nicht die Zeit, dieses dir zu erläutern, aber wenn ich die Tage noch mal Zeit finde, schreibe ich einen neue Antwort.

Viele Grüße
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hallo domagic,

hab gerade noch mal ein bischen über dein Problem nachgedacht. Was willst du eigentlich erreichen?
Dein eingeschlagener Weg funktioniert gar nicht. Du brauchst auch - anders als vorher gesagt - gar keinen Textfield-Master. Lass mich mal überlegen, was du eigentlich willst:
Du hast ein Dokumnet und dort gibt es ein eingefügtes Feld "Titel", richtig?
Jetzt möchtest du per Basic dort einen bestimmten Text angezeigt bekommen?
Na, das wäre aber umständlich. Zur Erläuterung:
Felder sind ja an sich schon kliene Makros, die bestimmte Inhalte darstellen, die von irgendwo anders herkommen. Du kannst ein Textfeld auslesen, ansich aber nicht beschreiben, da dieses ja eine Funktionalität darstellt und sich die Inhalte irgendwo herholt.
Betrachten wir das Feld "Title". Dies holt sich seinen Inhalt aus den Dokumenteneigenschaften, so wie sie auch zu finden sind über den Menü-Punkt Datei - Eigenschaften ... und dort unter Titel. Das was dort steht - und dort gespeichert ist - wird im Feld angezeigt. Willst du also einen speziellen Inhalt anzeigen, so musst du die Eigenschaft Dokumententiitel ändern - das Feld zeigt dann schon das richtige an - und nicht den Inhalt des Textfeldes!
In deinem Fall also geht das ganz einfach:

Code: Alles auswählen

oDoc = thisComponent
oDoc.Title = "Das ist mein gesetzter Titel des Docs"
Fertig. Jetzt sollte dein Textfeld schon den oben gesetzten Text anzeigen. schlimstenfalls benötigt das Dokument noch ein "refresh", dann sollte es aber passen.
War es das, was du wolltest?

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,

Code: Alles auswählen

oDoc.Title = "Das ist mein gesetzter Titel des Docs" 
Das geht nicht. Es muß lauten:

Code: Alles auswählen

oDoc.DocumentInfo.Title = "Das ist mein gesetzter Titel des Docs" 
Dort befinden sich auch die Felder für Autor, Beschreibung, Thema und Schlüsselwörter.

oDocument.DocumentInfo.Author
oDocument.DocumentInfo.Description
oDocument.DocumentInfo.Keywords
oDocument.DocumentInfo.Theme
oDocument.DocumentInfo.Title

Auf diesen Weg können auch die Inhalte gesetzt werden.

Code: Alles auswählen

oDocument.DocumentInfo.Title = "Meine Titel"
mfg
Michael[/code]
__
FAQ zu Starbasic -> http://www.starbasicfaq.de
domagic
*
Beiträge: 13
Registriert: Fr, 08.07.2005 11:43

Textfelder

Beitrag von domagic »

Es geht um die Textfelder als Zeichnungsobjekte (oder wie man diese bei OpenOffice nennt). Ich will den Inhalt der schon drin steht auswechseln. Also keine Dokumentinformationen ändern etc. - obwohl diese Information auch sehr interessant ist.
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Domagic,
Es geht um die Textfelder als Zeichnungsobjekte
Na, das ist ja etwas ganz anderes. Soche "Textfelder" sind in Wirklichkeit einfache Zeichnungsobjekte (Shapes) mit bestimmten Eigenschaften, und diese sind alles Objekte der DrawPage.
Die einzige Schwierigkeit hierbei ist die Identizierung. Zwar unterstützen alle "Shapes" eine Nameneigenschaft, über die theoretisch eine eindeutige Identifizierung möglich wäre, aber leider besitzt das Frontend (also die Oberfläche) keine Möglichkeit, einen Namen für die Zeichnung zu vergeben.

So kommst du an das Objekt heran:

Code: Alles auswählen

Sub TextFeldGrafik
	oDoc = thisComponent
	oDraw = oDoc.getDrawPage()
	for i = 0 to oDraw.count-1
		oShape = oDraw.getByIndex(i)
		msgbox oShape.getString()
		oShape.setString("Hey")
	next
End Sub
Wenn du nur ein solches Textfeld im Dokument hast und auch sonst keine Zeichnungesobjekte, dann hast du das Ergebnis. Innerhalb der Schleife musst du aber zunächst die Identifizierung durchführen, zum Beispiel durch den Inhalt? Ein TExtfeld identifizierst du übrigens über den Service "com.sun.star.drawing.TextShape", ansonsten musst du einfach viel über das Dokument wissen. Legst du das TExtfeld jedoch per Makro an, so kannst du die Eigenschaft name nutzen und einen eindeutigen Namen vergeben. Dann wird es einfacher.

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