MenüItems zur Laufzeit einfügen

Anfängerfragen zum Programmieren mit PureBasic.
scoty
Beiträge: 64
Registriert: 18.10.2005 16:43
Wohnort: Raum Hildesheim

MenüItems zur Laufzeit einfügen

Beitrag 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.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: MenüItems zur Laufzeit einfügen

Beitrag von Kiffi »

Hallo scoty,

die wohl pragmatischte Lösung ist, das Menü zur Laufzeit immer komplett neu
zu erstellen.

Grüße ... Kiffi
scoty
Beiträge: 64
Registriert: 18.10.2005 16:43
Wohnort: Raum Hildesheim

Beitrag 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.
Benutzeravatar
benpicco
Beiträge: 391
Registriert: 01.10.2004 15:32
Wohnort: im Code
Kontaktdaten:

Beitrag von benpicco »

Speichere doch alle Einträge in einer LinkedList. Wen sie z.B. Programme aufrufen, kanst du den Programmpfad mit reinschreiben.
Johann Wolfgang von Geothe hat geschrieben:Wie dieses oder jenes Wort geschrieben wird, darauf kommt es doch eigentlich nicht an, sondern darauf, daß die Leser verstehen, was man damit sagen wollte.
Benutzeravatar
Blackskyliner
Beiträge: 532
Registriert: 28.07.2005 00:54
Wohnort: /home/Blackskyliner/

Beitrag 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.
Keine meiner Antworten ist endgültig, es kann passieren, dass ich den so eben geposteten Beitrag noch mehrmals ändere, um Doppelposts zu umgehen.
_________________
Purebasic Windows 7 x64 & Linux (Ubuntu 10.04LTS) 4.50[x64|x86] Nutzer
_________________
Projekte: YAED - Yet another Event Dispatcher
Benutzeravatar
Blackskyliner
Beiträge: 532
Registriert: 28.07.2005 00:54
Wohnort: /home/Blackskyliner/

Beitrag 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
Keine meiner Antworten ist endgültig, es kann passieren, dass ich den so eben geposteten Beitrag noch mehrmals ändere, um Doppelposts zu umgehen.
_________________
Purebasic Windows 7 x64 & Linux (Ubuntu 10.04LTS) 4.50[x64|x86] Nutzer
_________________
Projekte: YAED - Yet another Event Dispatcher
Benutzeravatar
Blackskyliner
Beiträge: 532
Registriert: 28.07.2005 00:54
Wohnort: /home/Blackskyliner/

Beitrag von Blackskyliner »

Hat´s denn geholfen??
Keine meiner Antworten ist endgültig, es kann passieren, dass ich den so eben geposteten Beitrag noch mehrmals ändere, um Doppelposts zu umgehen.
_________________
Purebasic Windows 7 x64 & Linux (Ubuntu 10.04LTS) 4.50[x64|x86] Nutzer
_________________
Projekte: YAED - Yet another Event Dispatcher
Antworten