🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

[gelöst] Vorhandenes Bild per Makro nach unten verschieben

Alles zur Programmierung im LibreOffice.
Antworten
Oscar B
Beiträge: 28
Registriert: Fr 15. Jan 2021, 13:49

[gelöst] Vorhandenes Bild per Makro nach unten verschieben

Beitrag von Oscar B » Sa 30. Jan 2021, 11:34

Hallo!
Ich bin schon wieder auf ein neues Problem gestoßen!
Ich habe zwar einige Forumsbeiträge zu diesem Thema gefunden, aber keine Lösung war Zielführend!
Also: ich habe in einer Tabelle ein Bild, mit dem ein Makro gestartet wird. Dieses Makro trägt Werte unter die bestehende Tabelle. Jedes Mal, wenn das Makro ausgeführt wird, kommt also eine beschriebene Zeile hinzu!

Jetzt möchte ich, dass sich am Ende des Makros die Grafik um einen bestimmten Wert nach unten verschiebt, damit sie immer am Ende der Tabelle bleibt.
In anderen Foren bin ich oft auf die Methode Bild.HoriOrientPosition oder Bild.HoriOrient gestoßen. Diese Methode kennt das Makro aber anscheinend nicht.

Vielen Dank im Voraus!
Zuletzt geändert von Oscar B am Sa 30. Jan 2021, 18:46, insgesamt 1-mal geändert.
LibreOffice Version 7.1.1.2 (x64) - Windows 10 (x64)

craig
* LO-Experte *
Beiträge: 1137
Registriert: Do 21. Apr 2016, 11:42

Re: Vorhandenes Bild per Makro nach unten verschieben

Beitrag von craig » Sa 30. Jan 2021, 15:28

Hallo Oscar,

fallbezogen muss man für Größenangabe und auch Positionsangabe u.U. ein sogenanntes Struct deklarieren.
Structs werden auch constants groups genannt:

Code: Alles auswählen

Dim aGrafikGroesse As new com.sun.star.awt.SIZE
oder auch:

Code: Alles auswählen

Dim aGrafikPosSize  As new com.sun.star.awt.POSSIZE 
Die Referenzierung mit dem Präfix a steht hierbei für Structure.
Siehe hier Konventionen...

Wenn die Variable "aGrafikGroesse" mit Xray (siehe weiter unten) untersucht, erkennt man was sich dahinter verbirgt:

Code: Alles auswählen

xray aGrafikGroesse
oder auch:

Code: Alles auswählen

xray aGrafikPosSize
Ergänzend diese API-Websites:
constants group POSSIZE
SIZE Struct Reference
Constant Group Reference POSSIZE
Ich weise hier ausdrücklich daraufhin, dass der Name u.U. in Großbuchtsaben geschrieben werden muss :!:
Ich weiß nicht welche Regel hinter der Großschreibung steht, bin aber selbst schon mal daran verzweifelt,
dass ein Code niicht funktioniert, bis ich dann irgendwo im Netz über die Großschreibung gestolpert bin.
Bei Verwendung von SIZE scheint diese Regelung nicht wichtig zu sein, dennoch schreibe ich SIZE groß.

Hier ein Beispielcode, welchen ich für ein Writer-Dokument erstellt habe:

Code: Alles auswählen

REM  *****  BASIC  *****
'***************************************************************************
'	Dieser Code erfasst ein markiertes Bild, schneidet es zu, ändert 
'	dessen Größe und verschiebt das Bild an seine Zielposition.
'***************************************************************************
Sub PicDaten
Dim oDoc as object
Dim oShape as Object
Dim oPage as Object
Dim oGraphicCrop as Object
Dim oSel as Object
Dim nIndexDraw as Integer
Dim i as Integer
	
	oDoc=ThisComponent
	
    ' aktuelle Markierung/ Selektion erfassen
    oSel = oDoc.CurrentSelection
    
    ' Prüfen ob sich der Inhalt der Selektion ein Grafikobjet ist
    ' Wenn kein Bild, dann Programm beenden  
    If oSel.ImplementationName <> "SwXTextGraphicObject" Then
       Exit Sub
    End If
'  xray oSel
	' Dem aktuellen Bild einen vorläufigen Namen zuweisen, 
	' zweck späterer Identifikation	
	oSel.setName("Post")
	
   oPage = oDoc.drawPage
 '  xray oPage
 
   ' Objektzuweisung für das gewünschtes Bild
   for i = 0 to oPage.count
	   oShape = oPage.getByindex(i)
	   if oshape.name = "Post" then
		   	nIndexDraw=i
		   		exit for
	   End if
   next i

'xray oShape(nIndexDraw)

'------------------- Daten zuschneiden ------------------------------------------------------

oGraphicCrop = oShape(nIndexDraw).GraphicCrop
	' Zuschnitte festlegen
	With oGraphicCrop
		.Top = 8489
		.Bottom = 6200
		.Left = 10000
		.Right = 2850
	End with
'xray oGraphicCrop
' Daten entsprechend der obigen Parameter zuschneiden
oShape(nIndexDraw).GraphicCrop = oGraphicCrop
'--------------------------------------------------------------------------------------------


'------------------- Daten Größe ändern ------------------------------------------------------
Dim nB as Long
Dim nH as Long

' Variablen für die Daten Größe
nB=2.35*1000	' Höhe Daten 2,35
nH=0.86*1000	' Breite Daten 0,86

' Größenobjekt erstellen
Dim aGrafikGroesse As new com.sun.star.awt.SIZE
' Größenzuweisung
	With aGrafikGroesse
		.height = nH
		.width = nB
	End With
'Größe entsprechend der obigen Parameter zuschneiden und zuweisen
oShape(nIndexDraw).setSize(aGrafikGroesse)
'--------------------------------------------------------------------------------------------



'------------------- Daten an Zielposition verschieben ---------------------------------------
	With oShape(nIndexDraw)
		.HoriOrientPosition=7600		' = cm * 1000
		.VertOrientPosition=6300-860	' = cm * 1000 [840 = 0,84cm = relative Höhe des Bildes]
	End With
'--------------------------------------------------------------------------------------------

'----------------- Daten einen neuen Bildnamen geben -------------------------------------
'	Bildname = Daten & _ & Zufallszahl (Integer aus Datum) 
' 	das heutige Datum erfassen
Dim xD as Date
Dim nZufall as Long
	xD=Date
	' Zufallszahl berechnen
    nZufall = Int((xD * Rnd) -2)

		' dem markierten Objekt einen neuen Namen zuweisen.
		oShape(nIndexDraw).Name="Daten_" & nZufall
End Sub
Damit der Code funktioniert, musst Du ein Bild in einem Writerdokument markieren :!:

Im Code findest Du auskommentierte Zeilen wie etwa:

Code: Alles auswählen

'  xray oSel
Xray ist ein Codeinpektions-Tool.
Es handelt sich hierbei um eine Writer-Datei, inklusive deutschsprachige Dokumentation.
X-Ray tool von Bernard Marcelly

Wichtig für den Anfang sind die Seiten 5 und 7
  • Auf Seite 5 findest Du Schaltflächen, mit denen Du Xray de/ installieren kannst.
  • Auf Seite 7 wird beschrieben, wie Du Xray in Dein Office integrieren kannst, bzw.
    was erforderlich ist wie Xray standardmäßig bei Officestart geladen werden kann.
Diesen Code verwende ich zum Laden von Xray und der Bibliothek "Tools"

Code: Alles auswählen

REM  *****  BASIC  *****
Option Explicit

REM ════════════════════════════════════════════════════════════════════════════════════════════════════
REM					BASIC-IDE: 
REM 1)	LoadingLibraries
REM 
REM ════════════════════════════════════════════════════════════════════════════════════════════════════


REM (1)
REM Bibliotheken bie LibreOffice-Start laden
Sub LoadingLibraries

	' Hier in der Basic-IDE -> Objektkatalog
	' LibreOffice Makros & Dialoge -> Tools
	Globalscope.BasicLibraries.LoadLibrary ( "Tools")
	
		'https://extensions.openoffice.org/en/project/mri-uno-object-inspection-tool
		' Fuer Libreoffice: https://extensions.openoffice.org/en/projectrelease/mri-uno-object-inspection-tool-133
REM 		Globalscope.BasicLibraries.LoadLibrary ( "MRILib")
	
			' https://wiki.openoffice.org/wiki/DE/Makro_Basic_Tutorial
			'http://berma.pagesperso-orange.fr/Files_en/XrayTool60_de.odt
			GlobalScope.BasicLibraries.LoadLibrary("XrayTool")
End Sub
Info zur Bibliothek "Tools"
In dieser Bibliothek sind vorgefertigte Funktionen, auf die man in seinem eigenen Code zugreifen kann:
Basic IDE → Objektkatalog → LibreOffice Makros & Dialoge → Tools
Ich nutze relativ häufig Funktionen aus dem Modul "Strings"
U.a. ist es bei Datei(namen)-Operationen sehr hilfreich:
Test Tools-Bibliothek.odt
(81.79 KiB) 135-mal heruntergeladen
Gruß

Craig

Nie die Sicherungskopie vergessen!

════════════════════════════════════════════════
WIN 10 Pro 64-Bit • LO 7.4.5.1 (x64) • AOO 4.1.8

Oscar B
Beiträge: 28
Registriert: Fr 15. Jan 2021, 13:49

Re: Vorhandenes Bild per Makro nach unten verschieben

Beitrag von Oscar B » Sa 30. Jan 2021, 18:45

Vielen Dank für die Antwort!
Dein Code ist (mal wieder :D ) sehr nützlich und lehrreich!
Für dieses Problem habe ich mir jetzt aber einen anderen Code geschrieben!

Code: Alles auswählen

Sub Bildverschieben
Dim Zeile as Long

doc=thisComponent
sheet=doc.sheets.getbyname("Tabelle1")
Page=sheet.drawPage

Zeile=10	'Im Orginalcode wird hier die Zeile ermittelt, die als nächstes beschrieben wird

zBildanker=sheet.getcellrangebyname("B" & Zeile)
Bild=Page.getbyIndex(0)

Bild.Anchor = zBildanker

end sub
So verschiebt sich das Bild immer mit, wenn in der Tabelle eine neue Zeile beschrieben wird!

Grüße
Oscar
LibreOffice Version 7.1.1.2 (x64) - Windows 10 (x64)

craig
* LO-Experte *
Beiträge: 1137
Registriert: Do 21. Apr 2016, 11:42

Re: [gelöst] Vorhandenes Bild per Makro nach unten verschieben

Beitrag von craig » Sa 30. Jan 2021, 19:14

Hallo Oscar,

auch Dir einen herzlichen Dank. :D

Einen solches Problem hatte ich noch nicht und habe jetzt von Dir etwas gelernt.

Deinen Code werde ich zugegebner Zeit testen.

bis dann...
Gruß

Craig

Nie die Sicherungskopie vergessen!

════════════════════════════════════════════════
WIN 10 Pro 64-Bit • LO 7.4.5.1 (x64) • AOO 4.1.8


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten