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

Unsere Datenschutzerklärung wurde aktualisiert. Mit der Nutzung unseres Forums akzeptierst Du unsere Datenschutzerklärung. Du bestätigst zudem, dass Du mindestens 16 Jahre alt bist.

  • 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)
    Ryzen 1700X/MSI B350 PC MATE/16GB RAM@2933MHz/Radeon HD7770 OC/Creative X-Fi XTreme Music/65TB HDD+256GB Samsung 960 EVO/28" Samsung 4k
    XBox Classic/360S/One S/One X Scorpio Edition/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84) auf 60" 4k/3D LG
    OnePlus 6 256GB Midnight Black
    http://jacdelad.bplaced.net
  • Jo. Einfache Prozentrechnung. :pfeifend: :thumbsup:
    XProfan-Semiprofi (XProfan X4+XPIA+LemonEd)
    Ryzen 1700X/MSI B350 PC MATE/16GB RAM@2933MHz/Radeon HD7770 OC/Creative X-Fi XTreme Music/65TB HDD+256GB Samsung 960 EVO/28" Samsung 4k
    XBox Classic/360S/One S/One X Scorpio Edition/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84) auf 60" 4k/3D LG
    OnePlus 6 256GB Midnight Black
    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)
    Ryzen 1700X/MSI B350 PC MATE/16GB RAM@2933MHz/Radeon HD7770 OC/Creative X-Fi XTreme Music/65TB HDD+256GB Samsung 960 EVO/28" Samsung 4k
    XBox Classic/360S/One S/One X Scorpio Edition/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84) auf 60" 4k/3D LG
    OnePlus 6 256GB Midnight Black
    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