Seite 1 von 2

TableGadget (alle OS, Anfänger-Tip)

Verfasst: 25.01.2015 17:28
von Tommy
Ich habe ein neues Gadget erstelt. Es is ein Tabellen Gadget. Alle eingetragenen Daten
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

Re: TableGadget (alle OS, Anfänger-Tip)

Verfasst: 25.01.2015 18:44
von STARGÅTE
Ich wusste garnicht das PB auf einmal Schlüsselworte als Strukturnamen und Variablennamen akzeptiert.
Der Code sieht mit Syntaxhighlighting extrem merkwürdig aus.

Der Code ist meiner Meinung im übrigen nicht für Anfänger geeignen, weil es komplett an Kommentaren mangelt, bezüglich der einzelnen Codezeilen und ihre Aufgabe.
Daraus folgt, dass der Code sehr fehleranfällig ist, wenn man ihn abändert.

Re: TableGadget (alle OS, Anfänger-Tip)

Verfasst: 25.01.2015 18:58
von Tommy
Kommentiert hab ich jetzt und is jetzt verständlicher für Anfänger :)

Re: TableGadget (alle OS, Anfänger-Tip)

Verfasst: 25.01.2015 21:15
von Vera
Hallo Tommy,

Ein Array() als GadgetKonstante? - das versteh ich ja gar nicht und ist für jeden Anfänger bestimmt völlig irritierend.

greets ~ Vera

Re: TableGadget (alle OS, Anfänger-Tip)

Verfasst: 25.01.2015 21:22
von Tommy
Ja es wird bei meinen Gadget keine Gadgetnummer verlangt sondern das Array
für die Daten die man jederzeit im und exportieren kann. Alles was man im
Tabellengadget sieht - die Zellen - sind automatisch im Array abgelegt und
wen du die Daten exportieren möchtest musst du nur das Array das du anstelle
von Gadgetnummer übergeben hast einfach in eine Datei speichern.
Beispiel:
1) User tippt willkürlich in Zellen
2) Array => Datei
3) Datei => Array
Fazit: Alle Daten sind wieder in den Zellen

Re: TableGadget (alle OS, Anfänger-Tip)

Verfasst: 27.01.2015 14:45
von Tommy
Hab Flags hinzugefügt. Man kann jetzt auch rahmenlose Zellen anlegen wen man es möchte. ;)

Code: Alles auswählen

code siehe oben

Re: TableGadget (alle OS, Anfänger-Tip)

Verfasst: 28.01.2015 01:00
von Vera
Tommy hat geschrieben:;Geeignet: Nur für Anfänger
Anfänger sollten vor Deinem Beispiel gewarnt werden.

Ich habe inzwischen verstanden, dass es hier um alles andere geht, aber sicher nicht um einen uneigennützigen Einsatz zur Erweiterung fehlender PB-Hilfe-Beispiele.

Re: TableGadget (alle OS, Anfänger-Tip)

Verfasst: 28.01.2015 11:17
von walbus
:)

Re: TableGadget (alle OS, Anfänger-Tip)

Verfasst: 28.01.2015 11:35
von GronkhLP
Wo ist das bitte "crude"? Sein Code ist völlig in Ordnung meiner Meinung nach. ;)

Er hat Variablen deklariert, richtig eingerückt, Zeilen kommentiert, Parameter sinnvoll übergeben ohne globale Definition und gut strukturiert. Was hätte er deiner Meinung besser machen können?

Re: TableGadget (alle OS, Anfänger-Tip)

Verfasst: 28.01.2015 12:08
von Tommy
Man konte die ganze Zeit in meinen TableGadget nich mit Tasten steuern
also hoch runter links rechts wie bei Excel. Habs jetzt implementiert ;)

Code: Alles auswählen

Code siehe oben