SortArray oder PureLVSORT und deutsche Umlaute

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
gnozal
Beiträge: 219
Registriert: 04.12.2004 13:01
Wohnort: Frankreich (67)
Kontaktdaten:

Re: SortArray oder PureLVSORT und deutsche Umlaute

Beitrag von gnozal »

dysti hat geschrieben:Hallo,
habe ein ganz großes Problem mit Sortarray bzw. PureLVSORT.
Habe folgende Einträge in einem Array oder Listicon:

"Abben"
"Otten"
"Öztar"
"Oncken"
"Paulsen"
"Weiser"
"Zimmer"
und ich diese mit den obengenannten Befehlen sortiere, finde ich den Namen "Özgar" am Ende der Liste wieder.
Bei PureLVSORT ist es noch verrückter. da kann der Name überall sein...
With PureLVSORT, you can define the sorting order (it's all in the help file) :

Two possibilities !

1. use PureLVSORT_DefineAlphabeticOrder(*UserArray)

Set alphabetic order for column type #PureLVSORT_Alphabetic_User.

*UserArray is a pointer to a 256 bytes array, defining the sorting order for the 256 ASCII codes.
Byte 0 : sorting order for ASCII code 0, ..., byte 65 : sorting order for ASCII code 65 "A", ..., byte 255 : sorting order for ASCII code 255.

Example :

Code: Alles auswählen

#Window_0 = 0
#ListIcon_0 = 0
Procedure Open_Window_0()
  If OpenWindow(#Window_0, 216, 0, 602, 302, "PureLVSORT User Array Test", #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered)
    If CreateGadgetList(WindowID(#Window_0))
      ListIconGadget(#ListIcon_0, 5, 5, 590, 285, "User", 110)
      AddGadgetColumn(#ListIcon_0, 1, "DateDDMMYYYYHHMMSS", 130)
      AddGadgetColumn(#ListIcon_0, 2, "DateDDMMYYHHMM", 130)
      AddGadgetColumn(#ListIcon_0, 3, "DateDDMMYYYY", 120)
      AddGadgetColumn(#ListIcon_0, 4, "DateMMDDYYYY", 120)
      AddGadgetColumn(#ListIcon_0, 5, "FileSize", 120)
      AddGadgetColumn(#ListIcon_0, 6, "NoSorting", 120)
      AddGadgetItem(#ListIcon_0, -1, "éseza" + Chr(10) + "12/05/2001 06:41:30" + Chr(10) + "19/07/66 06:41" + Chr(10) + "31/12/2004" + Chr(10) + "12/31/2004" + Chr(10) + "15.02 MB" + Chr(10) + "0")
      AddGadgetItem(#ListIcon_0, -1, "zssdd" + Chr(10) + "05/07/2004 09:21:30" + Chr(10) + "12/05/01 07:50" + Chr(10) + "11/12/2004" + Chr(10) + "12/11/2004"  + Chr(10) + "65 B" + Chr(10) + "1")
      AddGadgetItem(#ListIcon_0, -1, "tdeed" + Chr(10) + "19/11/2003 07:18:31" + Chr(10) + "13/08/03 06:41" + Chr(10) + "21/01/2003" + Chr(10) + "01/21/2003" + Chr(10) + "5.98 GB" + Chr(10) + "3")
      AddGadgetItem(#ListIcon_0, -1, "ùdsdd" + Chr(10) + "19/11/2003 06:21:30" + Chr(10) + "12/05/01 06:41" + Chr(10) + "10/06/2001" + Chr(10) + "06/10/2001" + Chr(10) + "100 KB" + Chr(10) + "A")
      AddGadgetItem(#ListIcon_0, -1, "cdgdd" + Chr(10) + "19/11/2003 16:21:30" + Chr(10) + "12/05/01 06:41" + Chr(10) + "10/08/2001" + Chr(10) + "16/11/2001" + Chr(10) + "800 KB" + Chr(10) + "9")
      AddGadgetItem(#ListIcon_0, -1, "âdsdg" + Chr(10) + "19/11/2003 06:21:31" + Chr(10) + "12/05/01 06:41" + Chr(10) + "10/06/2004" + Chr(10) + "06/10/2004" + Chr(10) + "101 KB" + Chr(10) + "z")
      AddGadgetItem(#ListIcon_0, -1, "fdsdd" + Chr(10) + "19/11/2003 06:21:30" + Chr(10) + "12/05/01 06:41" + Chr(10) + "10/04/2001" + Chr(10) + "07/08/2004" + Chr(10) + "1000 B" + Chr(10) + "A")
    EndIf
  EndIf
EndProcedure
Open_Window_0()
; define alphabetic order user array
Structure Array256
  Byte.b[256]
EndStructure
UserArray.Array256
; standard ASCII values
For i = 0 To 255
  UserArray\Byte[i] = i
Next
; change some values
UserArray\Byte[Asc("à")] = 'a'
UserArray\Byte[Asc("â")] = 'a'
UserArray\Byte[Asc("ù")] = 'u'
UserArray\Byte[Asc("û")] = 'u'
UserArray\Byte[Asc("ü")] = 'u'
UserArray\Byte[Asc("é")] = 'e'
UserArray\Byte[Asc("è")] = 'e'
UserArray\Byte[Asc("ê")] = 'e'
; declare user array (before using #PureLVSORT_Alphabetic_User !)
PureLVSORT_DefineAlphabeticOrder(@UserArray)
; ListIcon Sort Setup
If PureLVSORT_SelectGadgetToSort(#ListIcon_0, #PureLVSORT_ShowClickedHeader_IconLeft) = #PureLVSORT_Ok
  ;PureLVSORT_SetColumnType(#ListIcon_0, 0, #PureLVSORT_String)
  PureLVSORT_SetColumnType(#ListIcon_0, 0, #PureLVSORT_Alphabetic_User)
  PureLVSORT_SetColumnType(#ListIcon_0, 1, #PureLVSORT_DateDDMMYYYYHHMMSS)
  PureLVSORT_SetColumnType(#ListIcon_0, 2, #PureLVSORT_DateDDMMYYHHMM)
  PureLVSORT_SetColumnType(#ListIcon_0, 3, #PureLVSORT_DateDDMMYYYY)
  PureLVSORT_SetColumnType(#ListIcon_0, 4, #PureLVSORT_DateMMDDYYYY)
  PureLVSORT_SetColumnType(#ListIcon_0, 5, #PureLVSORT_FileSize)
  PureLVSORT_SetColumnType(#ListIcon_0, 6, #PureLVSORT_NoSorting)
  PureLVSORT_SortListIconNow(#ListIcon_0, 1, -1)
EndIf
;
Repeat
  Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
End
2. Use PureLVSORT_DefineUserCallback(*UserCallbackAddress)

Define user sorting callback for column type #PureLVSORT_UserCallback.

The callback is a procedure called when a ListIconGadget is sorted.

The callback procedure is like this :

Procedure MySortingCallback(ListIconNumber.l, ListIconColumn.l, Item1.s, Item2.s)
;
Compare Item1 and Item2 and
Return 1 if Item1 > Item2
Return -1 if Item1 < Item2
Return 0 if Item1 = Item2
;
EndProcedure

declared like that :

PureLVSORT_DefineUserCallback(@MySortingCallback())

where :

ListIconNumber is the purebasic gadget ID
ListIconColumn is the sorted column
Item1 and Item2 are the items to sort.

Example :

Code: Alles auswählen

Procedure.l MySortingCallback(ListIconNumber.l, ListIconColumn.l, Item1.s, Item2.s)
  Protected ReturnValue.l
  Debug Str(ListIconNumber) + ":" + Str(ListIconColumn) + "->" + Item1 + ":" + Item2
  If Item1 > Item2
    ReturnValue = 1
  ElseIf Item1 < Item2
    ReturnValue = -1
  Else
    ReturnValue = 0
  EndIf
  ProcedureReturn ReturnValue
EndProcedure
;
#Window_0 = 0
#ListIcon_0 = 0
Procedure Open_Window_0()
  If OpenWindow(#Window_0, 216, 0, 602, 302, "PureLVSORT User Callback",  #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered)
    If CreateGadgetList(WindowID(#Window_0))
      ListIconGadget(#ListIcon_0, 5, 5, 590, 285, "UserCallback", 110)
      AddGadgetColumn(#ListIcon_0, 1, "DateDDMMYYYYHHMMSS", 130)
      AddGadgetColumn(#ListIcon_0, 2, "DateDDMMYYHHMM", 130)
      AddGadgetColumn(#ListIcon_0, 3, "DateDDMMYYYY", 120)
      AddGadgetColumn(#ListIcon_0, 4, "DateMMDDYYYY", 120)
      AddGadgetColumn(#ListIcon_0, 5, "FileSize", 120)
      AddGadgetColumn(#ListIcon_0, 6, "UserCallback", 120)
      AddGadgetItem(#ListIcon_0, -1, "aseza" + Chr(10) + "12/05/2001 06:41:30" + Chr(10) + "19/07/66 06:41" + Chr(10) + "31/12/2004" + Chr(10) + "12/31/2004" + Chr(10) + "15.02 MB" + Chr(10) + "0")
      AddGadgetItem(#ListIcon_0, -1, "zssdd" + Chr(10) + "05/07/2004 09:21:30" + Chr(10) + "12/05/01 07:50" + Chr(10) + "11/12/2004" + Chr(10) + "12/11/2004"  + Chr(10) + "65 B" + Chr(10) + "1")
      AddGadgetItem(#ListIcon_0, -1, "aeeed" + Chr(10) + "19/11/2003 07:18:31" + Chr(10) + "13/08/03 06:41" + Chr(10) + "21/01/2003" + Chr(10) + "01/21/2003" + Chr(10) + "5.98 GB" + Chr(10) + "3")
      AddGadgetItem(#ListIcon_0, -1, "udsdd" + Chr(10) + "19/11/2003 06:21:30" + Chr(10) + "12/05/01 06:41" + Chr(10) + "10/06/2001" + Chr(10) + "06/10/2001" + Chr(10) + "100 KB" + Chr(10) + "A")
      AddGadgetItem(#ListIcon_0, -1, "cdgdd" + Chr(10) + "19/11/2003 16:21:30" + Chr(10) + "12/05/01 06:41" + Chr(10) + "10/08/2001" + Chr(10) + "16/11/2001" + Chr(10) + "800 KB" + Chr(10) + "9")
      AddGadgetItem(#ListIcon_0, -1, "adsdg" + Chr(10) + "19/11/2003 06:21:31" + Chr(10) + "12/05/01 06:41" + Chr(10) + "10/06/2004" + Chr(10) + "06/10/2004" + Chr(10) + "101 KB" + Chr(10) + "z")
      AddGadgetItem(#ListIcon_0, -1, "azsdd" + Chr(10) + "19/11/2003 06:21:30" + Chr(10) + "12/05/01 06:41" + Chr(10) + "10/04/2001" + Chr(10) + "07/08/2004" + Chr(10) + "1000 B" + Chr(10) + "A")
    EndIf
  EndIf
EndProcedure
Open_Window_0()
; ListIcon Sort Setup
If PureLVSORT_SelectGadgetToSort(#ListIcon_0, #PureLVSORT_ShowClickedHeader_IconLeft) = #PureLVSORT_Ok
  PureLVSORT_DefineUserCallback(@MySortingCallback())
  PureLVSORT_SetColumnType(#ListIcon_0, 0, #PureLVSORT_UserCallback)
  PureLVSORT_SetColumnType(#ListIcon_0, 1, #PureLVSORT_DateDDMMYYYYHHMMSS)
  PureLVSORT_SetColumnType(#ListIcon_0, 2, #PureLVSORT_DateDDMMYYHHMM)
  PureLVSORT_SetColumnType(#ListIcon_0, 3, #PureLVSORT_DateDDMMYYYY)
  PureLVSORT_SetColumnType(#ListIcon_0, 4, #PureLVSORT_DateMMDDYYYY)
  PureLVSORT_SetColumnType(#ListIcon_0, 5, #PureLVSORT_FileSize)
  PureLVSORT_SetColumnType(#ListIcon_0, 6, #PureLVSORT_UserCallback)
  PureLVSORT_SortListIconNow(#ListIcon_0, 1, -1)
EndIf
;
Repeat
  Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
End
For free libraries and tools, visit my web site (also home of jaPBe V3 and PureFORM).
Num500
Beiträge: 21
Registriert: 23.12.2004 18:50
Wohnort: Buchholz

Beitrag von Num500 »

@Kiffi

vielen Dank für die "Lehrstunde",

habe Deine Vorschläge umgesetzt:

Code: Alles auswählen

Enumeration
  #Window_0
  #ListIcon_0
  #Button_Auf
  #Button_Ab
  #Button_NameHinzu
EndEnumeration

Structure Namen
  Name.s
  SortName.s
EndStructure

Global NewList NamenListe.Namen()

Procedure DatenLaden()
ClearList(NamenListe())
AddElement(NamenListe.Namen())
NamenListe.Namen()\Name     = "Abben"
AddElement(NamenListe.Namen())
NamenListe.Namen()\Name     = "Otten"
AddElement(NamenListe.Namen())
NamenListe.Namen()\Name     = "Öztar"
AddElement(NamenListe.Namen())
NamenListe.Namen()\Name     = "Oncken"
AddElement(NamenListe.Namen())
NamenListe.Namen()\Name     = "Paulsen"
AddElement(NamenListe.Namen())
NamenListe.Namen()\Name     = "Weißer"
AddElement(NamenListe.Namen())
NamenListe.Namen()\Name     = "Milchmueller"
AddElement(NamenListe.Namen())
NamenListe.Namen()\Name     = "Weiser"
AddElement(NamenListe.Namen())
NamenListe.Namen()\Name     = "Zimmer"
AddElement(NamenListe.Namen())
NamenListe.Namen()\Name     = "Ändermüller"
AddElement(NamenListe.Namen())
NamenListe.Namen()\Name     = "Milchmüller"
EndProcedure        

Procedure SortDaten(SortRichtung.l)
  ForEach(NamenListe())
    NamenListe.Namen()\SortName = NamenListe.Namen()\Name
    NamenListe.Namen()\SortName = ReplaceString(NamenListe.Namen()\SortName, "Ä", "Ae")
    NamenListe.Namen()\SortName = ReplaceString(NamenListe.Namen()\SortName, "ä", "ae")
    NamenListe.Namen()\SortName = ReplaceString(NamenListe.Namen()\SortName, "Ö", "Oe")
    NamenListe.Namen()\SortName = ReplaceString(NamenListe.Namen()\SortName, "ö", "oe")
    NamenListe.Namen()\SortName = ReplaceString(NamenListe.Namen()\SortName, "Ü", "Ue")
    NamenListe.Namen()\SortName = ReplaceString(NamenListe.Namen()\SortName, "ü", "ue")
    NamenListe.Namen()\SortName = ReplaceString(NamenListe.Namen()\SortName, "ß", "ss")
  Next

  If SortRichtung.l = 1
    SortStructuredList(NamenListe(), 2, OffsetOf(Namen\SortName), #PB_Sort_String)
  ElseIf SortRichtung.l = -1
    SortStructuredList(NamenListe(), 3, OffsetOf(Namen\SortName), #PB_Sort_String)
  EndIf
EndProcedure

Procedure ZeigeDaten()
  ClearGadgetItemList(#ListIcon_0) 
  ForEach(NamenListe())
    AddGadgetItem(#ListIcon_0, -1, NamenListe.Namen()\Name + Chr(10) + NamenListe.Namen()\SortName)
  Next
EndProcedure

Procedure.s ErzeugeNamen()
Protected Name.s ="" , i.l, Buchstabe.l
  For i = 1 To 7
    Buchstabe = Random(57)+66
    If Buchstabe = 91
      Buchstabe = 196
    ElseIf Buchstabe = 92
      Buchstabe = 228
    ElseIf Buchstabe = 93
      Buchstabe = 214
    ElseIf Buchstabe = 94
      Buchstabe = 246
    ElseIf Buchstabe = 95
      Buchstabe = 220
    ElseIf Buchstabe = 96
      Buchstabe = 252
    ElseIf Buchstabe = 123
      Buchstabe = 223
    EndIf  
    Name = Name + Chr(Buchstabe)
  Next i
  ProcedureReturn Name
EndProcedure

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 216, 0, 300, 390, "PureSORT Test",  #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered)
    If CreateGadgetList(WindowID(#Window_0))
      ButtonGadget(#Button_Auf, 5, 300, 140, 20, "sortiere aufsteigend")
      ButtonGadget(#Button_Ab, 5, 330, 140, 20, "sortiere absteigend")
      ButtonGadget(#Button_NameHinzu, 5, 360, 140, 20, "Namen hinzufügen")
      ListIconGadget(#ListIcon_0, 5, 5, 280, 285, "Name", 136, #PB_ListIcon_GridLines)
      AddGadgetColumn(#ListIcon_0, 1, "SortName", 136)
      ForEach NamenListe()
        AddGadgetItem(#ListIcon_0, -1, NamenListe.Namen()\Name )
      Next
    EndIf
  EndIf
EndProcedure

DatenLaden()
Open_Window_0()

;
Repeat
  Event = WaitWindowEvent()
  WindowID = EventWindow()
  GadgetID = EventGadget()
  EventType = EventType()

  If Event = #PB_Event_Gadget 
    If GadgetID = #Button_Auf
      SortDaten(1)
      ZeigeDaten()
    ElseIf GadgetID = #Button_Ab
      SortDaten(-1)
      ZeigeDaten()
    ElseIf GadgetID = #Button_NameHinzu
      AddElement(NamenListe.Namen())
      NamenListe.Namen()\Name = ErzeugeNamen()

      ZeigeDaten()
    EndIf  
  EndIf
  
Until Event = #PB_Event_CloseWindow 
Jürgen
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Beitrag von dysti »

Erstmal danke für die guten Ideen.
Da ich Gnozals - Userlib benutze, habe ich das Hilfebeispiel versucht umzusetzen. Der Erfolg war leider negativ, sobald man den Spaltenheader anklickt ist alles für die Katz.

Die Idee mit der LL ist sehr gut und habe auch wieder was zu LL dazu gelernt.

Da ich sowieso schon ein Array benutze, habe ich das Beispiel von @Shardik aufgegriffen und meinen Beispielcode entsprechend angepasst.
Hier der von mir geänderte Code von @Shardik:

Code: Alles auswählen

Procedure.S UmlautConversion(Name.S)
  Name = ReplaceString(Name, "Ä", "Ae")
  Name = ReplaceString(Name, "Ö", "Oe")
  Name = ReplaceString(Name, "Ü", "Ue")
  Name = ReplaceString(Name, "ä", "ae")
  Name = ReplaceString(Name, "ö", "oe")
  Name = ReplaceString(Name, "ü", "ue")
  Name = ReplaceString(Name, "ß", "ss")
  ProcedureReturn Name
EndProcedure 

Procedure.s BubbleSort(NameList.s(1),RCount.l)
Define TempName1.s,TempName2.s

For j = RCount - 2 To 0 Step -1
  For i = 0 To j
    TempName1 = UmlautConversion(NameList(i))
    TempName2 = UmlautConversion(NameList(i + 1))

    If TempName1 > TempName2
      Swap NameList(i), NameList(i + 1)
    EndIf
  Next i
Next j

EndProcedure
Der folgende Aufruf in der Procedure SortDaten wurde gelöscht

Code: Alles auswählen

SortArray(Feld(),2)
und durch diesen ersetzt:

Code: Alles auswählen

BubbleSort(Feld(),AnzahlPositionen)
Jetzt habe ich dennoch eine Frage.
Da ja Arrays definiert werden und Speicherplatz brauchen, ist ja zu empfehlen, diesen wieder freizugeben.
An welchen Stellen muß dieses geschehen?
Oder kann ich das unberücksichtigt lassen?
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Beitrag von Shardik »

@Num500:

Noch ein Vorschlag zur Code-Verkürzung. Statt

Code: Alles auswählen

Procedure DatenLaden() 
ClearList(NamenListe()) 
AddElement(NamenListe.Namen()) 
NamenListe.Namen()\Name     = "Abben" 
AddElement(NamenListe.Namen()) 
NamenListe.Namen()\Name     = "Otten" 
AddElement(NamenListe.Namen()) 
NamenListe.Namen()\Name     = "Öztar" 
AddElement(NamenListe.Namen()) 
NamenListe.Namen()\Name     = "Oncken" 
AddElement(NamenListe.Namen()) 
NamenListe.Namen()\Name     = "Paulsen" 
AddElement(NamenListe.Namen()) 
NamenListe.Namen()\Name     = "Weißer" 
AddElement(NamenListe.Namen()) 
NamenListe.Namen()\Name     = "Milchmueller" 
AddElement(NamenListe.Namen()) 
NamenListe.Namen()\Name     = "Weiser" 
AddElement(NamenListe.Namen()) 
NamenListe.Namen()\Name     = "Zimmer" 
AddElement(NamenListe.Namen()) 
NamenListe.Namen()\Name     = "Ändermüller" 
AddElement(NamenListe.Namen()) 
NamenListe.Namen()\Name     = "Milchmüller" 
EndProcedure
packe ich Strings immer durch ein Trennzeichen getrennt zusammen in einen einzigen String und lade sie in einer For/Next-Schleife in die LinkedList:

Code: Alles auswählen

Procedure DatenLaden() 
  Namen.S = "Abben+Otten+Öztar+Oncken+Paulsen+Weißer+Milchmueller+Weiser+Zimmer+Ändermüller+Milchmüller"
  For i = 1 To CountString(Namen, "+") + 1
    AddElement(NamenListe.Namen()) 
    NamenListe.Namen()\Name = StringField(Namen, i, "+")
  Next i
EndProcedure
dysti hat geschrieben: Da ja Arrays definiert werden und Speicherplatz brauchen, ist ja zu empfehlen, diesen wieder freizugeben.
An welchen Stellen muß dieses geschehen?
Dann, wenn sie für den weiteren Programmablauf nicht mehr benötigt werden. Wie der Speicherplatz eines Feldes (neudeutsch: Array :wink: ) freigegeben wird, bescheibt die PB-Hilfe:
PB-Hilfe zu Dim hat geschrieben: Um den Inhalt eines Arrays zu löschen und seinen verwendeten Speicher während des Programmablaufs freizugeben, rufen Sie Dim mit dem Array-Namen und 0 Elementen auf.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

dysti hat geschrieben:Da ich Gnozals - Userlib benutze, habe ich das Hilfebeispiel versucht umzusetzen. Der Erfolg war leider negativ, sobald man den Spaltenheader anklickt ist alles für die Katz.
hast du den 2ten vorschlag probiert?

der erste, PureLVSORT_DefineAlphabeticOrder(*UserArray), erschien mir eigentlich plausibel.
funzt der auch nicht?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
mknjc
Beiträge: 217
Registriert: 09.09.2006 12:59

Beitrag von mknjc »

dysti hat geschrieben:Da ich Gnozals - Userlib benutze, habe ich das Hilfebeispiel versucht umzusetzen. Der Erfolg war leider negativ, sobald man den Spaltenheader anklickt ist alles für die Katz.
Hm das klingt nach Bug...
Hier funktioniert alles.

Mfg mknjc
Ich nutze PureBasic 4.02 unter Linux und Windows.

Momentane Projekte:
Das geheimste aller geheimen Projekte... FPBC
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Beitrag von dysti »

Hey,
habe ja gerade das zweite Beispiel ausprobiert, weil es ja um die Umlautsortierung ging.
Beim ersten Aufruf des Listicon funzt noch alles.
Wenn man dann aber auf den Spaltenheader klickt und das vielleicht auch mehrmals,
hat man absolut keine richtige Sortierung mehr.
Hinzu kam noch, daß ich nach dem Einfügen eines neuen Namens mit Gnozals-Befehlen keine Sortierung mehr hinbekam.:|
Mit @Shardik´s Procedure habe ich überhaupt keine Probleme.:allright:
Neuer Name, einmal @Shardik´s Procedure aufrufen und alles ist korrekt sortiert.
War für mich halt in dieser Situation am einfachsten.
Anmerkung: Das ist auch bisher der erste Befehl aus den Bibliotheken von Gnozal, wo ich nicht mit zu recht gekommen bin.:oops:
Nun ja, alles muß ich wohl nicht verstehen. :lol:
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

dysti hat geschrieben:habe ja gerade das zweite Beispiel ausprobiert, weil es ja um die Umlautsortierung ging.
ja eben.
das erste beispiel zeigt, wie man eine tabelle aufstellt, die die sortierreihenfolge manipuliert.
alleine schon dieser codeausschnitt sollte aussagekräftig sein:

Code: Alles auswählen

; change some values 
UserArray\Byte[Asc("à")] = 'a' 
UserArray\Byte[Asc("â")] = 'a' 
UserArray\Byte[Asc("ù")] = 'u' 
UserArray\Byte[Asc("û")] = 'u' 
UserArray\Byte[Asc("ü")] = 'u' 
UserArray\Byte[Asc("é")] = 'e' 
UserArray\Byte[Asc("è")] = 'e' 
UserArray\Byte[Asc("ê")] = 'e' 
also, warum hast du nicht das erste beispiel ausprobiert?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Beitrag von dysti »

Hallo @Kaeru Gaman,
Irgendwie habe ich es auf einmal geblickt. :o
So funktiert es, wie ich es möchte:

Code: Alles auswählen

#Window_0 = 0
#ListIcon_0 = 0
Procedure Open_Window_0()
  If OpenWindow(#Window_0, 216, 0, 602, 302, "PureLVSORT User Array Test", #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered)
    If CreateGadgetList(WindowID(#Window_0))
      ListIconGadget(#ListIcon_0, 5, 5, 590, 285, "User", 110)
      AddGadgetColumn(#ListIcon_0, 1, "DateDDMMYYYYHHMMSS", 130)
      AddGadgetColumn(#ListIcon_0, 2, "DateDDMMYYHHMM", 130)
      AddGadgetColumn(#ListIcon_0, 3, "DateDDMMYYYY", 120)
      AddGadgetColumn(#ListIcon_0, 4, "DateMMDDYYYY", 120)
      AddGadgetColumn(#ListIcon_0, 5, "FileSize", 120)
      AddGadgetColumn(#ListIcon_0, 6, "NoSorting", 120)
      AddGadgetItem(#ListIcon_0, -1, "Ennen" + Chr(10) + "12/05/2001 06:41:30" + Chr(10) + "19/07/66 06:41" + Chr(10) + "31/12/2004" + Chr(10) + "12/31/2004" + Chr(10) + "15.02 MB" + Chr(10) + "0")
      AddGadgetItem(#ListIcon_0, -1, "Otten" + Chr(10) + "05/07/2004 09:21:30" + Chr(10) + "12/05/01 07:50" + Chr(10) + "11/12/2004" + Chr(10) + "12/11/2004"  + Chr(10) + "65 B" + Chr(10) + "1")
      AddGadgetItem(#ListIcon_0, -1, "Ötzgur" + Chr(10) + "19/11/2003 07:18:31" + Chr(10) + "13/08/03 06:41" + Chr(10) + "21/01/2003" + Chr(10) + "01/21/2003" + Chr(10) + "5.98 GB" + Chr(10) + "3")
      AddGadgetItem(#ListIcon_0, -1, "Oncken" + Chr(10) + "19/11/2003 06:21:30" + Chr(10) + "12/05/01 06:41" + Chr(10) + "10/06/2001" + Chr(10) + "06/10/2001" + Chr(10) + "100 KB" + Chr(10) + "A")
      AddGadgetItem(#ListIcon_0, -1, "Cäsar" + Chr(10) + "19/11/2003 16:21:30" + Chr(10) + "12/05/01 06:41" + Chr(10) + "10/08/2001" + Chr(10) + "16/11/2001" + Chr(10) + "800 KB" + Chr(10) + "9")
      AddGadgetItem(#ListIcon_0, -1, "Adden" + Chr(10) + "19/11/2003 06:21:31" + Chr(10) + "12/05/01 06:41" + Chr(10) + "10/06/2004" + Chr(10) + "06/10/2004" + Chr(10) + "101 KB" + Chr(10) + "z")
      AddGadgetItem(#ListIcon_0, -1, "Pauls" + Chr(10) + "19/11/2003 06:21:30" + Chr(10) + "12/05/01 06:41" + Chr(10) + "10/04/2001" + Chr(10) + "07/08/2004" + Chr(10) + "1000 B" + Chr(10) + "A")
    EndIf
  EndIf
EndProcedure
Open_Window_0()
; define alphabetic order user array
Structure Array256
  Byte.b[256]
EndStructure
UserArray.Array256
; standard ASCII values
For i = 0 To 255
  UserArray\Byte[i] = i
Next
; change some values
UserArray\Byte[Asc("Ä")] = 'A'
UserArray\Byte[Asc("ä")] = 'a'
UserArray\Byte[Asc("Ü")] = 'U'
UserArray\Byte[Asc("ü")] = 'u'
UserArray\Byte[Asc("Ö")] = 'O'
UserArray\Byte[Asc("ö")] = 'ö'
UserArray\Byte[Asc("è")] = 'e'
UserArray\Byte[Asc("ß")] = 's'


; declare user array (before using #PureLVSORT_Alphabetic_User !)
  PureLVSORT_DefineAlphabeticOrder(@UserArray)
; ListIcon Sort Setup
  PureLVSORT_SelectGadgetToSort(#ListIcon_0, #PureLVSORT_ShowClickedHeader_No	)
  
  PureLVSORT_SetColumnType(#ListIcon_0, 0, #PureLVSORT_Alphabetic_User)
  ; sofort sortieren
  PureLVSORT_SortListIconNow(#ListIcon_0, 0, 1)
  ; und Spaltenclick ausschalten
  PureLVSORT_ClearGadget(#ListIcon_0) 

;
Repeat
  Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
End
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Beitrag von dysti »

..... wenn ich einen neuen Datensatz einfüge, brauche ich doch nur noch folgendes machen:

Code: Alles auswählen

; sofort sortieren
  PureLVSORT_SortListIconNow(#ListIcon_0, 0, 1)
  ; und Spaltenclick ausschalten
  PureLVSORT_ClearGadget(#ListIcon_0)
oder muß das auch alles komplett davor?

Code: Alles auswählen

; declare user array (before using #PureLVSORT_Alphabetic_User !)
  PureLVSORT_DefineAlphabeticOrder(@UserArray)
; ListIcon Sort Setup
  PureLVSORT_SelectGadgetToSort(#ListIcon_0, #PureLVSORT_ShowClickedHeader_No   )
 
  PureLVSORT_SetColumnType(#ListIcon_0, 0, #PureLVSORT_Alphabetic_User) 
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Antworten