werden automatisch in ein Array gespeichert. Wenn man die Daten speichern oder laden
möchte dann einfach das Array befüllen oder auslesen. Ich habe mir viel Mühe gegeben
und habe versucht einfach wie möglich zu machen und überlegt wie man dem Programmierer
die Daten bereitstellt. Man erstelt ein eigenes Array und übergibt es. Mehr mus man als
Programierer nich machen. Einfach TableGadget mit dem Array und am Ende das Array mit
hilfe einer Schleife speichern.
Wozu braucht man das? Wenn man ein Tabellengadget braucht.
Code: Alles auswählen
;Programmierer: Tommy und NicTheQuick
Structure TableStruct
gadgetNr.i
Content.s
i.i
j.i
EndStructure
Dim TableStruct.TableStruct(0, 0)
LoadFont(0, "Arial", 10, #PB_Font_Bold)
; Verfügbare Flags
#PB_Table_BorderLess = 1
#PB_Table_ActiveHighlighting = 2
#PB_Table_Columns = 4
; Event Constanten
#PB_Table_Event_Key_Up = $A000
#PB_Table_Event_Key_Down = $A001
#PB_Table_Event_Key_Right = $A002
#PB_Table_Event_Key_Left = $A003
Procedure TablegadgetHandler()
Protected dataValue, i, j, *this.TableStruct
dataValue = GetGadgetData(EventGadget())
*this.TableStruct = dataValue
*this\Content = GetGadgetText(*this\gadgetNr)
EndProcedure
Procedure TablegadgetFocusHandler()
SetGadgetColor(EventGadget(), #PB_Gadget_BackColor, RGB(255, 255, 220))
EndProcedure
Procedure TablegadgetLostFocusHandler()
SetGadgetColor(EventGadget(), #PB_Gadget_BackColor, -1)
EndProcedure
Procedure TablegadgetKeyHandler(Array TableStruct.TableStruct(2), Key)
Protected cgadget, *this.TableStruct, dataValue, maxWidthField, maxHeightField
cgadget = GetActiveGadget()
If IsGadget(cgadget)
maxWidthField = ArraySize(TableStruct(), 1)
maxHeightField = ArraySize(TableStruct(), 2)
dataValue = GetGadgetData(cgadget)
*this.TableStruct = dataValue
If *this
*this\Content = GetGadgetText(*this\gadgetNr)
; Mit Pfeiltasten steuerbar
Select Key
Case #PB_Table_Event_Key_Up : If *this\j <> 0: SetActiveGadget(TableStruct(*this\i, *this\j-1)\gadgetNr) : EndIf
Case #PB_Table_Event_Key_Down : If *this\j <> maxHeightField-1: SetActiveGadget(TableStruct(*this\i, *this\j+1)\gadgetNr) : EndIf
Case #PB_Table_Event_Key_Right: If *this\i <> maxWidthField-1: SetActiveGadget(TableStruct(*this\i+1, *this\j)\gadgetNr) : EndIf
Case #PB_Table_Event_Key_Left : If *this\i <> 0: SetActiveGadget(TableStruct(*this\i-1, *this\j)\gadgetNr) : EndIf
EndSelect
EndIf
EndIf
EndProcedure
Procedure TableColumnHandler()
Protected dataValue, cgadget, i, j, k
Shared TableStruct()
cgadget = EventGadget()
dataValue = GetGadgetData(cgadget)
Protected rows.i = ArraySize(TableStruct(), 2)
Protected cols.i = ArraySize(TableStruct(), 1)
For i = 0 To rows
For j = i + 1 To rows
If TableStruct(dataValue, i)\Content > TableStruct(dataValue, j)\Content
For k = 0 To cols
Swap TableStruct(k, i)\Content, TableStruct(k, j)\Content
Next
EndIf
Next
For k = 0 To cols
SetGadgetText(TableStruct(k, i)\gadgetNr, TableStruct(k, i)\Content)
Next
Next
EndProcedure
Procedure Tablegadget(Array TableStruct.TableStruct(2), x, y, Width, Height, CellWidth = 100, CellHeight = 20, Flags = 0)
Protected i, j, gadget, sFlags, addColumns
; Mit Pfeiltasten steuerbar
AddKeyboardShortcut(0, #PB_Shortcut_Up, #PB_Table_Event_Key_Up)
AddKeyboardShortcut(0, #PB_Shortcut_Down, #PB_Table_Event_Key_Down)
AddKeyboardShortcut(0, #PB_Shortcut_Right, #PB_Table_Event_Key_Right)
AddKeyboardShortcut(0, #PB_Shortcut_Left, #PB_Table_Event_Key_Left)
If Bool(Flags & #PB_Table_BorderLess)
sFlags = #PB_String_BorderLess
EndIf
If Bool(Flags & #PB_Table_Columns)
addColumns = 1
EndIf
; Schleife für alle Spalten
For j=0 To (Height/CellHeight)-1
; Schleife für alle Zeilen
For i=0 To (Width/CellWidth)-1
If addColumns = 1 And (i = 0 Or j=0)
If i > 0 Or j > 0
If j = 0
gadget = ButtonGadget(#PB_Any, i*CellWidth, j*CellHeight, CellWidth, CellHeight, Chr(i+64))
BindGadgetEvent(gadget, @TableColumnHandler())
Else
gadget = ButtonGadget(#PB_Any, i*CellWidth, j*CellHeight, CellWidth, CellHeight, Str(j))
EndIf
SetGadgetData(gadget, i)
SetGadgetFont(gadget, FontID(0))
EndIf
EndIf
If addColumns = 1 And (j = (Height/CellHeight)-1 Or i = (Width/CellWidth)-1)
Else
;Else
gadget = StringGadget(#PB_Any, (i+addColumns)*CellWidth, (j+addColumns)*CellHeight, CellWidth, CellHeight, "", sFlags)
; Übergebenes TableStruct intern speichern
SetGadgetData(gadget, TableStruct(i, j))
; Eingegebener Inhalt bei Änderung automatisch ins TableStruct speichern
BindGadgetEvent(gadget, @TablegadgetHandler(), #PB_EventType_Change)
; Active Zelle färben
If Flags & #PB_Table_ActiveHighlighting
BindGadgetEvent(gadget, @TablegadgetFocusHandler(), #PB_EventType_Focus)
BindGadgetEvent(gadget, @TablegadgetLostFocusHandler(), #PB_EventType_LostFocus)
EndIf
TableStruct(i, j)\gadgetNr = gadget
TableStruct(i, j)\i = i
TableStruct(i, j)\j = j
;- Dbg
SetGadgetText(gadget, Str(Random(99)))
PostEvent(#PB_Event_Gadget, 0, gadget, #PB_EventType_Change)
EndIf
Next i
Next j
EndProcedure
Define event
Define ArrayX
Define ArrayY
Define TableFlags
Define addColumns
; Neues Fenster erstellen
OpenWindow(0, 0, 0, 800, 640, "", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
TableFlags = #PB_Table_ActiveHighlighting|#PB_Table_Columns
If Bool(TableFlags & #PB_Table_Columns)
addColumns = 1
EndIf
; Array für die Tabelle erstellen. Alle Daten werden automatisch darein gespeichert
Dim TableStruct.TableStruct((800/100)-addColumns, (600/20)-addColumns)
; Tabellen-Gadget erstellen. Zellen werden abhängig von der Breite und Höhe angelegt so viel da rein passen
Tablegadget(TableStruct(), 0, 0, 800, 600, 100, 20, TableFlags)
ButtonGadget(0, 300, 610, 200, 20, "Gebe alle Daten aus", 0)
Repeat
event = WaitWindowEvent()
If event = #PB_Event_Menu
Select EventMenu()
; Mit Pfeiltasten steuerbar
Case #PB_Table_Event_Key_Up : TablegadgetKeyHandler(TableStruct(), #PB_Table_Event_Key_Up)
Case #PB_Table_Event_Key_Down : TablegadgetKeyHandler(TableStruct(), #PB_Table_Event_Key_Down)
Case #PB_Table_Event_Key_Right: TablegadgetKeyHandler(TableStruct(), #PB_Table_Event_Key_Right)
Case #PB_Table_Event_Key_Left : TablegadgetKeyHandler(TableStruct(), #PB_Table_Event_Key_Left)
EndSelect
EndIf
If event = #PB_Event_Gadget
Select EventGadget()
Case 0
; Ausgabe der Daten, kann auch in Datei exportiert werden
For ArrayY=0 To ArraySize(TableStruct(), 2)
For ArrayX=0 To ArraySize(TableStruct(), 1)
Debug TableStruct(ArrayX, ArrayY)\Content
Next ArrayX
Next ArrayY
EndSelect
EndIf
Until event = #PB_Event_CloseWindow