Seite 1 von 1
MenüItems zur Laufzeit einfügen
Verfasst: 24.11.2005 15:35
von scoty
Hallo,
Ich möchte zur Laufzeit gern in einem Submenü neue MenüItems einfügen.
Aber wie gebe ich an, an welcher Position ich das neue Item anlegen möchte? Ic befürte mit
komm ich nicht weit.
Re: MenüItems zur Laufzeit einfügen
Verfasst: 24.11.2005 15:56
von Kiffi
Hallo scoty,
die wohl pragmatischte Lösung ist, das Menü zur Laufzeit immer komplett neu
zu erstellen.
Grüße ... Kiffi
Verfasst: 24.11.2005 16:12
von scoty
Das habe ich schon fast befürchtet.
Habe grad einen neuen Ansatzt versucht, indem ich meine Daten, die in das Menü sollten, einfach in die Statusbar schreibe. Nur muss ich die Feldgrößen des ersten Feldes bei Größenänderungen des Fensters ebenfalls anpassen. Da scheint es auch nicht wirklich eine Funktion für zu geben. Aber ich Denke es macht weniger Aufwand die Statusbar mit ihren fünf Feldern neu zu erstellen, als jedesmal ein Neues Menü zu Zaubern, was wesentlich mehr einTräge erhalten soll.
Verfasst: 24.11.2005 17:28
von benpicco
Speichere doch alle Einträge in einer LinkedList. Wen sie z.B. Programme aufrufen, kanst du den Programmpfad mit reinschreiben.
Verfasst: 26.11.2005 02:54
von Blackskyliner
Dynamic Menüs.... darüber hatte ich mir auch mal gedanken gemacht und bin Am ende auch auf LL gekommen aber ein bisschen anders mitter Idee... *ausschweif*
Also, man hat ein Menü. (Iss irgendwie logisch oder?

) Und um da nun einen dynamischen Menüpunkt unterzukriegen machma uns ne Structure
So an diese Structure bindet man nun eine LL
so, nun mach ich da mal noch ein Paar funktionen für die aktionen...
Code: Alles auswählen
Procedure AddDynamicMenuItem(GadgetID.l, Name.s)
AddElement(DynamicMenue())
DynamicMenue()\iGadgetID = GadgetID
; Hier jetzt dann das hinzufürgen des menü Punktes
; Meine Idee kommt jetzt gleich nach den Kommentaren ist aber untested
MenuItem(GadgetID, Name)
; Geht aber bestimmt auch professioneller und funktioneller per WINAPI
EndProcedure
Procedure DeleteDynamicMenuItem(GadgetID.l)
Foreach DynamicMenue()
If GadgetID = DynamicMenue()\iGadgetID
DeleteElement()
Endif
Next
; Durch WinAPI das MenüItem weg machen.. oder einfach nur disablen.. oder alles neu zeichnen..
EndProcedure
Und nun die Funktionen einfach nurnoch aufrufen und als GadgetID #PB_Any angeben und schon müsste das gehn... so hab ich mir das gedacht... obs geht? keine Ahnung...
Verarbeitung ist allerdings auf eine einzige Aktion beschränkt ansonsten müsste man mehrere LL´s machen, weil laut meinen Gedanken kann man pro LL nur eine Funktion zuordnen, zumindest in dem Aufbau wie ich ihn jetzt gemacht hab

.
Verfasst: 26.11.2005 03:16
von Blackskyliner
Hier mal ein Funktionsfähiger Code
Code: Alles auswählen
Enumeration
#Menu
EndEnumeration
Enumeration
#MenuItem_1
#MenuItem_2
; [...]
EndEnumeration
Structure m
iGadgetID.l
sGadgetText.s
EndStructure
NewList DynamicMenue.m()
Declare AddDynamicMenuItem(GadgetID.l, Name.s)
Declare DeleteDynamicMenuItem(GadgetID.l)
Declare UpdateMenue()
Declare CreateMenue()
Declare GetRandomMenuID()
Procedure AddDynamicMenuItem(GadgetID.l, Name.s)
AddElement(DynamicMenue())
DynamicMenue()\iGadgetID = GadgetID
DynamicMenue()\sGadgetText = Name
; Hier jetzt dann das hinzufürgen des menü Punktes
; Meine Idee kommt jetzt gleich nach den Kommentaren ist aber untested
;MenuItem(GadgetID, Name)
; Geht aber bestimmt auch professioneller und funktioneller per WINAPI
UpdateMenue()
EndProcedure
Procedure DeleteDynamicMenuItem(GadgetID.l)
ForEach DynamicMenue()
If GadgetID = DynamicMenue()\iGadgetID
DeleteElement(DynamicMenue())
EndIf
Next
; Durch WinAPI das MenüItem weg machen.. oder einfach nur disablen.. oder alles neu zeichnen..
EndProcedure
Procedure UpdateMenue()
FreeMenu(#Menu)
CreateMenue()
MenuTitle("RecentFiles")
ForEach DynamicMenue()
MenuItem(DynamicMenue()\iGadgetID, DynamicMenue()\sGadgetText)
Next
EndProcedure
Procedure CreateMenue()
If CreateMenu(#Menu, WindowID(0))
MenuTitle("Datei")
MenuItem(#MenuItem_1, "&Beenden")
MenuTitle("?")
MenuItem(#MenuItem_2, "&?")
EndIf
EndProcedure
Procedure GetRandomMenuID()
Protected iRandomInt.l
iRandomInt = Random(66550)
If IsMenu(iRandomInt)
GetRandomMenuID()
Else
ProcedureReturn iRandomInt
EndIf
EndProcedure
If OpenWindow(0,0,0,300,200,#PB_Window_SystemMenu, "Dynamic Menue")
If CreateGadgetList(WindowID(0))
ButtonGadget(0,0,0,300,100,"AddMenuEntry: LOL!")
;ButtonGadget(1,0,100,300,100,"DeleteMenuEntry: LOL!")
EndIf
CreateMenue()
While 1
iHwndEvent.l = WindowEvent()
Select iHwndEvent
Case #PB_Event_CloseWindow
Break;
Case #PB_Event_Gadget
Select EventGadgetID()
Case 0
AddDynamicMenuItem(GetRandomMenuID(), "LOL!")
;Case 1
;DeleteDynamicMenuItem(); Da komm ich grad nicht druff wie....
EndSelect
Case #PB_Event_Menu
Debug EventMenuID()
Default
Delay(1)
EndSelect
Wend
EndIf
End
Verfasst: 27.11.2005 12:53
von Blackskyliner
Hat´s denn geholfen??