"Listview-UDF" oder wie man User zur Verzweiflung bringt

    • Offizieller Beitrag

    Ich bin gerade so richtig stinkig und damit es euch nicht auch so ergeht, will ich euch meinen Ärger nicht vorenthalten.

    Ich schreibe seit geraumer Zeit an einem recht umfangreichen Skript (bereits mehrere tausend Zeilen Code) und dort sind auch einige Listview enthalten.
    Bisher hatte ich mit der letzten AutoIt-Version gearbeitet, nun verwende ich die 3.3.8.0 und hier hat sich etwas Gravierendes getan, was mit keinem Wort in den Changes erwähnt wird:
    Die meisten UDF-Funktionen arbeiten ausschließlich mit der ID! Ein übergebenes Handle wird ignoriert.
    Das ist ja eine Perversion in sich, da die UDF in ihrer Funktion .._Create() ein Handle zurückgibt, dass nun für die weiteren Funktion fast nutzlos ist. Die notwendige ID erhält man aber nicht und muß sie sich per WinAPI-Funktion besorgen.

    Ich habe bald eine Stunde damit verbracht, diesen blöden Bug zu finden. Zumal ja nicht alle Funktionen betroffen sind. Einige verwenden ausschließlich das Handle. Völlig konfus diese UDF.


    Da doch öfter Fragen nach sinnvollen Aufgaben gestellt werden, was man denn skripten kann. Das wäre eine sehr nützliche Aufgabe, die Listview-UDF entbuggen und in eine AutoIt-konforme Gestalt gießen.
    Es ist mir ehrlich schleierhaft, wie dieses Gemurks in die offizielle AutoIt-Version übernommen werden konnte. :wacko:

  • Oh, hört sich nicht gut an.
    Könntest du mal ein Beispiel machen bei welcher Funktion dies so ist und mit welcher WinAPI-Funktion man sich das Handle dann holt.

    Hast du einfach mal dumm im englischen Forum nachgefragt, warum dies gemacht wurde :?:

    • Offizieller Beitrag

    Ich habe noch nicht alle Funktionen durchgetestet, hier ein paar, die die ich gerade beim Wickel habe und die mich zur Fehlersuche gezwungen haben:

    _GUICtrlListView_DeleteAllItems(NUR HANDLE)
    _GUICtrlListView_GetColumnCount(NUR ID)
    _GUICtrlListView_GetItemText(NUR ID)

    Bei den anderen habe ich noch nicht auf Ausschließlichkeit geprüft (habe ich auch nicht unbedingt Lust zu).
    Ich werde lieber zurückkehren direkt zu den _SendMessage - Funktionen (eigentlich sollte die Listview-UDF ja eine komfortable Behandlung dieser Funktion darstellen).

    Im EN-Forum nachfragen? - Da hast du aber mehr Resonanz, wenn du einen Stein ins Wasser wirfst. :whistling:

  • ... mit welcher WinAPI-Funktion man sich das Handle dann holt.


    GetDlgItem, bzw. GetDlgCtrlID ...

    Ich werde lieber zurückkehren direkt zu den _SendMessage - Funktionen (eigentlich sollte die Listview-UDF ja eine komfortable Behandlung dieser Funktion darstellen).


    U.a. deshalb nutze ich diese "UDFs" so gut wie nie. Ich mache es lieber alles selber wie beim Wichsen. Da weiß ich wenigstens was dabei herauskommt. :D


    Gruß
    Greenhorn


  • Verwendest du wirklich ein Handle in den Funktionen, das per IsHWnd erkannt wird? Das ist zwingend nötig.
    Die UDF-Funktionen müssen alle ein Handle akzeptieren. IDs sind ein Bonus, der in immer mehr Funktionen eingebaut wird, dabei können aber Bugs auftreten denke ich.

    • Offizieller Beitrag

    Ich erstelle generell alle Listview so:

    [autoit]

    $ID_LV = GuiCtrlCreateListview(..)
    ; Handle holen für UDF
    $hLV = GuiCtrlGetHandle($ID_LV)

    [/autoit]


    Und jetzt ist erstmalig dieses Phänomen aufgetreten, meine Listview wurden nicht geleert, weil meine ItemCount-Abfrage mit dem Handle nicht ausgeführt wurde. Doch bis ich das herausgefunden hatte war eine Stunde "Fehler"suche notwendig. Denn wer rechnet schon damit, dass ein bisher immer auf diesem Weg funktionierender Ablauf plötzlich versagt.

  • Ich erstelle generell alle Listview so:

    [autoit]

    $ID_LV = GuiCtrlCreateListview(..)
    ; Handle holen für UDF
    $hLV = GuiCtrlGetHandle($ID_LV)

    [/autoit]


    Und jetzt ist erstmalig dieses Phänomen aufgetreten, meine Listview wurden nicht geleert, weil meine ItemCount-Abfrage mit dem Handle nicht ausgeführt wurde. Doch bis ich das herausgefunden hatte war eine Stunde "Fehler"suche notwendig. Denn wer rechnet schon damit, dass ein bisher immer auf diesem Weg funktionierender Ablauf plötzlich versagt.


    Hmm bei mir klappt alles:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <GUIListView.au3>
    #include <Debug.au3>

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

    #Region - GUI Create

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

    GUICreate("test")
    $ID_LV = GUICtrlCreateListView("test", 10, 10)
    $hLV = GUICtrlGetHandle($ID_LV)

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

    GUICtrlCreateListViewItem("test0", $ID_LV)
    GUICtrlCreateListViewItem("test1", $ID_LV)
    GUICtrlCreateListViewItem("test2", $ID_LV)
    GUICtrlCreateListViewItem("test3", $ID_LV)
    GUICtrlCreateListViewItem("test4", $ID_LV)

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

    $s = StringFormat("%s\r\nItemCount: %i\r\nColCount %i\r\nItemText: %s", _
    _DebugBugReportEnv(), _
    _GUICtrlListView_GetItemCount($hLV), _
    _GUICtrlListView_GetColumnCount($hLV), _
    _GUICtrlListView_GetItemText($hLV, 1))

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

    GUICtrlCreateEdit($s, 10, 250, 300, 150)

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

    #EndRegion

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

    GUISetState(@SW_SHOW)

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

    #Region - GUI SelectLoop

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

    While 1
    $msg = GUIGetMsg()

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

    Select

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

    Case $msg = -3 ;$GUI_EVENT_CLOSE
    Exit

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

    EndSelect

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

    WEnd
    #EndRegion

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

    ; Start - Functions

    [/autoit]


    Ausgabe:

    Zitat

    AutoIt:3.3.8.0 AdminMode (Os:WIN_7/SP1/X64 OSLang:0409 MUILang:0000 Keyboard:00000407)
    ItemCount: 5
    ColCount 1
    ItemText: test1

    _GUICtrlListView_DeleteAllItems funktioniert übrigesn sowohl mit Handle als auch ID.

  • Code
    AutoIt:3.3.8.0 AdminMode   (Os:WIN_7/SP0A, v.1/X64   OSLang:0409 Keyboard:00000407)
    ItemCount: 5
    ColCount 1
    ItemText: test1

    Also bei mir funktioniert das Beispiel von progandy auch... (und ich hab' Service Pack 0, falls das irgendwas mit dem System zu tun hat)

  • bei mir funktioniert progandys Skript auch

    Zitat

    AutoIt:3.3.8.1 AdminMode (Os:WIN_7/SP1/X64 OSLang:0407)
    ItemCount: 5
    ColCount 1
    ItemText: test1