[gelöst] Listener in Laufzeit für Shapes erzeugen

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

Moderator: Moderatoren

Maggus
****
Beiträge: 108
Registriert: Mo, 01.08.2005 13:32
Kontaktdaten:

[gelöst] Listener in Laufzeit für Shapes erzeugen

Beitrag 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ß,
Zuletzt geändert von Maggus am Di, 14.02.2012 13:45, insgesamt 1-mal geändert.
Maggus (:o)
Frieder D.
****
Beiträge: 115
Registriert: Di, 10.01.2012 10:51
Kontaktdaten:

Re: Listener in Laufzeit für Shapes erzeugen

Beitrag 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
Maggus
****
Beiträge: 108
Registriert: Mo, 01.08.2005 13:32
Kontaktdaten:

Re: Listener in Laufzeit für Shapes erzeugen

Beitrag von Maggus »

Frieder D. hat geschrieben:Was du brauchst ist ein "com.sun.star.script.ScriptEventDescriptor"
Ahaaa, endlich funktionierts. :D Ä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!
Maggus (:o)
Frieder D.
****
Beiträge: 115
Registriert: Di, 10.01.2012 10:51
Kontaktdaten:

Re: Listener in Laufzeit für Shapes erzeugen

Beitrag 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
Maggus
****
Beiträge: 108
Registriert: Mo, 01.08.2005 13:32
Kontaktdaten:

Re: Listener in Laufzeit für Shapes erzeugen

Beitrag 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ß,
Maggus (:o)
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Listener in Laufzeit für Shapes erzeugen

Beitrag 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.
Maggus
****
Beiträge: 108
Registriert: Mo, 01.08.2005 13:32
Kontaktdaten:

Re: Listener in Laufzeit für Shapes erzeugen

Beitrag 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... ?
Maggus (:o)
Maggus
****
Beiträge: 108
Registriert: Mo, 01.08.2005 13:32
Kontaktdaten:

Re: Listener in Laufzeit für Shapes erzeugen

Beitrag 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ß,
Maggus (:o)
Frieder D.
****
Beiträge: 115
Registriert: Di, 10.01.2012 10:51
Kontaktdaten:

Re: [gelöst] Listener in Laufzeit für Shapes erzeugen

Beitrag 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
Maggus
****
Beiträge: 108
Registriert: Mo, 01.08.2005 13:32
Kontaktdaten:

Re: [gelöst] Listener in Laufzeit für Shapes erzeugen

Beitrag 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ß,
Zuletzt geändert von Maggus am Mo, 20.02.2012 07:35, insgesamt 1-mal geändert.
Maggus (:o)
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: [gelöst] Listener in Laufzeit für Shapes erzeugen

Beitrag 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.
Frieder D.
****
Beiträge: 115
Registriert: Di, 10.01.2012 10:51
Kontaktdaten:

Re: [gelöst] Listener in Laufzeit für Shapes erzeugen

Beitrag 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
Maggus
****
Beiträge: 108
Registriert: Mo, 01.08.2005 13:32
Kontaktdaten:

Re: [gelöst] Listener in Laufzeit für Shapes erzeugen

Beitrag 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ß,
Maggus (:o)
Antworten