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

Code: Alles auswählen

MenuItem
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

Code: Alles auswählen

Structure m
   iGadgetID.l
EndStructure
So an diese Structure bindet man nun eine LL

Code: Alles auswählen

NewList DynamicMenue.m()
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 :D.

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??