• Offizieller Beitrag

    Hi, Oscar.

    Irgendwie will das Automatische setzen der Spaltenbreiten der Listviews nicht richtig.
    Wenn man z.B. den Header des nicht aktiven Listviews verändert funzt das resizen erst wenn man die
    Maustaste wieder losläßt. Das Resizen der Spalten ist auch ziehmlich ruckelich. Ich hab da mal einen
    Lösungsvorschlag für dich. Dabei funzt das Resizen auch wenn man den Header des
    nicht aktiven Listviews ändert. Ist auch ein bischen performanter. Schau es dir mal an,
    wenn es dir zusagt kannst du es ja in dein Script integrieren.

    Spoiler anzeigen
    [autoit]

    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $iwParam
    Local $tNMHDR, $hWndFrom, $tInfo, $iItem, $sText, $sPath, $sExt
    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, 'hWndFrom'))
    Switch $hWndFrom
    case _GUICtrlListView_GetHeader($ahLV[0])
    Switch DllStructGetData($tNMHDR, 'Code')
    Case -321
    _CheckLVColWidth(0)
    EndSwitch
    case _GUICtrlListView_GetHeader($ahLV[1])
    Switch DllStructGetData($tNMHDR, 'Code')
    Case -321
    _CheckLVColWidth(1)
    EndSwitch
    Case GUICtrlGetHandle($ahLV[0])
    Switch DllStructGetData($tNMHDR, 'Code')
    Case $NM_DBLCLK
    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
    $iItem = DllStructGetData($tInfo, 'Index')
    $sText = _GUICtrlListView_GetItemText($ahLV[0], $iItem, 0)
    Switch $sText
    Case ''
    ; nothing
    Case '..'
    $sPath = StringRegExpReplace(GUICtrlRead($ahPath[0]), '(.+\\).+\\', '$1')
    GUICtrlSetData($ahPath[0], $sPath)
    _CreateListViewItems($ahLV[0], $sPath)
    Case Else
    $sExt = _GUICtrlListView_GetItemText($ahLV[0], $iItem, 1)
    If $sExt <> '' Then $sExt = '.' & $sExt
    $sPath = GUICtrlRead($ahPath[0]) & $sText
    Switch $sExt
    Case '.<DIR>'
    $sPath &= '\'
    GUICtrlSetData($ahPath[0], $sPath)
    _CreateListViewItems($ahLV[0], $sPath)
    Case Else
    ShellExecute($sPath & $sExt)
    EndSwitch
    EndSwitch
    Case $NM_SETFOCUS
    $iActiveLV = 0
    $sOldSelItems = '|'
    GUICtrlSetBkColor($ahPath[0], 0x005599)
    GUICtrlSetColor($ahPath[0], 0xFFFF22)
    GUICtrlSetBkColor($ahPath[1], 0xEEEEEE)
    GUICtrlSetColor($ahPath[1], 0x000000)
    EndSwitch
    Case GUICtrlGetHandle($ahLV[1])
    Switch DllStructGetData($tNMHDR, 'Code')
    Case $NM_DBLCLK
    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
    $iItem = DllStructGetData($tInfo, 'Index')
    $sText = _GUICtrlListView_GetItemText($ahLV[1], $iItem, 0)
    Switch $sText
    Case ''
    ; nothing
    Case '..'
    $sPath = StringRegExpReplace(GUICtrlRead($ahPath[1]), '(.+\\).+\\', '$1')
    GUICtrlSetData($ahPath[1], $sPath)
    _CreateListViewItems($ahLV[1], $sPath)
    Case Else
    $sExt = _GUICtrlListView_GetItemText($ahLV[1], $iItem, 1)
    If $sExt <> '' Then $sExt = '.' & $sExt
    $sPath = GUICtrlRead($ahPath[1]) & $sText
    Switch $sExt
    Case '.<DIR>'
    $sPath &= '\'
    GUICtrlSetData($ahPath[1], $sPath)
    _CreateListViewItems($ahLV[1], $sPath)
    Case Else
    ShellExecute($sPath & $sExt)
    EndSwitch
    EndSwitch
    Case $NM_SETFOCUS
    $iActiveLV = 1
    $sOldSelItems = '|'
    GUICtrlSetBkColor($ahPath[1], 0x005599)
    GUICtrlSetColor($ahPath[1], 0xFFFF22)
    GUICtrlSetBkColor($ahPath[0], 0xEEEEEE)
    GUICtrlSetColor($ahPath[0], 0x000000)
    EndSwitch
    EndSwitch
    $tNMHDR = ''
    $tInfo = ''
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

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

    Func _CheckLVColWidth($iLV)
    For $i = 0 To 4
    _GUICtrlListView_SetColumnWidth($ahLV[1 - $iLV], $i, _GUICtrlListView_GetColumnWidth($ahLV[$iLV], $i))
    Next
    EndFunc ;==>_CheckLVColWidth

    [/autoit]

    Edit: Was hällst du davon wenn man die Reihenfolge der ListviewSpalten frei verändern kann?
    Ich fände es praktisch wenn man selber bestimmern kann, welche Informationen man an welcher Stelle angezeigt bekommt.

    • Offizieller Beitrag

    Oh verdammt! Da habe ich eine falsche Version wiederhergestellt. Den Fehler mit dem ändern des nicht aktiven Listviews hatte ich schon längst behoben. :pinch:
    Das war bloss ein Denkfehler, aber ich hatte danach noch an einer anderen Funktion rumprobiert und weil das nicht klappte, hatte ich die alte Version wiederhergestellt und nicht mehr daran gedacht, dass da noch der Fehler mit der Spaltenbreite drin war. :rolleyes:

    Zum Thema "Reihenfolge der Listviewspalten frei ändern": Da müsste ich mein ganzes Konzept (alles basiert auf eine feste Spaltenreihenfolge) über den Haufen werfen. Ob ich das einbauen werde, bleibt abzuwarten. Muss ich mir erstmal einen Plan über die Größe der Änderungen machen.

  • Die Listview hat schon die nötige Funktionalität, um die Spaltenreihenfolge zu ändern. Der Spaltenindex bleibt dabei erhalten: _GUICtrlListView_SetColumnOrder(Array)

    • Offizieller Beitrag

    Die abfrage von $NM_CUSTOMDRAW ist alles andere als effektiv. Diese Notify wird zu oft ausgeführt.
    Jedes angezeigte Listviewitem sendet 1 mal $NM_CUSTOMDRAW und das bei beiden Listviews gleichzeitig.
    D.H. Wenn sich die Spaltenbreite des 1 Listviews ändert, wird beim setzen der Spaltenbreite des andere
    Listviews auch für jedes Item $NM_CUSTOMDRAW ausgelöst.
    Wenn du die Notify's $HDN_ITEMCHANGEDW oder $HDN_ITEMCHANGINGW des Headers abfragst
    wird die REsizefunktion weitaus weniger ausgeführt als bisher.

    Hab das mal eben mit dem Code abgetestet:

    Spoiler anzeigen
    [autoit]

    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local Static $Count
    Local Static $Count2
    #forceref $hWnd, $iMsg, $iwParam
    Local $tNMHDR, $hWndFrom, $tInfo, $iItem, $sText, $sPath, $sExt
    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, 'hWndFrom'))
    Switch $hWndFrom
    Case _GUICtrlListView_GetHeader($ahLV[0])
    Switch DllStructGetData($tNMHDR, 'Code')
    Case -321
    _CheckLVColWidth(0)
    ConsoleWrite("$HDN_ITEMCHANGEDW :" & $Count2 & @CRLF)
    $Count2 += 1
    EndSwitch
    Case _GUICtrlListView_GetHeader($ahLV[1])
    Switch DllStructGetData($tNMHDR, 'Code')
    Case -321
    _CheckLVColWidth(1)
    ConsoleWrite("$HDN_ITEMCHANGEDW :" & $Count2 & @CRLF)
    $Count2 += 1
    EndSwitch
    Case GUICtrlGetHandle($ahLV[0])
    Switch DllStructGetData($tNMHDR, 'Code')
    Case $NM_Customdraw
    ConsoleWrite("NM_CUSTOMDRAW " & $Count & @CRLF)
    $Count += 1
    Case $NM_DBLCLK
    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
    $iItem = DllStructGetData($tInfo, 'Index')
    $sText = _GUICtrlListView_GetItemText($ahLV[0], $iItem, 0)
    Switch $sText
    Case ''
    ; nothing
    Case '..'
    $sPath = StringRegExpReplace(GUICtrlRead($ahPath[0]), '(.+\\).+\\', '$1')
    GUICtrlSetData($ahPath[0], $sPath)
    _CreateListViewItems($ahLV[0], $sPath)
    Case Else
    $sExt = _GUICtrlListView_GetItemText($ahLV[0], $iItem, 1)
    If $sExt <> '' Then $sExt = '.' & $sExt
    $sPath = GUICtrlRead($ahPath[0]) & $sText
    Switch $sExt
    Case '.<DIR>'
    $sPath &= '\'
    GUICtrlSetData($ahPath[0], $sPath)
    _CreateListViewItems($ahLV[0], $sPath)
    Case Else
    ShellExecute($sPath & $sExt)
    EndSwitch
    EndSwitch
    Case $NM_SETFOCUS
    $iActiveLV = 0
    $sOldSelItems = '|'
    GUICtrlSetBkColor($ahPath[0], 0x005599)
    GUICtrlSetColor($ahPath[0], 0xFFFF22)
    GUICtrlSetBkColor($ahPath[1], 0xEEEEEE)
    GUICtrlSetColor($ahPath[1], 0x000000)
    EndSwitch
    Case GUICtrlGetHandle($ahLV[1])
    Switch DllStructGetData($tNMHDR, 'Code')
    Case $NM_Customdraw
    ConsoleWrite("NM_CUSTOMDRAW " & $Count & @CRLF)
    $Count += 1
    Case $NM_DBLCLK
    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
    $iItem = DllStructGetData($tInfo, 'Index')
    $sText = _GUICtrlListView_GetItemText($ahLV[1], $iItem, 0)
    Switch $sText
    Case ''
    ; nothing
    Case '..'
    $sPath = StringRegExpReplace(GUICtrlRead($ahPath[1]), '(.+\\).+\\', '$1')
    GUICtrlSetData($ahPath[1], $sPath)
    _CreateListViewItems($ahLV[1], $sPath)
    Case Else
    $sExt = _GUICtrlListView_GetItemText($ahLV[1], $iItem, 1)
    If $sExt <> '' Then $sExt = '.' & $sExt
    $sPath = GUICtrlRead($ahPath[1]) & $sText
    Switch $sExt
    Case '.<DIR>'
    $sPath &= '\'
    GUICtrlSetData($ahPath[1], $sPath)
    _CreateListViewItems($ahLV[1], $sPath)
    Case Else
    ShellExecute($sPath & $sExt)
    EndSwitch
    EndSwitch
    Case $NM_SETFOCUS
    $iActiveLV = 1
    $sOldSelItems = '|'
    GUICtrlSetBkColor($ahPath[1], 0x005599)
    GUICtrlSetColor($ahPath[1], 0xFFFF22)
    GUICtrlSetBkColor($ahPath[0], 0xEEEEEE)
    GUICtrlSetColor($ahPath[0], 0x000000)
    EndSwitch
    EndSwitch
    $tNMHDR = ''
    $tInfo = ''
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

    [/autoit]

    Ist schon heftig wenn bei einem resizen einer Spalte 500-2000 mal die Funktion _CheckLVColWidth ausgeführt wird.
    Voralledingen wird auch bei jedem Verzeichniswechsel ständig _CheckLVColWidth ausgeführt. Für jeden Listvieweintrag 1 mal.

    • Offizieller Beitrag

    Die Listview hat schon die nötige Funktionalität, um die Spaltenreihenfolge zu ändern. Der Spaltenindex bleibt dabei erhalten: _GUICtrlListView_SetColumnOrder(Array)

    Wenn der Index erhalten bleibt, brauch ich ja an meinen Funktionen nichts verändern!? Na, dann ist das kein Problem. Danke! Wieder was gelernt. :)

    Raupi : Ok, Du hast mich überzeugt. Also wird $NM_CUSTOMDRAW doch nicht nur beim ändern der Spaltenbreite ausgelöst!? Auf meinem schnellen Rechner hier fiel das gar nicht so auf, aber als ich das auf meinem Notebook getestet habe...
    Also nochmal ein Update (Post #1).

    • Offizieller Beitrag
    Zitat

    Raupi : Ok, Du hast mich überzeugt. Also wird $NM_CUSTOMDRAW doch nicht nur beim ändern der Spaltenbreite ausgelöst!?

    Für was diese Notify gut ist, sagt doch schon der Name :D
    Diese Notify wird immer gesendet wenn ein Item neu gezeichnet werden soll/muß.
    Dabei kannst du deine eigene "Zeichenroutine" ausführen. Siehe lie ListviewUDF von BugFix.

    • Offizieller Beitrag

    Hi, Oscar.

    Kleiner Bug oder fehlendes Feature. :D
    Beim Wechsel der Listviews ändert sich die Farbe der zugehörigen Eingabezeile auf Blau.
    Wenn man aber auf die Eingabezeile selber klickt wechselt nicht der Hintergrund.
    Ist das beabsichtigt oder hast du noch nicht darüber nachgegrübelt?

    Edit: Hab gerade nix zu tun, deshalb mein Lösungsvorschlag:
    Scriptanfang um

    [autoit]

    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

    [/autoit]


    erweitern und folgendes ins Script einfügen:

    [autoit]

    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom = $ilParam
    Local $iCode = _WinAPI_HiWord($iwParam)
    Local $hWndEdit1 = GUICtrlGetHandle($ahPath[0])
    Local $hWndEdit2 = GUICtrlGetHandle($ahPath[1])
    Switch $hWndFrom
    Case $hWndEdit1, $hWndEdit2
    Switch $iCode
    Case $EN_SETFOCUS
    Switch $hWndFrom
    Case $hWndEdit1
    GUICtrlSetBkColor($ahPath[0], 0x005599)
    GUICtrlSetColor($ahPath[0], 0xFFFF22)
    GUICtrlSetBkColor($ahPath[1], 0xEEEEEE)
    GUICtrlSetColor($ahPath[1], 0x000000)
    Case $hWndEdit2
    GUICtrlSetBkColor($ahPath[1], 0x005599)
    GUICtrlSetColor($ahPath[1], 0xFFFF22)
    GUICtrlSetBkColor($ahPath[0], 0xEEEEEE)
    GUICtrlSetColor($ahPath[0], 0x000000)
    EndSwitch
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc

    [/autoit]


    Beim setzen des Focus auf ein Input wird der Hintrgrund auf Blau geändert und das nicht aktive bekommt seine normale Hintergrundfarbe.
    Kannst du ja einbauen, wenn du willst.
    Wenn du ein bischen Hilfe brauchst bei deinem Projekt, sag mir bescheid. Hab nix besseres zu tun und keinen Antrieb für ein eigenes Projekt.
    Edit2:
    Ups, ich sehe ja gerade, die Inputs dienen ja nur zur Anzeige und es kann nichts eingegeben werden.
    Aber egal, man sollte bei der Auswertung von WM_COMMAND noch das aktive LIstview setzen, dann macht es wieder Sinn.
    Dann hat ein klick auf das Input den selben sinn wie ein Klick auf eines der Listviews.

    • Offizieller Beitrag

    Raupi : Du hattest Recht, das war noch ein Bug. Beim Klick auf die Eingabezeile sollte diese auch blau werden bzw. das Listview entsprechend aktiviert. Das habe ich so von Dir übernommen. Danke!

    Es gibt aber auch sonst noch einige Neuerungen. Die Wichtigste (war mir jedenfalls am wichtigsten) sind die Verzeichnislisten (Favoriten). Damit kann man beliebige Verzeichnisse in eine Liste aufnehmen und von dort dann wieder abrufen (wie die Favoriten im Browser). Das machte natürlich noch eine Listenverwaltung (zum ändern und löschen der Einträge) notwendig. Ich hoffe, dass ich das einigermassen intuitiv bedienbar hingekriegt habe.

    Deinen Vorschlag zum anpassen der Spaltenreihenfolge habe ich auch umgesetzt (im Einstellungsmenü).

    Außerdem wird ShellExecute jetzt mit entsprechendem WorkingDir aufgerufen, was die Probleme beim Start mancher Programme behebt.

    Neue Version in Post #1.

  • Hmm...kann ich bei mir nicht nachvollziehen.
    Kannst Du mal das Skript starten und das ausprobieren? Da ist die Fehlermeldung aussagekräftiger.

    [autoit]


    ..FileCommander_v1_3\FileCommander\FileCommander.au3 (379) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
    $aDirList[$iSelItem + 1][0] = $sName
    ^ ERROR
    ->22:49:27 AutoIT3.exe ended.rc:1
    >Exit code: 1 Time: 12.169

    [/autoit]

    Lg, Fabian

    • Offizieller Beitrag

    Hi, Oscar.

    Die Spaltensortierung gefällt mir, ist aber nur suboptimal gelöst.
    Ich finde es ein bischen nervig das man die Reihenfolge eintippen muß.
    Da ich überaus Faul bin hab ich das ganze mal so geändert, das man ohne tippen auskommt.
    Einfach ein Headerelement mit der linken Maus geklickt halten und verschieben :D

    Die Änderung sind recht simpel.

    Zeile 161

    [autoit]

    $ahLV[0] = GUICtrlCreateListView($sHeader, 2, 70, 347, 326, $LVS_SHOWSELALWAYS, BitOR($WS_EX_CLIENTEDGE, $LVS_EX_FULLROWSELECT))

    [/autoit]


    in

    [autoit]

    $ahLV[0] = GUICtrlCreateListView($sHeader, 2, 70, 347, 326, $LVS_SHOWSELALWAYS, BitOR($WS_EX_CLIENTEDGE, $LVS_EX_FULLROWSELECT, $LVS_EX_HEADERDRAGDROP))

    [/autoit]


    abändern.
    Zeile 202

    [autoit]

    $ahLV[1] = GUICtrlCreateListView($sHeader, 350, 70, 347, 326, $LVS_SHOWSELALWAYS, BitOR($WS_EX_CLIENTEDGE, $LVS_EX_FULLROWSELECT))

    [/autoit]


    in

    [autoit]

    $ahLV[1] = GUICtrlCreateListView($sHeader, 350, 70, 347, 326, $LVS_SHOWSELALWAYS, BitOR($WS_EX_CLIENTEDGE, $LVS_EX_FULLROWSELECT, $LVS_EX_HEADERDRAGDROP))

    [/autoit]


    abändern.

    Neue WM_NOTIFY Funktion:

    Spoiler anzeigen
    [autoit]

    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $iwParam
    Local $tNMHDR, $hWndFrom, $tInfo, $iItem, $sText, $sPath, $sExt
    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, 'hWndFrom'))
    Switch $hWndFrom
    Case GUICtrlGetHandle($hEditLV)
    Switch DllStructGetData($tNMHDR, 'Code')
    Case $NM_CLICK
    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
    $iItem = DllStructGetData($tInfo, 'Index')
    GUICtrlSetData($hEditName, _GUICtrlListView_GetItemText($hEditLV, $iItem, 0))
    GUICtrlSetData($hEditPath, _GUICtrlListView_GetItemText($hEditLV, $iItem, 1))
    EndSwitch
    Case _GUICtrlListView_GetHeader($ahLV[0])
    Switch DllStructGetData($tNMHDR, 'Code')
    Case -321
    _CheckLVColWidth(0)
    Case -16
    _SetLVColOrder(0)
    EndSwitch
    Case _GUICtrlListView_GetHeader($ahLV[1])
    Switch DllStructGetData($tNMHDR, 'Code')
    Case -321
    _CheckLVColWidth(1)
    Case -16
    _SetLVColOrder(1)
    EndSwitch
    Case GUICtrlGetHandle($ahLV[0])
    Switch DllStructGetData($tNMHDR, 'Code')
    Case $NM_DBLCLK
    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
    $iItem = DllStructGetData($tInfo, 'Index')
    $sText = _GUICtrlListView_GetItemText($ahLV[0], $iItem, 0)
    Switch $sText
    Case ''
    ; nothing
    Case '..'
    $sPath = StringRegExpReplace(GUICtrlRead($ahPath[0]), '(.+\\).+\\', '$1')
    GUICtrlSetData($ahPath[0], $sPath)
    _CreateListViewItems($ahLV[0], $sPath)
    Case Else
    $sExt = _GUICtrlListView_GetItemText($ahLV[0], $iItem, 1)
    If $sExt <> '' Then $sExt = '.' & $sExt
    $sPath = GUICtrlRead($ahPath[0]) & $sText
    Switch $sExt
    Case '.<DIR>'
    $sPath &= '\'
    GUICtrlSetData($ahPath[0], $sPath)
    _CreateListViewItems($ahLV[0], $sPath)
    Case Else
    ShellExecute($sPath & $sExt, '', GUICtrlRead($ahPath[0]))
    EndSwitch
    EndSwitch
    Case $NM_SETFOCUS
    GUISetState(@SW_HIDE, $hDirListGui)
    $iActiveLV = 0
    GUICtrlSetBkColor($ahPath[0], $aColorActive[0])
    GUICtrlSetColor($ahPath[0], $aColorActive[1])
    GUICtrlSetBkColor($ahPath[1], $aColorInactive[0])
    GUICtrlSetColor($ahPath[1], $aColorInactive[1])
    EndSwitch
    Case GUICtrlGetHandle($ahLV[1])
    Switch DllStructGetData($tNMHDR, 'Code')
    Case $NM_DBLCLK
    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
    $iItem = DllStructGetData($tInfo, 'Index')
    $sText = _GUICtrlListView_GetItemText($ahLV[1], $iItem, 0)
    Switch $sText
    Case ''
    ; nothing
    Case '..'
    $sPath = StringRegExpReplace(GUICtrlRead($ahPath[1]), '(.+\\).+\\', '$1')
    GUICtrlSetData($ahPath[1], $sPath)
    _CreateListViewItems($ahLV[1], $sPath)
    Case Else
    $sExt = _GUICtrlListView_GetItemText($ahLV[1], $iItem, 1)
    If $sExt <> '' Then $sExt = '.' & $sExt
    $sPath = GUICtrlRead($ahPath[1]) & $sText
    Switch $sExt
    Case '.<DIR>'
    $sPath &= '\'
    GUICtrlSetData($ahPath[1], $sPath)
    _CreateListViewItems($ahLV[1], $sPath)
    Case Else
    ShellExecute($sPath & $sExt)
    EndSwitch
    EndSwitch
    Case $NM_SETFOCUS
    GUISetState(@SW_HIDE, $hDirListGui)
    $iActiveLV = 1
    GUICtrlSetBkColor($ahPath[1], $aColorActive[0])
    GUICtrlSetColor($ahPath[1], $aColorActive[1])
    GUICtrlSetBkColor($ahPath[0], $aColorInactive[0])
    GUICtrlSetColor($ahPath[0], $aColorInactive[1])
    EndSwitch
    EndSwitch
    $tNMHDR = ''
    $tInfo = ''
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

    [/autoit]


    Und die neue Funktion _SetLVColOrder:

    [autoit]

    Func _SetLVColOrder($iLV)
    Local $aOrder = _GUICtrlListView_GetColumnOrderArray($ahLV[$iLV])
    _GUICtrlListView_SetColumnOrderArray($ahLV[1 - $iLV], $aOrder)
    _GUICtrlListView_RedrawItems($ahLV[1 - $iLV], 0, _GUICtrlListView_GetItemCount($ahLV[1 - $iLV]))
    _ArrayDelete($aOrder, 0)
    $sColOrder = _ArrayToString($aOrder)
    EndFunc ;==>_SetLVColOrder

    [/autoit]


    Das wars schon. Kannst dir überlegen ob du es in dein Prog übernehem willst. :D
    Hier mal das ganze Script mit den Änderungen:
    autoit.de/wcf/attachment/12036/
    Ich habe deine Funktion _ChangeColOrder belassen wie sie ist. Ist aber eingentlich nicht mehr von Nöten.

    PS: Natürlich gelten die Spaltensortierungen wie bei der Breite auch für beide Listviews.

  • Ah! Du benutzt die Listenbearbeitung zum anlegen neuer Einträge!
    Das hatte ich so gar nicht vorgesehen, aber eigentlich eine gute Idee. :D
    Habe ich gleich mal eingebaut. Kommt mit der nächsten Version.

    Aha ich dachte, das war so vorgesehen. :D
    Dann freue ich mich auf die neue Version! :thumbup:

    • Offizieller Beitrag

    Raupi : Ja, das ist natürlich noch besser! Habe ich übernommen. Danke!

    Es gibt auch eine neue Version (siehe Post #1).

    Das Kopieren/Verschieben per FileCopy/FileMove war mir zu blöd. Da sieht man nicht so gut den Fortschritt.
    Also wollte ich meine Funktion "MultiFileCopy" verwenden, aber die führt unter Win7 dazu, dass das Progressfenster immer "einfriert". Nachdem ich einige Stunden mit der Fehlersuche verbracht hatte und zu keinem brauchbaren Ergebnis kam, habe ich die Kopierfunktion einfach per FileOpen/FileRead bzw. FileWrite geschrieben. Ich benutze dort (Zeile 864) einen 256 KB Puffer. Das hat sich bei mir als die schnellste Variante herausgestellt. Wenn das bei euch anders ist, dann bitte mal melden. Dann mache ich die Puffergröße einstellbar.
    Beim verschieben erkennt meine Funktion, wenn Quelle und Ziel auf dem gleichen Laufwerk liegen. In dem Fall benutze ich FileMove (am schnellsten), ansonsten wird erst kopiert und dann gelöscht.

  • Hallo Oscar,

    Ich habe wie gestern schon versucht einen Ordner manuell in die Favouritenliste einzugeben, dies funktioniert jetzt auch. :thumbup:
    Aber wenn ich über das Lesezeichen in diesen Ordner gehe werden mir die Dateien, aber keine Verknüpfungen und Ordner angezeigt welche sich in diesem Verzeichnis befinden.

    Lg, Fabian

    Edit:

    Den Grund auch schon gefunden, bei der manuellen Eingabe habe ich den abschliessenden Slash vergessen: "C:\Users\Fabian\Desktop\AutoIt" und deshalb wurden mir die Ordner und Verknüpfungen nicht angezeigt. Hingegen bei "C:\Users\Fabian\Desktop\AutoIt\" werden die Ordner und Verknüpfungen auch angezeigt. ;)

    • Offizieller Beitrag

    Mist! Da habe ich mir doch extra eine kleine Funktion "_AddTrailingBackslash" geschrieben und dann vergesse ich die dort anzuwenden. :rolleyes:
    Fehler ist in der nächsten Version beseitigt. Danke für die Meldung!

    Edit: Hat mir keine Ruhe gelassen. Hab die Überprüfung gleich mal überall eingefügt. Neue Version in Post #1.

    • Offizieller Beitrag

    Hi,Oscar.

    Ich hab noch eine Macke beim setzen der Columnreihenfolge entdecket.
    Wenn nur auf den Header geklickt wird, wird die Funktion _SetLVColOrder auch ausgeführt. Dabei flackert das
    andere Listview kurz weil, es komplett neu gezeichnet wird. Fällt bei langsamen Maschinen auf.
    Die Notify $NM_RELEASEDCAPTURE (-16) wird auch beim loslassen des Headercontrols ausgelöst, auch wenn sich dessen Position nicht ändert.
    Hier ist die Lösung, _SetLVColOrder wird nur ausgeführt wenn das Headerelement versetzt wird:

    Spoiler anzeigen
    [autoit]

    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $iwParam
    Local Static $bTabSelect
    Local $tNMHDR, $hWndFrom, $tInfo, $iItem, $sText, $sPath, $sExt
    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, 'hWndFrom'))
    Switch $hWndFrom
    Case GUICtrlGetHandle($hEditLV)
    Switch DllStructGetData($tNMHDR, 'Code')
    Case $NM_CLICK
    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
    $iItem = DllStructGetData($tInfo, 'Index')
    GUICtrlSetData($hEditName, _GUICtrlListView_GetItemText($hEditLV, $iItem, 0))
    GUICtrlSetData($hEditPath, _GUICtrlListView_GetItemText($hEditLV, $iItem, 1))
    EndSwitch
    Case _GUICtrlListView_GetHeader($ahLV[0])
    Switch DllStructGetData($tNMHDR, 'Code')
    Case -310 ; $HDN_BEGINDRAG
    $bTabSelect = True
    Case -321;$HDN_ITEMCHANGEDW
    _CheckLVColWidth(0)
    Case $NM_RELEASEDCAPTURE
    If $bTabSelect Then
    $bTabSelect = False
    _SetLVColOrder(0)
    EndIf
    EndSwitch
    Case _GUICtrlListView_GetHeader($ahLV[1])
    Switch DllStructGetData($tNMHDR, 'Code')
    Case -310; $HDN_BEGINDRAG
    $bTabSelect = True
    Case -321;$HDN_ITEMCHANGEDW
    _CheckLVColWidth(1)
    Case $NM_RELEASEDCAPTURE
    If $bTabSelect Then
    $bTabSelect = False
    _SetLVColOrder(1)
    EndIf
    EndSwitch
    Case GUICtrlGetHandle($ahLV[0])
    Switch DllStructGetData($tNMHDR, 'Code')
    Case $NM_DBLCLK
    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
    $iItem = DllStructGetData($tInfo, 'Index')
    $sText = _GUICtrlListView_GetItemText($ahLV[0], $iItem, 0)
    Switch $sText
    Case ''
    ; nothing
    Case '..'
    $sPath = StringRegExpReplace(_AddTrailingBackslash(GUICtrlRead($ahPath[0])), '(.+\\).+\\', '$1')
    GUICtrlSetData($ahPath[0], $sPath)
    _CreateListViewItems($ahLV[0], $sPath)
    Case Else
    $sExt = _GUICtrlListView_GetItemText($ahLV[0], $iItem, 1)
    If $sExt <> '' Then $sExt = '.' & $sExt
    $sPath = _AddTrailingBackslash(GUICtrlRead($ahPath[0])) & $sText
    Switch $sExt
    Case '.<DIR>'
    $sPath &= '\'
    GUICtrlSetData($ahPath[0], $sPath)
    _CreateListViewItems($ahLV[0], $sPath)
    Case Else
    ShellExecute($sPath & $sExt, '', _AddTrailingBackslash(GUICtrlRead($ahPath[0])))
    EndSwitch
    EndSwitch
    Case $NM_SETFOCUS
    GUISetState(@SW_HIDE, $hDirListGui)
    $iActiveLV = 0
    GUICtrlSetBkColor($ahPath[0], $aColorActive[0])
    GUICtrlSetColor($ahPath[0], $aColorActive[1])
    GUICtrlSetBkColor($ahPath[1], $aColorInactive[0])
    GUICtrlSetColor($ahPath[1], $aColorInactive[1])
    EndSwitch
    Case GUICtrlGetHandle($ahLV[1])
    Switch DllStructGetData($tNMHDR, 'Code')
    Case $NM_DBLCLK
    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
    $iItem = DllStructGetData($tInfo, 'Index')
    $sText = _GUICtrlListView_GetItemText($ahLV[1], $iItem, 0)
    Switch $sText
    Case ''
    ; nothing
    Case '..'
    $sPath = StringRegExpReplace(_AddTrailingBackslash(GUICtrlRead($ahPath[1])), '(.+\\).+\\', '$1')
    GUICtrlSetData($ahPath[1], $sPath)
    _CreateListViewItems($ahLV[1], $sPath)
    Case Else
    $sExt = _GUICtrlListView_GetItemText($ahLV[1], $iItem, 1)
    If $sExt <> '' Then $sExt = '.' & $sExt
    $sPath = _AddTrailingBackslash(GUICtrlRead($ahPath[1])) & $sText
    Switch $sExt
    Case '.<DIR>'
    $sPath &= '\'
    GUICtrlSetData($ahPath[1], $sPath)
    _CreateListViewItems($ahLV[1], $sPath)
    Case Else
    ShellExecute($sPath & $sExt, '', _AddTrailingBackslash(GUICtrlRead($ahPath[0])))
    EndSwitch
    EndSwitch
    Case $NM_SETFOCUS
    GUISetState(@SW_HIDE, $hDirListGui)
    $iActiveLV = 1
    GUICtrlSetBkColor($ahPath[1], $aColorActive[0])
    GUICtrlSetColor($ahPath[1], $aColorActive[1])
    GUICtrlSetBkColor($ahPath[0], $aColorInactive[0])
    GUICtrlSetColor($ahPath[0], $aColorInactive[1])
    EndSwitch
    EndSwitch
    $tNMHDR = ''
    $tInfo = ''
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

    [/autoit]
    • Offizieller Beitrag

    Raupi : Ok, Fehler behoben. Danke!

    @progandy: Ich bleib jetzt bei meiner eigenen Funktion. Habe die jetzt auch noch um eine Geschwindigkeits- und Restzeitanzeige erweitert.

    Außerdem wird nun abgefragt, was passieren soll, wenn die Quelldatei im Zielverzeichnis bereits vorhanden ist.
    Zur Auswahl stehen dann:
    - Abbrechen
    - Überschreiben
    - Alle Überschreiben
    - Überspringen
    - Alle Überspringen

    Neue Version in Post#1.