🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Dialog per Basic erstellen - Dialog-Handler als Komponentmethoden

Alles zur Programmierung im LibreOffice.
Antworten
Knopfler
Beiträge: 4
Registriert: Do 27. Apr 2023, 23:04

Dialog per Basic erstellen - Dialog-Handler als Komponentmethoden

Beitrag von Knopfler » Fr 28. Apr 2023, 01:20

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?
Dateianhänge
Bild1.png
Bild1.png (52.19 KiB) 2948 mal betrachtet

F3K Total
* LO-Experte *
Beiträge: 2501
Registriert: So 10. Apr 2011, 10:10

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

Beitrag von F3K Total » So 30. Apr 2023, 10:13

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
Windows 11: AOO, LO Linux Mint: AOO, LO


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten