Listview nach deutschen Datum sortieren

  • Hi zusammen,

    ich habe ein Listview, bei der eine Spalte ein Datum enthält, welches ich mit _NowCalcDate() erzeuge. Jetzt habe ich mir 2 Funktionen gebastelt (teilweise kopiert), die das Datum vom Format YYYY/MM/DD nach DD.MM.YYYY und zurück umwandeln, s.u...

    Schreibe ich nun aber das "deutsche" Datum in das Listview, kann ich es logischerweise nicht mehr chronologisch sortieren lassen - das andere sieht aber schrecklich aus :rolleyes: . Gibt es da irgend eine Möglichkeit?

    Danke für jede Hilfe und Gruß
    trainer


    Funktionen:

    [autoit]

    ;Datum von YYYY/MM/DD nach DD.MM.YYYY umwandeln
    Func Date_AutoIt_2_German($conv_date)
    $conv_parts = StringSplit($conv_date, "/")
    Return $conv_parts[3] & "." & $conv_parts[2] & "." & $conv_parts[1]
    EndFunc ;==>Date_AutoIt_2_German

    [/autoit][autoit][/autoit][autoit]

    ;Datum von DD.MM.YYYY nach YYYY/MM/DD umwandeln
    Func Date_German_2_AutoIt($conv_date)
    $conv_parts = StringSplit($conv_date, ".")
    Return $conv_parts[3] & "/" & $conv_parts[2] & "/" & $conv_parts[1]
    EndFunc ;==>Date_German_2_AutoIt

    [/autoit]

    Einmal editiert, zuletzt von ip_trainer (18. September 2009 um 12:06)

  • Hi,

    hier nun der Codeschnipsel für alle die das mal brauchen:

    MfG
    trainer

    [autoit]


    ;========================================== Includes und Definitionen =================================================================
    #include <GUIConstantsEx.au3>
    #include <Guilistview.au3>
    #include <ListViewConstants.au3>

    [/autoit][autoit][/autoit][autoit]

    ;========================================== GUI-Erzeugung =============================================================================
    $hGui = GUICreate("Nach deutschem Datum in einer Listview sortieren", 505, 200, 50, 50)
    ; Listview erstellen
    $hListView = GUICtrlCreateListView("Spalte 1|Spalte 2|Spalte 3|Spalte 4|Datum|", 0, 0, 505, 200, $LVS_SHOWSELALWAYS)
    $hLVHandle = GUICtrlGetHandle($hListView)
    _GUICtrlListView_SetColumn($hLVHandle, 0, "Spalte 1",100, 0)
    _GUICtrlListView_SetColumn($hLVHandle, 1, "Spalte 2", 100, 0)
    _GUICtrlListView_SetColumn($hLVHandle, 2, "Spalte 3", 100, 0)
    _GUICtrlListView_SetColumn($hLVHandle, 3, "Spalte 4", 100, 0)
    _GUICtrlListView_SetColumn($hLVHandle, 4, "Datum", 100, 1)
    ;Noch ein paar Daten einfügen
    GUICtrlCreateListViewItem("Test_1_a|Test_1_b|Test_1_c|Test_1_d|01.01.2008", $hListView)
    GUICtrlCreateListViewItem("Test_2_a|Test_2_b|Test_2_c|Test_2_d|02.01.2008", $hListView)
    GUICtrlCreateListViewItem("Test_3_a|Test_3_b|Test_3_c|Test_3_d|01.04.2008", $hListView)
    GUICtrlCreateListViewItem("Test_4_a|Test_4_b|Test_4_c|Test_4_d|13.01.2009", $hListView)
    GUICtrlCreateListViewItem("Test_5_a|Test_5_b|Test_5_c|Test_5_d|11.11.2010", $hListView)
    GUICtrlCreateListViewItem("Test_6_a|Test_6_b|Test_6_c|Test_6_d|15.03.2009", $hListView)
    GUICtrlCreateListViewItem("Test_7_a|Test_7_b|Test_7_c|Test_7_d|01.02.1999", $hListView)
    GUICtrlCreateListViewItem("Test_8_a|Test_8_b|Test_8_c|Test_8_d|02.01.2007", $hListView)
    _GUICtrlListView_RegisterSortCallBack($hLVHandle) ; damit man das Listview (mit Klick auf die Spaltenüberschrift) sortieren kann
    GUISetState(@SW_SHOW)

    [/autoit][autoit][/autoit][autoit]

    ; =========== Meldungen der GUI(s) abfangen =================
    While 1
    $nMsg = GUIGetMsg(1)
    Switch $nMsg[0]

    ;Nach Spaltenüberschrift sortieren
    Case $hListView

    ;Falls nach Datum sortiert werden soll
    If GUICtrlGetState($hListView) = 4 Then

    _GUICtrlListView_BeginUpdate($hLVHandle); Aktionen vor Benutzer verstecken
    Local $iCount = _GUICtrlListView_GetItemCount($hLVHandle) - 1 ; Anzahl der Listview-Einträge holen
    For $i = 0 To $iCount ; Schleife, um alle Listview-Einträge in sortierbares Datum umzuwandeln
    _GUICtrlListView_SetItemText($hLVHandle, $i, Date_German_2_AutoIt(_GUICtrlListView_GetItemText($hLVHandle, $i, 4)), 4)
    Next

    _GUICtrlListView_SortItems($hLVHandle, GUICtrlGetState($hListView));Einträge sortieren
    For $i = 0 To $iCount ; Schleife, um alle Listview-Einträge wieder ins das deutsche Format umzuwandeln
    _GUICtrlListView_SetItemText($hLVHandle, $i, Date_AutoIt_2_German(_GUICtrlListView_GetItemText($hLVHandle, $i, 4)), 4)
    Next

    _GUICtrlListView_EndUpdate($hLVHandle); Aktionen wieder sichtbar machen

    ;Bei anderen Spalten sparen wir uns das alles...
    Else
    _GUICtrlListView_SortItems($hLVHandle, GUICtrlGetState($hListView))
    EndIf

    [/autoit][autoit][/autoit][autoit]

    ;Programm beenden
    Case $GUI_EVENT_CLOSE
    _GUICtrlListView_UnRegisterSortCallBack($hLVHandle) ; Sortierroutine wieder de-registrieren
    Exit
    EndSwitch
    WEnd

    [/autoit][autoit][/autoit][autoit]

    ;========================================== Funktionen ================================================================================
    ;Datum von YYYY/MM/DD nach DD.MM.YYYY umwandeln
    Func Date_AutoIt_2_German($conv_date)
    $conv_parts = StringSplit($conv_date, "/")
    Return $conv_parts[3] & "." & $conv_parts[2] & "." & $conv_parts[1]
    EndFunc ;==>Date_AutoIt_2_German

    [/autoit][autoit][/autoit][autoit]

    ;Datum von DD.MM.YYYY nach YYYY/MM/DD umwandeln
    Func Date_German_2_AutoIt($conv_date)
    $conv_parts = StringSplit($conv_date, ".")
    Return $conv_parts[3] & "/" & $conv_parts[2] & "/" & $conv_parts[1]
    EndFunc ;==>Date_German_2_AutoIt

    [/autoit]
  • Das Umwandeln würde auch so gehen:

    Spoiler anzeigen
    [autoit]


    ;Datum von YYYY/MM/DD nach DD.MM.YYYY umwandeln
    dim $conv_parts
    $date = "2009/12/01"

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(1, "",Date_AutoIt_2_German($date))
    MsgBox(1, "",Date_AutoIt_from_German($conv_parts))
    Func Date_AutoIt_2_German($conv_date)
    $conv_parts = StringRegExpReplace($conv_date, "(\d{4})\/(\d{2})\/(\d{2})","$3.$2.$1")
    Return $conv_parts
    EndFunc ;==>Date_AutoIt_2_German

    [/autoit] [autoit][/autoit] [autoit]

    ;Datum von DD.MM.YYYY nach YYYY/MM/DD umwandeln
    Func Date_AutoIt_from_German($conv_date)
    $conv_parts = StringRegExpReplace($conv_date, "(\d{2})\.(\d{2})\.(\d{4})","$3/$2/$1")
    Return $conv_parts
    EndFunc ;==>Date_German_2_AutoIt

    [/autoit]


    Ich hab mich auch sehr lange mit Stringsplit gequält, dabei ists in vielen Fällen mit entsprechendem Pattern ein Einzeiler.
    Reguläre Ausdrücke sind hier ganz gut erklärt http://www.autoit.de/dokumentation_…gexp/regexp.htm