Objekte/Dateien/Projekte öffnen und schließen

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
tmjuk
Beiträge: 380
Registriert: 30.06.2006 00:10
Wohnort: Backaryd, Schweden

Objekte/Dateien/Projekte öffnen und schließen

Beitrag von tmjuk »

Hallo

Ich schreibe gerade an einem Editor. Nun stand ich vor dem Problem verschieden viele Objekte, Projekte bzw. Dateien (im Folgenden nur Objekte genannt) öffnen oder schliessen zu können.
Zu den jeweils geöffneten Objekten sollen verschiedene Gadgets zur Bearbeitung erstellt werden.
Die geöffneten Objekte sollen in einem Panelgadget dargestellt werden.

Ich habe folgenden Code dazu geschrieben und dachte, das ich ihn mal hier rein stelle. Vielleicht kann ja noch ein Anderer sowas gebrauchen.

In diesem Code wird zu den jeweiligen Objekten als Beispiel ein Treegadget und ein Button erstellt.
Der Code wurde unter Linux geschrieben. Eventuell muss man unter Windows eine Anpassung des Y-Beginns des Panelgadgets machen.

Gruss
Torsten

Code: Alles auswählen

; Beispiel zur Objekt öffnen schliessen 

;{ Initialisierung


;{ Enumeration

Enumeration 
	; Fenster
	#main
	
	; Menü
	#menu
	#menu_open
	#menu_close
	
	; Toolbar
	#toolbar
	
	; Statusbar
	#statusbar
	
	
	; Gadgets
	#panel
	
	

EndEnumeration
;}



; Struktur für Objektliste
Structure objektstruktur
	; Nummer der einzelnen Panele
	panel.l 			; Nummer (via getgadgetstate) des Panels, auf dem die Gadgets sind
	; hier die Gadgets in jedem Panel
	liste.l				; Gadgetnummer für die Liste der Bilder				
	button.l			; Gadgetnummer für Button 
	
EndStructure


Global NewList objekte.objektstruktur()
Global text.s





;}


;{ Prozeduren

Procedure liste_aktuell() ; Liste auf das jeweilige Panel abstimmen
	
	; wird aufgerufen, wenn es eine Veränderung im Panelgadget gegeben hat
	; es werden die vorhandenen Listenelemente solange durchlaufen, bis der Eintrag "Panel"
	; mit dem gerade aktuellen Panel übereinstimmt
	ResetList(objekte())
	While NextElement(objekte())
		If GetGadgetState(#panel) = objekte()\panel 
			Break ; hier wird die Schleife vorzeitig abgebrochen, wenn der Wert gefunden wurde
		EndIf
	Wend
	
EndProcedure


Procedure objekt_auf() ; Objekt öffnen
	; dies ist die Prozedur um ein Objekt zu öffnen und die Gadgets zu erzeugen
	LastElement(objekte()) ; Objektliste auf letztes Element setzen
	
	AddElement(objekte()) ; Objektliste ein Element hinzufügen
	AddGadgetItem(#panel,-1, " Zufallswert: " + Str(Random(1000))); dem Panel ein Element hinzufügen
		; das Panelgadget auf das neu erzeugte Panel setzen
		SetGadgetState(#panel,CountGadgetItems(#panel)-1)
		
		; Dem neuen Objektlistenelement die Panelnummer mitteilen
		objekte()\panel = GetGadgetState(#panel)
		
		; Liste erzeugen (in diesem Fall ein Treegadget) und die Nummer der Objektliste übergeben
		objekte()\liste = TreeGadget(#PB_Any, 10, 10, GetGadgetAttribute(#panel, #PB_Panel_ItemWidth) - 90, GetGadgetAttribute(#panel, #PB_Panel_ItemHeight) - 20)
		; dem Treegadget 10 Zufallszahlen hinzufügen
		For i = 1 To 10
			AddGadgetItem(objekte()\liste, -1, Str(Random(1000000)), 0, 0)
		Next i
		
		; Button erzeugen und die Nummer der Objektliste übergeben
		objekte()\button = ButtonGadget(#PB_Any, GetGadgetAttribute(#panel, #PB_Panel_ItemWidth) - 70, GetGadgetAttribute(#panel, #PB_Panel_ItemHeight) - 35, 60, 25,"Ok")
    
	
EndProcedure


Procedure objekt_zu() ; Objekt schliessen
	If CountGadgetItems(#panel) > 0 ; Wenn im Gadget min. 1 Panel vorhanden ist
    	; Item aus Gadget entfernen
    	RemoveGadgetItem(#panel, GetGadgetState(#panel))
    	
    	; Verwendete Gadgets freigeben
    	FreeGadget(objekte()\liste)
    	FreeGadget(objekte()\button)
    	
    	; Listenelement zu diesem Panel löschen
    	DeleteElement(objekte())
    	; Objektliste aktualisieren, da ein Objekt fehlt müssen die Panelnummern "verschoben" werden
    	ResetList(objekte())
    	i = 0
    	While NextElement(objekte())
    		objekte()\panel = i
    		i + 1
    	Wend
    	; und die Objektliste auf das aktuelle Panel setzen
    	liste_aktuell()
    EndIf
    
EndProcedure



;}




;{ Fenster erstellen
	If OpenWindow(#main, 0, 0, 600, 480, "Objekte öffnen und schließen", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget | #PB_Window_SizeGadget)
	Else
		MessageRequester("Fehler", "Fenster kann nicht erstellt werden", 0)
		End
	EndIf
;}

;{ Menu
	If CreateMenu(#menu, WindowID(#main))
	Else
		MessageRequester("Fehler", "Menü kann nicht erstellt werden", 0)
		End
	EndIf
	MenuTitle("Objekt")
	MenuItem(#menu_open, "Neues Objekt")
	MenuItem(#menu_close, "Objekt schliessen")
;}
    
    	
;{ Statusbar
	If CreateStatusBar(#statusbar, WindowID(#main))
	Else
		MessageRequester("Fehler", "Statusbar kann nicht erstellt werden", 0)
		End
	EndIf
	AddStatusBarField(100)
	AddStatusBarField(350)
;}
    
    
;{ Toolbar
	If CreateToolBar(#toolbar, WindowID(#main))
	Else
		MessageRequester("Fehler", "Toolbar kann nicht erstellt werden", 0)
		End
	EndIf
	ToolBarStandardButton(1, #PB_ToolBarIcon_Open)
	ToolBarToolTip(#toolbar, 1, "Neues Projekt öffnen")
	ToolBarStandardButton(2, #PB_ToolBarIcon_Save)
	ToolBarToolTip(#toolbar, 2, "Aktuelles Projekt schliessen")
;}
    
;{ Gadget
If CreateGadgetList(WindowID(#main))
Else
	MessageRequester("Fehler", "Gadgetliste kann nicht erstellt werden", 0)
	End
EndIf
; Panelgadget erstellen nach Fenstergröße
PanelGadget(#panel, 0, 0, WindowWidth(#main), WindowHeight(#main) - MenuHeight() - StatusBarHeight(#statusbar) - ToolBarHeight(#toolbar) - 5)
;}

;{ Ereignisschleife
	Repeat 
		event = WaitWindowEvent()

		;{ Gadgets
			If event = #PB_Event_Gadget
				Select EventGadget()

					Case #panel ; Panel
						; Objektliste und Panel auf einander abstimmen
						liste_aktuell()
					
					
					Case objekte()\liste
						; Klick auf Liste und Ausgabe links oder rechts und welcher Eintrag aktiv ist
						If EventType() = #PB_EventType_LeftClick
							MessageRequester("Linksklick","In der Liste im Panel " + Chr(34) + GetGadgetItemText(#panel, GetGadgetState(#panel)) + Chr(34) + " wurde links geklickt." + Chr(10) + "Aktiver Eintrag :" + Chr(34) + GetGadgetText(objekte()\liste) + Chr(34),0)
						ElseIf EventType() = #PB_EventType_RightClick
							MessageRequester("Linksklick","In der Liste im Panel " + Chr(34) + GetGadgetItemText(#panel, GetGadgetState(#panel)) + Chr(34) + " wurde rechts geklickt." + Chr(10) + "Aktiver Eintrag :" + Chr(34) + GetGadgetText(objekte()\liste) + Chr(34),0)
						EndIf
						
					
					Case objekte()\button
						; Klick auf Button
						MessageRequester("Wow", "Du hast 'nen Knopf gedrückt!",0)
					
					
				EndSelect
			EndIf
		;}
		
		;{ Menu, Toolbar
			If event = #PB_Event_Menu
				Select EventMenu()
					
					Case 1 ;Objekt öffnen
						objekt_auf()
					
					Case 2 ; Objekt schliessen
						objekt_zu()
					
				EndSelect
			EndIf
		;}
		
		;{ Resizen
			If Event = #PB_Event_SizeWindow
				; Panelgadget resizen
				ResizeGadget(#panel, #PB_Ignore, #PB_Ignore, WindowWidth(#main), WindowHeight(#main) - MenuHeight() - StatusBarHeight(#statusbar) - ToolBarHeight(#toolbar) - 5)
				If CountGadgetItems(#panel) > 0
					; Objektliste reseten und alle Gadget resizen, damit beim Öffnen eines anderen Panels bereits die Größe hergestellt ist
					ResetList(objekte())
					While NextElement(objekte())
						ResizeGadget(objekte()\liste, #PB_Ignore, #PB_Ignore, GetGadgetAttribute(#panel, #PB_Panel_ItemWidth) - 90, GetGadgetAttribute(#panel, #PB_Panel_ItemHeight) - 20)
						ResizeGadget(objekte()\button, GetGadgetAttribute(#panel, #PB_Panel_ItemWidth) - 70, GetGadgetAttribute(#panel, #PB_Panel_ItemHeight) - 35, 60, 25)
					Wend
					; Objektliste und Panel in Übereinstimmung bringen
					liste_aktuell()
				EndIf
			EndIf
		;}
		
	Until event = #PB_Event_CloseWindow 
 ;}



;
PB 4.51 32 Windows Vista, 32 XP, PB 4.51 32 Ubuntu 10.10