Dynamische Menus mit wxWidgets

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
exbs
Beiträge: 11
Registriert: Mo Sep 29, 2008 12:51 pm

Dynamische Menus mit wxWidgets

Beitrag von exbs » Mi Jun 15, 2011 2:06 pm

Hi,

um folgendes geht es. Ich bin dabei eine dynamische Oberfläche (ich komme gleich darauf zurück) zu erstellen, die anhand einer ini-Datei initialisiert und aufgebaut wird. Speziell geht es dabei darum ein Menu-Struktur aus der ini-Datei zu lesen und diese mit wxWidgets zu implementieren. Leider bin ich selbst ein Anfänger im Umgang mit diesem Framework und kann nur die rudimentären Funktionen benutzen. Kennt sich hier jemand damit besser aus ?

Was meine ich mit dynamisch:

Code: Alles auswählen

; Beispiel für die modifizierte INI-Datei

[menutitel_{untermenutitel}_eintrag]
name            = string		; sichtbarer Name im Menu
type              = "exec"
exec_param  = A (teilmenge) PAR ; Programmaufrufe ohne Parameter möglich. BSP: $DEBUG
exec_pfad     = "/path/to/file" 	; Pfad zum auszufuehrenden Programm
button           = YES/NO

[menutitel_{untermenutitel}_eintrag]
name	    = string 		; sichtbarer Name im Menu
type	            = "conf"
conf_pfad      = "/path/to/file"
button           = YES/NO

[menutitel_{untermenutitel}_eintrag]
name	    = string 		; sichtbarer Name im Menu
type	            = "param"
param_type   = T € {file, int, float, string, bool}
param_name  = $string		; Platzhalter fuer diesen Parameter. BSP: $DEBUG
param_desc   = string		; Beschreibung
param_value  = wert vom Typ T 	; kann nicht immer angegeben werden, wenn "NULL", dann muss dieser Wert vor dem Start des Programms explizit abgefragt werden.
param_format = string		; Aufruf fuer diesen Parameter. BSP: -d
button            = YES/NO


; Wie sehen die Menu´s dann aus ?
; Über Untermenus haben wir vorhin schon gesprochen. Sie sind nicht zwingend notwendig, aber ich wenn es sich als nicht allzu aufwendig erweist, dann
; können wir dies ruhig machen.
[menutitel1]
	{[untermenutitel_1]} --> {eintrag_1} ... {eintrag_n}
		...
	{[untermenutitel_n]} --> {eintrag_1} ... {eintrag_n}
	{eintrag_1}
		...
	{eintrag_n}


; Definitionen:
;	PAR ... ist die Menge aller Parameter
;	    ... ist die Menge aller INI-Einträge mit type = param
So sieht meine (vorläufige) Version der ini-Datei aus. Was die einzelnen Parameter in den Sections machen erkläre ich gerne bei Interesse. Meine Frage ist jetzt, wie ich diese Menu sinnvoll repräsentieren kann. Problematisch ist, dass hinter jedem Menupunkt alle Parameter stehen müssen. Ich habe an eine Liste gedacht für jedes Menu (bzw. Untermenu). Dies ist allerdings in meinen Augen eine zu aufwendige Lösung. Was sagt ihr dazu ? Hat jemand so etwas ähnliches schon einmal gemacht ? Vlt in wxWidgets ?

LG,
exbs

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Dynamische Menus mit wxWidgets

Beitrag von Xin » Mi Jun 15, 2011 5:27 pm

Mir ist nicht bekannt, dass man wxWidgets mit einer Ini-Datei bestücken kann.

Du musst die Ini-Datei doch selbst laden und hast anschließend die Informationen in irgendwelchen structs vorligen, zum Beispiels als Array?

Bis dahin hast Du noch nichts mit wxWidgets zu tun.

Nachdem Du die Daten im Speicher verfügbar hast, wirst Du Dich vermutlich mit der wxMenuBar beschäftigen dürfen.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

exbs
Beiträge: 11
Registriert: Mo Sep 29, 2008 12:51 pm

Re: Dynamische Menus mit wxWidgets

Beitrag von exbs » Mi Jun 15, 2011 5:37 pm

Bisher arbeite ich genau damit (wxMenu). Was ich allerdings umständlich finde, ist die Informationen die hinter jedem MenuPunkt stehen zu behalten.

Wo ich dir das so schreibe habe ich aber die Idee, mir eine Art "myMenuItem" abzuleiten, der in der Lage ist, diese Informationen zu speichern. Allerdings bin ich der Meinung, dass dann zu viel Last in dieser Menu Struktur steckt. Zwecks der Idee, die Daten immer von der Darstellung zu trennen?!

Die ini-Datei lese ich bisher einfach ein. Das stellte auch so lange kein Problem dar, wie die Struktur recht einfach war. Doch jetzt ist um einiges Komplexer geworden.

Ich denke in Ruhe lieber nochmal nach, bevor ich hier noch mehr schreibe :).

LG

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Dynamische Menus mit wxWidgets

Beitrag von Xin » Mi Jun 15, 2011 6:05 pm

Die Ableitung erscheint mir erstmal sinnvoll, natürlich so, dass keine Daten doppelt vorkommen. Ich bin mit wxWidgets aber leider auch nicht vertraut, jedenfalls habe ich bisher nicht viel damit gemacht. Ich würde da derzeit genauso dreist rangehen, wie Du. ^^

Die Daten von der Darstellung zu trennen ist ja auch in Ordnung, allerdings wird man die Daten irgendwann auch darstellen müssen. In Deinem Fall ist Dein Menüaufbau die Daten und das Menü die Darstellung. Dem Menü wirst Du mitteilen müssen, wie es auszusehen hat und wie der Eintrag heißt. ^^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

exbs
Beiträge: 11
Registriert: Mo Sep 29, 2008 12:51 pm

Re: Dynamische Menus mit wxWidgets

Beitrag von exbs » Mi Jun 22, 2011 12:42 pm

Ich habe mich jetzt entschieden es folgendermaßen zu machen.

Es gibt 3 dynamische Datenstrukturen (in meinem Fall std::vector) in dem die 3 verschiedenen Typen des ini-file gespeichert sind (exec, conf, param). Diese werden mit globalen Indizes der Reihe nach aus der Datei gelesen und in die Vektoren gepackt. Das Menu wird parallel aufgebaut. Dort bekommen die einzelnen wxItem und wxMenu Indizes aus einem globalen Bereich. Also zum Beispiel gibt es 1000 ID's für Menu's. Diese gehen von 1000 - 1999. Wenn jetzt ein neues Menu hinzugefügt wird, dann wird ein Zähler (nextMenuID) inkrementiert. Die Daten und die Menu's werden also über die Indizes aufeinander abgebildet. Ebenso mache ich es mit den Parametern. Diese liegen in einem Großen "Pool" und können von allen exec genutzt werden. Wenn ein Parameter geändert werden soll, dann wird entpsrechend seiner ID im Menu das Element aus dem Vektor geholt und die Eigenschaften dort verändert.

Ich folge so der die Daten und die Darstellung möglichst von einander zu trennen, allerdings ist um das komplett zu machen die Abhängigkeit von ID im Menu und Platz im Vektor nicht sehr optimal. Oder sehe ich da jetzt ein Problem wo keines ist ?

MfG

Antworten