User Tools

Site Tools


k7:k7.4:k7.4.9:k7.4.9.3:start

7.4.9.3 Sorting derived arrays

In order to correctly implement the idea of sorting data in a GridView, as in the example in chapter 7.4.9.2, it is obviously necessary to have a different way of mapping the data of the GridView to an array that can be sorted correctly.

Approach:

  • The core of the new approach is first described as a class in which only the public variables required for the purpose of the application are declared with the required data type. In this approach, the class represents a record in a price list.
  • This class contains beside the (pure) data structure only one special method.
  • The method Object[]. sort (Mode As Integer) sorts objects, i. e. it calls the object-internal special method _compare (..) to compare the objects. Therefore, it is possible to sort an array whose elements are objects - which is true for derived arrays.
  • The advantage of the following approach is also that, in addition to specifying the sorting order, you can also specify the element in the object (static) according to which the object array is sorted step by step.

The complete source texts for the class CDS (class DataSet) and for the main program are specified here and commented on briefly:

Class CDS.class

[1] ' Gambas class file
[2] 
[3] Public Nachname As String 
[4] Public Alter As Integer 
[5] 
[6] Public Function _compare(DS As CDS) As Integer
[7]   Dim iSelector As Integer
[8]   
[9]   iSelector = 1 
[10]   Select Case iSelector
[11]   Case 1
[12]     Return Comp(Nachname, DS.Nachname)
[13]   Case 2
[14]     Return Sgn(Alter - DS.Alter)
[15]   Default
[16]       Error.Raise(("Keine passende Sortier-Methode gefunden!"))
[17]   End Select
[18]   
[19] End

Comments:

  • The function properties of the _compare (DS As CDS) function must be defined according to the task.
  • An object of class type (–> CDS) is used as argument of the function.
  • Depending on the selector value, lines 10 to 17 of the select case control structure are sorted either by surname (1) or by age (2).
  • The result of the comparison must be returned as an integer in lines 12 (string comparison) and 14 (integer comparison):
+1 , if the object is larger than the argument passed, 
0  , if the objects are equal,
-1 , if the object is smaller than the argument passed. 
  • If the _compare(..) method cannot be implemented for the objects, the objects are compared according to their addresses in memory. In this case, it makes sense to react with a corresponding error message (lines 15 and 16).

Source code for FMain. class

[1] ' Gambas class file
[2]  
[3] Public $2DGridArray As CDS[] 
[4] Public KL As New CDS[] ' Class list
[5] Public aGArray As New CDS[] 
[6] 
[7] Public Sub Form_Open()
[8]   Dim hCDS As CDS
[9]   
[10]   FMain.Center
[11]   FMain.Resizable = False
[12]   
[13]   SetGridProperty()
[14]   FillGridView()
[15]   $2DGridArray = GridToArray()
[16]     
[17]   ' Zur Kontrolle:
[18]   ' For Each hCDS In $2DGridArray
[19]   '   Print "---> ", hCDS.Nachname, hCDS.Alter
[20]   ' Next
[21]   
[22] End ' Form_Open()
[23] 
[24] Private Sub SetGridProperty()  
[25]   GridView1.Header = GridView1.Both ' Header line is displayed
[26]   GridView1.Mode = Select.Single ' The selected line is highlighted in color
[27]   GridView1.Columns.Count = 2 ' Number of columns
[28]   GridView1.Sorted = True
[29]   
[30]   GridView1.Columns[0].Width = 140
[31]   GridView1.Columns[0].Alignment = Align.Center
[32]   GridView1.Columns[0].Title = "Nachname"
[33]   GridView1.Columns[1].Width = 60
[34]   GridView1.Columns[1].Alignment = Align.Center
[35]   GridView1.Columns[1].Title = "Alter"  
[36] End ' SetGridProperty()  
[37] 
[38] Public Sub FillGridView()
[39]   Dim iCount As Integer
[40]   Dim aNames As String[] = ["Adler", "Bär", "Dachs", "Fuchs", "Meise", "Uhu", "Elch"] '   
[41]   
[42]   Randomize
[43]   
[44]   For iCount = 0 To 4 ' 5 data sets with random data
[45]     Inc GridView1.Rows.Count ' Display of generated data records (lines in grid view)
[46]     GridView1.MoveTo(GridView1.Rows.Count - 1, 0) ' Optional
[47]     GridView1[iCount, 0].Text = aNames[Int(Rnd(0, aNames.Count))]
[48]     GridView1[iCount, 1].Text = Str(Int(Rnd(15, 20))) ' 15..19
[49]   Next ' iCount
[50]   
[51] End ' FillGridView()
[52] 
[53] Public Function GridToArray() As CDS[]
[54]   Dim i As Integer
[55]   Dim hCDS As CDS
[56]   
[57]   For i = 0 To 4
[58]     hCDS = New CDS
[59]       hCDS.Nachname = GridView1[i, 0].Text
[60]       hCDS.Alter = GridView1[i, 1].Text
[61]     KL.Add(hCDS)
[62]   Next ' iCount
[63]   
[64]   Return KL
[65]   
[66] End ' Function GridToArray()
[67] 
[68] Public Sub ArrayToGrid(aArray As CDS[])
[69]   Dim iRowCount As Integer = 0
[70]   Dim hCDS As CDS
[71]   
[72]   GridView1.Clear
[73]   GridView1.Rows.Count = aArray.Count
[74]   
[75]   For Each hCDS In aArray
[76]     GridView1[iRowCount, 0].Text = hCDS.Nachname
[77]     GridView1[iRowCount, 1].Text = hCDS.Alter
[78]     Inc iRowCount
[79]   Next ' hCDS  
[80]  
[81] End '  ArrayToGrid(..)
[82] 
[83] Public Sub GridViewShow(Optional bSorted As Boolean)
[84]   Dim hCDS As CDS
[85]   
[86]   aGArray = $2DGridArray.Copy()
[87]   
[88]   If bSorted = True Then 
[89]      aGArray.Sort(gb.Ascent) ' Determination of the sorting order
[90]      ArrayToGrid(aGArray)
[91]   Else
[92]     ArrayToGrid($2DGridArray)
[93]   Endif
[94]   
[95] End ' GridViewShow(..)
[96] 
[97] Public Sub btnGridViewShow_Click()
[98]   GridViewShow()
[99] End ' btnGridViewShow_Click()
[100] 
[101] Public Sub btnGridViewShowS_Click()
[102]   GridViewShow(True)
[103] End ' btnGridViewShowS_Click()

Comments:

  • The GridView is used to display the original data and sorted GridView data.
  • The GridToArray () function and the procedure ArrayToGrid (aArray As CDS[]) are used to transform the GridView data into an array - which can be sorted later - and from the original or sorted array into GridView data.
  • Line 89 calls the sorting of the derived array of type CDS[], which internally calls the special sorting method for object arrays in class CDS (line 6). The selector specifies the object variable to be used for sorting.

The result is impressive:

B1 B2

Figure 7.4.9.3.1: Correct sorting of GridView data

Chapter –> '7.4.9.4 Project for sorting arrays' introduces you to a project in which the element dynamic can be defined, according to which the object array is sorted.

Download

7.4.9.3 Sortierung abgeleiteter Arrays

Für die korrekte Umsetzung der Idee zur Sortierung von Daten in einer GridView wie im Beispiel im Kapitel 7.4.9.2 ist offensichtlich ein anderer Zugang zur Abbildung der Daten der GridView auf ein Array erforderlich, das korrekt sortiert werden kann.

Ansatz:

  • Als Kernstück des neuen Ansatzes wird zuerst eine Klasse beschrieben, in der nur die für den Anwendungszweck erforderlichen öffentlichen Variablen mit dem notwendigem Daten-Typ deklariert sind. Die Klasse repräsentiert in diesem Ansatz einen Datensatz (Rekord) in einer Kursliste.
  • Diese Klasse enthält neben der (reinen) Datenstruktur nur eine spezielle Methode.
  • Die Methode Object[].Sort(Mode As Integer) sortiert Objekte, d.h. sie ruft die objekt-interne spezielle Methode _compare(..) auf, um die Objekte zu vergleichen. Daher kann ein Array sortiert werden, dessen Elemente Objekte sind – was ja für abgeleitete Arrays zutrifft.
  • Der Vorteil des verfolgten Ansatzes besteht auch darin, dass man neben der Vorgabe der Sortier-Reihenfolge auch das Element im Objekt (statisch) vorgeben kann, nach dem das Objekt-Array schrittweise sortiert wird.

Hier werden Ihnen die vollständigen Quelltexte für die Klasse CDS (Klasse Datensatz) sowie für das Hauptprogramm angegeben und jeweils kurz kommentiert:

Klasse CDS.class

[1] ' Gambas class file
[2] 
[3] Public Nachname As String 
[4] Public Alter As Integer 
[5] 
[6] Public Function _compare(DS As CDS) As Integer
[7]   Dim iSelector As Integer
[8]   
[9]   iSelector = 1 
[10]   Select Case iSelector
[11]   Case 1
[12]     Return Comp(Nachname, DS.Nachname)
[13]   Case 2
[14]     Return Sgn(Alter - DS.Alter)
[15]   Default
[16]       Error.Raise(("Keine passende Sortier-Methode gefunden!"))
[17]   End Select
[18]   
[19] End

Kommentare:

  • Die Funktionseigenschaften der Funktion _compare(DS As CDS) müssen Sie aufgaben-angepasst festlegen.
  • Als Argument der Funktion wird ein Objekt vom Klassen-Typ (→ CDS) verwendet.
  • Je nach Selektor-Wert wird in der Select-Case-Kontroll-Struktur in den Zeilen 10 bis 17 entweder nach dem Nachnamen (1) oder nach dem Alter (2) sortiert.
  • Es muss das Ergebnis des Vergleichs in den Zeilen 12 (Zeichenketten-Vergleich) und 14 (Ganzzahl-Vergleich) als ganze Zahl zurück gegeben werden:
+1 , wenn das Objekt größer ist als das übergebene Argument, 
0  , wenn die Objekte gleich sind, 
-1 , wenn das Objekt kleiner ist als das übergebene Argument. 
  • Wenn sich für die Objekte die _compare(..)-Methode nicht umsetzen lässt, dann werden die Objekte nach ihren Adressen im Speicher verglichen. Für diesen Fall ist es sinnvoll, mit einer entsprechenden Fehlermeldung (Zeilen 15 und 16) zu reagieren.

Quelltext für FMain.class

[1] ' Gambas class file
[2]  
[3] Public $2DGridArray As CDS[] 
[4] Public KL As New CDS[] ' Klassen-Liste 
[5] Public aGArray As New CDS[] 
[6] 
[7] Public Sub Form_Open()
[8]   Dim hCDS As CDS
[9]   
[10]   FMain.Center
[11]   FMain.Resizable = False
[12]   
[13]   SetGridProperty()
[14]   FillGridView()
[15]   $2DGridArray = GridToArray()
[16]     
[17]   ' Zur Kontrolle:
[18]   ' For Each hCDS In $2DGridArray
[19]   '   Print "---> ", hCDS.Nachname, hCDS.Alter
[20]   ' Next
[21]   
[22] End ' Form_Open()
[23] 
[24] Private Sub SetGridProperty()  
[25]   GridView1.Header = GridView1.Both ' Kopfzeile wird angezeigt
[26]   GridView1.Mode = Select.Single ' Die selektierte Zeile wird farbig markiert
[27]   GridView1.Columns.Count = 2 ' Anzahl der Spalten
[28]   GridView1.Sorted = True
[29]   
[30]   GridView1.Columns[0].Width = 140
[31]   GridView1.Columns[0].Alignment = Align.Center
[32]   GridView1.Columns[0].Title = "Nachname"
[33]   GridView1.Columns[1].Width = 60
[34]   GridView1.Columns[1].Alignment = Align.Center
[35]   GridView1.Columns[1].Title = "Alter"  
[36] End ' SetGridProperty()  
[37] 
[38] Public Sub FillGridView()
[39]   Dim iCount As Integer
[40]   Dim aNames As String[] = ["Adler", "Bär", "Dachs", "Fuchs", "Meise", "Uhu", "Elch"] '   
[41]   
[42]   Randomize
[43]   
[44]   For iCount = 0 To 4 ' 5 Datensätze mit Zufallsdaten
[45]     Inc GridView1.Rows.Count ' Anzeige der generierten Datensätze (Zeilen in der Gitteransicht)
[46]     GridView1.MoveTo(GridView1.Rows.Count - 1, 0) ' Optional
[47]     GridView1[iCount, 0].Text = aNames[Int(Rnd(0, aNames.Count))]
[48]     GridView1[iCount, 1].Text = Str(Int(Rnd(15, 20))) ' 15..19
[49]   Next ' iCount
[50]   
[51] End ' FillGridView()
[52] 
[53] Public Function GridToArray() As CDS[]
[54]   Dim i As Integer
[55]   Dim hCDS As CDS
[56]   
[57]   For i = 0 To 4
[58]     hCDS = New CDS
[59]       hCDS.Nachname = GridView1[i, 0].Text
[60]       hCDS.Alter = GridView1[i, 1].Text
[61]     KL.Add(hCDS)
[62]   Next ' iCount
[63]   
[64]   Return KL
[65]   
[66] End ' Function GridToArray()
[67] 
[68] Public Sub ArrayToGrid(aArray As CDS[])
[69]   Dim iRowCount As Integer = 0
[70]   Dim hCDS As CDS
[71]   
[72]   GridView1.Clear
[73]   GridView1.Rows.Count = aArray.Count
[74]   
[75]   For Each hCDS In aArray
[76]     GridView1[iRowCount, 0].Text = hCDS.Nachname
[77]     GridView1[iRowCount, 1].Text = hCDS.Alter
[78]     Inc iRowCount
[79]   Next ' hCDS  
[80]  
[81] End '  ArrayToGrid(..)
[82] 
[83] Public Sub GridViewShow(Optional bSorted As Boolean)
[84]   Dim hCDS As CDS
[85]   
[86]   aGArray = $2DGridArray.Copy()
[87]   
[88]   If bSorted = True Then 
[89]      aGArray.Sort(gb.Ascent) ' Festlegung der Sortier-Reihenfolge
[90]      ArrayToGrid(aGArray)
[91]   Else
[92]     ArrayToGrid($2DGridArray)
[93]   Endif
[94]   
[95] End ' GridViewShow(..)
[96] 
[97] Public Sub btnGridViewShow_Click()
[98]   GridViewShow()
[99] End ' btnGridViewShow_Click()
[100] 
[101] Public Sub btnGridViewShowS_Click()
[102]   GridViewShow(True)
[103] End ' btnGridViewShowS_Click()

Kommentare:

  • Die GridView dient zum Anzeigen der originalen Daten und zum Anzeigen der sortierten GridView-Daten.
  • Die Funktion GridToArray() und die Prozedur ArrayToGrid(aArray As CDS[]) dienen der Transformation der GridView-Daten in ein Array – das später sortiert werden kann – und aus dem originalen oder sortierten Array in GridView-Daten.
  • In der Zeile 89 wird die Sortierung des abgeleiteten Arrays vom Typ CDS[] aufgerufen, was intern die spezielle Sortier-Methode für Objekt-Arrays in der Klasse CDS (Zeile 6) aufruft. Nach welcher Objekt-Variablen sortiert wird, ist dort durch den Selektor vorgegeben.

Das Ergebnis kann sich sehen lassen:

B1 B2

Abbildung 7.4.9.3.1: Korrekte Sortierung von GridView-Daten

Im Kapitel '7.4.9.4 Projekt zur Sortierung von Arrays' wird Ihnen ein Projekt vorgestellt, in dem das Element dynamisch festgelegt werden kann, nach dem das Objekt-Array sortiert wird.

Download

The website uses a temporary session cookie. This technically necessary cookie is deleted when the browser is closed. You can find information on cookies in our privacy policy.
k7/k7.4/k7.4.9/k7.4.9.3/start.txt · Last modified: 02.07.2018 (external edit)

Page Tools