Argument an Event Listener übergeben

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

Moderator: Moderatoren

schnumbl
Beiträge: 8
Registriert: Fr, 09.12.2011 18:30

Argument an Event Listener übergeben

Beitrag von schnumbl »

Hallo,

ich bin schon ganz glücklich, dass ich mit folgenden Zeilen einer Textbox ein Macro zuweisen kann:

Code: Alles auswählen

Dim aEventArgs(1) as new com.sun.star.beans.PropertyValue
 aEventArgs(0).Name = "EventType"
 aEventArgs(0).Value = "Script"
 aEventArgs(1).Name = "Script"
 aEventArgs(1).Value = "vnd.sun.star.script:Standard.Module1.Test_Event?language=Basic&location=application"
oshape.Events.replaceByName("OnClick",aEventArgs)
Jetzt würde ich allerdings noch gerne ein Argument an folgende Funktion übergeben:

Code: Alles auswählen

Function Test_Event(info)
 msgbox info
End Function
Die Funktion soll als ActionListener für mehrere Objekte dienen und ich möchte gerne wissen, von welchem Object aus sie
jeweils aufgerufen wird.

Folgende Zeile funktioniert nicht:

aEventArgs(1).Value = "vnd.sun.star.script:Standard.Module1.Test_Event(""ich_bin_objekt_1"")?language=Basic&location=application"



Gibt es vielleicht noch eine Property "Arguments" (so heißt sie nicht), die ich dem aEventArgs hinzufügen könnte?

Oder kann man irgendwie einstellen, dass ein Event-Objekt mit übergeben wird, so dass folgendes funktioniert?

Code: Alles auswählen

Function Test_Event(oEvent as Object)
 msgbox oEvent.Source.Name
End Function
Danke und Sonnige Grüße,

Stefan
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Argument an Event Listener übergeben

Beitrag von F3K Total »

Hi,
keine Ahnung ob das irgendwie hinzubekommen ist, mit Kontrollfeldern geht es:

Code: Alles auswählen

Sub create_graphic_control

odoc = thiscomponent
ocontroller = odoc.currentcontroller
osheet = ocontroller.activeSheet
oPage = osheet.drawpage

ocontroller.setformdesignmode(true)

if not oPage.forms.hasByName("MainForm") then
oMainForm = thiscomponent.createInstance("com.sun.star.form.component.Form")
oPage.forms.insertbyname("MainForm",oMainForm)
endif

oform = oPage.forms.getbyname("MainForm")

Dim aPoint As New com.sun.star.awt.Point
Dim aSize As New com.sun.star.awt.Size

aPoint.x = 1000
aPoint.y = 1000
aSize.Width = 5000
aSize.Height = 5000

ographic = thiscomponent.createInstance("com.sun.star.drawing.ControlShape")
oControlModel = thiscomponent.createInstance( "com.sun.star.form.component.DatabaseImageControl" )
ographic.control = oControlModel

ographic.Size = aSize
ographic.Position = aPoint
ographic.Control.name="VeuszTextBox"
ographic.Control.ImageURL= converttourl("D:\MyBlueTemplate.bmp")
ographic.Control.ScaleImage=true
ographic.Control.ScaleMode=1
ographic.Control.InputRequired=false
ographic.Control.HelpText="Hier wird der Hilfetext definiert"
ographic.Control.Border = 0 'ohne Rahmen
oPage.add(ographic)

nIndex = oForm.Count-1 'Der Button wurde soeben eingefügt, deshalb ist es sehr wahrscheinlich, dass er das letzte Element der Controls-Liste der Form ist.
     
Dim oEvent as new com.sun.star.script.ScriptEventDescriptor
oEvent.ListenerType = "com.sun.star.awt.XMouseListener"
oEvent.EventMethod = "mousePressed"
oEvent.ScriptType = "Script"
oEvent.ScriptCode = "vnd.sun.star.script:Standard.Module1.Test_Event?language=Basic&location=document"
oForm.registerScriptEvent(nIndex, oEvent)

aPoint.x = 1000
aPoint.y = 500
aSize.Width = 5000
aSize.Height = 700
'Überschrift als Labelfeld
olabel = thiscomponent.createInstance("com.sun.star.drawing.ControlShape")
oControlModel = thiscomponent.createInstance( "com.sun.star.form.component.FixedText" )
olabel.control = oControlModel
olabel.control.Label="Dies ist die VeuszTextBox"
olabel.Control.name="lblVeuszTextBox"
olabel.Size = aSize
olabel.Position = aPoint
oPage.add(olabel)
thiscomponent.currentcontroller.setformdesignmode(false)

end sub

Sub Test_Event (event)
sName = event.source.model.name
Msgbox "Das war ein sauberer Klick auf "+sName
end sub
Gruß R
schnumbl
Beiträge: 8
Registriert: Fr, 09.12.2011 18:30

Re: Argument an Event Listener übergeben

Beitrag von schnumbl »

Hmm,

wenn ich als Basisobjekt statt dem "com.sun.star.drawing.GraphicObjectShape" ein
"com.sun.star.drawing.ControlShape" verwende, steht mir also ein "mouse_Pressed" - Event zur Verfügung.
Dann wird der Listener-Funktion ein Event - Objekt übergeben. Das gefällt mir.

Leider kann das Basisobjekt dann nicht mehr im Calc-Sheet verschoben werden. (Das GraphicObjectShape kann man
mit der rechten Maustaste anklicken und dann verschieben.)

Seltsamer Weise ist es so, dass wenn ich ein fehlerhaftes Makro starte, sich danach auch
das ControlShape verschieben lässt. Wird vielleicht beim Debuggen von einem
"run mode" in einen "edit mode" gewechselt? Kann man diesen Wechsel auch per Makro ausführen?
Wahrscheinlich reagiert die ControlShape aber dann nicht mehr auf den Links-Click?

Noch ein anderer Gedanke. Kann ich auf eine "globale Event-Verwaltung" zugreifen und darüber
die Quelle des letzten Click-Events abfragen? Ich habe bereits im Internet gesucht aber nichts in der Art gefunden.

Code: Alles auswählen

Sub Listener_Action()
 oEvent = ThisComponent.getLastMousClickAction()  '<= gibt es so etwas in der Art?
 MySource = oEvent.source
End Sub
Als Alternative hab ich auch noch versucht ein Diagramm-Objekt zu verwenden.

Code: Alles auswählen

odoc = ThisComponent
oController = odoc.currentcontroller
oSheet = ocontroller.activeSheet
Dim aRect as new com.sun.star.awt.Rectangle 
    with aRect
       .X = 0 : .Y = 0 : .Width = 6000 : .Height = 6000
    end with
oSheet.Charts.addNewByName("MyDiagram", aRect, Array(), False, True)
oChart = oSheet.Charts.getByName( "MyDiagram" )
'Xray oChart
Allerdings kann man dem glaube ich auch keinen MouseListener zuweisen.

Grüße,

Stefan
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Argument an Event Listener übergeben

Beitrag von F3K Total »

schnumbl hat geschrieben:Leider kann das Basisobjekt dann nicht mehr im Calc-Sheet verschoben werden. (Das GraphicObjectShape kann man
mit der rechten Maustaste anklicken und dann verschieben.)
Das liegt daran, das mit der Zeile

Code: Alles auswählen

thiscomponent.currentcontroller.setformdesignmode(false)
Der Entwurfsmodus des Formulares verlassen wird, gehst Du wieder hinein...
Entwurf.png
Entwurf.png (1.1 KiB) 2164 mal betrachtet
...kanst Du das Kontrollelement auch wieder verschieben. Wie das per Makro geht erklärt die Zeile oben von selbst.

Gruß R
schnumbl
Beiträge: 8
Registriert: Fr, 09.12.2011 18:30

Re: Argument an Event Listener übergeben

Beitrag von schnumbl »

Ahh, verstehe. Die Zeile hatte ich übersehen. Ich werde dass nun so machen,
dass ich in der Symbolleiste für mein AddIn die Schaltfläche "Entwurfsmodus ein/aus" mit anzeige.
Der Benutzer muss dann halt erst den entsprechenden Modus wählen wenn er "die Diagramme verschieben"
oder "ein Menü per Mausklick anzeigen" möchte.

Danke für die Unterstützung.

Falls jemand doch noch eine Möglichkeit kennt, beim "OnClick" Event ein Event-Objekt oder ein
eigenes Argument mit zu übergeben, wär das natürlich eleganter (Bei Excel funktioniert die
Übergabe von Argumenten).
Antworten