[gelöst] Writer: Rahmen mittels Makro 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: [gelöst] Writer: Rahmen mittels Makro einfügen

Re: [gelöst] Writer: Rahmen mittels Makro einfügen

von uroveits » So, 31.10.2010 19:07

Hallo zusammen!

Nachtrag:
Das Problem ist nun endgültig gelöst.

Der Grund, warum der Autotext-Inhalt bei meinen bestehenden Dokumenten nicht funktioniert hat, war folgender:
Im Code, den Jürgen gepostet hat, waren zwei meiner ursprünglichen Einstellungen nicht berücksichtigt gewesen. Ich habe dies zunächst nicht bemerkt.
Einstellungen von Jürgen:
Frame.Width = 17000
Frame.Height = 15000
Meine Einstellungen:
Frame.Width = 17500
Frame.Height = 1000

Jetz geht wirklich alles und ich arbeite damit erst einmal.

Gruß

Jochen

Re: Writer: Rahmen mittels Makro einfügen

von uroveits » So, 31.10.2010 18:49

Hallo Jürgen,

jetzt funktioniert fast alles, so wie ich mir das vorstelle. Vielen Dank dafür.
Mit "fast" meine ich die Tatsache, dass in einem leeren Dokument alles funktioniert, aber nicht in meinen bestehenden Dokumenten. Da wird der Autotext-Inhalt an der falschen Stelle - also nicht unten -, sondern unterschiedlich in der Mitte bzw. an einer anderen Stelle auf der Seite eingefügt. Außerdem wird der Autotext (eine Tabelle; Erklärung s. weiter unten) nicht korrekt eingefügt. In einem leeren Dokument ist dies nicht der Fall.
Ich werde versuchen, herauszufinden, woran das liegt. Möglicherweise muss ich aber noch einmal nachfragen.
Es ist doch immer toll zu erleben wie sich die Dinge entwickeln.
Ich hoffe, dass Du das nicht ironisch meinst.
Die Überschrift des Threads lautet: Rahmen mittels Makro einfügen
Na ja. Ich hatte zwischendrin schon überlegt, einen neuen Thread aufzumachen. Aber das Thema wurde im weitesten Sinne nicht verfehlt. Aus einer Frage wurde fast ein kleines Projekt.

Ich bin jetzt Dir bzw. dem Forum fast eine Erklärung schuldig, für was ich das Makro benötige. Hier folgt sie:
Ich möchte erreichen, dass am Ende einer jeden Seite eine Tabelle steht. Diese Tabelle soll dort auch stehen bleiben, wenn der Text im Textfeld/Fließtext ergänzt wird.
Mit der der Fußzeilen-Lösung geht das nicht, da der Inhalt der Tabelle pro Seite unterschiedlich ist.
Mit der der Fußnoten-Lösung geht das auch nicht, da das Fußnoten-Zeichen im Text erstens jedesmal manuell eingegeben werden muss und zweitens bei einer Textergänzung mitwandert.
Mit dem o.g. Makro kann das Problem elegant gelöst werden. Diese Lösung hat Jürgen mit seinem Wissen und seiner Geduld ermöglicht.

Gruß

Jochen

Re: Writer: Rahmen mittels Makro einfügen

von turtle47 » So, 31.10.2010 17:45

Es ist doch immer toll zu erleben wie sich die Dinge entwickeln.

Die Überschrift des Threads lautet:
Rahmen mittels Makro einfügen
Man sieht was daraus geworden ist. :shock:
uroveits hat geschrieben:Darf ich Dich bitten, dazu noch einmal Stellung zu nehmen bzw. einen Lösungsvorschlag zu posten?
Folgender Code fügt auf die jeweilige Seite wo sich der Cursor gerade befindet den Rahmen und die Tabelle ein:

Code: Alles auswählen

sub RahmenEinfuegen
Dim Doc As Object
Dim TextTables As Object
Dim Cursor As Object
Dim Frame As Object
	Doc = thisComponent
	Cursor = doc.text.createtextcursor()
	myViewCursor = Doc.GetCurrentController.ViewCursor
	iPage = myViewCursor.getPage
	sFrameName = "Rahmen_Tabelle_" & iPage
	cursor.gotoRange(myViewCursor,false)
	oFrames = Doc.getTextFrames()
	
	if oFrames.hasByName(sFrameName) then
	msgbox "Der Rahmen auf Seite > " & iPage & " < ist bereits vorhanden! " & CHR(13) & "Der Vorgang wird abgebrochen! ", 48
	exit sub
	end if	


	Frame = Doc.createInstance("com.sun.star.text.TextFrame")
	Frame.setName(sFrameName)
	Frame.Width = 17000
	Frame.Height = 15000
	Frame.AnchorType = com.sun.star.text.TextContentAnchorType.AT_PAGE	
	Frame.TopMargin = 0
	Frame.BottomMargin = 0
	Frame.LeftMargin = 0
	Frame.RightMargin = 0
	Frame.BorderDistance = 0
	Frame.HoriOrient = com.sun.star.text.HoriOrientation.NONE
	Frame.VertOrient = com.sun.star.text.VertOrientation.BOTTOM

	Doc.Text.insertTextContent(Cursor, Frame, False)
	oAutoTextContainer = CreateUnoService("com.sun.star.text.AutoTextContainer")
	oGroup = oAutoTextContainer.getByName("mytexts")'Gruppe My Autotext anprechen
	oEntry = oGroup.getByName("TE")'Autotextkürzel übergeben
	Auto_String = oEntry.getText
	FrameCursor = Frame.createTextCursor()
	oEntry.applyto(FrameCursor)
	oFrames = Doc.getTextFrames()
	oFrame = oFrames.getByName(sFrameName)
	oText = oFrame.getText()
	oTextEnum = oText.createEnumeration()
	do while oTextEnum.hasMoreElements()
		oPart = oTextEnum.nextElement()
			if (oPart.supportsService("com.sun.star.text.Paragraph")) then
				oPart.dispose
		 	endif
	loop

end sub

Re: Writer: Rahmen mittels Makro einfügen

von uroveits » So, 31.10.2010 16:18

Hallo Jürgen,

jetzt funktioniert das Erstellen des "Rahmens" und das Einfügen des Autotextes. Vielen Dank für Deinen Code.

Ich habe heute den ganzen Tag über dieses Probem im Netz gelesen - hauptsächlich über virtuelle und "echte" Cursor, weil ich diesbezüglich ansetzen wollte. Aber eine Lösung konnte ich nicht finden. Ich glaube, dass mann solche Probleme nur duch jahrelange Erfahrung lösen kann. Ich muss mal Deinen Code näher analysieren.

Ich habe aber noch eine weiteres (und hoffentlich letztes) Problem zu meiner Anfrage.
Das Problem ist, dass der Einfügevorgang immer nur einmal pro Dokument funktioniert, d.h. wenn ich auf Seite 1 das Makro ausführe, wird alles wie gewünscht ausgeführt. Wenn ich jedoch die Seite 2 (oder x) des gleichen Dokumentes aufrufe und das Makro ausführen lassen, wird der "Rahmen" immer auf der Seite 1 eingefügt bzw. das Einfügen wirde durch die Hinweismeldung, die Du in Deinem Code generierst, abgefangen.
Ich habe mal in einem mehrseitigen Dokument beispielsweise für die Seite 50 das Makro ausführen lassen. Es tritt das o.g. Phänomen auf. Wenn ich z.B. auf der Seite 67 das Makro aufrufe, wird auf der Seite 50 der Einfügevorgang anstoßen.
Irgendetwas im Code legt fest, dass der Einfügevorgang auf der gleichen Seite durchgeführt werden soll, auf der bereits ein "Rahmen" erstellt worden ist. Ich habe die Ursache dafür noch nicht herausgefunden.
Das Problem hat nichts mit Deinem Code im eigentlichen Sinne zu tun. Das Problem bestand schon bei meinem ursprünglichen Code, bei dem die Erstellung des "Rahmen" (ohne Einbindung des Autotextes) funktioniert hat. Ich habe mich nur zunächst auf die Einbindung des Autotexts konzentriert. Jetzt muss das Problem mit dem Einfügen auf verschiedenen Seiten gelöst werden.
Ich habe mal eine Variable für den "Rahmennahmen" gesetzt (Du hast ja einen Namen - "Rahmen_Tabelle" - festgesetzt). Aber dies hat wie zu erwarten das Problem nicht gelöst.
Darf ich Dich bitten, dazu noch einmal Stellung zu nehmen bzw. einen Lösungsvorschlag zu posten?

Gruß

Jochen

Re: Writer: Rahmen mittels Makro einfügen

von turtle47 » So, 31.10.2010 15:58

Hallo Jochen,


dann versuche es mal mit diesem Code:

Code: Alles auswählen

sub RahmenEinfuegen
Dim Doc As Object
Dim TextTables As Object
Dim Cursor As Object
Dim Frame As Object
Doc = thisComponent
	oFrames = Doc.getTextFrames()
	if oFrames.hasByName("Rahmen_Tabelle") then
	msgbox "Der Rahmen ist bereits vorhanden! " & CHR(13) & "Der Vorgang wird abgebrochen! ", 48
	exit sub
	end if
Cursor = Doc.Text.createTextCursor()
Cursor.gotoNextWord(False)

	Frame = Doc.createInstance("com.sun.star.text.TextFrame")
	Frame.setName("Rahmen_Tabelle")
	Frame.Width = 17000
	Frame.Height = 15000
	Frame.AnchorType = com.sun.star.text.TextContentAnchorType.AT_PAGE
	Frame.TopMargin = 0
	Frame.BottomMargin = 0
	Frame.LeftMargin = 0
	Frame.RightMargin = 0
	Frame.BorderDistance = 0
	Frame.HoriOrient = com.sun.star.text.HoriOrientation.NONE
	Frame.VertOrient = com.sun.star.text.VertOrientation.BOTTOM

	Doc.Text.insertTextContent(Cursor, Frame, False)
	oAutoTextContainer = CreateUnoService("com.sun.star.text.AutoTextContainer")
	oGroup = oAutoTextContainer.getByName("mytexts")'Gruppe My Autotext anprechen
	oEntry = oGroup.getByName("TE")'Autotextkürzel übergeben
	Auto_String = oEntry.getText
	FrameCursor = Frame.createTextCursor()
	oEntry.applyto(FrameCursor)
	oFrames = Doc.getTextFrames()
	oFrame = oFrames.getByName("Rahmen_Tabelle")
	oText = oFrame.getText()
	oTextEnum = oText.createEnumeration()
	do while oTextEnum.hasMoreElements()
		oPart = oTextEnum.nextElement()
			if (oPart.supportsService("com.sun.star.text.Paragraph")) then
				oPart.dispose
		 	endif
	loop

end sub

Re: Writer: Rahmen mittels Makro einfügen

von uroveits » So, 31.10.2010 11:58

Hallo Jürgen,

vielen Dank für Deine schnelle Antwort.
Das Makro wird durch Deinen Vorschlag zwar aufgerufen und ausgeführt. Aber nicht in dem "Rahmen", sondern mitten im Fließtext. Das Problem ist die Fokusübernahme in den "Rahmen". Und da scheitert es momentan.
Ich habe in einem USA-Forum folgenden Code gefunden:

Code: Alles auswählen

vViewCursor.gotoRange(pFrame.getStart(),false)
Aber dieser funzt bei mir nicht. Hast Du noch eine Idee?

Es folgt zur Übersicht der bisher erstellte Code:

Code: Alles auswählen

sub RahmenEinfuegen
Dim Doc As Object
Dim TextTables As Object
Dim Cursor As Object
Dim Frame As Object
Doc = StarDesktop.CurrentComponent
Cursor = Doc.Text.createTextCursor()
Cursor.gotoNextWord(False)
Frame = Doc.createInstance("com.sun.star.text.TextFrame")
Frame.Width = 17500
Frame.Height = 1500
Frame.AnchorType = com.sun.star.text.TextContentAnchorType.AT_PAGE
Frame.TopMargin = 0
Frame.BottomMargin = 0
Frame.LeftMargin = 0
Frame.RightMargin = 0
Frame.BorderDistance = 0
Frame.HoriOrient = com.sun.star.text.HoriOrientation.NONE
Frame.VertOrient = com.sun.star.text.VertOrientation.BOTTOM 
Doc.Text.insertTextContent(Cursor, Frame, False)

oAutoTextContainer = CreateUnoService("com.sun.star.text.AutoTextContainer")
oGroup = oAutoTextContainer.getByName("<Bereichname>")
oEntry = oGroup.getByName("<Kürzel für Autotext>")
FrameCursor = Frame.createTextCursor()
QMHinweisEinfuegen
End sub

Gruß

Jochen

Re: Writer: Rahmen mittels Makro einfügen

von turtle47 » So, 31.10.2010 11:43

uroveits hat geschrieben:Gibt es eine Möglichkeit, das o.g. Makro ("QMHinweisEinfuegen") hier einzufügen bzw. ausführen zu lassen.

Code: Alles auswählen

	.....
	FrameCursor = Frame.createTextCursor()
	QMHinweisEinfuegen 'Sub QMHinweisEinfuegen aufrufen
End Sub	
sollte gehen.

Gruß

Jürgen

Re: Writer: Rahmen mittels Makro einfügen

von uroveits » So, 31.10.2010 11:24

Hallo Jürgen,

vielen Dank für Deine Hinweise.
Ich habe diese jetzt umgesetzt und es funktioniert im Prinzip. Das Problem, das jetzt noch auftritt ist folgendes:
Der Autotexteintrag besteht auf einer formatierten Tabelle. Ich habe ein Makro ("QMHinweisEinfuegen") geschrieben, mit dem diese Tabelle korrekt eingefügt wird (s. folgenden Code):
Dieser Code ist etwas länger, da ich die Leerzeile über und unter Tabelle automatisch entfernen lasse. Wahrscheinlich bekommst Du gerade einen Lachanfall wegen der umständlichen Programmierung. Aber es funktioniert.

Code: Alles auswählen

sub QMHinweisEinfuegen
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Group"
args1(0).Value = "SchiffersAutoText*1"
dispatcher.executeDispatch(document, ".uno:SetActGlossaryGroup", "", 0, args1())

rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "Group"
args2(0).Value = "SchiffersAutoText*1"
dispatcher.executeDispatch(document, ".uno:SetActGlossaryGroup", "", 0, args2())

rem ----------------------------------------------------------------------
dim args3(0) as new com.sun.star.beans.PropertyValue
args3(0).Name = "Group"
args3(0).Value = "SchiffersAutoText*1"
dispatcher.executeDispatch(document, ".uno:SetActGlossaryGroup", "", 0, args3())

rem ----------------------------------------------------------------------
dim args4(1) as new com.sun.star.beans.PropertyValue
args4(0).Name = "Group"
args4(0).Value = "SchiffersAutoText*1"
args4(1).Name = "ShortName"
args4(1).Value = "Q"
dispatcher.executeDispatch(document, ".uno:InsertGlossary", "", 0, args4())


rem ----------------------------------------------------------------------
dim args5(1) as new com.sun.star.beans.PropertyValue
args5(0).Name = "Count"
args5(0).Value = 1
args5(1).Name = "Select"
args5(1).Value = false
dispatcher.executeDispatch(document, ".uno:GoLeft", "", 0, args4())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:DelToEndOfSentence", "", 0, Array())

rem ----------------------------------------------------------------------
dim args6(1) as new com.sun.star.beans.PropertyValue
args6(0).Name = "Count"
args6(0).Value = 1
args6(1).Name = "Select"
args6(1).Value = false
dispatcher.executeDispatch(document, ".uno:GoUp", "", 0, args5())

rem ----------------------------------------------------------------------
dim args7(1) as new com.sun.star.beans.PropertyValue
args7(0).Name = "Count"
args7(0).Value = 1
args7(1).Name = "Select"
args7(1).Value = false
dispatcher.executeDispatch(document, ".uno:GoUp", "", 0, args6())

rem ----------------------------------------------------------------------
dim args8(1) as new com.sun.star.beans.PropertyValue
args8(0).Name = "Count"
args8(0).Value = 1
args8(1).Name = "Select"
args8(1).Value = false
dispatcher.executeDispatch(document, ".uno:GoUp", "", 0, args7())

rem ----------------------------------------------------------------------
dim args9(1) as new com.sun.star.beans.PropertyValue
args9(0).Name = "Count"
args9(0).Value = 1
args9(1).Name = "Select"
args9(1).Value = false
dispatcher.executeDispatch(document, ".uno:GoUp", "", 0, args8())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Delete", "", 0, Array())

end sub
Nun zu meinem Problem:
Mit Deinem Code-Vorschlag kann ich zwar den Autotext einfügen, aber die Formatierung wird nicht übernommnen. Aus meiner Sicht gibt es zwei Lösungsansätze, die ich aber beide bisher noch nicht umsetzen konnte. Vielleicht hast Du einen Tipp für mich:
Lösungsansatz1: Einfügen des Autotextes in dem gewünschten und im "AutoText" abgespeicherten Format
Lösungsansatz2: "FrameCursor = Frame.createTextCursor()" und "FrameCursor.String = " steuern wohl die Fokusübernahme und die AutoText-Ausführung innerhalb des "Rahmens". Gibt es eine Möglichkeit, das o.g. Makro ("QMHinweisEinfuegen") hier einzufügen bzw. ausführen zu lassen.

Gruß

Jochen

Re: Writer: Rahmen mittels Makro einfügen

von turtle47 » So, 31.10.2010 00:44

Hallo Jochen,
uroveits hat geschrieben:Hat da jemand einen Lösungsvorschlag?

Code: Alles auswählen

	.....
	Doc.Text.insertTextContent(Cursor, Frame, False)
	oAutoTextContainer = CreateUnoService("com.sun.star.text.AutoTextContainer")
	oGroup = oAutoTextContainer.getByName("standard")'Gruppe Standard anprechen
	oEntry = oGroup.getByName("AF")'Autotextkürzel übergeben
	Auto_String = oEntry.String
	FrameCursor = Frame.createTextCursor()
	FrameCursor.charWeight = com.sun.star.awt.FontWeight.BOLD
	FrameCursor.paraAdjust = com.sun.star.style.ParagraphAdjust.CENTER
	FrameCursor.String = Auto_String
Viel Erfolg.

Jürgen

Re: Writer: Rahmen mittels Makro einfügen

von uroveits » So, 31.10.2010 00:01

Hallo zusammen!

Ich habe das Problem lösen können. Hier die Makro-Syntax:

Code: Alles auswählen

sub RahmenEinfuegen
Dim Doc As Object
Dim TextTables As Object
Dim Cursor As Object
Dim Frame As Object
Doc = StarDesktop.CurrentComponent
Cursor = Doc.Text.createTextCursor()
Cursor.gotoNextWord(False)
Frame = Doc.createInstance("com.sun.star.text.TextFrame")
Frame.Width = 17500
Frame.Height = 1500
Frame.AnchorType = com.sun.star.text.TextContentAnchorType.AT_PAGE
Frame.TopMargin = 0
Frame.BottomMargin = 0
Frame.LeftMargin = 0
Frame.RightMargin = 0
Frame.BorderDistance = 0
Frame.HoriOrient = com.sun.star.text.HoriOrientation.NONE
Frame.VertOrient = com.sun.star.text.VertOrientation.BOTTOM 
Doc.Text.insertTextContent(Cursor, Frame, False)
end sub
Allerdings habe ich folgendes Problem noch nicht lösen können.
In den soeben erstellen Rahmen soll eine Tabelle eingefügt werden. Dazu möchte ich einen "AutoText" (Strg + F3) verwenden. Das Problem ist, dass nach der Erstellung des Rahmens sich der Fokus/Cursor im Fließtext befindet und nicht in dem Textfeld des Rahmens.
Ich kann zwar einen Text mit folgendem Code in den Rahmen einfügen:

Code: Alles auswählen

FrameCursor = Frame.createTextCursor()
FrameCursor.charWeight = com.sun.star.awt.FontWeight.BOLD
FrameCursor.paraAdjust = com.sun.star.style.ParagraphAdjust.CENTER
FrameCursor.String = "Dies ist ein kleiner Test!"
ABER: ich schaffe es nicht, den Fokus in den Rahmen zu setzen und dann einen "AutoText" (Strg + F3) aufrufen zu lassen..

Hat da jemand einen Lösungsvorschlag?

Gruß

Jochen

[gelöst] Writer: Rahmen mittels Makro einfügen

von uroveits » Sa, 30.10.2010 20:35

Hallo zusammen!

Ich schaffes es nicht, in Writer einen Rahmen mittels eines Makros einzufügen.

OS: MS Windows 7 (64 Bit)
OOo-Version: 3.2.1

Problem:
Wenn ich per Makrorecorder das Einfügen eines Rahmen aufzeichne, scheint alles zu funktionieren. Beim Abspielen des Makros wird aber nur ein Teil der Einstellungen des Rahmens ausgeführt.

Mein gewünschten Einstellungen sind:
Reiter „Typ“:
Größe:
Breite: 17,50 cm
Höhe: 1,50 cm
Autom. Größe: Haken ist gesetzt
Verankerung: „An der Seite“
Position:
Horizontal:
„Links“
zu: „Seitentextbereich“
Vertikal
„Unten“
zu: „Seitentextbereich“
Reiter „Umlauf“
Vorgabe: „Kein“
Abstände
Oben: 1,00 cm

Der Makrorecoder speichert aber nur folgendes ab:
sub Probe
rem ----------------------------------------------------------------------
rem define variables
dim document as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem ----------------------------------------------------------------------
dim args1(4) as new com.sun.star.beans.PropertyValue
args1(0).Name = "AnchorType"
args1(0).Value = 2
args1(1).Name = "Pos.X"
args1(1).Value = 0
args1(2).Name = "Pos.Y"
args1(2).Value = 0
args1(3).Name = "Size.Width"
args1(3).Value = 17500
args1(4).Name = "Size.Height"
args1(4).Value = 1499
dispatcher.executeDispatch(document, ".uno:InsertFrame", "", 0, args1())
end sub

Kann mir bitte jemand sagen, wie der vollständige Code lautet?

Gruß

Jochen

Nach oben