Seite 1 von 1

Gelöst: Bookmarks in Tabellen

Verfasst: Do, 17.04.2008 17:06
von pdidi
Hallo alle miteinander,

ich bin noch absoluter Neuling in der OpenOffice Programmierung und brauche eure Hilfe.

Folgendes Problem:
Ich würde gerne in einer TextTabelle (Writer) Inhalte in bookmarks einfü�n.
Wenn ich die bisherigen Forenbeiträg�dazu richtig verstanden habe, kann ich den Cursor auf die Bookmark nur übe�die Tabellenzelle setzen.
Also so ähnl�h:

Code: Alles auswählen

cell=document.TextTables(0).getCellByName("A1")
cursor=cell.createTextCursorByRange(bookmark.anchor)
Jetzt stehe ich nur vor dem Problem, dass der Code allgemein gültig�ür all�mögliche�Dokumente sein soll.
Übergebe�wird nur die Bookmark und der gewünschte I�alt, nicht der Name der Tabellenzelle und auch nicht die wievielte Tabelle im Dokument es ist.
Kann ich das irgendwie über die B�kmark herausfinden? Oder den Inhalt auf einem anderen Weg in die Bookmark einfügen?

Bin �r jeden Tip�dankbar!

Re: Bookmarks in Tabellen

Verfasst: Do, 17.04.2008 19:46
von Toxitom
Hey pdidi,

tia, das ist keine einfache Aufgabenstellung, da du ja zunächst herausbekommen musst, wo sich entweder der Cursor oder die Textmarke befindet.

Ich habe mal für ein ähnliche Aufgabe eine Funktion geschrieben - hier sollte auch per Makro an einer Textmarke etwas geschrieben werden - und die Textmarke konnte irgendwo im Dokument sein.

Vielleicht hilft dir der Code ja irgendwie weiter :-)

Code: Alles auswählen

'/** MAK18_GetObjectPosition
'*************************************************************************.
'*.
'* Analysiert die Position eines Objektes im Dokument
'* Übergeben wird als Parameter ein Objekt (hier Viewcursor oder Textmarke) sowie 
'* der Name des Objektes (wird für evt. Fehlermeldungen genutzt)
'* liefert das Textobjekt, in dem sich das Objekt befindet, zurück
'* Kann ein leeres Objekt zurückliefern, soweit hier ein Abbruch erfolgen soll. 
'* @param     Obj      übergeben wird das Objekt, dessen Position im Dokument gesucht
'*                     gesucht werden soll. Hier entweder der ViewCursor oder die Textmarke
'*            sName    übergeben wird auch ein String, der das übergebene Objekt beschreibt. 
'*                     Dieser String wird für evt. Fehlermeldungen gebraucht - und zur Identifikation
'* @return    oTxtObj  zurückgeliefert wird das Textobjekt der Position, also zum Beispiel
'*                     eine Tabellenzelle, ein Rahmen, Kopf-oder Fusszeile, Fliesstext ...
'*************************************************************************
'*/
function MAK18_GetObjectPosition(Obj as object, sName as string)
  dim oTxtObj as object  'leeres Objekt, wird bei der Rückgabe benötigt
                         'nimmt evt. das Textobjekt auf, in dem sich das Obj befindet
  if sName = "Der Cursor " then   'nur beim Cursorobjekt
    If ThisComponent.CurrentSelection.SupportsService("com.sun.star.drawing.ShapeCollection") then
	  REM in einem Zeichnungsobjekt oder ein solches ist markiert
	  MAK18_FehlerPosition(sName & "befindet sich in einem Zeichnungsobjekt oder ein solches ist markiert")
	  MAK18_GetObjectPosition = oTxtObj
	  exit Function
    ElseIf ThisComponent.CurrentSelection.SupportsService("com.sun.star.text.TextGraphicObject") then
	  REM in einem Grafikobjekt oder ein solches ist selektiert.
	  MAK18_FehlerPosition(sName & "befindet sich in einem Grafikobjekt oder ein solches ist selektiert.")
	  MAK18_GetObjectPosition = oTxtObj
	  exit Function
    end if
  end if    
  REM jetzt für alle
  if not isEmpty(obj.textTable) then  ' in einer Texttabelle
	oTxtObj = Obj.cell.text
  elseIf not isEmpty(Obj.textFrame) then  'in einem Textrahmen
	oTxtObj = Obj.textFrame.text
  elseIf not isEmpty(Obj.textSection) then  'in einem Textbereich
	oTxtObj = ThisComponent.text   	
  elseIf not isEmpty(Obj.textField) then 'in oder am Anfang eines Textfeldes
	MAK18_FehlerPosition(sName & "befindet sich in einem (Text-) Feld oder ein solches ist selektiert.")
  ElseIf obj.getText.ImplementationName = "SwXFootnote" then 'in einer Fussnote
    oTxtObj = Obj.getText()  
  ElseIf obj.getText.ImplementationName = "SwXEndnote" then 'in einer Endnote
    oTxtObj = Obj.getText()  
  ElseIf obj.getText.ImplementationName = "SwXHeadFootText" then 'in der Kopf- oder Fusszeile
    oTxtObj = Obj.getText()
  else
	oTxtObj = ThisComponent.text
  end if

  MAK18_GetObjectPosition = oTxtObj   'Rückgabe: das Textobjekt, evt. leer
end function
Viele Grüße
Thomas

Re: Bookmarks in Tabellen

Verfasst: Fr, 18.04.2008 09:15
von pdidi
Hallo Thomas,

danke für den Tipp.
Aber es hat in meinem Fall leider nicht funktioniert.
Wahrscheinlich hat es damit zu tun, dass ich von Lotus Notes aus das OpenOffice Dokument fülle.
Jrdenfalls bekomme ich, wenn ich das über document.bookmarks.GetByName ("MeineBookmark") erzeugte Bookmark Object, dass in diesem einen Dokument definitiv in einer Tabelle ist, an die Funktion übergebe, bei der Überprüfung auf IsEmpty(object.textTable) den Hinweis, dass TextTable keine Instanz meines Objektes ist. :cry:

Jetzt habe ich erst mal, um überhaupt mal Text in eine Bookmark in einer Tabelle einzutragen, den Weg über das direkte Ansprechen der Tabellenzelle versucht.

Code: Alles auswählen

bookmark = document.Bookmarks.GetByName("MeineBookmark") 
cell=document.TextTables.GetByName("1").getCellByName("A1")
textCursor=cell.createTextCursorByRange(bookmark.anchor)
textCursor.String = sText
Damit komme ich zumindest bis zum Setzen von String. Aber dann bricht er ab und behauptet, dass textCursor (oder vielleicht auch textCursor.String???) nicht gesetzt ist. :x
Versteh ich nicht. Denn auf ähnliche Art und Weise funktioniert es doch auch bei Bookmarks, die nicht in Tabellen sind:

Code: Alles auswählen

bookmark = document.Bookmarks.GetByName("MeineBookmark") 
textCursor = document.Text.CreateTextCursorByRange (bookmark.Anchor)
textCursor.String = sText
Was mache ich falsch?

Re: Bookmarks in Tabellen

Verfasst: So, 20.04.2008 00:02
von turtle47
Hi Pdidi,
Wenn ich die bisherigen Forenbeiträge dazu richtig verstanden habe, kann ich den Cursor auf die
Bookmark nur über Tabellenzelle setzen
Das stimmt nicht. Folgender Code durschsucht alle Tabellen nach dem gesetzten Bookmark und schreibt den vorgebenen Text an diese Stelle.

Code: Alles auswählen

Dim Doc As Object
Dim TextTables As Object
Dim Table As Object
Dim Cell As Object
Dim CellCursor As Object
Sub Start_Bookmark
	Dim Texttables as variant
	oDoc = thisComponent
	sText = "Mein Text zum Bookmark"
	TextTables = oDoc.getTextTables()
	Zahl = TextTables.count()
	for TabellenZaehler = 1 to (Zahl - 1)
	Table = TextTables(TabelZaehler)
	on error goto Fehler
	oTextmarke = oDoc.Bookmarks.getByName("Bookmark1")
	oBookmark = thisComponent.getBookmarks().getByName("Bookmark1").getAnchor()
	If Not IsEmpty(oBookmark.TextTable) then
	oTextCursor = oBookmark.Text.CreateTextCursorByRange(oTextmarke.Anchor)
	oTextCursor.String = sText
	end if
	Next TabellenZaehler
	exit Sub
	Fehler:
	Msgbox  "Es wurde kein entsprechender Bookmark gefunden"
End Sub
Hilft das weiter?

Juergen

Edit:
Was mache ich falsch?
Dann schau Dir mal diese beiden Zeilen an:

Code: Alles auswählen

textCursor=cell.createTextCursorByRange(bookmark.anchor)

Code: Alles auswählen

textCursor = document.Text.CreateTextCursorByRange (bookmark.Anchor)
In der oberen Zeile fehlt:

Code: Alles auswählen

Text.

Re: Bookmarks in Tabellen

Verfasst: Mo, 21.04.2008 11:01
von pdidi
It Works!!!! :lol:

Dank eurer Tipps habe ich es geschafft, dass die Bookmarks in Tabellen gefüllt werden kö�en, ohne dass ich wissen muss, in welcher Tabelle oder Zelle sich die Bookmark befindet.
Vielen Dank dafür�!

Für �le, die sich wie ich mit Lotus Notes rumschlagen müsse� habe ich die Funktionen in Lotus Script beigefügt.
�Toxitom
Hallo Thomas,
Dein Code hat doch funktioniert. Dass es bei mir erst mal nicht ging, lag daran, dass ich das Ergebnis von GetBookmarkByName an die Funktion überge�n habe, statt den Anchor darauf zu übergeb�. Darauf bin ich gekommen, als ich den Tipp von Jürgen au�robiert habe.

In Lotus Script sieht der Code wie folgt aus:

Code: Alles auswählen

Function GetOOoObjectPosition (OOoObjDok As Variant, Obj As Variant) As Variant
	
	'/** GetOOoObjectPosition
    '*************************************************************************.
    '*.
    '* Analysiert die Position eines Objektes im Dokument
    '* Übergeben�ird als Parameter ein Objekt (hier Viewcursor oder Textmarke) sowie
    '* der Name des Objektes (wird für evt. Fe�ermeldungen genutzt)
    '* liefert das Textobjekt, in dem sich das Objekt befindet, zurück
    '* �nn ein leeres Objekt zurückliefern, �weit hier ein Abbruch erfolgen soll.
    '* @param	 Obj		übergeben wir�das Objekt, dessen Position im Dokument gesucht
    '*                     			gesucht werden soll. Hier entweder der ViewCursor oder die Textmarke
    '*            		sName	übergeben wird�uch ein String, der das übergebene Obje� beschreibt.
    '*                     			Dieser String wird für evt. Fehlerme�ungen gebraucht - und zur Identifikation
    '* @return    oTxtObj  zurückgeliefert wird�as Textobjekt der Position, also zum Beispiel
    '*                     eine Tabellenzelle, ein Rahmen, Kopf-oder Fusszeile, Fliesstext ...
    '*************************************************************************
    '*/
	Dim oTxtObj As Variant  'leeres Objekt, wird bei der Rückgabe benötigt
 �          �              'nimmt evt. das Textobjekt auf, in dem sich das Obj befindet
	
	If Not Isempty(obj.textTable) Then  ' in einer Texttabelle
		Set oTxtObj = Obj.cell.text
	Elseif Not Isempty(Obj.textFrame) Then  'in einem Textrahmen
		Set oTxtObj = Obj.textFrame.text
	Elseif Not Isempty(Obj.textSection) Then  'in einem Textbereich
		Set oTxtObj = OOoObjDok.text      
'	Elseif Not Isempty(Obj.textField) Then 'in oder am Anfang eines Textfeldes
'		Print ("Objekt befindet sich in einem (Text-) Feld oder ein solches ist selektiert.")
	Elseif obj.getText.ImplementationName = "SwXFootnote" Then 'in einer Fussnote
		Set oTxtObj = Obj.getText() 
	Elseif obj.getText.ImplementationName = "SwXEndnote" Then 'in einer Endnote
		Set oTxtObj = Obj.getText() 
	Elseif obj.getText.ImplementationName = "SwXHeadFootText" Then 'in der Kopf- oder Fusszeile
		Set oTxtObj = Obj.getText()
	Else
		Set oTxtObj = OOoObjDok.text
	End If
	
	Set GetOOoObjectPosition = oTxtObj   'Rückgabe: das Textobj�t, evt. leer
	
End Function
Der Aufruf dazu ist wie folg[/code]bjDok wurde mit LoadComponentFromURL belegt):

Code: Alles auswählen

Set bookmark = OOoObjDok.Bookmarks.GetByName("BookmarkName")
Set textObj = GetOOoObjectPosition (OOoObjDok, bookmark.Anchor)
Set textCursor = textObj.CreateTextCursorByRange (bookmark.Anchor)
textCursor.String = "Der auszugebende Text"
@turtle47
Hallo Jürgen,
erst mal Danke�ür den Hinweis, dass i� .Text vergessen hatte. Ein typischer Anfängerfehler.
Ich wursch�l mich durch das Buch in dem die API beschrieben ist, von einem Element zum nächsten und am Ende weis�ich gar nicht mehr, wie es zusammengehört. Aber das wird noch m� der Zeit.
Bis es soweit ist, hoffe ich, dass ihr Geduld mit mir habt.

Jetzt zu Deinem Code: auch der funktioniert einwandfrei, nachdem ich ihn für Lotus Notes umgeschrieb� habe.

Hier der Code in Lotus Script:

Code: Alles auswählen

Sub SetBookm[code]Doc As Variant, bookmark As Variant, sText As String)
	
	Dim TextTables As Variant
	Dim oTextmarke As Variant
	Dim oBookmark As Variant
	Dim oTextCursor As Variant
	
	Dim Zahl As Integer
	Dim i As Integer
	
	Set TextTables = oDoc.getTextTables()
	Zahl = TextTables.count()
	
	On Error Goto Fehler
	For i = 1 To (Zahl)
		Set oTextmarke = oDoc.Bookmarks.getByName(bookmark)
		Set oBookmark = oDoc.getBookmarks().getByName(bookmark).getAnchor()
		If Not Isempty(oBookmark.TextTable) Then
			Set oTextCursor = oBookmark.Text.CreateTextCursorByRange(oTextmarke.Anchor)
			oTextCursor.String = sText
		End If
	Next i
	Exit Sub
Fehler:
	Msgbox  "Es wurde kein entsprechender Bookmark gefunden"
End Sub
Aufgerufen wird die Funktion so (auch hier wurde OOoObjDok mit LoadComponentFromURL belegt):

Code: Alles auswählen

Call SetBookmark (OOoObjDok, "BookmarkName, "Der auszugebende Text")
Bis zur nächsten Frage,


Petra�

Re: Gelöst: Bookmarks in Tabellen

Verfasst: Mi, 20.11.2013 11:49
von Boller78
Moin zusammen,

wundbares Lotus Skript. Das ist in wenigen Handgriffen 1:1 auch nach Delphi transportiert... ;o)

Ein Problem gibt es jetzt leider noch und zwar das Auffinden der Textmarken im Kopf oder Fusszeilen Segment. Hier müßte es noch eine andere Ansteuerung geben.

Code: Alles auswählen

Function TOOoWriter.GetOOoObjectPosition (OOoObjDok : Variant; Obj : Variant):  Variant;
//
//   '/** GetOOoObjectPosition
//    '*************************************************************************.
//    '*.
//    '* Analysiert die Position eines Objektes im Dokument
//    '* Übergeben�ird als Parameter ein Objekt (hier Viewcursor oder Textmarke) sowie
//    '* der Name des Objektes (wird für evt. Fe�ermeldungen genutzt)
//    '* liefert das Textobjekt, in dem sich das Objekt befindet, zurück
//    '* �nn ein leeres Objekt zurückliefern, �weit hier ein Abbruch erfolgen soll.
//    '* @param    Obj      übergeben wir�das Objekt, dessen Position im Dokument gesucht
//    '*                    gesucht werden soll. Hier entweder der ViewCursor oder die Textmarke
//    '*           sName    übergeben wird�uch ein String, der das übergebene Obje� beschreibt.
//    '*                    Dieser String wird für evt. Fehlerme�ungen gebraucht - und zur Identifikation
//    '* @return   oTxtObj  zurückgeliefert wird�as Textobjekt der Position, also zum Beispiel
//    '*                    eine Tabellenzelle, ein Rahmen, Kopf-oder Fusszeile, Fliesstext ...
//    '*************************************************************************
//    '*/

var oTxtObj : Variant;  //'leeres Objekt, wird bei der Rückgabe benötigt - nimmt evt. das Textobjekt auf, in dem sich das Obj befindet
begin


   If Not VarIsEmpty(obj.textTable) Then  // in einer Texttabelle
      oTxtObj := Obj.cell.text
   Else
   if Not VarIsEmpty(Obj.textFrame) Then  //in einem Textrahmen
      oTxtObj := Obj.textFrame.text
   Else
   if Not VarIsEmpty(Obj.textSection) Then  //in einem Textbereich
      oTxtObj := OOoObjDok.text
   Else
   if Not VarIsEmpty(Obj.textField) Then //in oder am Anfang eines Textfeldes
//  Print ("Objekt befindet sich in einem (Text-) Feld oder ein solches ist selektiert.")
   Else
     if (obj.getText.ImplementationName = 'SwXFootnote') Then //in einer Fussnote
          oTxtObj := Obj.getText()
       Else
       if (obj.getText.ImplementationName = 'SwXEndnote') Then //in einer Endnote
          oTxtObj := Obj.getText()
       Else
       if (obj.getText.ImplementationName = 'SwXHeadFootText') Then //'in der Kopf- oder Fusszeile klappt an dieser Stelle leider net...
       begin
          showmessage('Kopfzeile');             kommt hier in diesen Abschnitt nicht hinein... ;(
          oTxtObj := Obj.getText()
       end
       Else
          oTxtObj := OOoObjDok.text; //

   result:=oTxtObj;  //Rückgabe: das Textobj�t, evt. leer
end;
[​code]…[​/code] Tags gesetzt. lorbass, Moderator

Wie könnte man hier noch die Textmarken im Kopf/Fuss Zeilenbreich ansteuern?

Gäbe es auch eine leichtere Variante per UNO ... ;o)

Danke.