TableGadget (alle OS, Anfänger-Tip)

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.
GronkhLP
Beiträge: 72
Registriert: 14.11.2013 22:43
Wohnort: Köln
Kontaktdaten:

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

Beitrag 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.
Bild
Benutzeravatar
Tommy
Spassvogel
Beiträge: 319
Registriert: 17.10.2013 14:36

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

Beitrag von Tommy »

Freut mich das es dir gefällt. :)
Neuer Parameter: #PB_Table_ActiveHighlighting

Code: Alles auswählen

Code siehe 1. Post
Zuletzt geändert von Tommy am 28.01.2015 13:33, insgesamt 1-mal geändert.
PB 5.41 x64
GronkhLP
Beiträge: 72
Registriert: 14.11.2013 22:43
Wohnort: Köln
Kontaktdaten:

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

Beitrag 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. :)
Bild
matbal
Beiträge: 261
Registriert: 30.03.2011 20:53

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

Beitrag von matbal »

Die Cursor-Steuerung sollte so überarbeitet werden, daß sie deaktiviert wird, wenn keine Zelle mehr den Cursor hat.
Benutzeravatar
Tommy
Spassvogel
Beiträge: 319
Registriert: 17.10.2013 14:36

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

Beitrag 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
PB 5.41 x64
NeoChris
Beiträge: 205
Registriert: 21.11.2013 21:17
Wohnort: Schweiz
Kontaktdaten:

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

Beitrag von NeoChris »

Sehr nützlich :allright:
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

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

Beitrag von bobobo »

Geht auch Sortieren ?
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
Tommy
Spassvogel
Beiträge: 319
Registriert: 17.10.2013 14:36

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

Beitrag 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 :)
PB 5.41 x64
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

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

Beitrag von bobobo »

ja, sowas in der Art.
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Antworten