Seite 3 von 4
Re: Formular global anlegen
Verfasst: So, 04.10.2009 19:20
von gigabert
eBayer hat geschrieben:
Solltest Du nicht doch nochmal Dein Konzept überdenken und dann einen Kompromiss aus den Vor- und Nachteilen erarbeiten?
Ich will Dir gerne bei Deinen Überlegungen helfen, wenn Du Wert darauf legst - und vielleicht finden wir ja eine gute Lösung als Mittelweg.
Gruß eBayer
Hallo eBayer,
vielen Dank für dein Hilfsangebot. Ich bin immer noch auf der Suche nach einer grundsätzlichen Struktur und einem Konzept, wie ich meine Anwendung entwickle. Über Tipps und Hilfe wäre ich sehr froh und dankbar. Mein jetziger Plan sieht so aus: ich würde gerne ein leeres Formular zu Beginn anzeigen, welches ein eigenes Menü hat. (das mit dem Menü klappt wohl mittlerweile) Aus diesem Menü möchte ich dann die anderen Formulare und Dialoge aufrufen. Jetzt war meine Idee, die Objekte der Formulare schon gleich zu Beginn als globale Variablen zu erzeugen, damit ich während der Anwendung jederzeit darauf zugreifen kann. Aber vielleicht bin ich da auch völlig auf dem Holzweg.
Gruss
Bert
Re: Formular global anlegen
Verfasst: So, 04.10.2009 19:59
von eBayer
Dann haben wir ja den gleichen Ansatz bei unseren Überlegungen.
Ich habe meine Anwendungen so gestrickt:
- Ein Startformular als Menü mit PushButtons (optisch gestaltet), über welches ich alle anderen Formulare aufrufe.
- diverse Formulare, die über das Startmenü aufgerufen werden.
Im Gegensatz zu Deinen Überlegungen verwende ich allerdings ein kleines externes Startmodul, mit dem ich die Datenbank starte...
Kommt noch von oO 3.01 weil es dort nicht möglich war, mit der Anwendung ein Startformular zu starten, bringt mir aber zusätzlich gestalterische und technische Vorteile, über die wir ggf. mal diskutieren können.
Die Vorbelegung globaler Variablen für die Formulare ist dabei nicht notwendig.
Dort, wo ich Folgeformulare aus einem anderen Formular benötige, rufe ich sie halt über einen PushButton im jeweiligen Formular auf.
Dabei kann ich in der Dir bereits beschriebenen Form (globale Variable mit dem Formular) ggf. mit dem aufrufenden Formular kommunizieren.
Wichtig ist dabei, daß Du in der MainRoutine des aufgerufenen (Unter)Formulars sofort die globale Variable mit dem HauptFormular übernimmst und auf Null setzt. Damit wird verhindert, daß bei einem zeitgleichen Aufruf eines weiteren Formulars vom Menü her, Konflikte entstehen.
Das Menü ist sehr simpel gestrickt, weil ich alle Formulare und Berichte über ein einziges Makro starte.
Im Menü selbst erfolgt der Aufruf immer auf die gleiche Weise im folgenden schematisch als Beispiel dargestellt:
Sub Lieferanten
OpenForm("Lieferanten")
End Sub
Sub Kunden
OpenForm("Kunden")
End Sub
Sub OpenForm(sForm) ' allgemein gültiges Makro zum Start der Formulare. Aufruf: OpenForm("Formularname")
Dim args(1) As New com.sun.star.beans.PropertyValue
Dim container As Variant, oForm As Variant, oConnection As Object
Dim oContext
oContext = CreateUnoService ( "com.sun.star.sdb.DatabaseContext" )
oConnection = oContext.getByName( "Dein Name" ).getConnection( "" , "" )
container = oConnection.Parent.DatabaseDocument.FormDocuments
args(0).Name = "ActiveConnection" : args(0).Value = oConnection
args(1).Name = "OpenMode" : args(1).Value = "open"
oForm = container.loadComponentFromURL(sForm,"_blank",0,args())
With oForm.getCurrentController().getFrame().getContainerWindow()
End With
End Sub
Gruß eBayer
Re: Formular global anlegen
Verfasst: Mo, 05.10.2009 00:00
von gigabert
Hallo eBayer,
das habe ich mitbekommen, dass es mittlerweile möglich ist, auch dem Öffnen des Base-Dokumentes eine Prozedur zuzuweisen. Da ich diese Anwendung nicht für mich entwickele, sollen für die zukünftigen Anwender möglichst viele Funktionen automatisch im Hintergrund ablaufen, ohne dass sie vorher irgendwelche Buttons klicken müssen. Auch finde ich eine Navigation innerhalb der Anwendung über ein Menü besser, als über Buttons. Manchmal ist vielleicht auch beides denkbar, z.B. das Schliessen von Formularen oder der ganzen Anwendung, was über einen Button als auch über das Menü möglich sein sollte. Es sollte halt wirklich wie eine eigenständige Anwendung wirken, so wie es die meisten Benutzer von anderen Anwendungen gewohnt sind. Ich denke auch, dass du in diesem Bereich schon ziemlich viele Sachen entwickelt und viel Erfahrung gesammelt hast. Ich fände es deshalb prima, wenn wir gemeinsam (auch mit anderen hier im Forum) dies weiterentwickeln können.
OK, ich melde mich wohl morgen wieder...
Bis denn
Bert
Re: Formular global anlegen
Verfasst: Mo, 05.10.2009 13:16
von gigabert
Hallo eBayer,
ich hab mir jetzt mal die drei Basic-Module von deinem Testprogramm (Florian1) ausgedruckt, um sie mir mal genauer anzuschauen. Aufgefallen ist mir dabei, dass du zwar dein Adressen-Formular als globales Objekt anlegst, aber in dem Modul zu dem Adressen-Formular darüber nicht darauf zugreifst, sondern nur mit dem Modul zum Umsatz-Formular. Im Modul Form_Adressen_Standard rufst du das Formular in mehreren Prozeduren mit oForm = ThisComponent.DrawPage.Forms.getByName("Form_Adressen") auf. Ich denke, das war es, was mich verwirrt hatte. Denn ich hatte das auch so ähnlich und dachte mir, dass ich das Objekt global anlege und dann nicht jedesmal wieder so holen muss. Aber vielleicht ist es so wie bei dir ja auch eher richtig. Ich werde das mal weiter durcharbeiten...
Gruss
Bert
Re: Formular global anlegen
Verfasst: Mo, 05.10.2009 14:22
von eBayer
Hallo Bert,
warum soll ich mit "getGlobalForm()" auf mich selbst zugreifen?
Wenn ich im AdressFormular bin, habe ich doch alles im direkten Zugriff und kann mir den Funktionsaufruf sparen.
getGlobalForm() macht nur dort Sinn, wo ich auf andere Weise keinen direkten Zugriff auf das Object habe.
Hast Du eigentlich schon Dein ToolBarMenu realisiert oder ist es zur Zeit nur Deine Absicht?
Ich habe heute mal interessehalber ein wenig geforscht, bin aber noch nicht so richtig weitergekommen.
Gruß eBayer
Re: Formular global anlegen
Verfasst: Mo, 05.10.2009 14:31
von gigabert
Hallo eBayer,
meine Überlegung war ja auch, dass ich einmal (zum Anwendungsbeginn) eine globale Variable (Objekt vom Formular, z.B. global oPersonenFormular as Object) anlege und dann von überall direkt auf diese Variable zugreifen kann, ohne dass ich dann mit getGlobalForm() oder ThisComponent.DrawPage.Forms.getByName("Form_Adressen") mir nochmal ein Objekt erstellen muss. Ich weiss ja jetzt nicht genau, was da mehr Ressourcen benötigt. Wenn ich einaml ein globales Objekt angelegt habe oder wenn ich jedes mal lokal ein neues Objekt erzeuge. Aber vielleicht kommt meine Verwirrung auch von der objektorientierten Java-Programmierung, und hier bei OOo Basic ist das etwas anders. Ich werde wohl erstmal deine Vorgehensweise aufgreifen und übernehmen, damit ich wenigstens mal was zum Laufen bekomme.
Gruss
Bert
Re: Formular global anlegen
Verfasst: Mo, 05.10.2009 14:55
von eBayer
und was hast Du inzwischen mit dem ToolBarMenu erreicht?
würde mich interessieren.
Re: Formular global anlegen
Verfasst: Mo, 05.10.2009 15:21
von gigabert
eBayer hat geschrieben:und was hast Du inzwischen mit dem ToolBarMenu erreicht?
würde mich interessieren.
Na ja, ist vielleicht ein etwas ungewöhnlicher Weg und nicht besonders optimal, aber ich hab mir jetzt erstmal in der Menüleiste einen Menüeintrag für meine Anwendung erstellt, in dem ich auch weitere Menü-Items erstellen kann, die mit Makros verbunden werden, je nach Funktionalität des Menüeintrages, auch mit verschachtelten Untermenüs. So hab ich dann erstmal meine eigene Menü-Struktur für die Anwendung in einem Menüpunkt untergebracht. Dieser eigene Menüpunkt steht jetzt aber neben den vielen anderen Menüpunkten, die zur IDE gehören. Da ich aber teilweise Probleme hatte, aus der bestehenden Menüleiste Einträge komplett zu entfernen (also über die IDE -> Anpassen -> Menüs), gehe ich nun direkt in die gezippte odb-Datei und ändere im entsprechenden Verzeichnis die menubar.xml so wie ich sie haben möchte. Es gibt für jedes Formular im dortigen Unterordner eine zugehörige menubar.xml. Ganz am Ende, wenn die Anwendung fertig ist und an die Benutzer übergeben wird, lösche ich so die unnötigen Menüpunkte und lege mein eigenes Menü per Hand in der XML-Datei an. Ich möchte halt nicht das Menü komplett ausblenden und die Navigation nur über Buttons tätigen. Das Problem bei den gelöschten Menüeinträgen ist aber wohl, dass damit auch die Bearbeitungsfunktion für das Formular wegfällt. Wahrscheinlich muss ich mir dann eben zwei Versionen der odb-Datei anlegen: eine mit dem kompletten Menü und eine mit meinem eigenen. So kann ich dann später trotzdem weiterhin wieder an den Formularen basteln.
Bin mal gespannt, ob du mir jetzt noch irgendwelche Nachteile an dieser Vorgehensweise aufzeigst...
Gruss
Bert
Re: Formular global anlegen
Verfasst: Mo, 05.10.2009 18:35
von eBayer
Was hältst Du davon?
Menü per Makro individuell pro Formular dynamisch erstellt.
Bin aber noch am forschen, um das zu verbessern.

- Toolbar.jpg (93.22 KiB) 2580 mal betrachtet
Re: Formular global anlegen
Verfasst: Mo, 05.10.2009 20:15
von gigabert
eBayer hat geschrieben:Was hältst Du davon?
Menü per Makro individuell pro Formular dynamisch erstellt.
Bin aber noch am forschen, um das zu verbessern.
Ich hatte vor längerer Zeit mal gefragt, ob es möglich ist, ein eigenes Menü zu erstellen. Da hiess es, das würde nicht gehen. Ausser mit der von mir oben genannten Methode. Ich hatte dann aber in der API-Doku irgendwas mit menubar und menu gefunden, konnte damals aber nichts damit anfangen. Ich vermute, dass es eben doch auch per Basic-Makros möglich sein muss, sich ein individuelles Menü zusammenzustellen. An einer Lösung oder auch Tipps bin ich jedenfalls sehr interessiert. MAl schauen, was für ungeahnte Möglichkeiten noch zum Vorschein kommen...
Gruss
Bert
Re: Formular global anlegen
Verfasst: Mo, 05.10.2009 22:06
von eBayer
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
Re: Formular global anlegen
Verfasst: Mo, 05.10.2009 22:19
von gigabert
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
Verfasst: Di, 06.10.2009 21:38
von eBayer
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
Re: Formular global anlegen
Verfasst: Di, 06.10.2009 21:52
von gigabert
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
Verfasst: Di, 06.10.2009 22:11
von gigabert
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