Seite 2 von 2

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

Verfasst: 28.01.2015 12:20
von GronkhLP
Cool, vielen Dank :allright:

Vorschlag: Kannst du die aktuelle bzw. aktive Zelle auch einfärben? Am besten ein optionaler bool-Parameter, den man übergibt.

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

Verfasst: 28.01.2015 12:41
von Tommy
Freut mich das es dir gefällt. :)
Neuer Parameter: #PB_Table_ActiveHighlighting

Code: Alles auswählen

Code siehe 1. Post

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

Verfasst: 28.01.2015 13:01
von GronkhLP
Vielen Dank Tommy für die schnelle Umsetzung, es funktioniert wie es sein sollte und ist echt smart! Ich werde es in einem meiner Projekte nutzen. Danke dir :allright:
Falls ich weitere Vorschläge habe, sag ich dir Bescheid. :)

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

Verfasst: 28.01.2015 13:25
von matbal
Die Cursor-Steuerung sollte so überarbeitet werden, daß sie deaktiviert wird, wenn keine Zelle mehr den Cursor hat.

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

Verfasst: 28.01.2015 13:34
von Tommy
Gute Idee und du hast recht. Wen ich auf den Button klicke
und dann Cursor nach links/rechts/oben/unten dann gibts Fehler.
Hab den Fehler jetzt behandelt.

Code: Alles auswählen

;Programmierer: Tommy

Structure TableStruct
  GadgetNr.i
  Content.s
  i.i
  j.i
EndStructure

; Verfügbare Flags
#PB_Table_BorderLess = $20000
#PB_Table_ActiveHighlighting = $C0

; 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 TableGadget(Array TableStruct.TableStruct(2), x, y, Width, Height, CellWidth = 100, CellHeight = 20, Flags = 0)
  Protected i, j, Gadget
  
  ; 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)
  
  ; Schleife für alle Spalten
  For j=0 To (Height/CellHeight)-1
    ; Schleife für alle Zeilen
    For i=0 To (Width/CellWidth)-1
      Gadget = StringGadget(#PB_Any, i*CellWidth, j*CellHeight, CellWidth, CellHeight, "", Flags)
      ; Ü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
    Next i
  Next j
EndProcedure

Define event
Define ArrayX
Define ArrayY

; Neues Fenster erstellen
OpenWindow(0, 0, 0, 800, 640, "", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)

; Array für die Tabelle erstellen. Alle Daten werden automatisch darein gespeichert
Dim TableStruct.TableStruct(800/100, 600/20)
; 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, #PB_Table_ActiveHighlighting)
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: 28.01.2015 13:55
von NeoChris
Sehr nützlich :allright:

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

Verfasst: 28.01.2015 16:02
von bobobo
Geht auch Sortieren ?

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

Verfasst: 28.01.2015 16:40
von Tommy
@bobobo
Sollen Spalten hinzugefügt werden und soll via Klick auf
eine Spalte sortiert werden? Ich versuche mal was ich
umsetzen kann. Danke für den Feature Vorschlag :)

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

Verfasst: 28.01.2015 19:33
von bobobo
ja, sowas in der Art.