Seite 1 von 1
Kopieren von Elementen einer Drawpage
Verfasst: Mi, 18.01.2012 14:24
von Maggus
Hallo,
also ich dachte, wie man in einem Calc Sheet auf ein Element in der Drawpage zugreift wäre mir klar:
Code: Alles auswählen
oSheet = thisComponent.Sheets.getByName("test")
For n = 0 to oSheet.DrawPage.getCount -1
oThisElement = oSheet.DrawPage.getByIndex(n)
If oThisElement.Name = "hinweis1" Then
xray oThisElement
End If
Next n
End Sub
Aber:
Frage1: greift man mit
DrawPage.getByIndex(n) auf das gleiche zu wie mit
DrawPage(n)? und ist das jetzt die DrawPage oder das x-te Element der DrawPage? Ich dachte jedes Sheet hat nur eine DrawPage
Frage2: Wie kann ich in der DrawPage was Löschen ohne dass Office abschmiert? Mit dispose? remove? Kombination?
Noch wichtiger für mich: Wie kann ich Ein gruppiertes Element kopieren und auf einem anderen Sheet einfügen? Oder geht das garnicht über die DrawPage? Ich finde mit Xray nämlich nichts dergleichen.
Gruß,
Re: Kopieren von Elementen einer Drawpage
Verfasst: Fr, 20.01.2012 19:12
von DPunch
Aloha
Frage1: Ja - die Drawpage ist ein Container, und Container erlauben den Zugriff statt per getByIndex-Methode (fast) immer auch durch die verkürzte "Array-Schreibweise" x(n).
Frage2: Wurde z.B.
Hier oder auch
Hier schon behandelt, gibt sicher noch etliche Links mehr.
Frage3: Ohne Weiteres dürfte das nicht gehen, nein, da wirst Du vermutlich jedes Element einzeln kopieren und rüberschieben müssen.
Re: Kopieren von Elementen einer Drawpage
Verfasst: Mo, 23.01.2012 11:18
von Maggus
Hi DPunch,
danke für die Aufklärung. Klar mit Sheets.getByIndex ist das ja das gleiche.
Bei den verlinkten Beiträgen, welche mir schon bekannt waren, geht es ja um Formular Elemente. Trifft das denn auf ein gezeichnetes Rechteck genauso zu? Müsste ich da auch ein Model aus einem Formular löschen?
DPunch hat geschrieben:
Ohne Weiteres dürfte das nicht gehen, nein, da wirst Du vermutlich jedes Element einzeln kopieren und rüberschieben müssen.
Auch nicht per Dispatcher? ich könnte ja mit
Code: Alles auswählen
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
Die aktuelle Selektion kopieren. Leider ist es mir bisher aber auch nicht gelungen per Makro die Selektion auf ein Shape zu setzen.
So oder so finde ich keine Methods für den Kopiervorgang. Gehe ich richtig der Annahme, dass das nur mit
oDrawPage.add(oShape) geht? Bei meinen bisherigen Versuchen wird damit allerdings immer nur das oShape aus dem Quell Sheet gelöscht. Warum auch immer...
[EDIT] Quatsch. Narürlich nicht gelöscht. Wurde im gleichen Sheet mit x=0 y=0 und 1x1 mm geändert.[/EDIT]
So sieht mein Code aus:
Code: Alles auswählen
Sub copyElement
ActiveSheet = ThisComponent.CurrentController.ActiveSheet
For n = 0 to ActiveSheet.DrawPage.getCount -1
oShape = ActiveSheet.DrawPage.getByIndex(n)
If oShape.supportsService("com.sun.star.drawing.Shape") Then
If oShape.Name = "kopiermich" Then
ThisComponent.Sheets(5).Drawpage.add(oShape)
End If
End If
Next n
End Sub
Gruß,
Re: Kopieren von Elementen einer Drawpage
Verfasst: Mo, 23.01.2012 12:02
von Frieder D.
Hallo Maggus
Bei meinen bisherigen Versuchen wird damit allerdings immer nur das oShape aus dem Quell Sheet gelöscht. Warum auch immer...
Du musst erst eine Kopie der Grafik erstellen.
der Code sieht dann so aus:
Code: Alles auswählen
Sub copyElement
ActiveSheet = ThisComponent.CurrentController.ActiveSheet
For n = 0 to ActiveSheet.DrawPage.getCount -1
oShape = ActiveSheet.DrawPage.getByIndex(n)
If oShape.supportsService("com.sun.star.drawing.Shape") Then
If oShape.Name = "kopiermich" Then
'Kopie erstellen:
oshapecoppy = thiscomponent.createInstance("com.sun.star.drawing.GraphicObjectShape")
'muss vieleicht so heißen
'oshapecoppy = thiscomponent.createInstance("com.sun.star.drawing.Shape")
with oshapecoppy
.name = oShape.Name
.size = oShape.size
.position = oShape.position
.GraphicURL = oShape.GraphicURL
end with
ThisComponent.Sheets(5).Drawpage.add(oshapecoppy)
End If
End If
Next n
End Sub
Gruß Frieder
Re: Kopieren von Elementen einer Drawpage
Verfasst: Mo, 23.01.2012 13:30
von Maggus
Ahaaa....
Sehr schön. Folgendes musste noch geändert werden:
ThisComponent.createInstance("com.sun.star.drawing.
RectangleShape")
(herausgefunden mittels oShape.getShapeType)
und
ohne GraphicURL
folgendes funktioniert also:
Code: Alles auswählen
Sub copyRectangleShape
ActiveSheet = ThisComponent.CurrentController.ActiveSheet
For n = 0 to ActiveSheet.DrawPage.getCount -1
oShape = ActiveSheet.DrawPage.getByIndex(n)
If oShape.supportsService("com.sun.star.drawing.Shape") Then
If oShape.Name = "kopiermich" Then
oShapeCopy = ThisComponent.createInstance("com.sun.star.drawing.RectangleShape")
With oShapeCopy
.Size = oShape.Size
.Position = oShape.Position
End With
ThisComponent.Sheets(5).Drawpage.add(oShapeCopy)
End If
End If
Next n
End Sub
Bleibt die Frage mit dem Kopieren einer Gruppierung per Dispatcher!?
Und wenn ich mir in einem Calc Sheet DrawPage.Forms(0) ansehe, dann deutet Count = 0 darauf hin, dass ich beim Löschen eines RectangleShape nur die View aus der DrawPage löschen muss und kein Model aus irgendeinem Form, oder irre ich?
Danke Frieder,
Gruß,
Re: Kopieren von Elementen einer Drawpage
Verfasst: Di, 24.01.2012 11:19
von Maggus
Das mit dem Kopieren einer Gruppierung per Dispatcher funktioniert.
Habe mir folgendes zusammengebastelt:
Code: Alles auswählen
Sub copyShapeCollection
oDocCtrl = ThisComponent.CurrentController
ActiveSheet = oDocCtrl.ActiveSheet
For n = 0 to ActiveSheet.DrawPage.getCount -1
oShapeCollection = ActiveSheet.DrawPage.getByIndex(n)
If oShapeCollection.supportsService("com.sun.star.drawing.GroupShape") Then
If oShapeCollection.Name = "MeineGruppierung" Then
oDocCtrl.select(oShapeCollection)
oFrame = oDocCtrl.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(oFrame, ".uno:Copy", "", 0, Array())
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "Nr"
args2(0).Value = 6
dispatcher.executeDispatch(oFrame, ".uno:JumpToTable", "", 0, args2())
dispatcher.executeDispatch(oFrame, ".uno:Paste", "", 0, Array())
oDocCtrl.select(createUnoService("com.sun.star.drawing.Shape")) 'Selektion aufheben
End If
End If
Next n
End Sub
Vielleicht kann man das noch verfeinern...
Gruß,