Seite 1 von 1
[gelöst] Listener in Laufzeit für Shapes erzeugen
Verfasst: Di, 07.02.2012 10:22
von Maggus
Hallo,
ich schlag mich mal wieder mit Listener herum...
Was ich nicht verstehe:
1. Man kann in einem Calcsheet einem Beschriftungsfeld manuell ein Makro zuordnen (RMT > Kontrollfeld -> Ereignisse > Maustaste losgelassen). Aber wenn ich dieses Kontrollfeld mit Xray untersuche zeigt er mir nur addEventListener und nicht addMouseListener. Warum?? Wie kann man denn einen XMouseListener per Makro darauf legen? Alle meine Versuche sind bisher fehlgeschlagen. Auch finde ich manuell gesetzte Eventlistener in Xray nicht wieder.
2. Worauf genau muss ich bei einem Shape den Listener setzen? Auf das Model
ThisComponent.Sheets(0).DrawPage.Forms(0).getByName("testName").addEventListener(oListener)
oder das Zeichnungsobjekt
ThisComponent.Sheets(0).DrawPage.getByIndex(0).addEventListener(oListener)?
In Dialogen bekomme ich das alles hin, aber in Formularen haperts.
Gruß,
Re: Listener in Laufzeit für Shapes erzeugen
Verfasst: Di, 07.02.2012 10:55
von Frieder D.
Hallo Maggus
Was du brauchst ist ein "com.sun.star.script.ScriptEventDescriptor"
Dem kannst du jeden beliebigen Listerner zuweisen, und diesen dann dem Beschriftungsfeld zuweisen.
ein Beispiel findest du hier:
viewtopic.php?f=18&t=51360
und hier:
viewtopic.php?f=2&t=46662
Gruß Frieder
Re: Listener in Laufzeit für Shapes erzeugen
Verfasst: Di, 07.02.2012 11:42
von Maggus
Frieder D. hat geschrieben:Was du brauchst ist ein "com.sun.star.script.ScriptEventDescriptor"
Ahaaa, endlich funktionierts.

Ähnlichen Code hatte ich im Forum schon gefunden, aber bislang hatte ich es nicht richtig anpassen können. Sieht also bei mir jetzt so aus:
Code: Alles auswählen
Dim oEvent as new com.sun.star.script.ScriptEventDescriptor
oEvent.ListenerType = "com.sun.star.awt.XMouseListener"
oEvent.EventMethod = "mouseReleased"
oEvent.ScriptType = "StarBasic"
oEvent.ScriptCode = "vnd.sun.star.script:Standard.Module1.test"
oForm.registerScriptEvent(nIndex, oEvent)
Wofür soll denn dann aber das addEventListener gut sein?
Und noch eine Frage: Man soll doch für einen Listener immer eine disposing Routine zur Verfügung stellen. Erübrigt sich das in diesem Falle?
Also besten Dank für den Hinweis!
Re: Listener in Laufzeit für Shapes erzeugen
Verfasst: Di, 07.02.2012 12:29
von Frieder D.
Hallo Maggus
Und noch eine Frage: Man soll doch für einen Listener immer eine disposing Routine zur Verfügung stellen. Erübrigt sich das in diesem Falle?
Es gibt verschiedene arten von Listenern. Manche brauchen eine eine disposing Routine, und manche nicht.
In diesem Fall Benötigst du keine disposing Routine.
Wann du eine brauchst und wann nicht, kannst du im immer in der
API Nachlesen.
Gruß Frieder
Re: Listener in Laufzeit für Shapes erzeugen
Verfasst: Di, 07.02.2012 14:08
von Maggus
Frieder D. hat geschrieben:Es gibt verschiedene arten von Listenern. Manche brauchen eine eine disposing Routine, und manche nicht.
Das ist ja interessant. Und wo genau sehe ich das? Steht das in der jeweiligen "Methods' Summary" ?
Wie muss ich dann das hier verstehen (aus Andrew Pitonyaks Makros explained, übersetzt von Volker Lenhardt):
Alle Listeners stammen vom XEventListener ab, so dass die Methode disposing(ObjectEvent) auch implementiert sein muss.
???
Gruß,
Re: Listener in Laufzeit für Shapes erzeugen
Verfasst: Mi, 08.02.2012 21:25
von DPunch
Servus
Frieder D. hat geschrieben:Es gibt verschiedene arten von Listenern. Manche brauchen eine eine disposing Routine, und manche nicht.
Sorry, aber die Antwort ist... komplett falsch.
Wie kommst Du darauf?
Maggus hat geschrieben:Wofür soll denn dann aber das addEventListener gut sein?
Und noch eine Frage: Man soll doch für einen Listener immer eine disposing Routine zur Verfügung stellen. Erübrigt sich das in diesem Falle?
Der Unterschied zwischen den beiden Methoden ist, dass Du mit addEventListener zur Laufzeit einen Listener erstellst, der eben auch nur zur Laufzeit seine Gültigkeit behält.
Mit registerScriptEvent verankerst Du das Event dagegen fest im Dokment, sprich der Listener wird bei jedem Laden erneut initialisiert, so als hättest Du das Event über das Kontextmenü des Kontrollfeldes zugewiesen.
Da dieser Listener vom Dokument selber gehandled wird, brauchst Du ihm auch keine Methoden wie "disposing" zur Verfügung stellen.
Re: Listener in Laufzeit für Shapes erzeugen
Verfasst: Do, 09.02.2012 19:35
von Maggus
DPunch hat geschrieben:...Der Unterschied zwischen den beiden Methoden ist, ...
Ahaaaaa. Erlebe gerade eine kleine Erleuchtung.

Danke dir.
PS: Warum findet man solche wichtigen Infos nirgends, wenn man danach sucht... ?
Re: Listener in Laufzeit für Shapes erzeugen
Verfasst: Do, 16.02.2012 13:02
von Maggus
DPunch hat geschrieben:mit addEventListener zur Laufzeit einen Listener erstellst, der eben auch nur zur Laufzeit seine Gültigkeit behält.
Gibt es hierfür irgendein Anwendungsfall? Wofür braucht man einen Listener, der nur zur Laufzeit gültig ist?
Gruß,
Re: [gelöst] Listener in Laufzeit für Shapes erzeugen
Verfasst: Do, 16.02.2012 15:38
von Frieder D.
Hallo
@DPunch
Sorry, aber die Antwort ist... komplett falsch.
Wie kommst Du darauf?
Ja ich gebe dir recht. Alle Event Listener benötigen die Methode "disposing" .
Wenn der Listener jedoch einem "ScriptEventDescriptor" übergeben wird, dann stellt dieser die Methode automatisch zur Verfügung.
Es gibt allerdings auch Listener, die nicht vom "XEventListener" abstammen, und somit die Methode "disposing" nicht benötigen.
Mir ist zumindest ein Beispiel bekannt:(siehe meine
Homepage)
Code: Alles auswählen
oTR = createUnoListener("Tr_", "com.sun.star.datatransfer.XTransferable")
@Maggus
Gibt es hierfür irgendein Anwendungsfall? Wofür braucht man einen Listener, der nur zur Laufzeit gültig ist?
Dafür gibt es viele Anwendungsbeispiele:
z.B. wenn du den Inhalt der Zwischenablage bekommen möchtest, sobald er sich geändert hat ( siehe
hier),
Oder wenn du einen "XModifyListener" einer Zelle (oder einem Bereich) zuweisen willst,
oder dem Dokument einen "XPrintJobListener" zuweisen....
Gruß Frieder
Re: [gelöst] Listener in Laufzeit für Shapes erzeugen
Verfasst: Do, 16.02.2012 16:11
von Maggus
Frieder D. hat geschrieben:Dafür gibt es viele Anwendungsbeispiele:
z.B. wenn du den Inhalt der Zwischenablage bekommen möchtest, ... Oder wenn du einen "XModifyListener" einer Zelle (oder einem Bereich) zuweisen willst, ...oder dem Dokument einen "XPrintJobListener" zuweisen....
OK, dann verstehe ich wohl die Bezeichnung "zur Laufzeit" nicht richtig. Ich dachte dabei geht es um die Zeit in welcher das Makro läuft.
Und bei den von dir genannten Beispielen verankerst du doch auch das Event fest im Dokument, oder?
Gruß,
Re: [gelöst] Listener in Laufzeit für Shapes erzeugen
Verfasst: Fr, 17.02.2012 21:07
von DPunch
Servus
Frieder D. hat geschrieben:Es gibt allerdings auch Listener, die nicht vom "XEventListener" abstammen, und somit die Methode "disposing" nicht benötigen.
Mir ist zumindest ein Beispiel bekannt
Und wieso denkst Du, dass Du es mit einem Listener zu tun hast, wenn Du doch selber schon auf die API verwiesen hast, und dort zu sehen ist, dass es sich um keinen Listener handelt?
Mit CreateUnoListener kannst Du Dir jedes Interface liefern lassen und dessen Methoden überschreiben.
Code: Alles auswählen
Sub Main
binKeinListener = CreateUnoListener("uberschriebeneMethode_","com.sun.star.sheet.XSpreadsheetDocument")
MsgBox binKeinListener.Dbg_Methods
binKeinListener.getSheets()
End Sub
Function uberschriebeneMethode_getSheets
MsgBox "Hallo"
End Function
...der Code macht aber aus einem com.sun.star.sheet.XSpreadsheetDocument keinen Listener.
Re: [gelöst] Listener in Laufzeit für Shapes erzeugen
Verfasst: Sa, 18.02.2012 18:33
von Frieder D.
Hallo DPunch
Mit CreateUnoListener kannst Du Dir jedes Interface liefern lassen und dessen Methoden überschreiben.
Vielen Dank.
Das war mir bis jetzt nicht bewusst.
Dadurch wird die ganze Sache für mich klarer.
Gruß Frieder
Re: [gelöst] Listener in Laufzeit für Shapes erzeugen
Verfasst: Sa, 18.02.2012 20:48
von Maggus
Na, da haben wir doch alle mal wieder was gelernt. Was ich wissen wollte weiß ich jetzt, aber der Rest war mir jetzt zu hoch...
(also das mit dem createUnoListener und ätsch, ich bin doch keiner)
Danke euch
Gruß,