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

TableGadget (alle OS, Anfänger-Tip)

Beitrag 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
Zuletzt geändert von Tommy am 30.01.2015 00:51, insgesamt 8-mal geändert.
PB 5.41 x64
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

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

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Tommy
Spassvogel
Beiträge: 319
Registriert: 17.10.2013 14:36

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

Beitrag von Tommy »

Kommentiert hab ich jetzt und is jetzt verständlicher für Anfänger :)
Zuletzt geändert von Tommy am 26.01.2015 14:48, insgesamt 1-mal geändert.
PB 5.41 x64
Benutzeravatar
Vera
Beiträge: 928
Registriert: 18.03.2009 14:47
Computerausstattung: Win XP SP2, Suse 11.1
Wohnort: Essen

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

Beitrag 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
Zuletzt geändert von Vera am 27.01.2015 18:01, insgesamt 1-mal geändert.
°
<°)))o><
~~~~~~~~~
echo "Don't worry"
echo "Keep quiet"
@echo off
format forum:\
Benutzeravatar
Tommy
Spassvogel
Beiträge: 319
Registriert: 17.10.2013 14:36

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

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

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

Beitrag 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
Zuletzt geändert von Tommy am 28.01.2015 12:08, insgesamt 1-mal geändert.
PB 5.41 x64
Benutzeravatar
Vera
Beiträge: 928
Registriert: 18.03.2009 14:47
Computerausstattung: Win XP SP2, Suse 11.1
Wohnort: Essen

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

Beitrag 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.
°
<°)))o><
~~~~~~~~~
echo "Don't worry"
echo "Keep quiet"
@echo off
format forum:\
walbus
Beiträge: 137
Registriert: 03.03.2013 20:50

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

Beitrag von walbus »

:)
Zuletzt geändert von walbus am 07.02.2015 23:06, insgesamt 1-mal geändert.
GronkhLP
Beiträge: 72
Registriert: 14.11.2013 22:43
Wohnort: Köln
Kontaktdaten:

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

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

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

Beitrag 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
Zuletzt geändert von Tommy am 28.01.2015 12:41, insgesamt 1-mal geändert.
PB 5.41 x64
Antworten