Formular global anlegen

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

Moderator: Moderatoren

eBayer
******
Beiträge: 556
Registriert: Do, 04.12.2008 14:33
Wohnort: Augsburg

Re: Formular global anlegen

Beitrag von eBayer »

Hallo Bert,
ja, es hat Spaß gemacht und ich werde es sicher noch optimieren.
Allerdings sind die Informationen nur sehr schwer zu finden.
Ich meinte übrigens oooforum.org...... übrigens ein thread, in dem Du bereits selbst dort geforscht hast.
Wünsche Dir jedenfalls viel Spaß bei Deiner weiteren Arbeit und bin dankbar für weitere Tipps, um das Modul zu komplettieren.
Gruß eBayer
Intel(R) Core(TM)2 Quad CPU Q8200 @ 2.33GHz mit 4 GB Memory (3,2 GB aktiv)
Vista Home Premium 32 Bit
openOffice 3.1.1 mit Sun Report Builder 1.1.0 und MySql 5.1
Hauptinteresse ooBase seit 12.2008
gigabert
*****
Beiträge: 203
Registriert: Di, 11.08.2009 16:06

Re: Formular global anlegen

Beitrag von gigabert »

Hallo eBayer,

ein Problem ist mir noch aufgefallen: das Formular "Adressen" kann nun nicht mehr bearbeitet werden, da es ja jetzt sein eigenes Menü hat. Ich vermute mal, du hast dem Formular beim Öffnen das Ereignis "configMenu" zugewiesen. Kann ich aber nun ohne Bearbeitungsmöglichkeiten im Formular nicht mehr feststellen und auch nicht mehr ändern. Sehe ich das richtig, oder hast du dir noch eine Hintertür offen gehalten?

Als Verbesserungsmöglichkeiten fallen mir gerade noch die 2 Sachen ein:
- Separatoren hinzufügen
- verschachtelte Menüs (also mit weiteren Untermenüs)

Ich werde mich da dann wohl auch mal an die Suche danach machen, denke aber, dass du eh schneller bist als ich.

Gruss
Bert
OpenOffice 3.1.1 unter Debian 5.0 und mit PostgreSQL 8.3
eBayer
******
Beiträge: 556
Registriert: Do, 04.12.2008 14:33
Wohnort: Augsburg

Re: Formular global anlegen

Beitrag von eBayer »

Hallo Bert,
Separatoren habe ich heute gelöst.
Verschachtelte Menü's.... Du kriegst den Hals wohl nie voll? *grins
Aber damit werde ich mich vorerst mal nicht befassen. Vielleicht magst Du ja?
Um das Formular zu bearbeiten, setze einfach in das Sub "configMenu" als erste Zeile ein "exit Sub" hinein.
Dann bleibt das Standardmenu erhalten.
Ich werde noch ein wenig an dem Testprogramm verschlimmbessern.... dann kann ich Dir die neue Version schicken.
Gruß eBayer

Ergänzung: Ich bin soweit fertig und hänge die aktuelle Version hier an.
Dateianhänge
PopUpTest.odb
(14.57 KiB) 117-mal heruntergeladen
Intel(R) Core(TM)2 Quad CPU Q8200 @ 2.33GHz mit 4 GB Memory (3,2 GB aktiv)
Vista Home Premium 32 Bit
openOffice 3.1.1 mit Sun Report Builder 1.1.0 und MySql 5.1
Hauptinteresse ooBase seit 12.2008
gigabert
*****
Beiträge: 203
Registriert: Di, 11.08.2009 16:06

Re: Formular global anlegen

Beitrag von gigabert »

eBayer hat geschrieben:Hallo Bert,
Separatoren habe ich heute gelöst.
Verschachtelte Menü's.... Du kriegst den Hals wohl nie voll? *grins
Aber damit werde ich mich vorerst mal nicht befassen. Vielleicht magst Du ja?
Um das Formular zu bearbeiten, setze einfach in das Sub "configMenu" als erste Zeile ein "exit Sub" hinein.
Dann bleibt das Standardmenu erhalten.
Ich werde noch ein wenig an dem Testprogramm verschlimmbessern.... dann kann ich Dir die neue Version schicken.
Gruß eBayer

Ergänzung: Ich bin soweit fertig und hänge die aktuelle Version hier an.
Hallo eBayer,

ich wusste ja, dass du einfach schneller bist, als ich. Ich bin zur Zeit immer noch dabei, deinen Code zu analysieren, da kommt schon die neue Version. Ich komme leider mit X-Ray und der Dokumentation nicht so richtig klar. Irgendwie kriege ich da nie so richtig gute Infos raus, die mich auch weiterbringen. Na ja, ich schau mir mal weiterhin deine Beispiele an und versuche einfach, die zu verstehen. Manche Sachen sind ja auch klar und logisch... Ich melde mich morgen wieder.

Gruss
Bert
OpenOffice 3.1.1 unter Debian 5.0 und mit PostgreSQL 8.3
gigabert
*****
Beiträge: 203
Registriert: Di, 11.08.2009 16:06

Re: Formular global anlegen

Beitrag von gigabert »

Sieht ja richtig schick aus, mit Icons und Separatoren. Hast du auch was über die Mnemonics herausgefunden? Also, die unterstrichenen Buchstaben in den Menü-Items. Die werden wohl von OOo automatisch vergeben. Ich schau mir deinen Code morgen nochmal genauer an. Vielleicht schaffe ich es ja mit den verschachtelten Menüs... ;-)

Gruss
Bert
OpenOffice 3.1.1 unter Debian 5.0 und mit PostgreSQL 8.3
gigabert
*****
Beiträge: 203
Registriert: Di, 11.08.2009 16:06

Re: Formular global anlegen

Beitrag von gigabert »

Hallo eBayer,

ein kleiner Verbesserungsvorschlag. Der folgende Code wird zweimal ausgeführt. Einmal beim Löschen der bestehenden MenuBar (killStandardMenu), und einmal beim Anlegen der neuen MenuBar (setFormMenu). Da das Löschen auf jeden Fall immer zuerst stattfindet, müsste es ja reichen, diese dann ganz am Anfang für das ganze Modul zu definieren und sich dann nur einmal die Objekte zu holen.

Code: Alles auswählen

...
sMenuBar = "private:resource/menubar/menubar"

oModel = ThisComponent

If not isNull( oModel ) then

oFrame = oModel.getCurrentController().getFrame()

oLayoutManager = oFrame.LayoutManager()

oMenuBar = oLayoutManager.getElement( sMenuBar )

oMenuBarSettings = oMenuBar.getSettings( true )

oMenuBar.Persistent = false

end if
...
Ansonsten wegen den verschachtelten Menüs denke ich, es müsste so ähnlich gehen, wie ich es bei Java-Programmen mache: einfach in den einzelnen Menüs anstatt ein MenuItem nochmal ein Menu aufrufen.

Ich melde mich später nochmal...

Gruss
Bert
OpenOffice 3.1.1 unter Debian 5.0 und mit PostgreSQL 8.3
eBayer
******
Beiträge: 556
Registriert: Do, 04.12.2008 14:33
Wohnort: Augsburg

Re: Formular global anlegen

Beitrag von eBayer »

Bert, das habe ich ganz bewusst so getan!
Wenn die Routine als allgemein verwendbare benutzt werden soll, kann es ja auch mal sein, daß ich das bestehende Menü erhalten möchte. Meine Logik ist so gestrickt, daß ich beliebige MenuItems anhängen kann.
Das siehst Du übrigens ganz gut beim erzeugen der Menüs, wo ich für jedes MenuItem separat die Routine aufrufe.
Wenn ich dort zum Anfang die Menupunkte löschen würde, würde ich die gerade eingefügten ja wieder zerschlagen und nur das letzte bliebe stehen.
Ich habe das ganz bewusst so gestrickt, weil es auch für Dich oder jeden, der das Menü anpassen will, einfacher zu lesen und zu handhaben ist, wenn er sich nicht mit verschachtelten Arrays herumschlagen muß - das hat auch mir Probleme bereitet.
So wie es ist, definierst Du das MenuItem und die dazugehörigen UnterMenus und übergibst es der Routine...
und das machst Du nach folgendem Muster:
1. Altes Menü löschen, wenn gewünscht
2. von links beginnend das erste MenuItem mit den UnterMenus
3. das nächste und so weiter
Du kannst sogar bestehende PopUpMenus Punkt für Punkt auf diese Weise erweitern. Die Routine sucht sich das passende MainMenu und hängt dann das UnterMenu an
Alles klar?
Gruß eBayer
Intel(R) Core(TM)2 Quad CPU Q8200 @ 2.33GHz mit 4 GB Memory (3,2 GB aktiv)
Vista Home Premium 32 Bit
openOffice 3.1.1 mit Sun Report Builder 1.1.0 und MySql 5.1
Hauptinteresse ooBase seit 12.2008
gigabert
*****
Beiträge: 203
Registriert: Di, 11.08.2009 16:06

Re: Formular global anlegen

Beitrag von gigabert »

eBayer hat geschrieben:Bert, das habe ich ganz bewusst so getan!
Wenn die Routine als allgemein verwendbare benutzt werden soll, kann es ja auch mal sein, daß ich das bestehende Menü erhalten möchte. Meine Logik ist so gestrickt, daß ich beliebige MenuItems anhängen kann.
Hallo eBayer,

kann ich gut verstehen, dass du das so gelöst hast. Mir als Anfänger ist das aber schon etwas zu viel. Ich bin gerade dabei, dein Beispiel auf das Notwendigste zu kürzen. Also nur die Teile, die mir die Menüs und Menü-Items anlegen (natürlich vorher das Standard-Menü löschen). Auch wenn das dann völlig starr und unflexibel ist, so versteh ich dann wenigstens eher, wie es funktioniert. Wenn ich das dann habe, kann ich auch versuchen, solch eine Dynamik wie bei deinem Beispiel reinzubringen. Es bringt mir dann am ehestens was, weil ich dann lerne, wie das aufgebaut ist und funktioniert. Dein Beispiel ist mir aber sehr hilfreich dabei.

Gruss
Bert
OpenOffice 3.1.1 unter Debian 5.0 und mit PostgreSQL 8.3
gigabert
*****
Beiträge: 203
Registriert: Di, 11.08.2009 16:06

Re: Formular global anlegen

Beitrag von gigabert »

Ich hab's geschafft, in einem Menü ein verschachteltes Untermenü anzulegen (die Verschachtelung wird angezeigt), aber in dieses Untermenü bekomme ich irgendwie keine weiteren Menu-Items rein. Ich hab einfach anstatt eines Menu-Items ein neues Menu hinzugefügt.
(eBayer: nicht lachen über meine vereinfachten Versuche; das ist noch nicht fertig, ich werde da noch weiter dran basteln) :wink:

Code: Alles auswählen

Dim oModel as Object
Dim oFrame as Object
Dim oLayoutManager as Object
Dim oMenuBar as Object
Dim oMenuBarSettings as Object

Sub configMenu

	Dim oPopupMenu As Variant

	getMenuBar                                'holt sich die notwendigen Objekte

	deleteStandardMenu                    'Standard-Menü löschen
	
	oMenuItem = CreateMenu("Menu1", "Datei")
	oMenuBarSettings.insertByIndex( 0, oMenuItem )
	
	oPopupMenuItem() = oMenuBarSettings.getByIndex(0)
	oPopupMenu = GetProperty( "ItemDescriptorContainer", oPopupMenuItem() )
	
	oMenuItem = CreateMenuItem( ".uno:CloseDoc", "Ende1" )
	oMenuItem = oPopupMenu.insertByIndex( 0, oMenuItem )
	
	oMenuItem = CreateMenuItem( ".uno:CloseDoc", "Ende2" )
	oMenuItem = oPopupMenu.insertByIndex( 1, oMenuItem )
	
	oMenuItem = CreateMenu("SubMenu1", "Untermenü")
	oMenuItem = oPopupMenu.insertByIndex( 2, oMenuItem )
	
	oMenuItem = CreateMenuItem( ".uno:CloseDoc", "Ende3" )
	oMenuItem = oPopupMenu.insertByIndex( 3, oMenuItem )
	
	oMenuItem = addSeparator()
	oMenuItem = oPopupMenu.insertByIndex( 4, oMenuItem )
	
	oMenuItem = CreateMenuItem( ".uno:CloseDoc", "Ende4" )
	oMenuItem = oPopupMenu.insertByIndex( 5, oMenuItem )
	
	oMenuItem = CreateMenu("Menu2", "Datei 2")
	oMenuBarSettings.insertByIndex( 1, oMenuItem )
	
	oMenuItem = CreateMenu("Menu3", "Datei 3")
	oMenuBarSettings.insertByIndex( 2, oMenuItem )
	
	oMenuBar.setSettings( oMenuBarSettings )

End Sub
OpenOffice 3.1.1 unter Debian 5.0 und mit PostgreSQL 8.3
gigabert
*****
Beiträge: 203
Registriert: Di, 11.08.2009 16:06

Re: Formular global anlegen

Beitrag von gigabert »

Hallo eBayer,

hast du einen genaueren Plan, was dieser ItemDescriptorContainer ist und was man damit machen kann/muss? Laut API-Doku beschreibt der Service ItemDescriptor ein User Interface Item, welches Teil eines User Interface Elements (Menüs, Toolbars, Statusbars) ist. Der ItemDescriptorContainer beschreibt einen optionalen Sub-Container. Wenn laut deinem Code ein Menü erstellt wird, gibt es diese 4 Properties:
1.) CommandURL (Aktion für den Menüeintrag)
2.) Label (Beschriftung)
3.) Type (Typ des ItemDescriptors) -> 0 = normaler Item, 1-3 -> Separatoren
4.) ItemDescriptorContainer (???).

Die ersten 3 Properties sind klar. Aber was macht der ItemDescriptorContainer? Ein optionaler Sub-Container? Was bedeutet das?
Laut dem Code wird ihm das zugewiesen (was ich nicht verstehe):

Code: Alles auswählen

oModuleCfgMgrSupplier = createUnoService("com.sun.star.ui.ModuleUIConfigurationManagerSupplier")
oModuleCfgMgr = oModuleCfgMgrSupplier.getUIConfigurationManager( "com.sun.star.sheet.SpreadsheetDocument" )
oContainer = oModuleCfgMgr.createSettings()
Gruss
Bert
OpenOffice 3.1.1 unter Debian 5.0 und mit PostgreSQL 8.3
Antworten