1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. smaster123

Beiträge von smaster123

  • _WM_NOTIFY - _GUICtrlListView_SortItems zu langsam

    • smaster123
    • 9. August 2019 um 09:17

    autoiter um _GUICtrlListView_SortItems nutzen zu können benötige ich _GUICtrlListView_RegisterSortCallBack(. Ohne Funktioniert das gar nicht.

    Oscar Ja, da hast du recht. Da ging es aber um eine andere Sortierung (Selbes Programm, andere Stelle :)).

    Ich habe das nun mit Hilfe deiner Ideen selbst gelöst.

    Ich ziehe das ganze von der Datenbank, direkt so sortiert, wie ich das brauche und spiele es im ListView ein. Durch eine Boolsche variable gebe ich mit ob True oder False und setze somit auch das häckchen :),

    Es ist zwar noch immer nicht ultra schnell, aber min 80% schneller als vorher :).

    Danke euch!

    Code
        Func _WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
        #forceref $hWnd, $iMsg, $wParam
        Local $hWndFrom, $iCode, $tNMHDR, $hWndListView
    
        $hWndListView = $ListView1
        If Not IsHWnd($ListView1) Then $hWndListView = GUICtrlGetHandle($ListView1)
    
        $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
        $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
        $iCode = DllStructGetData($tNMHDR, "Code")
    
        Switch $hWndFrom
            Case $hWndListView
                Switch $iCode
    
                    Case $LVN_COLUMNCLICK ; A column was clicked
                        Local $tInfo = DllStructCreate($tagNMLISTVIEW, $lParam)
    
    ;~                     ; Kick off the sort callback
    ;~                     _GUICtrlListView_BeginUpdate($ListView1)
    ;~                     _GUICtrlListView_SortItems($hWndFrom, DllStructGetData($tInfo, "SubItem"))
    ;~                     _GUICtrlListView_EndUpdate($ListView1)
                        ; No return value
    
                        SQLOPEN()
                        Local $iIndex
                        For $i = 0 To UBound($g_aRadio) - 1
                            If GUICtrlRead($g_aRadio[$i][0]) = 1 Then $iIndex = $i
                        Next
                        $getrecord = _MSSQL_GetRecord($sqlCon, "TabelleA", "*", "Order by " & $headItems[DllStructGetData($tInfo, "SubItem")][0] & " " & $sort)
                        SQLCLOSE()
    
                        If $sort = "asc" Then
                            updateListView(False, True, DllStructGetData($tInfo, "SubItem"), $HDF_SORTUP)
                            $sort = "desc"
                        ElseIf $sort = "desc" Then
                            updateListView(False, True, DllStructGetData($tInfo, "SubItem"), $HDF_SORTDOWN)
                            $sort = "asc"
                        EndIf
                        ;(......)
        EndFunc
    
    Func updateListView($autosize = true, $setformat = False, $column = 0, $format = 0)
    
        _GUICtrlListView_BeginUpdate($ListView1)
        _GUICtrlListView_DeleteAllItems($ListView1)
        _ArrayDelete($getrecord, 0)
        _GUICtrlListView_AddArray($ListView1, $getrecord)
    
    ;~     SORTIERPFEIL ENTFERNEN UND AUTOSIZE HEADER
        For $i = 0 To _GUICtrlListView_GetColumnCount($ListView1) - 1
            $aInfo = _GUICtrlListView_GetColumn($ListView1, $i)
            _GUICtrlListView_SetColumn($ListView1, $i, $aInfo[5])
            If $autosize = True Then _GUICtrlListView_SetColumnWidth($ListView1, $i, $LVSCW_AUTOSIZE_USEHEADER)
        Next
    ;~     SETZE SORTIERHÄCKCHEN WENN GEWÜNSCHT
        If $setformat = True Then
            $header = _GUICtrlListView_GetHeader($ListView1)
            $aFormat = _GUICtrlHeader_GetItemFormat($header, $column)
            _GUICtrlHeader_SetItemFormat($header, $column, BitXOR($aFormat, $format))
        EndIf
        _GUICtrlListView_EndUpdate($ListView1)
    
    EndFunc   ;==>updateListView
    Alles anzeigen
  • _WM_NOTIFY - _GUICtrlListView_SortItems zu langsam

    • smaster123
    • 8. August 2019 um 16:30

    Hey,

    danke für den Tipp, habe ich eingebaut - hat leider vom Gefühl her nicht wirklich geholfen :P...

    Sonst noch eine Idee?

    lg

  • _WM_NOTIFY - _GUICtrlListView_SortItems zu langsam

    • smaster123
    • 8. August 2019 um 15:08

    Hallo Zusammen,

    ich nutze in meinem Script eine ListView, welche ich durch _GUICtrlListView_RegisterSortCallBack($ListView1), GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY") und eine entsprechende _WM_NOTIFY Funktion sortierbar gemacht habe.

    Code
    Func _WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
        #forceref $hWnd, $iMsg, $wParam
        Local $hWndFrom, $iCode, $tNMHDR, $hWndListView
    
        $hWndListView = $ListView1
        If Not IsHWnd($ListView1) Then $hWndListView = GUICtrlGetHandle($ListView1)
    
        $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
        $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
        $iCode = DllStructGetData($tNMHDR, "Code")
    
        Switch $hWndFrom
            Case $hWndListView
                Switch $iCode
    
                    Case $LVN_COLUMNCLICK ; A column was clicked
                        Local $tInfo = DllStructCreate($tagNMLISTVIEW, $lParam)
                        _GUICtrlListView_SortItems($hWndFrom, DllStructGetData($tInfo, "SubItem"))
                        ;(.....)
    Alles anzeigen

    Die Zeile _GUICtrlListView_SortItems($hWndFrom, DllStructGetData($tInfo, "SubItem")) sorgt dafür, dass man die Daten nach den Headern auf/absteigend sortieren kann. Dies dann auch mit dem bekannten sortierhäkchen :). Allerdings ist diese Funktion seeeehr seeeehr langsam. aktuell habe ich ca 1000 zeilen im ListView. Hierbei benötigt die Funktion schon ca 2 Sekunden zum Sortieren. Am Ende werden es sicher um die 1500-2000 Zeilen sein.

    Hattet hierfür jemand eine Lösung? Mir ist wichtig, dass ich nach den Headern auf/absteigend sortieren kann und dies dann eben entsprechend durch dieses Häkchen angezeigt wird

    Danke und LG

    Bilder

    • pasted-from-clipboard.png
      • 907 Byte
      • 45 × 36
  • ListView Sortierungshäkchen entfernen

    • smaster123
    • 7. August 2019 um 15:31

    hahahahaha ja okay :D

    aber ich denke das ist auch noch nicht korrekt :O

    1. SQLOPEN()
    2. $getrecord = _MSSQL_GetRecord($sqlCon, "TabelleA", "*", "where " & $g_aRadio[$g_aRadio, $iIndex][1] & " like '%" & $suche & "%' Order by ID desc")
    3. ; If @error Then ..
    4. SQLCLOSE()

    da muss noch die variable raus :). So funktioniert es nun. Danke!!

  • ListView Sortierungshäkchen entfernen

    • smaster123
    • 7. August 2019 um 15:23

    Hallo autoiter,

    ich habe nun verscuht dein vorschlag mit den Radios einzubauen. leider klappt die SQL abfrage nicht wie gewünscht und ehrlich gesagt verstehe ich $g_aRadio[_ArraySearch($g_aRadio, 5)][1] nicht so ganz :D...

    ich bekomme folgende Meldung:

    "...blabla...\Inventar.au3" (784) : ==> Variable subscript badly formatted.:

    $getrecord = _MSSQL_GetRecord($sqlCon, "TabelleA", "*", "where " & $g_aRadio[_ArraySearch($g_aRadio, 5)][1] & " like '%" & $suche & "%' Order by ID desc")

    $getrecord = _MSSQL_GetRecord($sqlCon, "TabelleA", "*", "where " & $g_aRadio[^ ERROR

    lg

  • ListView Sortierungshäkchen entfernen

    • smaster123
    • 7. August 2019 um 13:36

    Hallo ihr zwei,

    autoiter Dein vorschlag hat geholfen und war genau das was ich gesucht habe, Danke!

    Oscar Ich hole die Daten Sortiert von der Datenbank, Richtig. Dadurch sind sie nach der eindeutigen ID sortiert und man sieht immer zuerst das neuste. Trotzdem habe ich _GUICtrlListView_RegisterSortCallBack($ListView1) eingebaut, damit man die Daten über einen Klick im Header bei bedarf nach etwas anderem sortieren kann. Das Problem war ja eben nur, dass das Sortierhäkchen bei einem erneuten befüllen des ListView nicht verschwunden ist, was ich nun mit tt]_GUICtrlListView_RegisterSortCallBack($ListView1)[/tt] beheben konnte. Auch dir danke für die hilfe.

    lg

  • ListView Sortierungshäkchen entfernen

    • smaster123
    • 7. August 2019 um 13:06

    Hallo autoiter und Oscar ,

    das sortieren ist bei mir doch gar nicht notwendig, ich hole die Daten schon sortiert von der Datenbank:

    If GUICtrlRead($Radio1) = 1 Then $getrecord = _MSSQL_GetRecord($sqlCon, "TabelleA", "*", "where typ like '%" & $suche & "%' Order by ID desc")

    das Order by ID desc bedeutet, dass es nach ID absteigend sortiert abgeholt wird. Deshalb hatte ich anfangs gar kein sortieren drin.

    Leider hilft keiner von euren Vorschlägen bei dem eigentlichen Problem :P

    Zitat von @autoiter

    Warum du _GUICtrlListView_BeginUpdate und _GUICtrlListView_EndUpdate da brauchst, damit die Beschriftung nicht verschwindet weiß ich auch nicht.

    Das war ein seltsames verhalten. Ich habe GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY")  eingebaut, wodurch ich die ListView klickbar gemacht habe und die Daten auch änderbar gemacht habe. Habe ich einen Wert gedoppelklickt, den Wert angepasst und bestätigt wurde eine erneute Suche ausgeführt. Daraufhin sind die Header der Listview unsichtbar geworden (warum auch immer). Sichtbar wurden sie wieder, wenn man mit der Maus darüber gefahren ist. Das Update hat dem abholfe geschaffen. Ich habe sie aber nun wie von dir empfohlen platziert und das funktioniert auch.

    lg

  • ListView Sortierungshäkchen entfernen

    • smaster123
    • 7. August 2019 um 08:31

    Hey autoiter

    das ist schon einmal eine gute Idee, leider sortiert es dann eben noch einmal. Dadurch wirkt das Tool sehr träge -> Ich holde die Daten von der Datenbank direkt absteigend sortiert. Durch GUICtrlListView_SortItems($idListView, -1) wird es dann wieder aufsteigend sortiert. Nun könnte ich die Daten zwar auch aufsteigend sortiert von der DB holen und dann durch GUICtrlListView_SortItems($idListView, -1) wieder absteigend sortieren das wäre eine Möglichkeit, nur leider stehen die Daten dann erst einmal unsortiert 1-2Sek im ListView bevor sie umsortiert werden (der Befehl ist wohl nicht so schnell bei ~500 einträgen (am ende werden es noch mehr einträge).

    Code
    Func suchen()
        $suche = GUICtrlRead($Input1)
        SQLOPEN()
        If GUICtrlRead($Radio1) = 1 Then $getrecord = _MSSQL_GetRecord($sqlCon, "TabelleA", "*", "where typ like '%" & $suche & "%' Order by ID desc")
        If GUICtrlRead($Radio2) = 1 Then $getrecord = _MSSQL_GetRecord($sqlCon, "TabelleA", "*", "where stockwerk like '%" & $suche & "%' Order by ID desc")
        If GUICtrlRead($Radio3) = 1 Then $getrecord = _MSSQL_GetRecord($sqlCon, "TabelleA", "*", "where bauteil like '%" & $suche & "%' Order by ID desc")
        If GUICtrlRead($Radio4) = 1 Then $getrecord = _MSSQL_GetRecord($sqlCon, "TabelleA", "*", "where zimmer like '%" & $suche & "%' Order by ID desc")
        If GUICtrlRead($Radio5) = 1 Then $getrecord = _MSSQL_GetRecord($sqlCon, "TabelleA", "*", "where buero like '%" & $suche & "%' Order by ID desc")
        If GUICtrlRead($Radio6) = 1 Then $getrecord = _MSSQL_GetRecord($sqlCon, "TabelleA", "*", "where abteilung like '%" & $suche & "%' Order by ID desc")
        If GUICtrlRead($Radio7) = 1 Then $getrecord = _MSSQL_GetRecord($sqlCon, "TabelleA", "*", "where benutzer like '%" & $suche & "%' Order by ID desc")
        If GUICtrlRead($Radio8) = 1 Then $getrecord = _MSSQL_GetRecord($sqlCon, "TabelleA", "*", "where hersteller like '%" & $suche & "%' Order by ID desc")
        If GUICtrlRead($Radio9) = 1 Then $getrecord = _MSSQL_GetRecord($sqlCon, "TabelleA", "*", "where model like '%" & $suche & "%' Order by ID desc")
        If GUICtrlRead($Radio10) = 1 Then $getrecord = _MSSQL_GetRecord($sqlCon, "TabelleA", "*", "where inventarname like '%" & $suche & "%' Order by ID desc")
        If GUICtrlRead($Radio11) = 1 Then $getrecord = _MSSQL_GetRecord($sqlCon, "TabelleA", "*", "where serialnummer like '%" & $suche & "%' Order by ID desc")
        If GUICtrlRead($Radio12) = 1 Then $getrecord = _MSSQL_GetRecord($sqlCon, "TabelleA", "*", "where mac like '%" & $suche & "%' Order by ID desc")
        If GUICtrlRead($Radio13) = 1 Then $getrecord = _MSSQL_GetRecord($sqlCon, "TabelleA", "*", "where hinweise like '%" & $suche & "%' Order by ID desc")
        If GUICtrlRead($Radio14) = 1 Then $getrecord = _MSSQL_GetRecord($sqlCon, "TabelleA", "*", "where telearbeit like '%" & $suche & "%' Order by ID desc")
    
    
        _GUICtrlListView_DeleteAllItems($ListView1)
        _ArrayDelete($getrecord, 0)
        _GUICtrlListView_AddArray($ListView1, $getrecord)
    ;~             EndIf
        SQLCLOSE()
        _GUICtrlListView_SetColumnWidth($ListView1, 0, $LVSCW_AUTOSIZE_USEHEADER)
        _GUICtrlListView_SetColumnWidth($ListView1, 1, $LVSCW_AUTOSIZE_USEHEADER)
        _GUICtrlListView_SetColumnWidth($ListView1, 2, $LVSCW_AUTOSIZE_USEHEADER)
        _GUICtrlListView_SetColumnWidth($ListView1, 3, $LVSCW_AUTOSIZE_USEHEADER)
        _GUICtrlListView_SetColumnWidth($ListView1, 4, $LVSCW_AUTOSIZE_USEHEADER)
        _GUICtrlListView_SetColumnWidth($ListView1, 5, $LVSCW_AUTOSIZE_USEHEADER)
        _GUICtrlListView_SetColumnWidth($ListView1, 6, $LVSCW_AUTOSIZE_USEHEADER)
        _GUICtrlListView_SetColumnWidth($ListView1, 7, $LVSCW_AUTOSIZE_USEHEADER)
        _GUICtrlListView_SetColumnWidth($ListView1, 8, $LVSCW_AUTOSIZE_USEHEADER)
        _GUICtrlListView_SetColumnWidth($ListView1, 9, $LVSCW_AUTOSIZE_USEHEADER)
        _GUICtrlListView_SetColumnWidth($ListView1, 10, $LVSCW_AUTOSIZE_USEHEADER)
        _GUICtrlListView_SetColumnWidth($ListView1, 11, $LVSCW_AUTOSIZE_USEHEADER)
        _GUICtrlListView_SetColumnWidth($ListView1, 12, $LVSCW_AUTOSIZE_USEHEADER)
        _GUICtrlListView_SetColumnWidth($ListView1, 13, $LVSCW_AUTOSIZE_USEHEADER)
        _GUICtrlListView_SetColumnWidth($ListView1, 14, $LVSCW_AUTOSIZE_USEHEADER)
    
    ;~ OHNE DIESE ZEILEN VERSCHWINDET DIE SPALTENBESCHRIFTUNG BEIM UPDATE EINES WERTES
        _GUICtrlListView_BeginUpdate($ListView1)
        _GUICtrlListView_EndUpdate($ListView1)
    
    
        _GUICtrlListView_SortItems($ListView1, -1)
    EndFunc   ;==>suchen
    Alles anzeigen

    lg

  • ListView Sortierungshäkchen entfernen

    • smaster123
    • 6. August 2019 um 08:13

    Hallo Zusammen,

    ich habe für unsere IT ein Inventarisierungstool in AutoIT geschrieben, welches die Daten direkt in eine MSSQL Datenbank schreibt/Liest. Das Tool besitzt 3 Tabs - Suchen (um auf der Datenbank nach Datensätzen zu suchen und diese ggf abzuändern), Hardware intern (um neue Datensätze hinzuzufügen) und Telearbeit (um neue Datensätze hinzuzufügen). Soviel zu der grundlegenden Funktion.

    Der Suchen Tab sieht wie folgt aus:

    pasted-from-clipboard.png

    Das Problem ist das Sortierhäkchen bei Model

    ich habe mit

    _GUICtrlListView_RegisterSortCallBack($ListView1)

    die ListView sortierbar gemacht, was auch gut funktioniert. Wechsel ich allerdings in einen anderen Tab (HARDWARE INTERN oder TELEARBEIT) und wieder zurück auf SUCHEN wird die liste neu befüllt (da ich ja evtl neue Sätze hinzugefügt habe und diese auch angezeigt haben möchte.). Die Liste wird dann automatisch wieder nach der ID absteigend sortiert. Das Sortierhäkchen bleibt aber bei model(oder einem anderen wert nach dem ich sortiert habe) bestehen.

    Das ist zwar kein Problem, sieht aber unschön aus. Die Frage ist also - Hat einer eine Idee, wie ich dieses Sortierhäkchen entfernen kann?

    Ich hoffe ich konnte mein Problem gut erläutern :D

    Vielen Dank schon mal

    ~smaster

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™