Seite 1 von 1

Variablendefinition a'la ListIconGadget

Verfasst: 19.02.2014 09:42
von Bisonte
Hallo.

Ich steh grad mal wieder wie der Ochs vorm Berg, oder das berühmte Schwein vor dem Uhrwerk und sehe
womöglich den Wald vor lauter Bäumen nicht.

Ich habe folgendes Problem :

Wie definiere ich Variablentechnisch in PB eine Tabelle, mit der ich die PB internen Sort... Befehle nutzen kann,
wobei die Integrität der Tabelle bestehen bleibt, UND ich die Anzahl der Zeilen und Spalten vorher nicht kenne ?

Beispieltabelle :

Code: Alles auswählen

;:-       Col1   Col2   Col3   ...
;:- Row1  Value  Value  Value  ...
;:- Row2  Value  Value  Value  ...
;:- Row3  Value  Value  Value  ...
;:- Row4  Value  Value  Value  ...
;:- Row5  Value  Value  Value  ...
;:- ...   ...    ...    ...    ...
Wenn ich nun die Spalte Col2 sortiere, sollen natürlich alle Werte von Col1 und Col3 ebenfalls abhängig zur Col2
ihre Position innerhalb der Tabelle einnehmen.

Ich dachte mir, "Hey da nehm ich ein mehrdimensionales Array...", aber das kann man leider nicht redimensionieren (zumindest nicht alles :
Also nur die letzte Dimension.

Welchen Mix aus Arrays, Listen, Maps wie auch immer brauch ich hier... ?
Wie macht es das ListIconGadget ?

Re: Variablendefinition a'la ListIconGadget

Verfasst: 19.02.2014 13:18
von STARGÅTE
Bisonte hat geschrieben:ch dachte mir, "Hey da nehm ich ein mehrdimensionales Array...", aber das kann man leider nicht redimensionieren (zumindest nicht alles :
Also nur die letzte Dimension.
Das ist richtig, wenn du wirklich ReDim nutzen willst/musst.
Du kannst dein mehrdimensionales Array aber trotzdem normal mit Dim neue Dimensionen geben.
Den Inhalt musst du dabei halt kopieren.

Da du aber auch sortieren willst, würde ich vermutlich eine List-List Structur nutzen:

Code: Alles auswählen

Structure Row
  List Field.Value()
EndStructure

Structure Table
  List Row.Row()
EndStructure
Zum sortieren kannst du dann CustomSortList() nutzen. Dort kannst du in der Vorschrift für die Sortierung (Callback) definieren welches Feld/Spalte wie verglichen werden soll. Bei der Sortierung wird dann immer das ganze Element (also die ganze Zeile) verschoben.

Re: Variablendefinition a'la ListIconGadget

Verfasst: 20.02.2014 11:49
von Bisonte
Danke.

Mit dem CustomSortList() bin zwar etwas überfordert (ich raff das grad nicht so wirklich wie das geht)
aber das mit dem kopieren hat mich in eine funktionierende Richtung geschubst.

Ist zwar nicht perfekt, aber ein Ansatz mit Funktion ;) (Könnte bei grösseren Listen wohl etwas länger dauern....)

Code: Alles auswählen

EnableExplicit

Structure table_data
  Value.s
EndStructure
Structure row_data
  sValue.s
  Array Table.table_data(1)
EndStructure
Structure col_data
  List Row.row_data()
EndStructure

Procedure Sorter(*SL.col_data, Column)
  
  If ListSize(*SL\Row())
    If Column >= 0 And Column <= ArraySize(*SL\Row()\Table())
      ForEach *SL\Row()
        *SL\Row()\sValue = *SL\Row()\Table(Column)\Value  
      Next
      SortStructuredList(*SL\Row(), #PB_Sort_Ascending, OffsetOf(row_data\sValue), TypeOf(row_data\sValue))
    EndIf
  EndIf
  
EndProcedure
Procedure AddRow(List SL.row_data(), Columns)
  
  AddElement(SL())
  Dim SL()\Table(Columns)
    
EndProcedure

Define Tabelle.col_data

AddRow(Tabelle\Row(), 3)
Tabelle\Row()\Table(1)\Value = "ZZ Top" : Tabelle\Row()\Table(2)\Value = "La Grange" : Tabelle\Row()\Table(3)\Value = "1973" 

AddRow(Tabelle\Row(), 3)
Tabelle\Row()\Table(1)\Value = "Abba" : Tabelle\Row()\Table(2)\Value = "Chiquita" : Tabelle\Row()\Table(3)\Value = "1979"

AddRow(Tabelle\Row(), 3)
Tabelle\Row()\Table(1)\Value = "Frank Zappa" : Tabelle\Row()\Table(2)\Value = "Bobby Brown" : Tabelle\Row()\Table(3)\Value = "1980"

AddRow(Tabelle\Row(), 3)
Tabelle\Row()\Table(1)\Value = "Pink Floyd" : Tabelle\Row()\Table(2)\Value = "The Wall" : Tabelle\Row()\Table(3)\Value = "1979"

ForEach Tabelle\Row()
  With Tabelle\Row()
    Debug LSet(\Table(1)\Value, 20, " ") + LSet(\Table(2)\Value, 20, " ") + LSet(\Table(3)\Value, 20, " ") 
  EndWith
Next
Debug LSet("-", 60, "-")

Sorter(@Tabelle, 3)

ForEach Tabelle\Row()
  With Tabelle\Row()
    Debug LSet(\Table(1)\Value, 20, " ") + LSet(\Table(2)\Value, 20, " ") + LSet(\Table(3)\Value, 20, " ") 
  EndWith
Next