Hallo zusammen,
da ich immer mich weiter entwickeln will in AutoIt habe ich was mit ListView gemacht und habe jetzt ein paar Probleme, die ich nicht so auf die reihe bekomme und brauch deshalb eure Hilfe.
hier erst mal der CODE
Spoiler anzeigen
[autoit#include <array.au3>
#include <Misc.au3>
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <ColorConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <SendMessage.au3>
#include <Sound.au3>
Global $aDropFiles[1]
Global Const $VK_DELETE = 0x2E
Global Const $AllesMarkieren = 0x41
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Liste Sortieren", 333, 437, -1, -1, BitOR($WS_MINIMIZEBOX,$WS_SYSMENU,$WS_POPUP,$WS_GROUP,$WS_CLIPSIBLINGS), $WS_EX_ACCEPTFILES)
GUICtrlSetState($Form1, $GUI_DROPACCEPTED)
GUISetOnEvent($GUI_EVENT_DROPPED, "_FilesDropped")
$Pic1 = GUICtrlCreatePic("C:\Windows\Web\Screen\img103.jpg", 0, 0, 332, 436, BitOR($SS_NOTIFY, $WS_GROUP, $WS_CLIPSIBLINGS))
GUICtrlSetState($Pic1, $GUI_DISABLE)
$ExitButton = GUICtrlCreateButton("Exit", 266, 8, 60, 25)
$DateiLabel = GUICtrlCreateLabel("Keine Datei ausgewählt", 8, 40, 316, 40)
GUICtrlSetColor(-1, 0x00FF00)
GUICtrlSetBkColor(-1, 0x000000)
Local $ListView = GUICtrlCreateListView("Nr|Titel|Status|Datei",8,85,316,343,BitOR($LVS_SHOWSELALWAYS, $LVS_REPORT))
;~ $ListView = GUICtrlGetHandle($ListView)
GUICtrlSetBkColor($ListView,0x1E1E1E)
GUICtrlSetColor($ListView,0xffffff)
GUICtrlSetState($ListView, BitOR($GUI_DROPACCEPTED,$GUI_FOCUS))
_GUICtrlListView_SetBkImage($ListView,"C:\Windows\Web\Screen\img103.jpg")
_GUICtrlListView_SetColumnWidth($ListView, 0, 40)
_GUICtrlListView_SetColumnWidth($ListView, 1, 200)
_GUICtrlListView_SetColumnWidth($ListView, 3, 0)
GUIRegisterMsg($WM_DROPFILES, "WM_DROPFILES_FUNC")
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUISetState(@SW_SHOW)
For $i = 0 To 255
_GUICtrlListView_AddItem($ListView, $i)
_GUICtrlListView_AddSubItem($ListView, $i, $i & " Spalte 2 Irgendetwas", 1,1)
_GUICtrlListView_AddSubItem($ListView, $i, $i & " Spalte 3", 2,2)
_GUICtrlListView_AddSubItem($ListView, $i, $i & " Spalte 4", 3,3)
Next
While Sleep(10)
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case $ExitButton
Exit
Case $GUI_EVENT_DROPPED
If @GUI_DropId = $ListView Then GUICtrlSetData($ListView, @GUI_DragFile)
_FilesDropped()
EndSwitch
WEnd
Func _ListView_Sort($cIndex = 0)
Local $iColumnsCount, $iDimension, $iItemsCount, $aItemsTemp, $aItemsText, $iCurPos, $iImgSummand, $i, $j
$iColumnsCount = _GUICtrlListView_GetColumnCount($ListView)
$iDimension = $iColumnsCount * 2
$iItemsCount = _GUICtrlListView_GetItemCount($ListView)
If $iItemsCount = 0 Then Return ConsoleWrite('Keine Dateien in Liste vorhanden' & @CR)
Local $aItemsTemp[1][$iDimension]
For $i = 0 To $iItemsCount - 1
$aItemsTemp[0][0] += 1
ReDim $aItemsTemp[$aItemsTemp[0][0] + 1][$iDimension]
$aItemsText = _GUICtrlListView_GetItemTextArray($ListView, $i)
$iImgSummand = $aItemsText[0] - 1
For $j = 1 To $aItemsText[0]
$aItemsTemp[$aItemsTemp[0][0]][$j - 1] = $aItemsText[$j]
$aItemsTemp[$aItemsTemp[0][0]][$j + $iImgSummand] = _GUICtrlListView_GetItemImage($ListView, $i, $j - 1)
Next
Next
$iCurPos = $aItemsTemp[1][$cIndex]
_ArraySort($aItemsTemp, 0, 1, 0, $cIndex)
If StringInStr($iCurPos, $aItemsTemp[1][$cIndex]) Then _ArraySort($aItemsTemp, 1, 1, 0, $cIndex)
ConsoleWrite($iCurPos & ' ' & $aItemsTemp[1][$cIndex] & ' ' & $aItemsTemp & @CR)
For $i = 1 To $aItemsTemp[0][0]
For $j = 1 To $iColumnsCount
_GUICtrlListView_SetItemText($ListView, $i - 1, $aItemsTemp[$i][$j - 1], $j - 1)
_GUICtrlListView_SetItemImage($ListView, $i - 1, $aItemsTemp[$i][$j + $iImgSummand], $j - 1)
Next
Next
EndFunc
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
#forceref $hWnd, $iMsg, $iwParam
Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $tInfo
$hWndListView = $ListView
If Not IsHWnd($ListView) Then $hWndListView = GUICtrlGetHandle($ListView)
$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $hWndListView
Switch $iCode
Case $NM_DBLCLK ; Sent by a list-view control when the user double-clicks an item with the left mouse button
Local $sDrive, $sDir, $sFilename, $sExtension
$tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
_GUICtrlListView_SetItemSelected($ListView, DllStructGetData($tInfo, "Index"),True,True)
$lol = _GUICtrlListView_GetItemText($ListView, DllStructGetData($tInfo, "Index"),3)
Local $aPathSplit = _PathSplit($lol, $sDrive, $sDir, $sFilename, $sExtension)
If IsArray($aPathSplit) Then
If FileExists($aPathSplit[0]) Then
Local $hallo
$hallo = MsgBox(4100, 'Datei', 'Datei: ' & $aPathSplit[0] & @CR & @CR & _
'Laufwerk: ' & $aPathSplit[1] & @CR & @CR & _
'Ordner: ' & $aPathSplit[2] & @CR & @CR & _
'Dateiname: ' & $aPathSplit[3] & @CR & @CR & _
'Dateiendung: ' & $aPathSplit[4] & @CR & @CR & @CR & @CR & _
'Soll die Datei ausgewählt werden?')
If $hallo = 6 Then GUICtrlSetData($DateiLabel, $aPathSplit[0])
Else
GUICtrlSetData($DateiLabel, _GUICtrlListView_GetItemText($ListView, DllStructGetData($tInfo, "Index"),1))
EndIf
EndIf
Case $LVN_COLUMNCLICK
Local $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
Local $ColumnIndex = DllStructGetData($tInfo, "SubItem")
_ListView_Sort($ColumnIndex)
Case $LVN_KEYDOWN
$taGLVKEYDOWN = DllStructCreate("int;int;int;int;uint", $ilParam)
$code = Hex(DllStructGetData($taGLVKEYDOWN, 4), 2)
Select
Case $code = Hex($VK_DELETE, 2)
_GUICtrlListView_BeginUpdate($ListView)
$id = _GUICtrlListView_GetItemCount($ListView)
$Selected = StringSplit(_GUICtrlListView_GetSelectedIndices ($ListView), "|")
If $Selected[0]=$id then
_GUICtrlListView_DeleteAllItems($ListView)
Else
For $i=$Selected[0] To 1 Step -1 ; Loop through the array returned by StringSplit to display the individual values.
_GUICtrlListView_DeleteItem ($ListView, $Selected[$i])
Next
EndIf
$id = _GUICtrlListView_GetItemCount($ListView)
For $i = 0 To $id
_GUICtrlListView_SetItem($ListView,$i+1,$i,0)
Next
_GUICtrlListView_EndUpdate($ListView)
Case $code = Hex($AllesMarkieren, 2)
Local $hDLL = DllOpen("user32.dll")
If _IsPressed("11", $hDLL) Then
ControlListView ( "", "", $ListView, "SelectAll")
EndIf
EndSelect
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY
#region ;Drag and Drop und Doppelklick
Func WM_DROPFILES_FUNC($hWnd, $msgID, $wParam, $lParam)
Local $nSize, $pFileName
Local $nAmt = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", 0xFFFFFFFF, "ptr", 0, "int", 255)
For $i = 0 To $nAmt[0] - 1
$nSize = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", 0, "int", 0)
$nSize = $nSize[0] + 1
$pFileName = DllStructCreate("char[" & $nSize & "]")
DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", DllStructGetPtr($pFileName), "int", $nSize)
ReDim $aDropFiles[$i + 1]
$aDropFiles[$i] = DllStructGetData($pFileName, 1)
$pFileName = 0
Next
EndFunc ;==>WM_DROPFILES_FUNC
Func _FilesDropped()
Local $szDrive, $szDir, $szFName, $szExt, $split
_GUICtrlListView_BeginUpdate($ListView)
$id = _GUICtrlListView_GetItemCount($ListView)
For $i = 0 To UBound($aDropFiles) - 1
$id = $id+1
$split = _PathSplit($aDropFiles[$i], $szDrive, $szDir, $szFName, $szExt)
$szExt = StringUpper($szExt)
GUICtrlCreateListViewItem($id & "|" & $split[3] & $split[4] & "|" & "Bereit" & "|" & $split[0], $ListView)
Next
_GUICtrlListView_SetColumnWidth($ListView, 3, 0)
_GUICtrlListView_EndUpdate($ListView)
EndFunc ;==>_FilesDropped[/autoit]
Bei folgenden Fehler brauche ich Hilfe:
1. Wenn ich Dateien per Drag and Drop in die Liste hinzufüge, ersetzt es mir die Überschrift "Nr" in eine der Hinzugefügten Dateien. Was mach ich da falsch?
2. Wenn ich oben auf die Überschriften klicke, kann ich die Liste sortieren. Leider sortiert es mir aber falsch. Wo ist da der Hacken?
3. Man kann in der Liste Einträge löschen. Angenommen ich markiere von Zeile Nr. 5 bis zum Schluss alles so dass nur noch weniger Einträge in der Liste bleiben als das die voll ausgefällt wäre oder wenn ich unten alles markiere aber dann oben stehe und dann die markierten Einträge lösche, dann verschwindet die ListView komplett und wird erst wieder langsam sichtbar wenn ich über die übrigen Einträge mit der Maus drüber gehe oder klicke.
Wie kann ich das beseitigen? Gibt es da eine Funktion die die Liste dann aktualisiert.
4. Ist zwar kein Fehler, aber was mir noch fehlt ist wie kann ich es anstellen dass ich mit der Maus die einzelnen Positionen untereinander verschieben kann? Also sozusagen die Reihenfolge der Zeilen untereinander tauschen.
Wenn ihr mir dabei helfen könntet, dann seid ihr die Besten der Besten von Allerbesten
Danke schon mal vorab