🙏 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. 🤗

Zugriff auf per Makro erzeugten Dialog

Alles zur Programmierung im LibreOffice.
Antworten
noenglish
Beiträge: 5
Registriert: So 14. Sep 2014, 12:49

Zugriff auf per Makro erzeugten Dialog

Beitrag von noenglish » So 27. Mär 2016, 20:01

Ich möchte in einen Per Makro erzeugten Dialog Steuerelemente einfügen.
Den Dialog erzeuge ich so (Quelle: http://www.cul.de/data/oobasicpr2.pdf):

Code: Alles auswählen

Sub ShowDialog 
    
    Dim oDlgModel As Object
    Dim oWindow As Object
    Dim oDlg As Object
     
REM Initialisierung der Eigenschaften des Dialogs
     oDlgModel=CreateUnoService("com.sun.star.awt.UnoControlDialogModel") 
     oDlgModel.PositionX = 50 
     oDlgModel.PositionY = 50 
     oDlgModel.Width  = 250 
     oDlgModel.Height = 150 
     oDlgModel.Title  = "Beispiel - Dialog ohne Designer sondern per Makro erzeugt."
    
REM Mittels des Modells den Dialog anzeigen
    oDlg = CreateUnoService("com.sun.star.awt.UnoControlDialog") 
    oWindow = CreateUnoService("com.sun.star.awt.Toolkit") 
    oDlg.setModel(oDlgModel)
    oDlg.createPeer(oWindow, null)
     
    oDlg.execute() 
 
End Sub ' ** ShowDialog 
Wer kann mir weiter helfen?

Grüße
noenglish

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

Re: Zugriff auf per Makro erzeugten Dialog

Beitrag von F3K Total » So 27. Mär 2016, 22:07

Hi,
hier ein paar Beispiele:

Code: Alles auswählen

Sub ShowDialog
   
    Dim oDlgModel As Object
    Dim oWindow As Object
    Dim oDlg As Object
     
REM Initialisierung der Eigenschaften des Dialogs
     oDlgModel=CreateUnoService("com.sun.star.awt.UnoControlDialogModel")
     oDlgModel.PositionX = 50
     oDlgModel.PositionY = 50
     oDlgModel.Width  = 250
     oDlgModel.Height = 150
     oDlgModel.Title  = "Beispiel - Dialog ohne Designer sondern per Makro erzeugt."
     
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
   .setPropertyValue("Label", "X")
   .setPropertyValue("Name", "lblSX")
   .setPropertyValue("PositionX", 2)
   .setPropertyValue("PositionY", 11)
   .setPropertyValue("Height",11)
   .setPropertyValue("Width", 6)
End With
odlgModel.insertByName("lblSX", oMod)

'Button erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlButtonModel")
With oMod
    .setPropertyValue("Label", "Knopf")
    .setPropertyValue("Name", "cmd1")
    .setPropertyValue("PositionX",20)
    .setPropertyValue("PositionY", 11)
    .setPropertyValue("Height", 20)
    .setPropertyValue("Width", 40)
    .setPropertyValue("FontHeight",9)
    .setPropertyValue("FocusOnClick",false)
    .setPropertyValue("Tabstop",false)
End With
odlgModel.insertByName("cmd"+i, oMod)

REM **********numerisches Feld erzeugen       
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlNumericFieldModel")
With oMod
   .setPropertyValue("Name", "NumSX")
   .setPropertyValue("PositionX", 70)
   .setPropertyValue("PositionY", 11)
   .setPropertyValue("Height", 10)
   .setPropertyValue("Width", 20)
   .setPropertyValue("Value", 10)
End With     
odlgModel.insertByName("NumSX", oMod)     
   
REM Mittels des Modells den Dialog anzeigen
    oDlg = CreateUnoService("com.sun.star.awt.UnoControlDialog")
    oWindow = CreateUnoService("com.sun.star.awt.Toolkit")
    oDlg.setModel(oDlgModel)
    oDlg.createPeer(oWindow, null)
     
    oDlg.execute()
 
End Sub ' ** ShowDialog 
Wenn du wissen willst wie die anderen Kontrollelemente heißen, erzeuge sie in der GUI und analysiere sie mit z.B. MRI oder XRAY.

Gruß R
Windows 11: AOO, LO Linux Mint: AOO, LO

geschu
Beiträge: 25
Registriert: Mo 20. Dez 2010, 13:56

Re: Zugriff auf per Makro erzeugten Dialog

Beitrag von geschu » So 27. Mär 2016, 22:32

Moin,
ich mache es ähnlich wie R.
Zunächst habe ich mir vor Jahren ein Modul erstellt. In diesem stehen dann so Dinge wie:

Code: Alles auswählen

REM  *****  BASIC  *****
' modul : mdlDlgTools
' desc : stellt tools zum Aufbau eines Dialoges during Laufzeit
' zur Verfuegung
' author : geschu
' version: 2007
' Reihenfolge der Parameter zu den Funktionen build....
' wurden vereinheitlicht. Die Reihenfolge ist jetzt immer:
' Name -- Height -- width -- PosX -- PosY -- Title -- usw
' ------------------------------------------------------
option explicit
		
private function buildDialog(	sDlgName as String, _
								dlgHeight as Integer, dlgWidth as Integer, _
								dlgPosX as integer, dlgPosY as integer, _
								dlgTitle as String) as Object

	dim oMod as Object
	
	oMod = CreateUnoService("com.sun.star.awt.UnoControlDialogModel")

	with oMod
		.setPropertyValue("PositionX", dlgPosX)
		.setPropertyValue("PositionY", dlgPosY)
		.setPropertyValue("Width", dlgWidth)
		.setPropertyValue("Height", dlgHeight)
		.setPropertyValue("Name", sDlgName)
		.setPropertyValue("Title", dlgTitle)
	end with

	buildDialog = oMod

end function	' buildDialog
' Hier wird ein Button erzeugt:
private sub buildButton(oDlgMod as Object, _
				sButName as String, _
				butHeight as Integer,butWidth as Integer, _
				butPosX as integer, butPosY as integer, _
				butLabel as String,Optional sTyp as String)
	dim oMod as Object
	oMod = oDlgMod.CreateInstance("com.sun.star.awt.UnoControlButtonModel")
	with oMod
		.setPropertyValue("Name",sButName)
		.setPropertyValue("Align",1)
		.setPropertyValue("TabIndex",1)
		.setPropertyValue("PositionX",butPosX)
		.setPropertyValue("PositionY",butPosY)
		.setPropertyValue("Width",butWidth)
		.setPropertyValue("Height",butHeight)
		.setPropertyValue("Label",butLabel)
		if not isMissing (sTyp) then
			select case sTyp
				case "OK"
					.setPropertyValue("PushButtonType", com.sun.star.awt.PushButtonType.OK)
				case else
					.setPropertyValue("PushButtonType", com.sun.star.awt.PushButtonType.STANDARD)
			end Select
		end if
	end with
	oDlgMod.insertByname(sButName,oMod)
end sub	
Aufgerufen wird das Ganze z.B. so

Code: Alles auswählen

option explicit
	' the document
	private oDoc as Object
	' the dialog
	private oDlgMasterData		as Object
	private oDlgModelMasterData	as Object
	' the buttons
	private oMDNew_			as Object
	private oCmdMDNew		as Object
	
	private oGetIt_		as Object
	private oCmdGetIt		as Object
	
	private oMDInfo_		as Object
	private oCmdMDInfo		as Object
	
	private oSaveAs_		as Object
	private oCmdSaveAs		as Object
	
	' some stuff
	private const DLG_MASTERDATA	as String =	"dlgMasterData" 
	private Const DIALOG_TITLE		as String =	"Ding Dong "
	private const DIALOG_VERSION	as String =	"Dlg - Version 2.11.2007 by geschu"
	
	
sub debug
'Xray ThisComponent
'saveMasterData()

openDlgMasterData()
end sub	
sub openDlgMasterData(Optional oDocIn as Object) on Error goto ErrorHandler
	' instanziate the document
	if not(isMissing(oDocIn)) then
		oDoc = oDocIn
	else
		oDoc = ThisComponent
	end if
	'create the dialog
	oDlgModelMasterData = mdlDlgTools.buildDialog(DLG_MASTERDATA,109,198,116,49,DIALOG_TITLE)
	oDlgMasterData = CreateUnoService("com.sun.star.awt.UnoControlDialog")
	oDlgMasterData.setModel(oDlgModelMasterData)
	' build the controls
	with mdlDlgTools
		' the buttons
		.buildButton(oDlgModelMasterData,"cmdMDNew", 12,40,145,8,"Neu","STANDARD")
			oMDNew_ = CreateUnoListener("MDNew_","com.sun.star.awt.XActionListener")
			oCmdMDnew = oDlgMasterData.getControl("cmdMDNew")
			oCmdMDNew.AddActionListener(oMDNew_)	' Neu is pressed
		
		.buildButton(oDlgModelMasterData,"cmdGetIt", 12,40,145,21,"Übernehmen","STANDARD")
			oGetIt_ = CreateUnoListener("GetIt_","com.sun.star.awt.XActionListener")
			oCmdGetIt = oDlgMasterData.getControl("cmdGetIt")
			oCmdGetIt.AddActionListener(oGetIt_)	' übernehmen is pressed
		
		.buildButton(oDlgModelMasterData,"cmdSaveAs",12,40,145,35,"Speichern","STANDARD")	
			oSaveAs_ = CreateUnoListener("SaveAs_","com.sun.star.awt.XActionListener")
			oCmdSaveAs = oDlgMasterData.getControl("cmdSaveAs")
			oCmdSaveAs.AddActionListener(oSaveAs_)	' SaveAs is pressed
			
		.buildButton(oDlgModelMasterData,"cmdEnd", 12,40,145,48,"Abbrechen","OK")
		' no listener is needed for this button, for ist an OK Button
		
		.buildButton(oDlgModelMasterData,"cmdMDInfo", 12,40,145,61,"Info","STANDARD")
			oMDInfo_ = CreateUnoListener("MDInfo_","com.sun.star.awt.XActionListener")
			oCmdMDInfo = oDlgMasterData.getControl("cmdMDInfo")
			oCmdMDInfo.AddActionListener(oMDInfo_)	' info is pressed
	end with
	setMessage("-----> Was möchten Sie jetzt machen? <-----")
	mdlDlgMasterData.setButtonEnable("cmdSaveAs",false)
	' if present set focus on control txtOwner
	'oDlgMasterData.getControl("txtOwner").setFocus()
	'Xray oDlgMasterData
	' last but not least: display the Dialog
	oWin = CreateUnoService("com.sun.star.awt.Toolkit")
	oDlgMasterData.createPeer(oWin,null)
	oDlgMasterData.execute()
	' remove ActionListeners
	oDlgMasterData.getControl("cmdMDNew").removeActionListener(oMDNew_)
	oDlgMasterData.getControl("cmdGetIt").removeActionListener(oGetIt_)
	oDlgMasterData.getControl("cmdSaveAs").removeActionListener(oSaveAs_)
	oDlgMasterData.getControl("cmdMDInfo").removeActionListener(oMDInfo_)
	exit sub
ErrorHandler:
	mdlErrorMessage.setErrorMsg _
	( "Error " & Err & ": " & Error$ & " (line : " & Erl & ")" & _
	"in mdlDlgMasterdata.openDialog")
end sub	
Achtung bitte, dies ist kein Code, der so ohne weiteres funktioniert. Es fehlt z.B das Modul mdlErrorMessage, die sub setMessage und einiges mehr. Die subs für deine anderen Steuerelemente sowie deren Listener must Du selbst erstellen. Das schaffst du. Der Code Snipsel kann Dir dabei helfen, Deine Idee zu verwirklichen. Du kannst von mir keinen weiteren Support erwarten.

Viel Spaß damit
Gruß
--
Gerd

noenglish
Beiträge: 5
Registriert: So 14. Sep 2014, 12:49

Re: Zugriff auf per Makro erzeugten Dialog

Beitrag von noenglish » Mo 28. Mär 2016, 15:14

Vielen Dank für Eure schnellen und hilfreichen Antworten.
Die Antwort von Gerd verstehe ich (noch?) nicht. Die Antwort von R funktioniert!
Was mir noch fehlt: Wie reagiere ich auf Ereignisse wie Button_MouseUp?

Grüße
noenglish

geschu
Beiträge: 25
Registriert: Mo 20. Dez 2010, 13:56

Re: Zugriff auf per Makro erzeugten Dialog

Beitrag von geschu » Mo 28. Mär 2016, 17:10

Moin <Vorname?>
noenglish hat geschrieben:Die Antwort von Gerd verstehe ich (noch?) nicht.
macht ja nichts ,
Die Antwort von R funktioniert!
Ich weiß. R. ist sozusagen eine Koriphäe auf diesem Gebiet.
Meine Version dient (für mich) der Übersichtlichkeit. Ich habe es gerne, wenn verschiedene Aufgaben auf Module verteilt werden In Java benutze ich Klassen. Das geht in diesem Basic nicht. Macht aber auch nichts. Vorteil: Man braucht nicht soviel doppelt und dreifach zu coden. Z.B willst Du mehrere Buttons in Deinem Dialog plazieren. Dann kannst du
entweder
jeden Button einzeln mit immer den gleichen Befehlen programmieren
oder
eine Sub schreiben in der alle nötigen Befehle einmal codiert sind. Diese Sub befindet sich in einem Modul und wird für jeden zu erstellenden Button neu aufgerufen. Ist übersichtlich, nicht so fehleranfällig und einfach, finde ich.
Was mir noch fehlt: Wie reagiere ich auf Ereignisse wie Button_MouseUp?
Dazu benötigt man die von mir angesprochenen Listener. Du kannst hier etwas darüber nachlesen.
Gruß
--
Gerd

noenglish
Beiträge: 5
Registriert: So 14. Sep 2014, 12:49

Re: Zugriff auf per Makro erzeugten Dialog

Beitrag von noenglish » Mi 30. Mär 2016, 21:32

Vielen Dank für den Link. Ich werde versuchen weiterzukommen. Leider stört mein großes Problem, ich kann kein Englisch.
Grüße
noenglish


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