Zugriff auf Formularfeld (Position)

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

drbrode
**
Beiträge: 20
Registriert: Di, 29.11.2016 14:10

Zugriff auf Formularfeld (Position)

Beitrag von drbrode » Di, 27.02.2018 09:59

Hallo, ich habe mal wieder ein Problem. Vielleicht könnt ihr mir nochmal helfen...

Ich möchte gerne per Makro ein Formularfeld (grafische Schaltfläche) platzieren. Zugriff habe ich mir über den Befehl

Code: Alles auswählen

thisComponent.Sheets().getbyName("Tabelle").DrawPage.Forms.getbyName("Formular").getbyName("Feldname")
verschafft. Ich kann hier auch durchaus Parameter wir "BackgroundColour" oder "Sichtbarkeit" steuern. Aber anscheinend keine Position obwohl dies in den Eigenschaften des Kontrollfelds (Rechtsklickmenu) angegeben werden kann. Ich habe mit X-Ray nach den entsprechenden Parametern gesucht aber nichts gefunden.

Im Netz habe ich eine Lösung gefunden bei der folgender Code verwendet wird

Code: Alles auswählen

myPos.X = [x]
myPos.Y = [y]
myDrawpage = thisComponent.Sheets().getbyName("Name").Drawpage
for i = 0 to myDrawpage.count - 1
   myShape = myDrawpage(i)
   if myShape.supportsservice("com.sun.star.drawing.ControlShape") then
      if myShape.control.name = ("Feldname") then
         myShape.Position = myPos
      end if
   end if
next
Mit diesem Code scheint es zu funktionieren. Aber ich verstehe es nicht. Warum muss man den Umweg über die Schleife gehen? Ist es an dieser Stelle nicht möglich direkt auf das Formularfeld zuzugreifen und die Position einzugeben?

Mit X-Ray kommt man hier auch nicht weiter. An der Stelle

Code: Alles auswählen

myDrawpage = thisComponent.Sheets().getbyName("Name").Drawpage(i)
ist Schluss. Es ist anscheinend nicht möglich zu dem Punkt "Drawpage" mit einem Parameter (i) zu springen. "Drawpage" ist nur ohne Parameter verfügbar. (Hier habe ich mich jetzt sicher absolut unprofessionell ausgedrückt. Ich weiß aber nicht wie ich es anders beschreiben soll. Ich hoffe ihr wisst was gement ist.)

Zudem bin ich irgendwie von der Strukturierung verwirrt. Eigentlich existiert mein Formularfeld doch als Teil eines Formulars auf einer "Drawpage". Zumindest würde ich den Code

Code: Alles auswählen

thisComponent.Sheets().getbyName("Name").DrawPage.Forms.getbyName("Formular").getbyName("Feldname")
so interpretieren. Nun scheint es mir aber so zu sein, dass ebenfalls eine "Drawpage" unterhalb des Formulars existiert, die denselben Namen trägt wie mein Formularfeld.

Code: Alles auswählen

thisComponent.Sheets().getbyName("Name").Drawpage(i).control.name
Über diesen "Pfad" suche ich mir ja in der oben beschriebenen Schleife die richtige "Drawpage" für mein Formularfeld heraus.

Ich bin auf jeden Fall ziemlich verwirrt. Wäre schön, wenn jemand Licht in mein Dunkel bringen könnte...


_________________
Moderationshinweis
Thema verschoben von OOo Calc nach Makros und allgemeine Programmierung, wo alle Themen zur individuellen Programmierung hingehören. – lorbass, Moderator

mikeleb
******
Beiträge: 720
Registriert: Fr, 09.12.2011 16:50

Re: Zugriff auf Formularfeld (Position)

Beitrag von mikeleb » Di, 27.02.2018 10:28

Hallo,
die Frage gehört eher ins Unterforum "Makros und allgemeine Programmierung" ...
Der Hintergrund ist folgender: Jedes Kontrolelement besteht im Prinzip aus zwei Teilen, shape und control. Wenn z. B. eine Schaltfläche angelegt wird, wird zunächst der (geometrische) "Rahmen" (inkl. Position, Größe etc.) erstellt und darin die eigentliche Schaltfläche.
Der Rahmen liegt in der drawpage der Seite. Das Makro durchsucht nur alle (grafischen) Elemente der drawpage bis das richtige (mit dem entsprechenden control) gefunden ist.
Auf das control kannst du per .forms zugreifen von dort aber nicht auf das zugrunde liegende shape. Vom shape kann man allerdingsauf das control zugreifen.
Gruß,
mikeleb

drbrode
**
Beiträge: 20
Registriert: Di, 29.11.2016 14:10

Re: Zugriff auf Formularfeld (Position)

Beitrag von drbrode » Di, 27.02.2018 11:55

Ok, so langsam verstehe ich.

Das ist wohl so ähnlich wie beim html-Codieren. Die Trennung zwischen Inhalt und Layout (CSS).

Ich habe auch gerade herausgefunden, dass man durchaus auch direkt auf das Formularfeld (als Shape) zugreifen kann. Mann muss nur die Index-Nummer wissen.

Code: Alles auswählen

myDoc = thisComponent.Sheets().getByName("Tabelle").Drawpage.getbyIndex(i)
Warum an dieser Stelle jedoch kein

Code: Alles auswählen

.getbyName("Drawpage")
unterstützt wird ist mir schleierhaft...

Ich habe mir nun ein kleines Makro geschrieben mit dem ich alle auf einem Tabellenblatt hinterlegten Elemente mit "Index-Nr", "Shape.Name" und "control.Name" auslesen kann. Das hilft...

(Sorry für die falsche Wahl des Unterforums. Vielleicht kann einer der Admins das ja verschieben...)

Antworten