Datei an einer Textmarke einfügen

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: Datei an einer Textmarke einfügen

von ztree » So, 01.01.2006 07:38

Hallo Thomas,

Prost Neujahr!

Dein Buch? Potzblitz!

Ohne dein Buch wäre ich nicht so weit gekommen, es hat mir sehr geholfen und ich kann es empfehlen. Es ist klar, dass nicht jedes spezifische Problem direkt als Programmzeile zu finden ist.

Mit der OOo-API komme ich (noch) nicht zurecht und muss daher viel ausprobieren. Leider ist das Aufzeichnen von Makros keine große Hilfe, da der generierte Code nicht tief genug erstellt wird. Zum Beispiel, wenn man verhindern will, dass in einem Dokument, innerhalb von Tabellen ein Seitenumbruch erfolgt. Aber mit einer abgewandelten Version von "Sub LesezeilenEntfernen" (Seite 319) und ein wenig Ausprobieren kommt man schon dahinter.

Jetzt zum Thema "Textmarken innerhalb von Rahmen".

Danke für deine schnelle Hilfe, es ist mir jetzt klar, was ich ändern muss.

Zum Glück benötige ich nur eine Ebene und keine verschachtelten Rahmen.


Schöne Grüße
Oli

von Toxitom » Sa, 31.12.2005 13:34

Hey Oli,

na ja, wenn du schon mein Buch hast ... da gibt es schon ausreichend Hinweise drin - ok, exakt das Problem ist natürlich nicht beschrieben :)
muss daher bei jeder Textmarke prüfen,
ob sich diese in einem Textrahmen befindet.
Na gut: Alle Textmarken erhält du über getBookmarks(), dann kannst du die einzelne entweder über den Namen oder über den Index ansprechen.

Zur Unterscheidung, wo sie sich befinden: Das ist deutlich komplizierter. Die Textmarke besitzt ein Anker-Objekt, welches die Position ihrerselbst darstellt - wenn vorhanden!
Also kannst du das abprüfen. Hier ein kurzes Beispiel: Du besitzt ein Textdokument mit Fliesstext und irgendwo der Textmarke "tm1" sowie einem Rahmen ("Rahmen1") mit Text und der Textmarke "tm2".
Jetzt kannst du das wie folgt prüfen:

Code: Alles auswählen

Sub Main
	oDoc = thisComponent
	oTxtMarke = oDoc.getBookmarks().getByName("tm2")
	oAnker = oTxtMarke.getAnchor()
	var = oAnker.textFrame
	if isObject(var) then
	  msgbox "ja"
	  msgbox var.name
	else
	  msgbox "nein"
	end if  
End Sub
Ändere mal den GetByName() auf "tm1" um den Unterschied zu sehen.
Das Ankerobjekt besitzt eine Eigenschaft "textFrame" (als UNO-Objekt) wenn ersich in einem solchen befindet. Ansosnten gibt es diese Objekt nicht und die Eigenschaft liefert "void", welches kein UNO-Objekt darstellt.
Danach kannst du prüfen. Ist das Objekt vorhanden, handelt es sich auch gleich um den gesuchten Rahmen (das Rahmen-Objekt) - kannst du über die Namen-Eigenschaft auslesen.
So haben die Textmarken übrigens auch Tabellen- und ähnliche Eigenschaften, wenn dort plaziert. Wie gesagt, wenn es sich "nur" um Rahmen handelt, reicht an sich die obrige Abfrage.
Noch komplizierter wird es natürlich bei verschachtelten Rahmen etc.

Ich hoffe, es hilft erst einmal.

Viele Grüße
Thomas

von ztree » Sa, 31.12.2005 12:42

Hallo Thomas,

danke für deine Erklärungen, jetzt verstehe ich die den Zusammenhang mit der Exception, wenn sich die Textmarke in einem Rahmen befindet.

Leider habe ich keinen Einfluss auf die Positionierung der Textmarken innerhalb des Dokumentes, ich muss daher bei jeder Textmarke prüfen,
ob sich diese in einem Textrahmen befindet.

Kannst du mir da nochmal helfen?

Leider finde ich keinen Hinweis auf diesen Job in den Büchern:
"OpenOffice-Programmierung von Rene Martin" und "Makros in OpenOffice.org 2.0" von Thomas Krumbein.

Zum Hintergrund für meinen Einstieg in OOo-Basic:
Ich portiere gerade ein Projekt mit automatischer Dokument-Erstellung von "Windows und MS-Office" (COM-Objects)
nach "Windows mit OpenOffice.org" und "Linux mit OpenOffice.org"


Danke!

Gruß Oli

von Toxitom » Sa, 31.12.2005 11:04

Hey ztree,

na, das sieht doch schon gleich viel "angenehmer" aus :D
und informativer!
Ich vermute, dass die Zeile "ObjCursor = ObjDoc.Text.createTextCursorByRange(ObjTextmarke.getAnchor)"
Die Vermutung ist zumindest nicht ganz falsch. Solange sich die Textmarken im Textkörper (Objekt "text" ) befinden, funktioniert deine Methode.
Im Körper selbst befinden sich dann aber noch alle anderen Objekte - wie Tabellen, Grafiken ud eben auch - Textrahmen. Zwar können Textrahmen auch Texte aufnehmen (und funktionieren dann ähnlich wie der Textkörper selbst), nur muss dann eben auch der Textcursor als Objekt des Textrahmens erzeugt werden, nicht des Textkörpers.

Das verkompliziert deinen Code dann erheblich, da du quasi jede Textmarke erst abprüfen musst, ob sie in Textrahmen oer im Textkörper "steckt" und dann entsprechend den Cursor erzeugen.

So würdest du den Textrahmen eines Dokumentes mit Namen "Rahmen1" zum Beispiel erhalten durch:

Code: Alles auswählen

oDoc = thisComponent
oFrame = oDoc.getTextFrames().getByName("Rahmen1")
und dort könntest du jetzt den Cursor erstellen:

Code: Alles auswählen

oTxtCursor = oFrame.createTextCursor()
Natürlich kannst du dort auch deine Textcursor erzeugen mit Ankerpunkt etc.
Dann kannst du auch den Text dort ersetzen bzw. hineinschreiben.
Wie gesagt, die Unterscheidung ist wesentlich. Vielleicht vergibst du einfach verschieden Textmarken-Namen wie "FText_1" für den Fliesstext und "RText_1" für die Marken in Rahmenobjekten, dann kannst du später durch Stringvergleiche Verzweigungen einbauen und dennoch mit Schleifen arbeiten.

Viele Grüße und eine "guten Rutsch"

Thomas

von ztree » Sa, 31.12.2005 08:01

Hallo Toxitom,

na da habe ich mich ja gleich unbeliebt gemacht , was nicht meine Absicht war...

Ich versuche es daher nochmal etwas detaillierter:

Es geht darum, in einem Dokument alle vorhandenen Textmarken mit den Texten einer übergebenen CSV-Textdatei zu ersetzen.

In der CSV-Textdatei sind die Namen der Textmarken und der einzufügende Text durch ";" getrennt enthalten.

Einige der Textmarken werden dabei durch HTML-Blöcke ersetzt und müssen über "Datei|Einfügen" eingelesen werden, da sonst der HTML-Quelltext
eingefügt würde.

Der unten stehende Code funktioniert auch, solange sich die zu ersetzende Textmarke nicht in einem Rahmen befindet.

Wenn ich eine Textmarke (welche sich innerhalb eines Rahmens befindet) ersetzen möchte, erhalte ich eine unqualifizierte Exception.


REM ##### Alle Bookmarks ermitteln und ersetzen
' ----- die Zwischendatei für Html-Blöcke (hier legt GetCSVKeyNameData... die einzufügenden HTML-Blöcke ab)
TempHtmlFile = LocalTempPath & "temp.html"
TempHtmlFile = ConvertToUrl(TempHtmlFile)


ObjTextmarken = ObjDoc.getBookmarks()
ObjCursor = ObjDoc.Text.createTextCursor()

For Count = 0 To ObjTextmarken.getCount() - 1
ObjTextmarke = ObjTextmarken.getByIndex(Count)
KeyName = ObjTextmarke.Name
'MsgBox(KeyName)
TempString = GetCSVKeyNameData(csvData(), KeyName, TempHtmlFile)
If TempString <> "" Then
KeyValueArray() = Split(TempString, ";")

ObjCursor = ObjDoc.Text.createTextCursorByRange(ObjTextmarke.getAnchor)
If KeyValueArray(1) <> "{" Then 'normale Daten ({ ist die Kennung für HTML einfügen)
ObjCursor.String = KeyValueArray(1) 'Textmarke ersetzen
Else 'Html
ObjCursor.InsertDocumentFromURL(TempHtmlFile, Args()) 'Datei einfügen
EndIf
EndIf
Next
REM #####


Ich vermute, dass die Zeile "ObjCursor = ObjDoc.Text.createTextCursorByRange(ObjTextmarke.getAnchor)"
keine gute Idee ist, aber als Newcomer bin ich mit der OOoBasic-UNO-API noch nicht so vertraut und hoffe es kann
mir jemand helfen.


Grüße und einen guten Rutsch in's neue Jahr

von Toxitom » Fr, 30.12.2005 08:27

so, wie einen normalen Text auch :wink:

PS: Du siehst, zu kurze Fragen ohne Informationen werden auch nicht inhaltsvoll beantwortet. Wie auch? Und die Motivation dazu fehlt dann auch.
Stelle deine Frage mit entsprechenden Inhalten, ausführlich, so dass sich jeder etwas darunter vorstellen kann, nutze Ansprache und Grussformeln, dann wird dir ebenso geholfen, wie all den anderen hier im Forum.

Datei an einer Textmarke einfügen

von ztree » Do, 29.12.2005 19:34

Hallo,

wie kann ich in Writer an einer Textmarke eine Datei einfügen?

Danke für die Hilfe...

Nach oben