Objekte/Dateien/Projekte öffnen und schließen
Verfasst: 17.08.2008 17:28
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
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
;}
;