[Gelöst:] Optionsfelder in Laufzeit-Dialog

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

Moderator: Moderatoren

Mr.Ed
**
Beiträge: 47
Registriert: Di, 16.02.2010 18:38

[Gelöst:] Optionsfelder in Laufzeit-Dialog

Beitrag von Mr.Ed »

Hallo zusammen,

es geht darum, einen Dialog "zur Laufzeit" zu erzeugen. Ich brauche das, um ein Writer-Dokument, das "unter" dem Dialog liegt, mithilfe des Dialogs bearbeiten zu können. Hier der Code:

Code: Alles auswählen

Sub LaufzeitDialogErstellen
	dim oDlgM as object  ' das Model des Dialoges
	dim oDlg as object   ' der Dialog an sich
	dim oMod as object   ' nimmt jeweils das Model der Elemente auf
	dim oWin as Object   ' erzeugtes Fenster
			
	REM Das Dialogmodel erzeugen:
	oDlgM = CreateUnoService("com.sun.star.awt.UnoControlDialogModel")
	REM Eigenschaften zuweisen
	oDlgM.setPropertyValue("PositionX", 30)
	oDlgM.setPropertyValue("PositionY", 30)
	oDlgM.setPropertyValue("Width",  300)
	oDlgM.setPropertyValue("Height", 300)
	oDlgM.setPropertyValue("Title", "Bearbeitung von Teilsätzen")
	
	REM ein Beschriftungsfeld erzeugen
	oMod = oDlgM.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
	REM die Eigenschaften setzen	
	oMod.setPropertyValue("Name", "Txt_Feld1")
	oMod.setPropertyValue("Align", 0)
	oMod.setPropertyValue("MultiLine", true)
	oMod.setPropertyValue("FontFamily", 0)
	oMod.setPropertyValue("FontHeight", 10)
	oMod.setPropertyValue("TabIndex", 1)
	oMod.setPropertyValue("PositionX", 15)
	oMod.setPropertyValue("PositionY", 15)
	oMod.setPropertyValue("Width",  180)
	oMod.setPropertyValue("Height", 140)
	oMod.setPropertyValue("Label", "Hier werden wichtige Bestandteile von untergeordneten Teilsätzen markiert." & _
	chr$(13) & chr$(13) & "Bei Nebensätzen sind dies das Bindewort und die Prädikat-1-Form (die finite Verbform)." & _
	chr$(13) & chr$(13) & "Bei Infinitivsätzen geht es um das 'hinweisende Wort' (z." & chr$(160) & "B. 'es' " & _
	"oder 'dazu'), die 'Ersatzkonjunktion' ('um', 'ohne', 'anstatt' etc.), den Infinitivbegleiter ('zu') " & _
	"und natürlich den Infinitiv selbst." & _
	chr$(13) & chr$(13) & "Rechts kannst du wählen, ob Nebensätze oder Infinitivsätze markiert werden sollen.")
	REM und dem Dialogmodel zuweisen
	oDlgM.insertByName("Txt_Field1", oMod)

	REM erstes Optionsfeld erzeugen ' <--------------------------------------------------------
	oMod = oDlgM.createInstance("com.sun.star.awt.UnoControlRadioButtonModel")
	REM die Eigenschaften setzen
	oMod.setPropertyValue("Name", "Optionsfeld1")
	oMod.setPropertyValue("FontHeight", 10)
	oMod.setPropertyValue("PositionX", 200)
	oMod.setPropertyValue("PositionY", 15)
	oMod.setPropertyValue("Width",  80)
	oMod.setPropertyValue("Height", 60)
	oMod.setPropertyValue("Label", "Nebensatz")
	REM und dem Dialogmodel zuweisen
	oDlgM.insertByName("Optionsfeld1", oMod)

	REM zweites Optionsfeld erzeugen ' <---------------------------------------------------------
	oMod = oDlgM.createInstance("com.sun.star.awt.UnoControlRadioButtonModel")
	REM die Eigenschaften setzen
	oMod.setPropertyValue("Name", "Optionsfeld2")
	oMod.setPropertyValue("FontHeight", 10)
	oMod.setPropertyValue("PositionX", 200)
	oMod.setPropertyValue("PositionY", 30)
	oMod.setPropertyValue("Width",  80)
	oMod.setPropertyValue("Height", 60)
	oMod.setPropertyValue("Label", "Infinitivsatz")
	REM und dem Dialogmodel zuweisen
	oDlgM.insertByName("Optionsfeld2", oMod)

	REM einen Button erzeugen
	oMod = oDlgM.createInstance("com.sun.star.awt.UnoControlButtonModel")
	REM die Eigenschaften setzen	
	oMod.setPropertyValue("Name", "Button1")
	oMod.setPropertyValue("TabIndex", 2)
	oMod.setPropertyValue("PositionX", 50)
	oMod.setPropertyValue("PositionY", 160)
	oMod.setPropertyValue("Width",  100)
	oMod.setPropertyValue("Height", 20)
	oMod.setPropertyValue("Label", "OK")
	oMod.setPropertyValue("PushButtonType", com.sun.star.awt.PushButtonType.OK)
	REM und dem Dialogmodel zuweisen
	oDlgM.insertByName("Button1", oMod)
	
	REM den Dialog erzeugen
	oDlg = CreateUnoService("com.sun.star.awt.UnoControlDialog")
	oDlg.setModel(oDlgM)
	
	REM ein Fenster erzeugen und den Dialog zuweisen
	oWin = CreateUnoService("com.sun.star.awt.Toolkit")
	oDlg.createPeer(oWin, null)
	
	Rem Dialog aufrufen
	oDlg.execute()
End Sub
Mein Problem: Wie kann ich die Optionsfelder (Radio-Buttons, im Code mit Pfeilen markiert) dazu bringen, ihre Funktionalität (entweder – oder) zu entfalten? Ich weiß, dass dies irgendwie mit gewissen "intern ausgewerteten" TabIndex-Nummern (Krumbein) zusammenhängt, durch die diese Buttons gruppiert werden. Was kann ich tun? Welche "values" muss ich wie setzen? Ja, Xray habe ich schon bemüht, brachte mich aber auch nicht entscheidend weiter. Vielleicht hat jemand eine Antwort.

Gruß Mr.Ed
Zuletzt geändert von Mr.Ed am Do, 28.07.2011 16:20, insgesamt 1-mal geändert.
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Optionsfelder in Laufzeit-Dialog

Beitrag von F3K Total »

Hallo Mr. Ed,
warum es funktioniert kann ich nicht sagen.
Habe aber herausgefunden, dass der TabIndex des ersten Optionsbuttons um eins kleiner ist sein muss, als der des zweiten, dann klappts.
Gruß R

Code: Alles auswählen

Sub LaufzeitDialogErstellen
   dim oDlgM as object  ' das Model des Dialoges
   dim oDlg as object   ' der Dialog an sich
   dim oMod as object   ' nimmt jeweils das Model der Elemente auf
   dim oWin as Object   ' erzeugtes Fenster
         
   REM Das Dialogmodel erzeugen:
   oDlgM = CreateUnoService("com.sun.star.awt.UnoControlDialogModel")
   REM Eigenschaften zuweisen
   oDlgM.setPropertyValue("PositionX", 30)
   oDlgM.setPropertyValue("PositionY", 30)
   oDlgM.setPropertyValue("Width",  300)
   oDlgM.setPropertyValue("Height", 300)
   oDlgM.setPropertyValue("Title", "Bearbeitung von Teilsätzen")
   
   REM ein Beschriftungsfeld erzeugen
   oMod = oDlgM.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
   REM die Eigenschaften setzen   
   oMod.setPropertyValue("Name", "Txt_Feld1")
   oMod.setPropertyValue("Align", 0)
   oMod.setPropertyValue("MultiLine", true)
   oMod.setPropertyValue("FontFamily", 0)
   oMod.setPropertyValue("FontHeight", 10)
   oMod.setPropertyValue("TabIndex", 1)
   oMod.setPropertyValue("PositionX", 15)
   oMod.setPropertyValue("PositionY", 15)
   oMod.setPropertyValue("Width",  180)
   oMod.setPropertyValue("Height", 140)
   oMod.setPropertyValue("Label", "Hier werden wichtige Bestandteile von untergeordneten Teilsätzen markiert." & _
   chr$(13) & chr$(13) & "Bei Nebensätzen sind dies das Bindewort und die Prädikat-1-Form (die finite Verbform)." & _
   chr$(13) & chr$(13) & "Bei Infinitivsätzen geht es um das 'hinweisende Wort' (z." & chr$(160) & "B. 'es' " & _
   "oder 'dazu'), die 'Ersatzkonjunktion' ('um', 'ohne', 'anstatt' etc.), den Infinitivbegleiter ('zu') " & _
   "und natürlich den Infinitiv selbst." & _
   chr$(13) & chr$(13) & "Rechts kannst du wählen, ob Nebensätze oder Infinitivsätze markiert werden sollen.")
   REM und dem Dialogmodel zuweisen
   oDlgM.insertByName("Txt_Field1", oMod)

   REM erstes Optionsfeld erzeugen ' <--------------------------------------------------------
   oMod = oDlgM.createInstance("com.sun.star.awt.UnoControlRadioButtonModel")
   REM die Eigenschaften setzen
   oMod.setPropertyValue("Name", "Optionsfeld1")
   oMod.setPropertyValue("FontHeight", 10)
   oMod.setPropertyValue("PositionX", 200)
   oMod.setPropertyValue("PositionY", 15)
   oMod.setPropertyValue("Width",  80)
   oMod.setPropertyValue("Height", 60)
   oMod.setPropertyValue("Label", "Nebensatz")
   oMod.setPropertyValue("TabIndex", 3)
   REM und dem Dialogmodel zuweisen
   oDlgM.insertByName("Optionsfeld1", oMod)

   REM zweites Optionsfeld erzeugen ' <---------------------------------------------------------
   oMod = oDlgM.createInstance("com.sun.star.awt.UnoControlRadioButtonModel")
   REM die Eigenschaften setzen
   oMod.setPropertyValue("Name", "Optionsfeld2")
   oMod.setPropertyValue("FontHeight", 10)
   oMod.setPropertyValue("PositionX", 200)
   oMod.setPropertyValue("PositionY", 30)
   oMod.setPropertyValue("Width",  80)
   oMod.setPropertyValue("Height", 60)
   oMod.setPropertyValue("Label", "Infinitivsatz")
   oMod.setPropertyValue("TabIndex", 2)
   REM und dem Dialogmodel zuweisen
   oDlgM.insertByName("Optionsfeld2", oMod)

   REM einen Button erzeugen
   oMod = oDlgM.createInstance("com.sun.star.awt.UnoControlButtonModel")
   REM die Eigenschaften setzen   
   oMod.setPropertyValue("Name", "Button1")
   oMod.setPropertyValue("TabIndex", 4)
   oMod.setPropertyValue("PositionX", 50)
   oMod.setPropertyValue("PositionY", 160)
   oMod.setPropertyValue("Width",  100)
   oMod.setPropertyValue("Height", 20)
   oMod.setPropertyValue("Label", "OK")
   oMod.setPropertyValue("PushButtonType", com.sun.star.awt.PushButtonType.OK)
   REM und dem Dialogmodel zuweisen
   oDlgM.insertByName("Button1", oMod)
   
   REM den Dialog erzeugen
   oDlg = CreateUnoService("com.sun.star.awt.UnoControlDialog")
   oDlg.setModel(oDlgM)
   
   REM ein Fenster erzeugen und den Dialog zuweisen
   oWin = CreateUnoService("com.sun.star.awt.Toolkit")
   oDlg.createPeer(oWin, null)
   
   Rem Dialog aufrufen
   oDlg.execute()
End Sub
Mr.Ed
**
Beiträge: 47
Registriert: Di, 16.02.2010 18:38

Re: Optionsfelder in Laufzeit-Dialog

Beitrag von Mr.Ed »

Hallo R, danke, dass du dir die Mühe gemacht hast. Leider funktioniert es bei mir nicht ganz. Die Funktionalität ist zwar da. Aber der zweite Radiobutton ist zunächst nicht sichtbar. Erst wenn ich dahin klicke, wo er eigentlich sichtbar sein müsste, erscheint der Radiobutton, allerdings ohne den vereinbarten Text (Label). Nun kann ich auch zwischen beiden Möglichkeiten wechseln. - Krumbein sagt:
Eine Gruppenzugehörigkeit mehrer Optionsbuttons wird ausschließlich durch direkt aufeinander folgende TabIndex-Nummern erreicht Die TabIndex-Nummer ist eine Eigenschaft des Models und wird automatisch während des Desgns fortlaufend in der Reihenfolge des Erzeugens der Kontrollelemente vergeben. Der TabIndex wird intern ausgewertet, wenn man die Elemente einer Dialogbox mit der Tabulatortaste anspringt. Im Eigenschaftendialog der IDE-Designansicht heißt diese Eigenschaft "Aktivierungsreihenfolge". (S. 591)
So weit die Theorie. Aber wie kann man das praktisch umsetzen, wenn man nicht mit der IDE-Designeransicht arbeitet?

Gruß Mr.Ed
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Optionsfelder in Laufzeit-Dialog

Beitrag von balu »

Hallo Leute,

mit Laufzeit-Dialogen kenne ich mich noch nicht so weit aus, aber könnte es nicht eventuell damit zu tun haben, dass den OptionsButtons kein Eventlistner zugeordnet ist? Ich hatte hier und da was im Forum in dieser Art mal gelesen, weiß jetzt nur nicht mehr so genau wo.

Vielleicht hilft ja dieser Denkanstoß.

Und nein, ich hab den Code nicht ausprobiert.


Gruß
balu

[edit]
hatte in einem englischem Forum http://www.oooforum.org/ einen Code gefunden, der ein Laufzeit-Dialog erstellt. Diesen hab ich jetzt in eine Datei gepackt, und hier angehängt. Vielleicht ist er hilfreich.
Dateianhänge
Sample_Makro.ods
(11.52 KiB) 173-mal heruntergeladen
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Mr.Ed
**
Beiträge: 47
Registriert: Di, 16.02.2010 18:38

Re: Optionsfelder in Laufzeit-Dialog

Beitrag von Mr.Ed »

Hallo zusammen,

das Problem ist gelöst. Und die Lösung ist – wie so oft – trivial: Ich hatte durch dummes Copy&Paste für beide Radiobuttons als Höhe 60 angegeben (oMod.setPropertyValue("Height", 60)). Dadurch überlagerten sich natürlich die beiden Elemente, was wohl zu den entsprechenden Schwierigkeiten geführt hat. Das Ganze ist mir aufgefallen, als ich versuchte, ein FrameContol-Element einzubauen. Ist jetzt nicht mehr nötig. Vielen Dank für eure Mithilfe!

Gruß Mr.Ed
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: [Gelöst:] Optionsfelder in Laufzeit-Dialog

Beitrag von F3K Total »

Na, ist doch schön.
Ich finde es aber nach wie vor komisch, dass in o.a. Beispiel der zuerst definierte Optionsbutton einen größeren TabIndex (hier 3) als der zweite ( hier 2) haben muß, damit es funktioniert. Drehe ich das um, statt 3-2 nehme ich 2-3, funktionieren die Buttons nicht. Logisch ist das für mich nicht. Hat vielleicht einer der Profis eine Idee woran das liegen kann?

Beste Grüße von R
Mr.Ed
**
Beiträge: 47
Registriert: Di, 16.02.2010 18:38

Re: [Gelöst:] Optionsfelder in Laufzeit-Dialog

Beitrag von Mr.Ed »

Hallo R,
Ich finde es aber nach wie vor komisch, dass in o.a. Beispiel der zuerst definierte Optionsbutton einen größeren TabIndex (hier 3) als der zweite ( hier 2) haben muß, damit es funktioniert. Drehe ich das um, statt 3-2 nehme ich 2-3, funktionieren die Buttons nicht. Logisch ist das für mich nicht. Hat vielleicht einer der Profis eine Idee woran das liegen kann?
Ich bin natürlich auch immer neugierig auf fachkundige Hinweise. Es ist aber hinsichtlich der TabIndex-Sache nicht nötig, die "Profis" zu bemühen. Bei mir funktioniert es, wenn ich die TabIndex-Werte fortlaufend durchnummeriere, also 1 für das Beschriftungsfeld, 2 für den ersten, 3 für den zweiten Radiobutton und 4 für den OK-Button. Ich kann aber auch die TabIndex-Werte komplett auskommentieren - die Dialogoberfläche funktioniert trotzdem, offenbar werden die Werte dann tatsächlich automatisch gesetzt!

Also: Es war wirklich nur meine Flüchtigkeit. Setze bei den beiden Optionsfeldern im Ausgangscode einfach jeweils 10 als Wert für Height, und du wirst sehen, es funktioniert!

Spannend wird es natürlich, wenn ich den Dialogelementen bestimmte Ereignisse zuweisen möchte. Da brauche ich dann die oben bereits erwähnten Event-Listener. (Aber das wäre ein anderes Thema.)

Gruß Mr.Ed
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: [Gelöst:] Optionsfelder in Laufzeit-Dialog

Beitrag von F3K Total »

Ping,
jetzt habe ich auch verstanden warum der Dialog mit den "rückwärts" durchnummerierten TabIndexen funktioniert. Erst "oben" dann "unten".
Gruß R
Antworten