ALGORITHMEN - Teil XIV: Jetzt noch irrer!

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Information: Wir verlosen 3 x das Buch "Nur noch dieses Level!" Spiel mit!

    • Warum eigentlich die ganze Markiererei in der Schleife? Jede Menge unnützer Befehle, die den Code schneckenlangsam machen und die Liste flackert während des Füllens aufgeregt.

      Quellcode

      1. Proc FuelleGB
      2. Declare z&
      3. z& = 0
      4. WhileLoop 0, 150
      5. z& = AddString(gb%, Str$(&LOOP) + "|" + ".Eintrag")
      6. EndWhile
      7. LvDeSelect(gb%, -1) ' alle deselektieren
      8. LvSelect(gb%, z&)
      9. LvSetCurSel gb%, z&
      10. EndProc
      Geht viel schneller, flackert nicht und da hinter der Schleife eindeutig der letzte Eintrag in z& steht, wird auch nur der markiert.


      Gruß Volkmar
    • Stimmt, ist eleganter - Danke!
      Das Problem mit der Doppelmarkierung bleibt aber bestehen:

      Quellcode

      1. WindowTitle "ScrollMarkShow_SortedGrid"
      2. Window 0,0-600,400
      3. Declare gb%, btn1%, sp$
      4. sp$ = "Nummer;0;60;Name;0;100;"
      5. btn1% = Create("Button", %HWnd, "DATEN", 10, 10, 60, 25)
      6. gb% = Create("Gridbox", %HWnd, sp$, 3, 10, 50, 180, 150)
      7. FuelleGB()
      8. UserMessages $0010
      9. WhileNot %Umessage = $0010
      10. WaitInput
      11. If Clicked(btn1%)
      12. ClearList gb%
      13. FuelleGB()
      14. EndIf
      15. EndWhile
      16. Proc LvDeSelect
      17. Parameters Lv&,Item&
      18. Declare s#
      19. Dim s#,1024
      20. Long s#,12=0
      21. Long s#,16= $0002 | $0001 ' ~LVIS_SELECTED | ~LVIS_FOCUSED
      22. SendMessage(Lv&, $1000 + 43,Item&,s#) ' Lv&,~LVM_SETITEMSTATE = ~LVM_FIRST + 43
      23. Dispose s#
      24. EndProc
      25. Proc LvSelect
      26. Parameters Lv&,Item&
      27. Declare s#
      28. Dim s#,1024
      29. Long s#,12=$2
      30. Long s#,16= $0002 | $0001 ' ~LVIS_SELECTED | ~LVIS_FOCUSED
      31. SendMessage(Lv&, $1000 + 43,Item&,s#) '~LVM_SETITEMSTATE = ~LVM_FIRST + 43
      32. SendMessage(lv&, $1000 + 60,item&,0) '~LVM_SETHOTITEM = ~LVM_FIRST + 60
      33. SendMessage(lv&, $1000 + 19,Item&,0) '~LVM_ENSUREVISIBLE = ~LVM_FIRST + 19
      34. Dispose s#
      35. Endproc
      36. Proc LVSetCurSel :Parameters LV&,pos%
      37. Selectstring(LV&,pos%-1,Getstring$(LV&,pos%))
      38. SendMessage(LV&,4115,pos%,0)
      39. Endproc
      40. Proc FuelleGB
      41. Declare z&
      42. z& = 0
      43. WhileLoop 0, 150
      44. z& = AddString(gb%, Str$(&LOOP) + "|" + ".Eintrag")
      45. EndWhile
      46. LvDeSelect(gb%, -1) ' alle deselektieren
      47. LvSelect(gb%, z&)
      48. LvSetCurSel gb%, z&
      49. EndProc
      50. End
      Alles anzeigen
    • Volkmar schrieb:

      Warum eigentlich die ganze Markiererei in der Schleife? Jede Menge unnützer Befehle, die den Code schneckenlangsam machen und die Liste flackert während des Füllens aufgeregt.
      Das hatte ich deshalb gemacht, weil Horst Horn im anderen Forum bei jedem neuen Eintrag
      den Auswahlbalken gesetzt haben wollte.

      Normalerweise hätte ich es für mich auch wie Volkmar gemacht.
    • OK. Aber es ist eben sinnvoller, die Wohnzimmertür erst dann zu schließen, wenn ich alle Getränke auf dem Tisch habe. Später nochmal nachholen (Listeninhalt ändern) ist dann eine andere Geschichte ;-) Mit der Zusammenfassung klappt es jedenfalls auf allen genannten Versionen, im Ursprungscode hatte ich bei X2 auch mal bei mehreren Durchläufen eine Doppelmarkierung dabei. Das Problem scheint damit aber nicht vollständig zu beseitigen sein :-(

      Gruß Volkmar
    • Eigentlich bin ich erst durch Probieren darauf gekommen, daß
      AddString() die Nummer des angehängten/eingefügten Eintrags
      zurück gibt. Da ich das Ergebnis aber noch nicht gebraucht hatte,
      ging ich von 0 oder -1 aus.

      In der Hilfe steht ja nur :

      RGH schrieb:

      N: LongInt - Handle
      S: String - hinzuzufügender String
      Ergebnis: Integer - Erfolg

      Besser wäre da :
      Ergebnis: Integer - Index des angehängten Eintrages.

      Aber ideal ist es schon, wenn man den Index zum Positionieren hat.
      Und vor allem, wenn die Liste sortiert ist. Da hilft nämlich auch kein
      GetCount().

      Aber mal sehen. Vielleicht hat Roland ja noch solche Goodies versteckt,
      die in der Hilfe nicht eindeutig stehen. Man kommt ja erst drauf, wenn
      man es wirklich mal braucht.
    • Abt. Rätselecke Nr. 19: Verregnete Suppe
      ===============================
      Zwischendurch wieder mal ein Rätsel:

      Beim Militär gibt es im Felde zur Mahlzeitausgabe sogenannte "Gulasch-Kanonen", in denen als Vorspeise oft auch Suppe gekocht wird. Der Militärkoch stellt am Morgen einen sehr großen Topf mit Suppe aufs Feuer. Im Topf befinden sich 100 Liter Suppe (= 100 kg), 98 % davon ist reines Wasser.

      Leider fängt es noch vor Mittag stark zu regnen an, und der Deckel ist nirgendwo aufzutreiben. Zur Mittagsmahlzeit hat die Suppe dann bereits einen Wassergehalt von 99 %. Wieviel Liter Suppe sind nun im Topf?

      Gruss
    • Das ist in der Tat in der Hilfe nicht richtig beschrieben. Habe ich auch erst gefunden, als ich mal SetItemData in einer Listbox nutzen wollte.

      H.Brill schrieb:

      Eigentlich bin ich erst durch Probieren darauf gekommen, daß
      AddString() die Nummer des angehängten/eingefügten Eintrags
      zurück gibt. Da ich das Ergebnis aber noch nicht gebraucht hatte,
      ging ich von 0 oder -1 aus.

      In der Hilfe steht ja nur :


      Gruß Volkmar
    • @Heinz Brill: Wenn es nur um das numerisch richtige Sortieren geht, hilft ein Right$(" _ "+str$(&Loop),4) statt dem einfachen str$(&Loop). :thumbsup:

      * Ich lass mal den Index fallend generieren: Die sortierte Liste bleibt trotzdem korrekt aufsteigend sortiert.

      * Leider löst das das Doppelmarkierungsproblem bei Mehrfachmarkierbaren Gridboxen in XProfan-11 nicht. Derzeit keine Ahnung, was da los ist :8O:
      Gruss

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von p. specht ()

    • p. specht schrieb:

      Lösung zu NR 19:
      Spoiler anzeigen
      Morgens wiegt sie die Suppe noch 100 kg, 98 % davon - also 98 kg - sind Wasser, 2 kg (100kg - 98kg = 2Kg) sind Suppengrün und Einlage. Nach dem Regenguß sind die 2 kg Suppengrün jetzt nur noch 1 % des Gesamtgewichtes (99 % sind jetzt Wasser).
      Also entspricht 1 % 2 kg, und 100 % sind daher:
      200 kg (= 200 Liter).

      Du postest die Lösungen zu schnell. Ich wollte es gerade posten, hab weiter runter gescrollt und die Lösung war schon da. :-(
      XProfan-Semiprofi (XProfan X4+XPIA+LemonEd) :thumbsup:
      Ryzen 1700X/MSI B350 PC MATE/16GB RAM@2933MHz/Radeon HD7770 OC/Creative X-Fi XTreme Music/68TB HDD+256GB Samsung 960 EVO (3.2GB/lesen, 1.9GB/s schreiben :top: )
      XBox Classic 10GB/360S 500GB/One S 2TB/One X Scorpio Edition/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84) auf 60" 4k/3D LG :-D
      Samsung Galaxy S6 edge pearlwhite mit 128GB und Nexus ROM/XGOSP (Android 8.0, 11/2017)
      http://jacdelad.bplaced.net
    • Jo. Einfache Prozentrechnung. :pfeifend: :thumbsup:
      XProfan-Semiprofi (XProfan X4+XPIA+LemonEd) :thumbsup:
      Ryzen 1700X/MSI B350 PC MATE/16GB RAM@2933MHz/Radeon HD7770 OC/Creative X-Fi XTreme Music/68TB HDD+256GB Samsung 960 EVO (3.2GB/lesen, 1.9GB/s schreiben :top: )
      XBox Classic 10GB/360S 500GB/One S 2TB/One X Scorpio Edition/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84) auf 60" 4k/3D LG :-D
      Samsung Galaxy S6 edge pearlwhite mit 128GB und Nexus ROM/XGOSP (Android 8.0, 11/2017)
      http://jacdelad.bplaced.net
    • Habe mal versucht, den VB-Code in meinem obigen MSDN - Link umzusetzen.
      Leider funktioniert da was nicht, bzw. gibt es kein Ergebnis und keine Fehlermeldung.

      Vielleicht kann ja jemand mal drüberschauen, wo es hakt :

      Quellcode

      1. DEF %LVM_FIRST $1000
      2. DEF %LVM_SORTITEMS %LVM_FIRST + 48
      3. DEF %LVM_FINDITEM %LVM_FIRST + 13
      4. DEF %LVM_GETITEMTEXT %LVM_FIRST + 45
      5. DEF %LVFI_PARAM $0001
      6. DEF %LVIFTEXT $0001
      7. DEF CopyMemory(3) !"KERNEL32","RtlMoveMemory"
      8. DEF SendMessageLong(4) !"USER32", "SendMessageA"
      9. VAR LONG lvwAscending = 0
      10. VAR LONG lvwDescending = 1
      11. VAR LONG stString = 1
      12. VAR LONG stDate = 2
      13. VAR LONG stNumeric = 3
      14. DECLARE MEMORY LVWSORT, POINTAPI, LV_FINDINFO, LV_ITEM
      15. STRUCT LVWSORT = hWndListview&, SortKey&, SortTypes&, SortOrder&
      16. DIM LVWSORT, LVWSORT
      17. STRUCT POINTAPI = x&, y&
      18. DIM POINTAPI, POINTAPI
      19. STRUCT LV_FINDINFO = flags&, psz$(255), lParam&, pt#(8), vkDirection&
      20. DIM LV_FINDINFO, LV_FINDINFO
      21. STRUCT LV_ITEM = mask&, item&, iSubItem&, State&, stateMask&, pszText&, cchTextMax&, ilmage&, lParam&, ilndent&
      22. DIM LV_ITEM, LV_ITEM
      23. PROC SortListview
      24. PARAMETERS LONG hWndListview, SortKey, SortType, SortOrder
      25. DECLARE MEMORY udtLVWSORT
      26. DIM udtLVWSORT, LVWSORT
      27. WITH udtLVWSORT
      28. .hWndListview& = hWndListview
      29. .SortKey& = SortKey
      30. .SortTypes& = SortType
      31. .SortOrder& = SortOrder
      32. ENDWITH
      33. SendMessageLong(hWndListview, %LVM_SORTITEMS, udtLVWSORT, PROCADDR("CompareFunc", 3))
      34. DISPOSE udtLVWSORT
      35. ENDPROC
      36. PROC CompareFunc
      37. PARAMETERS LONG lParam1, lParam2, lParamSort
      38. DECLARE MEMORY ListviewSort
      39. DIM ListviewSort, LVWSORT
      40. DECLARE STRING sEntry1, sEntry2
      41. DECLARE LONG vCompare1, vCompare2
      42. CopyMemory(ListviewSort, lParamSort, SizeOf(ListviewSort))
      43. sEntry1 = LvwGetText(ListviewSort, lParam1)
      44. sEntry2 = LvwGetText(ListviewSort, lParam2)
      45. If sEntry1 = sEntry2
      46. DISPOSE ListviewSort
      47. RETURN
      48. EndIf
      49. SELECT ListviewSort.SortType&
      50. CASEOF stDate
      51. RETURN CompareDates(sEntry1, sEntry2, ListviewSort.SetOrder&)
      52. CASEOF stNumeric
      53. RETURN CompareNumbers(sEntry1, sEntry2, ListviewSort.SetOrder&)
      54. CASEOF stString
      55. RETURN CompareStrings(sEntry1, sEntry2, ListviewSort.SetOrder&)
      56. ENDSELECT
      57. DISPOSE ListviewSort
      58. ENDPROC
      59. PROC LvwGetText
      60. PARAMETERS MEMORY LVWSORT, LONG lParam)
      61. DECLARE LONG IngIndex, IngLength
      62. DECLARE MEMORY udtFindInfo, udtLVITEM, baBuffer
      63. DIM udtFindInfo, LV_FINDINFO
      64. DIM udtLVITEM, LV_ITEM
      65. DIM baBuffer, 512
      66. WITH udtFindInfo
      67. .flags& = %LVFI_PARAM
      68. .lParam& = lParam
      69. ENDWITH
      70. IngIndex = SendMessageLong(ListviewSort.hWndListview, %LVM_GETITEMTEXT, IngIndex, udtLVItem)
      71. WITH udtLVITEM
      72. . mask& = %LVIF_TEXT
      73. .iSubItem& = ListviewSort.SortKey&
      74. .pszText& = baBuffer
      75. .cchTextMax& = SizeOf(baBuffer) + 1
      76. ENDWITH
      77. IngLength = SendMessageLong(ListviewSort.hWndListview, %LVM_GETITEMTEXT, IngIndex, udtLVITEM)
      78. If IngLength > 0
      79. RETURN Char$(baBuffer, 0, SizeOf(baBuffer))
      80. ENDIF
      81. ENDPROC
      82. PROC CompareDates
      83. PARAMETERS STRING dtEntry1, dtEntry2, LONG SortOrder
      84. DECLARE FLOAT datum1, datum2
      85. datum1 = DT("SetDate", dtEntry1)
      86. datum2 = DT("SetDate", dtEntry2)
      87. IF SortOrder = lvwAscending
      88. RETURN IF(datum1 < datum2, -1, 1)
      89. ELSE
      90. RETURN IF(datum1 > datum2, -1, 1)
      91. ENDIF
      92. ENDPROC
      93. PROC CompareNumbers
      94. PARAMETERS STRING sEntry1, sEntry2, LONG SortOrder
      95. IF SortOrder = lvwAscending
      96. RETURN IF(VAL(sEntry1) < VAL(sEntry2), -1, 1)
      97. ELSE
      98. RETURN If(VAL(sEntry1) > VAL(sEntry2), -1, 1)
      99. ENDIF
      100. ENDPROC
      101. PROC CompareStrings
      102. PARAMETERS STRING sEntry1, sEntry2, LONG SortOrder
      103. IF SortOrder = lvwAscending
      104. RETURN IF(sEntry1 < sEntry2, -1, 1)
      105. ELSE
      106. RETURN IF(sEntry1 > sEntry2, -1, 1)
      107. ENDIF
      108. ENDPROC
      109. /* HAUPTPROGRAMM */
      110. Declare Handle gb, btn1, btn2, btn3, btn4, btn5, btn6, Long ende
      111. Window 600, 400
      112. btn1 = Create("Button", %HWnd, "ASC", 10, 10, 60, 25)
      113. btn2 = Create("Button", %HWnd, "DESC", 10, 40, 60, 25)
      114. btn3 = Create("Button", %HWnd, "ASC", 100, 10, 60, 25)
      115. btn4 = Create("Button", %HWnd, "DESC", 100, 40, 60, 25)
      116. btn5 = Create("Button", %HWnd, "ASC", 190, 10, 60, 25)
      117. btn6 = Create("Button", %HWnd, "DESC", 190, 40, 60, 25)
      118. gb = Create("Gridbox",%HWnd, "DATUM;0;80;MENGE;0;80;ARTIKEL;0;120", 0, 10, 70, 300, 150)
      119. AddString(gb, "20.10.2017|500|Tomaten")
      120. AddString(gb, "15.08.2016|200|Birnen")
      121. AddString(gb, "22.11.2017|100|Ananas")
      122. ende = 0
      123. WhileNot ende
      124. WaitInput
      125. If Clicked(btn1)
      126. SortListview(gb, 0, 2, 0)
      127. ElseIf Clicked(btn2)
      128. SortListview(gb, 0, 2, 1)
      129. ElseIf Clicked(btn3)
      130. SortListview(gb, 1, 3, 0)
      131. ElseIf Clicked(btn4)
      132. SortListview(gb, 1, 3, 1)
      133. Elseif Clicked(btn5)
      134. SortListview(gb, 2, 1, 0)
      135. ElseIf Clicked(btn6)
      136. SortListview(gb, 2, 1, 1)
      137. EndIf
      138. Case %Key = 2 : ende = 1
      139. EndWhile
      140. DISPOSE LVWSORT, POINTAPI, LV_FINDINFO, LV_ITEM
      141. END
      Alles anzeigen
      Wäre ja genial, wenn es ginge. Alleine schon wegen des Sortierens vom Datum.
    • p. specht schrieb:

      Abt. Neue Rätselecke Nr. 20:"Stadtmusikanten & Co"
      ==================================
      Esel = 2
      Hund = 3
      Katze = 4
      Hahn = 10
      Hase = 0
      -------------
      Taube = ?
      Also hier steh ich völlig auf dem Schlauch. Ist ja auch nicht nur eine simple Prozentrechnung...
      XProfan-Semiprofi (XProfan X4+XPIA+LemonEd) :thumbsup:
      Ryzen 1700X/MSI B350 PC MATE/16GB RAM@2933MHz/Radeon HD7770 OC/Creative X-Fi XTreme Music/68TB HDD+256GB Samsung 960 EVO (3.2GB/lesen, 1.9GB/s schreiben :top: )
      XBox Classic 10GB/360S 500GB/One S 2TB/One X Scorpio Edition/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84) auf 60" 4k/3D LG :-D
      Samsung Galaxy S6 edge pearlwhite mit 128GB und Nexus ROM/XGOSP (Android 8.0, 11/2017)
      http://jacdelad.bplaced.net
    • Habe es jetzt hin bekommen. Geht mit SortItemsEx wegen SendMessage.

      Quellcode

      1. DEF %LVM_FIRST $1000
      2. DEF %LVM_SORTITEMS %LVM_FIRST + 48
      3. DEF %LVM_SORTITEMSEX 4177
      4. DEF %LVM_FINDITEM %LVM_FIRST + 13
      5. DEF %LVM_GETITEMTEXT %LVM_FIRST + 45
      6. DEF %LVFI_PARAM $0001
      7. DEF %LVIF_TEXT $0001
      8. DEF CopyMemory(3) !"KERNEL32","RtlMoveMemory"
      9. DEF SendMessageLong(4) !"USER32", "SendMessageA"
      10. VAR LONG lvwAscending = 0
      11. VAR LONG lvwDescending = 1
      12. VAR LONG stString = 1
      13. VAR LONG stDate = 2
      14. VAR LONG stNumeric = 3
      15. DECLARE MEMORY LVWSORT, POINTAPI, LV_FINDINFO, LV_ITEM
      16. STRUCT LVWSORT = hWndListview&, SortKey&, SortTypes&, SortOrder&
      17. DIM LVWSORT, LVWSORT
      18. STRUCT POINTAPI = x&, y&
      19. DIM POINTAPI, POINTAPI
      20. STRUCT LV_FINDINFO = flags&, psz$(255), lParam&, pt#(8), vkDirection&
      21. DIM LV_FINDINFO, LV_FINDINFO
      22. STRUCT LV_ITEM = mask&, item&, iSubItem&, State&, stateMask&, pszText&, cchTextMax&, ilmage&, lParam&, ilndent&
      23. DIM LV_ITEM, LV_ITEM
      24. PROC SortListview
      25. PARAMETERS LONG hWndListview, SortKey, SortType, SortOrder
      26. DECLARE MEMORY udtLVWSORT
      27. DIM udtLVWSORT, LVWSORT
      28. WITH udtLVWSORT
      29. .hWndListview& = hWndListview
      30. .SortKey& = SortKey
      31. .SortTypes& = SortType
      32. .SortOrder& = SortOrder
      33. ENDWITH
      34. SendMessage(hWndListview, %LVM_SORTITEMSEX, udtLVWSORT, PROCADDR("CompareFunc", 3))
      35. DISPOSE udtLVWSORT
      36. ENDPROC
      37. PROC CompareFunc
      38. PARAMETERS LONG lParam1, lParam2, lParamSort
      39. DECLARE MEMORY ListviewSort
      40. DIM ListviewSort, LVWSORT
      41. DECLARE STRING sEntry1, sEntry2
      42. DECLARE LONG vCompare1, vCompare2
      43. CopyMemory(ListviewSort, lParamSort, SizeOf(ListviewSort))
      44. sEntry1 = LvwGetText(ListviewSort, lParam1)
      45. sEntry2 = LvwGetText(ListviewSort, lParam2)
      46. If sEntry1 = sEntry2
      47. DISPOSE ListviewSort
      48. RETURN
      49. EndIf
      50. SELECT ListviewSort.SortType&
      51. CASEOF stDate
      52. RETURN CompareDates(sEntry1, sEntry2, ListviewSort.SetOrder&)
      53. CASEOF stNumeric
      54. RETURN CompareNumbers(sEntry1, sEntry2, ListviewSort.SetOrder&)
      55. CASEOF stString
      56. RETURN CompareStrings(sEntry1, sEntry2, ListviewSort.SetOrder&)
      57. ENDSELECT
      58. DISPOSE ListviewSort
      59. ENDPROC
      60. PROC LvwGetText
      61. PARAMETERS MEMORY LVWSORT, LONG lParam
      62. DECLARE LONG IngIndex, IngLength
      63. DECLARE MEMORY udtFindInfo, udtLVITEM, baBuffer
      64. DIM udtFindInfo, LV_FINDINFO
      65. DIM udtLVITEM, LV_ITEM
      66. DIM baBuffer, 512
      67. WITH udtFindInfo
      68. .flags& = %LVFI_PARAM
      69. .lParam& = lParam
      70. ENDWITH
      71. IngIndex = SendMessageLong(ListviewSort.hWndListview&, %LVM_GETITEMTEXT, IngIndex, udtLVItem)
      72. WITH udtLVITEM
      73. .mask& = %LVIF_TEXT
      74. .iSubItem& = ListviewSort.SortKey&
      75. .pszText& = baBuffer
      76. .cchTextMax& = SizeOf(baBuffer) + 1
      77. ENDWITH
      78. IngLength = SendMessageLong(ListviewSort.hWndListview&, %LVM_GETITEMTEXT, IngIndex, udtLVITEM)
      79. If IngLength > 0
      80. RETURN Char$(baBuffer, 0, SizeOf(baBuffer))
      81. ENDIF
      82. ENDPROC
      83. PROC CompareDates
      84. PARAMETERS STRING dtEntry1, dtEntry2, LONG SortOrder
      85. DECLARE FLOAT datum1, datum2, LONG x
      86. datum1 = CTod$(dtEntry1)
      87. datum2 = CTod$(dtEntry2)
      88. x = DT("CompareDate", datum1, datum2)
      89. IF SortOrder = lvwAscending
      90. RETURN IF(x < 0), -1, 1)
      91. ELSE
      92. RETURN IF(x > 0, -1, 1)
      93. ENDIF
      94. ENDPROC
      95. PROC CompareNumbers
      96. PARAMETERS STRING sEntry1, sEntry2, LONG SortOrder
      97. IF SortOrder = lvwAscending
      98. RETURN IF(VAL(sEntry1) < VAL(sEntry2), -1, 1)
      99. ELSE
      100. RETURN If(VAL(sEntry1) > VAL(sEntry2), -1, 1)
      101. ENDIF
      102. ENDPROC
      103. PROC CompareStrings
      104. PARAMETERS STRING sEntry1, sEntry2, LONG SortOrder
      105. IF SortOrder = lvwAscending
      106. RETURN IF(sEntry1 < sEntry2, -1, 1)
      107. ELSE
      108. RETURN IF(sEntry1 > sEntry2, -1, 1)
      109. ENDIF
      110. ENDPROC
      111. PROC FARPROC
      112. PARAMETERS LONG pfn
      113. RETURN pfn
      114. ENDPROC
      115. /* HAUPTPROGRAMM */
      116. Declare Handle gb, btn1, btn2, btn3, btn4, btn5, btn6, Long ende
      117. Window 600, 400
      118. btn1 = Create("Button", %HWnd, "ASC", 10, 10, 60, 25)
      119. btn2 = Create("Button", %HWnd, "DESC", 10, 40, 60, 25)
      120. btn3 = Create("Button", %HWnd, "ASC", 100, 10, 60, 25)
      121. btn4 = Create("Button", %HWnd, "DESC", 100, 40, 60, 25)
      122. btn5 = Create("Button", %HWnd, "ASC", 190, 10, 60, 25)
      123. btn6 = Create("Button", %HWnd, "DESC", 190, 40, 60, 25)
      124. gb = Create("Gridbox",%HWnd, "DATUM;0;80;MENGE;0;80;ARTIKEL;0;120", 0, 10, 70, 300, 150)
      125. AddString(gb, "20.10.2015|500|Tomaten")
      126. AddString(gb, "15.12.2017|200|Birnen")
      127. AddString(gb, "22.11.2015|100|Ananas")
      128. AddString(gb, "10.04.2016|50|Äpfel")
      129. ende = 0
      130. WhileNot ende
      131. WaitInput
      132. If Clicked(btn1)
      133. SortListview(gb, 0, 2, 0)
      134. ElseIf Clicked(btn2)
      135. SortListview(gb, 0, 2, 1)
      136. ElseIf Clicked(btn3)
      137. SortListview(gb, 1, 3, 0)
      138. ElseIf Clicked(btn4)
      139. SortListview(gb, 1, 3, 1)
      140. Elseif Clicked(btn5)
      141. SortListview(gb, 2, 1, 0)
      142. ElseIf Clicked(btn6)
      143. SortListview(gb, 2, 1, 1)
      144. EndIf
      145. Case %Key = 2 : ende = 1
      146. EndWhile
      147. DISPOSE LVWSORT, POINTAPI, LV_FINDINFO, LV_ITEM
      148. END
      Alles anzeigen

      Das einzige und wichtigste, was nicht richtig funktioniert, ist mit Datum.
      Vielleicht mache ich da einen Denkfehler :

      Quellcode

      1. PROC CompareDates
      2. PARAMETERS STRING dtEntry1, dtEntry2, LONG SortOrder
      3. DECLARE FLOAT datum1, datum2, LONG x
      4. datum1 = CTod$(dtEntry1)
      5. datum2 = CTod$(dtEntry2)
      6. x = DT("CompareDate", datum1, datum2)
      7. IF SortOrder = lvwAscending
      8. RETURN IF(x < 0, -1, 1)
      9. ELSE
      10. RETURN IF(x > 0, -1, 1)
      11. ENDIF
      12. ENDPROC
      Alles anzeigen

    • dt("CompareDate", datum1, datum2) vergleicht zwei Zeitpunkte, erwartet als datum1 und datum2 also zwei Floats, die Zeitpunkte enthalten. Die kannst Du nicht mit CToD$ bereitstellen. Vergleiche mal die Ausgabe folgenden Codes:

      Quellcode

      1. declare float datum
      2. datum = dt("SetDate", "23.04.2003")
      3. Print datum
      4. datum = CToD$("23.04.2003")
      5. Print datum
      6. waitinput
      Der zeigt Dir zweimal das Datum 23.04.2003 an. Zuerst als Zeitpunkt, den Du verwenden müßtest und in der zweiten Ausgabe das, was Du bereit stellst.


      Gruß Volkmar