Seite 1 von 1

mit basic makro den Text eines Textfeldes in Impress ändern

Verfasst: Mi 20. Aug 2014, 00:19
von libre4711
Hallo,

wie kann man in Impress den Text eines Textfeldes ändern?

Code: Alles auswählen

Sub Textaendern
Dim  oDocument       As Object
Dim  oForm              As Object
Dim  oLabel              As Object

	oDocument      =  ThisComponent
	oForm          = oDocument.DrawPages(0).Forms.getByName("folie2")
					 
	oLabel         =  oForm.GetByName( "lbltest" )
	oLabel.Label   =  "Test"
End Sub
Das ganze scheitert schon in der Zeile:

Code: Alles auswählen

oForm          = oDocument.DrawPages(0).Forms.getByName("folie2")
Mit der Fehlermeldung:

Code: Alles auswählen

LibreOffice 3.5
Basic-Laufzeitfehler.
Es ist eine Ausnahme aufgetreten
Type: com.sun.star.container.NoSuchElementException
Message:.
Da ich schon seit Stdunden an dem Problem sitze sehe ich wohl den Wald vor lauter Bäumen nicht mehr.

Deshalb bitte ich um sachdienliche Hilfe.

Gruß
libre4711

Re: mit basic makro den Text eines Textfeldes in Impress änd

Verfasst: Mi 20. Aug 2014, 07:35
von karolus
Hallo

Die Fehlermeldung sagts doch deutlich:

Ein "Ding" das über diesen Namen angesprochen werden kann, gibts nicht.

Du benutzt doch sicher schon Mri oder Xray :!:

Karolus

Re: mit basic makro den Text eines Textfeldes in Impress änd

Verfasst: Mi 20. Aug 2014, 09:53
von libre4711
karolus hat geschrieben: Die Fehlermeldung sagts doch deutlich:

Ein "Ding" das über diesen Namen angesprochen werden kann, gibts nicht.
Karolus
Die Fehlermeldung glaube ich schon verstanden zu haben. Was ich nicht verstehe ist warum die Fehlermeldung kommt,
da die "folie2" definitiv existiert.

Um so mehr verwundert mich, das folgender Befehl mit einer Fehlermeldung quitiert wird:

Code: Alles auswählen

msgbox ThisComponent.DrawPages(0).Forms(0).Name

Code: Alles auswählen

LibreOffice 3.5
Unzulässiger Wert oder Datentyp.
Index außerhalb des definierten Bereiches.
In der Präsentation gibt es zwei Folien. Somit muß doch .Forms(0).Name und .Forms(1).Name existieren, oder
verstehe ich hier etwas grundlegend falsch?
karolus hat geschrieben: Du benutzt doch sicher schon Mri oder Xray :!:
Karolus
Da ich in Sachen Libre Office blutiger Anfänger bin würde ich ungerne Software installieren, bei der ich nicht weiß
wie man diese bedient. Die Frage ist auch ob diese zielführend ist um das Problem zu lösen.

Es scheint mir das hier ein simpler Anfängerfehler vorliegt. Nur leider finde ich diesen nicht.
Es scheint als ob das Objekt ThisComponent nicht angesprochen werden kann, bzw. leer ist.
Gibt es hier irgendwelche Restriktionen die freigeschaltet werden müssen?

Re: mit basic makro den Text eines Textfeldes in Impress änd

Verfasst: Mi 20. Aug 2014, 10:59
von karolus
Hallo

Du wirst mit der Programmierung in LO nicht weit kommen ohne die Benutzung eines Objektinspektors.
Dazu gibt eine Online-hilfe auf der Extensionsseite.
Mri kann im wesentlichen aus LO heraus über →Extras→Add-ons→MRI resp. →MRI<Selection bedient werden.

Falls dein Präsentation keine privaten Daten enthält häng die Datei mal an, damit man dir helfen kann.

Ich vermute Impress hat in etwa folgende Objekt-hierarchie
  • ThisComponent
    • →.DrawPages().getByIndex( ? )
      • →→.getByIndex( ? )
        • →→→.getForms() # ab hier wäre es pures Raten
Karolus

Re: mit basic makro den Text eines Textfeldes in Impress änd

Verfasst: Mi 20. Aug 2014, 22:21
von libre4711
Danke für die Hilfe.
Mir werde ich testen. Zwischenzeitlich wurden die Objekte Stück für Stück mittels
dbg_methods, dbg_properties und dbg_supportedinterfaces analysiert und heraus kam der folgende Code.

Der Code hat nur einen gravierenden Schönheitsfehler. Im "Entfurfs-Modus" funktioniert dies Einwandfrei,
aber wenn die Präsentation gestartet wird wird der Code zwar ausgeführt, aber auf der Folie sieht man keine Veränderung.
Erst wenn die Präsentation beendet wird sieht man die Veränderung im "Entfurfs-Modus".

Wie kann man Impress dazu bewegen ein Objekt neu zu zeichnen. In den Objekten habe ich nicht wirklich eine Methode
(reload oder refresh oder ...) dazu gefunden.

Hat dazu noch jemand eine Idee?

Code: Alles auswählen

Sub test
Dim  oDocument       As Object
Dim  oDrawPage       As Object
Dim  oLabel          As Object

	oDocument = ThisComponent
	oDrawPage = oDocument.DrawPages(1)
		
	oDrawPage.GetByIndex(2).SetString("endlich")
		
End Sub

Re: mit basic makro den Text eines Textfeldes in Impress änd

Verfasst: Do 21. Aug 2014, 11:19
von libre4711
Kann es sein, das Impress-Makros gar nicht zur Laufzeit der Präsentation Änderungen an dieser ausführen können, welche somit unmittelbar angezeigt werden sollen?

Der folgende Code aus http://www.pitonyak.org/OOME_3_0.pdf auf Seite 553 und folgende führt während der Präsentation zu keiner Bildschirmausgabe. Erst wenn die Präsentation beendet wird erscheinen die vom Programm erzeugten Linien.

Die Präsentation liegt an.
Verwendet wurde LibreOffice Version: 4.2.4.2 Build-ID: 63150712c6d317d27ce2db16eb94c2f3d7b699f8
auf einem Windows 7
Die Probleme treten jedoch auch unter XUbuntu 12.04 mit LibreOffice 3.irgendwas auf.

Listing 485. Draw 20 lines in a Draw or Impress document.

Code: Alles auswählen

Function draw20Lines()
Dim oPage 'Page on which to draw
Dim oShape 'Shape to insert
Dim oPoint 'Initial start point of the line
Dim oSize 'Width and height of the line
Dim i% 'Index variable
Dim n% 'Number of iterations to perform
Dim nShift%'Shift the graphic down
Dim oDoc
oDoc = LoadEmptyDocument("sdraw")
draw20Lines = oDoc
oPage = createDrawPage(oDoc, "Test Draw", True)
nShift = oPage.Height / 4
n = 20
For i = 0 To n
oShape = oDoc.createInstance("com.sun.star.drawing.LineShape")
oShape.LineColor = RGB( 255, 0, i+20 )
oShape.LineWidth = 20
oPoint = oShape.Position
oPoint.X = oPage.Width / 4

oPoint.Y = i * oPage.Height / n / 4 + nShift
oShape.Position = oPoint
oSize = oShape.Size
oSize.Height = (oPage.Height - 2 * i * oPage.Height / n) / 4
oSize.Width = oPage.Width / 2
oShape.Size = oSize
oPage.add(oShape)
Next
End Function