Seite 1 von 1

Dialog per Basic erstellen - Dialog-Handler als Komponentmethoden

Verfasst: Fr 28. Apr 2023, 01:20
von Knopfler
Hallo,
ich versuche mich seit einiger Zeit an mit Basic erstellten Dialogen.
Mit der Erstellung der Steuerelemente komm ich gut klar.

Nun das Problem:
Wie kann ich die Zuweisung der Eventhändler als Methodenzuweisung mit Basic realisieren?
Der händische Vorgang mit dem Dialog-Editor geht so wie im Bild 1 -- Wie geht das per Basic?

Code: Alles auswählen

  
Sub Dialog_Show()
	dp = CreateUnoService("com.sun.star.awt.DialogProvider2")
	dp.Initialize(Array(ThisComponent))
	eventHandler = CreateUnoListener("Console_", "com.sun.star.awt.XDialogEventHandler")
	oDlg = dp.createDialogWithHandler("vnd.sun.star.script:Standard.dlgTest?location=document", eventHandler)
	oDlg.Title = "Beispiel"

	REM Die folgenden 3 Zeilen bringen nicht die gewünschte Funktion
	oCtl = oDlg.getControl("btnPrint")
	oListener = CreateUnoListener("drucke_","com.sun.star.awt.XActionListener")
	oCtl.addActionListener(oListener)

	oDlg.execute()
End Sub

Function Console_callHandlerMethod(oDlg as Object, _
        event As com.sun.star.document.DocumentEvent, _
        method As String) As Boolean
	''' Intercept dialog events using .UNO protocol '''
    
	Console_callHandlerMethod = True
	Select Case method
		Case "drucke"
			msgbox "Drucke"

		Case Else : Console_callHandlerMethod = False
	
	End Select
End Function
Das ganze orientiert sich u. a. an folgenden Ausführungen:
https://help.libreoffice.org/latest/de/ ... ndler.html,
https://wiki.openoffice.org/wiki/Docume ... rol_Events,
https://wiki.openoffice.org/wiki/Component_and_Dialog

Der obige Code zeigt mein TestCase - Ein Dialog mit einem Button. Ein Handler auf Dialogebene für alle benötigten Ereignisse des gesamten Dialoges.

Hier komme ich so nicht weiter.
Der "btnPrint" soll seinen ActionListener per Script bekommen.
Nach der Zuweisung des XActionListeners geht das Event nicht bis zum XDialogEventHandler durch.

Mit der manuellen Zuweisung der Komponentenmethode im Dialog-Editor funktioniert es vom Prinzip her wie gewünscht..
Das hilft mir leider bei den zur Laufzeit im Dialog erstellten Controls nicht weiter.
Nun bin ich leider auch noch kein Profi mit der UNO-API. Einige Stunden Einarbeitung haben noch keine Erleuchtung gebracht und die paar Quellen im Netz brachten auch keinen Hinweis.
Ich hab ḿich hier festgefahren.

Vielleicht kennt jemand eine Lösung für die Komponentenzuweisung per Script?

Re: Dialog per Basic erstellen - Dialog-Handler als Komponentmethoden

Verfasst: So 30. Apr 2023, 10:13
von F3K Total
Moin,
habe dir mal einen kleinen modalen Dialog zusammengestrickt:

Code: Alles auswählen

  
Sub Dialog_Show()
REM ***** Initialisierung der Eigenschaften des Dialogs
odlgModel = CreateUnoService("com.sun.star.awt.UnoControlDialogModel")

With odlgModel
   .setPropertyValue("PositionX", 320)
   .setPropertyValue("PositionY", 111 )
   .setPropertyValue("FontName", Font)
   .setPropertyValue("Width", 82)
   .setPropertyValue("Height", 76)
   .setPropertyValue("Title", "Drucken")
   .setPropertyValue("Name", "DLG_Drucken")
   '.setPropertyValue("DesktopAsParent", True )
End With   

oCtl = odlgModel.createInstance("com.sun.star.awt.UnoControlButtonModel")
With oCtl
    .setPropertyValue("Label", "Drucken")
    .setPropertyValue("Name", "btnPrint")
    .setPropertyValue("PositionX", 10)
    .setPropertyValue("PositionY", 10)
    .setPropertyValue("Height", 20)
    .setPropertyValue("Width", 50)
End With
odlgModel.insertByName("btnPrint", oCtl)

odlg = CreateUnoService("com.sun.star.awt.UnoControlDialog")
odlg.setModel(odlgModel)

REM Die folgenden 3 Zeilen bringen nicht die gewünschte Funktion
oCtl = odlg.getControl("btnPrint")
oListener = CreateUnoListener("drucke_","com.sun.star.awt.XActionListener")
oCtl.addActionListener(oListener)


REM ********** Mittels des Modells den Dialog anzeigen
oWindow = CreateUnoService("com.sun.star.awt.Toolkit")
odlg.createPeer(oWindow, null)
Dim oWindowsListener as Object
oTopWindowsListener = CreateUnoListener( "Top_Win_", "com.sun.star.awt.XTopWindowListener" )
odlg.addTopWindowListener(oTopWindowsListener)
odlg.setVisible(True)

End Sub


Sub drucke_actionPerformed(oEv)
   print "hier könnte ich jetzt auch losdrucken ..."
end sub
   
Sub drucke_disposing(oEv)
End Sub

Sub Top_Win_windowClosing( oEvent ) 'Dialog schließen
  S_removeMouseClickHandler
  odlg.setVisible(False)
  odlg.dispose
End Sub

Sub Top_Win_disposing( )
End Sub
Sub Top_Win_windowOpened   ( oEvent )
End sub
Sub Top_Win_windowClosed   ( oEvent )
End sub 
Sub Top_Win_windowMinimized   ( oEvent )
End sub
Sub Top_Win_windowNormalized   ( oEvent )
End sub
Sub Top_Win_windowActivated   ( oEvent )
Top_Win_windowDeactivated = false
End sub
function Top_Win_windowDeactivated ( oEvent ) as boolean
Top_Win_windowDeactivated = true
End function
EDIT 02.05.2023 16:20 Uhr -> hatte die für den com.sun.star.awt.XTopWindowListener notwendigen Subroutinen vergessen.
Gruß R