ListView - 3 Probleme: ArrayDisplay / Drag & Drop / erweiterte Stile

  • Hi,

    bei dem folgenden Skript habe ich 2 Probleme:

    1. Wenn ich das Skript direkt aus SciTE starte, kann ich keine Dateien per Drag & Drop aus dem Explorer auf die GUI ziehen.

    Wenn ich es aus dem Explorer starte funktioniert es.

    Woran kann das liegen?

    2. Wenn ich Dateien per Drag & Drop aus dem Explorer auf die GUI ziehe, funktioniert _ArrayDisplay nicht (reagiert nicht mehr). Warum?


    • Offizieller Beitrag

    zu 1.

    Es funktioniert, sicher auch bei dir - du siehst es nur nicht, weil du einen Fehler eingebaut hast: Verwende NIE ArrayDisplay/MsgBox o.ä. in einer GuiRegisterMsg-Funktion! Das führt dann zu solch undefinierten Zuständen.

    Ändere mal deine Callbackroutine so:

    Dann siehst du, dass alles funktioniert.

    2. resultiert aus 1.

  • 1. Wenn ich das Skript direkt aus SciTE starte, kann ich keine Dateien per Drag & Drop aus dem Explorer auf die GUI ziehen.

    Wenn ich es aus dem Explorer starte funktioniert es.

    Woran kann das liegen?

    Auf die GUI ziehen geht ganz sicher in keinem Fall, da du ja in On_WM_DROPFILES prüfst, ob die Maustaste über dem Listview losgelassen wurde und nur dann verarbeitest du die Message, was übrigens so oder so falsch ist, da zumindest _WinAPI_DragFinish in jedem Fall vor Verlassen der Funktion ausgeführt werden sollte.

    2. Wenn ich Dateien per Drag & Drop aus dem Explorer auf die GUI ziehe, funktioniert _ArrayDisplay nicht (reagiert nicht mehr). Warum?

    Wenn du eine Funktion mit GUIRegisterMsg als Message-Handler registrierst, dann darfst du darin keine blockierenden Funktionen wie MsBox oder _ArrayDisplay ausführen, denn dadurch stauen sich die noch nicht verarbeiteten Messages auf und irgendwann geht dann nichts mehr. Solche Funktionen sollten immer so schnell es geht wieder verlassen werden.

    Global $idListview = GUICtrlCreateListView("Test", 10, 10, 400, 600, BitOR($LVS_SHOWSELALWAYS, $LVS_NOSORTHEADER), BitOR($LVS_EX_DOUBLEBUFFER, $WS_EX_CLIENTEDGE))
    GUICtrlSendMsg($idListview, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_FULLROWSELECT, $LVS_EX_FULLROWSELECT)
    GUICtrlSendMsg($idListview, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES)

    Hier solltest du dich mal entscheiden, ob du die ExSyles gleich bei GUICtrlCreateListView mit setzt, oder danach mit GUICtrlSendMsg... und 2x GUICtrlSendMsg dafür ausführen, ist auch nicht schön.

    Das macht man dann besser so:

    Global $iExMask = BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES) ; Specifies which styles in $iExStyle are to be affected.

    Global $iExStyle = $iExMask

    GUICtrlSendMsg($idListview, $LVM_SETEXTENDEDLISTVIEWSTYLE, $iExStyle, $iExMask)

    Hier mal eine korrigierte Version deines Scripts, mit dem es auch bei dir funktionieren sollte. Dropst du die Files auf das GUI, werden sie nur mit _ArrayDisplay angezeigt, dropst du sie über das Listview, werden sie als Item im Listview hinzugefügt und mit _ArrayDisplay angezeigt.

    Dafür gibt es übrigens eine gute UDF (im letzten Post, mit 2 Bsp.): https://www.autoitscript.com/forum/topic/13…dragdrop-event/

    6 Mal editiert, zuletzt von Bitnugger (30. Dezember 2020 um 21:33) aus folgendem Grund: Fehler mit ExStyle korrigiert und _WinAPI_ChangeWindowMessageFilterEx hinzugefügt

  • Danke euch beiden für die ausführlichen Erklärungen:).

    Leider funktioniert trotzdem nicht alles:(

    BugFix

    • zu 1. dafür habe ich _ArrayDisplay deaktiviert. Trotzdem funktioniert es nicht
    • zu 2. habe ich verstanden, funktioniert dann auch

    Bitnugger

    • zu 1. Ich möchte die Dateien auf die ListView und nicht auf die GUI ziehen. Habe ich oben falsch beschrieben. Leider funktioniert dein geändertes Beispiel trotzdem nicht.
    • zu 2. habe ich verstanden, funktioniert dann auch
    • zu den ListView Styles. Dies übernehme ich schon immer von alten Skripten. Ich hab mal beide Methoden nebeneinander gestellt. Wieso sehen diese beiden Listview anders aus?

    Kann es sein, dass es besser ist, wenn die Styles im Nachhinein gesetzt werden?

    https://www.autoitscript.com/forum/topic/19…comment=1433630


    Hat es mit den Rechten in Win 10 zu tun, dass es mit dem Drag & Drop nicht funktioniert?

  • Es wird nicht mal die Funktion "On_WM_DROPFILES" aufgerufen:thumbdown:.

    Im Post 4 habe ich noch was zu den ListView Styles ergänzt. Ich weiß nicht, ob du dies vorhin gesehen hast.

  • Ich weiß nicht, ob das was ausmacht, aber beim ersten ListView hast du "$WS_EX_CLIENTEDGE" zweimal drin. ;)

    Global $idListview = GUICtrlCreateListView("Test", 10, 10, 200, 200, BitOR($LVS_SHOWSELALWAYS, $LVS_NOSORTHEADER), BitOR($LVS_EX_DOUBLEBUFFER, $WS_EX_CLIENTEDGE, $LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES, $WS_EX_CLIENTEDGE))

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Kann es sein, dass es besser ist, wenn die Styles im Nachhinein gesetzt werden?

    https://www.autoitscript.com/forum/topic/19…comment=1433630

    Im nächsten Posting wird das von Melba23 bestätigt.

    https://www.autoitscript.com/forum/topic/19…comment=1433632

    Zudem benutzt du "GUICtrlSendMsg()" zum Setzen des exStyles. Versuch doch das von Melba23 empfohlene "_GUICtrlListView_SetExtendedListViewStyle()".

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Professor Bernd

    Glaube nicht, dass ich den exStyle überschreibe.

    Danke für das entdecken des doppelten Eintrags. Allerdings ist dies wohl egal.

    Habe bereits _GUICtrlListView_SetExtendedListViewStyle verwendet. Dies ändert nicht, da _GUICtrlListView_SetExtendedListViewStyle auch GUICtrlSendMsg verwendet.

  • Glaube nicht, dass ich den exStyle überschreibe.

    Warum? 8o

    Was glaubst du, was die Anweisung tut?

    Code
    GUICtrlSendMsg($idListview2, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES)

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Habe bereits _GUICtrlListView_SetExtendedListViewStyle verwendet. Dies ändert nicht, da _GUICtrlListView_SetExtendedListViewStyle auch GUICtrlSendMsg verwendet.

    Wie sieht denn deine Anweisung aus?

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • AutoIt
    _GUICtrlListView_SetExtendedListViewStyle($idListview3, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT))
  • Eigentlich wollte ich auf _GUICtrlListView_SetExtendedListViewStyle bzw. GUICtrlSendMsg verzichten.

    Aber scheinbar kommen da dann unterschiedliche Ergebnisse raus. Ich würde es nun so machen.

    Was meint ihr?

    BugFix

    Bitnugger

    Professor Bernd

  • Tweaky 30. Dezember 2020 um 18:30

    Hat den Titel des Themas von „ListView - 2 Probleme: ArrayDisplay und Drag & Drop“ zu „ListView - 3 Probleme: ArrayDisplay / Drag & Drop / erweiterte Stile“ geändert.
  • Aber scheinbar kommen da dann unterschiedliche Ergebnisse raus.

    Da du leider nicht sagst, welche Unterschiede du meinst, kann ich nur meine Glaskugel auspacken :Glaskugel:und raten, dass du den Rahmen meinst. Falls ja, liegt es daran, dass Windows scheinbar beim Erstellen des ListViews die $WS_EX Styles den $LVS_EX Styles vorzieht. Wenn du ein ListView erstellst mit $LVS_EX_GRIDLINES macht Windows daraus $WS_EX_DLGMODALFRAME und beim späteren Setzen wird $LVS_EX_GRIDLINES ignoriert.

    Versuch mal das:

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • In Zeile 22 habe ich den exStyle ausgelesen, in $OldLvwExStyle gespeichert und dann im nächsten BitOr dazu gegeben. Um den Rahmen zu erhalten, braucht man das scheinbar nicht. Dann genügt:

    Code
    Global $idListview3 = GUICtrlCreateListView("Test", 10, 230, 200, 200, _
      BitOR($LVS_SHOWSELALWAYS, $LVS_NOSORTHEADER), BitOR($LVS_EX_DOUBLEBUFFER, $WS_EX_CLIENTEDGE, $WS_EX_DLGMODALFRAME))
    _GUICtrlListView_SetExtendedListViewStyle($idListview3, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES))

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Habe nochwas entdeckt. Wenn du beim Erstellen des ListViews $LVS_EX_GRIDLINES benutzt, wird das 2x ausgewertet:

    1. Die Gridlines werden gezeichnet.
    2. Der Rahmen wird verändert.

    Kannst du ganz einfach testen, indem du es mal beim ListView1 wegmachst.

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Was meint ihr?

    Ich habe mir das mit den ExStyles gerade noch mal genauer angeschaut und auch gelesen, was Melba23 dazu geschrieben hat.

    Zitat von @Melba23

    You should always use _GUICtrlListView_SetExtendedListViewStyle to set extended ListView styles. Why? Because some of the values are the same as for $WS_EX_* styles and if you add them in the creation command Windows always applies the $WS_EX styles rather than the $LVS_EX ones.


    Sie sollten immer _GUICtrlListView_SetExtendedListViewStyle verwenden, um erweiterte ListView-Stile festzulegen. Warum? Da einige der Werte mit denen für $WS_EX_* -Stile identisch sind und Sie sie im Erstellungsbefehl hinzufügen, wendet Windows immer die $WS_EX-Stile anstelle der $LVS_EX-Stile an.

    Hier die ExStyles mit identischen Werten:

    Code
    $WS_EX_ACCEPTFILES   = $LVS_EX_HEADERDRAGDROP
    $WS_EX_CONTEXTHELP   = $LVS_EX_INFOTIP
    $WS_EX_DLGMODALFRAME = $LVS_EX_GRIDLINES
    $WS_EX_TOPMOST       = $LVS_EX_TRACKSELECT
    $WS_EX_TRANSPARENT   = $LVS_EX_FULLROWSELECT
    $WS_EX_WINDOWEDGE    = $LVS_EX_FLATSB

    Fazit: $WS_EX-Styles mit GUICtrlCreateListView und $LVS_EX-Styles mit _GUICtrlListView_SetExtendedListViewStyle setzen.