Formular global anlegen

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Formular global anlegen

Re: Formular global anlegen

von gigabert » Fr, 09.10.2009 14:37

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

Re: Formular global anlegen

von gigabert » Do, 08.10.2009 23:40

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

Re: Formular global anlegen

von gigabert » Do, 08.10.2009 22:19

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

Re: Formular global anlegen

von eBayer » Do, 08.10.2009 12:01

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

Re: Formular global anlegen

von gigabert » Do, 08.10.2009 11:22

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

Re: Formular global anlegen

von gigabert » Mi, 07.10.2009 20:14

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

Re: Formular global anlegen

von gigabert » Mi, 07.10.2009 20:08

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

Re: Formular global anlegen

von eBayer » Mi, 07.10.2009 15:11

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

Re: Formular global anlegen

von gigabert » Mi, 07.10.2009 10:38

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

Re: Formular global anlegen

von eBayer » Di, 06.10.2009 22:17

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

Re: Formular global anlegen

von gigabert » Di, 06.10.2009 22:11

eBayer hat geschrieben:Das wichtigste habe ich aus dem amerikanischen Forum...
Hallo eBayer,

welches ist denn das amerikanische Forum? Ich kenn z.B. diese Foren:
http://www.oooforum.org
http://user.services.openoffice.org/en/forum

In diesen gibt es jedenfalls auch immer ziemlich gute Infos (in englisch).

In der menubar.xml der Formulare hab ich gesehen, dass die Separatoren fürs Menü dort mit <menu:menuseparator/> angegeben sind. Vielleicht gibt es dafür ja auch noch ein Objekt, welches sich dann bequem ins Menü einbringen lässt.

Gruss
Bert

Re: Formular global anlegen

von gigabert » Di, 06.10.2009 21:52

Hallo eBayer,

sieht ja prima aus. Lass dich umarmen für deine tolle Arbeit!!! Das bringt die Entwicklung von Anwendungen einen grossen Schritt weiter...

Gruss
Bert

Re: Formular global anlegen

von eBayer » Di, 06.10.2009 21:38

Hallo Bert,
das PopupMenu ist fertig zum Test! War ein hartes Stück Arbeit.
Schau Dir mal das beiliegende Programm an. Sollte sich eigentlich selbst erklären.
Einfach nur kopieren und starten.... den Rest siehst Du dann.
Das wichtigste habe ich aus dem amerikanischen Forum.... der Rest war Forschung mit Hilfe von xRay und Test.
Habe es so angepasst, daß es möglichst flexibel und überall eingesetzt werden kann.
Gruß eBayer
Dateianhänge
PopUpTest.odb
(13.93 KiB) 100-mal heruntergeladen

Re: Formular global anlegen

von gigabert » Mo, 05.10.2009 22:19

Hallo eBayer,

sieht in etwa so aus, wie ich mir das schon immer gewünscht habe. Hätte mich auch ein bisschen gewundert, wenn dies nicht möglich gewesen wäre. Trotzdem: prima Arbeit! Auf das Modul bin ich aber mal gespannt. Das bringt die Entwicklung von Anwendungen einen grossen Schritt weiter...

Gruss
Bert

Re: Formular global anlegen

von eBayer » Mo, 05.10.2009 22:06

Ich habs geschafft......
Dynamisches Menu per Makro ist möglich. Ich werde mich allerdings nur um Base-Formulare kümmern!
Bei mir läuft bereits ein Testprogramm stabil.
Ich werde das Modul so gestalten, daß Du in der Main-Routine jedes Formulars das jeweils benötigte Menu selbst konfigurieren kannst.
Etwa in der Form:
Dim aMenus (3)
aMenus(0) = "TestMenu0"
aMenus(1) = "TestMenu1"
aMenus(2) = "TestMenu2"

Dim aSubMenus(2,5)
aSubMenus(0,0) = "TestForm0-0:SubName00"
aSubMenus(0,1) = "TestForm0-1:SubName01"
aSubMenus(0,2) = "TestForm0-2:SubName02"
aSubMenus(0,3) = "TestForm0-3:SubName03"
aSubMenus(0,4) = "TestForm0-4:SubName04"

aSubMenus(1,0) = "TestForm1-0:SubName10"
aSubMenus(1,1) = "TestForm1-1:SubName11"
aSubMenus(1,2) = "TestForm1-2:SubName12"
aSubMenus(1,3) = "TestForm1-3:SubName13"
aSubMenus(1,4) = "TestForm1-4:SubName14"

setFormMenu(aMenus, aSubMenus)

Das erzeugt 3 MenuEinträge, bei denen der 1. und 2. jeweils 5 Formulare etc. aufruft.
Der 3 Eintrag hat keine Submenus.
Mehr wird nicht zu tun sein,
In 2-3 Tagen werde ich damit fertig sein.
In einem nächsten Schritt werde ich das Menu über eine Datenbank-Tabelle oder eine externe INI-Datei konfigurierbar gestalten.
Einverstanden?
Gruß eBayer

Nach oben