heute bin ich auf ein Problem gestoßen, was ich mir nicht so richtig erklären kann.
Dazu hier ein lauffähiger code meiner Einleseroutine, welche eigendlich tadelos laufen sollte !
Nur kommt es wenn ich ein großes Verzeichnis einlese, zu einen merkwürdigen Fehler den ich nicht ganz folgen kann,
zumal dieser erst beim zweiten mal vom einlesen auftritt ????AddGadgetItem(gadget, -1, Dateien()\Datei+Chr(10)+Dateien()\Adatum+Chr(10)+Dateien()\Typ+Chr(10)+Str(Dateien()\Dsize)+" kb",Dateien()\ImageID)
Fehlermeldung: Das angebebene ImageID ist ungültig
Ich hoffe das ihr mir da weiter helfen könnt.
In diesen Beispiel habe ich das System32 Verzeichnis gewählt, da dort sehr viele Dateien enthalten sind.
Edit: Jetzt kommt es nicht mehr zu dem beschrieben Fehler, Code mit DestroyIcon_(Icon\hIcon) erweitert.
Danke allen nochmal für die hilfe, ist hiermit erledigt!
Code: Alles auswählen
EnableExplicit
Structure Datei
Datei.s
Adatum.s
Dsize.i
Typ.s
ImageID.i
Icon.i
EndStructure
NewList Dateien.Datei()
NewList Verzeichnis.Datei()
Define ListIconGadget.i
Define FolderIcon
Define Draw
;Folder Icon Extractieren
ExtractIconEx_("shell32.dll",3,0,@FolderIcon, 1)
CreateImage(1,32,32)
Draw = StartDrawing(ImageOutput(1))
Box(0,0,32,32,RGB(255,255,255))
DrawIcon_(Draw,0,0,FolderIcon)
StopDrawing()
Procedure Im_VerzeichnisEinlesen (Gadget,Paht.s)
Shared Verzeichnis(),Dateien()
Protected PahtUndDatei.s,info.SHFILEINFO, Icon.SHFILEINFO,FileName.s
If ExamineDirectory(0,paht, "*.*")
;einträge in Gadgetlist sowie Structlisten löschen
ClearGadgetItems(gadget)
ClearList(Verzeichnis()) : ClearList(Dateien())
;Verzeichnis öffnen und einlesen
While NextDirectoryEntry(0)
FileName = DirectoryEntryName(0)
PahtUndDatei=Paht+FileName
;auslesen der Dateitypen / Icon´s
SHGetFileInfo_(PahtUndDatei, #Null, @info.SHFILEINFO, SizeOf(SHFILEINFO), #SHGFI_TYPENAME)
;Ordner in liste eintragen
If DirectoryEntryType(0) = #PB_DirectoryEntry_Directory And FileName<>"."
AddElement(Verzeichnis())
Verzeichnis()\Datei =FileName
Verzeichnis()\Adatum =FormatDate("%dd.%mm.%yyyy",DirectoryEntryDate(0,#PB_Date_Modified))
Verzeichnis()\Typ =PeekS(@info\szTypeName,80)
Verzeichnis()\ImageID=ImageID(1)
;dateien im liste eintragen
ElseIf FileName<>"."
AddElement(Dateien())
Dateien()\Datei =FileName
Dateien()\Adatum =FormatDate("%dd.%mm.%yyyy",DirectoryEntryDate(0,#PB_Date_Modified))
Dateien()\Typ =PeekS(@info\szTypeName,80)
Dateien()\Dsize =DirectoryEntrySize(0)/1024+1
Dateien()\ImageID =Icon\hIcon
EndIf
Wend
;Ordner und Dateienliste sortieren
SortStructuredList(Verzeichnis() , #PB_Sort_Ascending, OffsetOf(Datei\Datei), TypeOf(Datei\Datei))
SortStructuredList(Dateien() , #PB_Sort_Ascending, OffsetOf(Datei\Datei), TypeOf(Datei\Datei))
;listen übergeben an das ListGadget
SendMessage_(GadgetID(Gadget), #WM_SETREDRAW, #False, 0)
ForEach Verzeichnis()
AddGadgetItem(gadget, -1,Verzeichnis()\Datei+Chr(10)+Verzeichnis()\Adatum+Chr(10)+Verzeichnis()\Typ,Verzeichnis()\ImageID)
Next
ForEach Dateien()
SHGetFileInfo_(Dateien()\Datei, #Null, @Icon, SizeOf(SHFILEINFO), #SHGFI_ICON|#SHGFI_SMALLICON|#SHGFI_USEFILEATTRIBUTES)
AddGadgetItem(gadget, -1, Dateien()\Datei+Chr(10)+Dateien()\Adatum+Chr(10)+Dateien()\Typ+Chr(10)+Str(Dateien()\Dsize)+" kb",Icon\hIcon)
; wichtig verhindert ein Handle overflow (gibt wieder alles frei)
DestroyIcon_(Icon\hIcon)
Next
SendMessage_(GadgetID(Gadget), #WM_SETREDRAW, #True, 0)
Else
;falls das verzeichnis gelesen werden kann
MessageRequester("Error","Kann das angebene Verzeichnis nicht öffnen: "+paht,0)
EndIf
EndProcedure
If OpenWindow(0, 100, 200, 500, 400, "PureBasic - FileSystem Example mit Iconextract / Filetypenextract",#PB_Window_ScreenCentered | #PB_Window_SystemMenu)
StringGadget (0, 5, 10, 425, 24, "C:\Windows\System32\")
ButtonGadget (1, 435, 10, 60 , 24, "List")
ListIconGadget=ListIconGadget(#PB_Any, 5, 40, 490, 350, "Name", 200, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
AddGadgetColumn(ListIconGadget, 1, "Änderungsdatum", 100)
AddGadgetColumn(ListIconGadget, 2, "Typ", 90)
AddGadgetColumn(ListIconGadget, 3, "Größe", 80)
Repeat
Define Event = WaitWindowEvent()
If Event = #PB_Event_Gadget
If EventGadget() = 1
Im_VerzeichnisEinlesen(ListIconGadget,GetGadgetText(0))
EndIf
EndIf
Until Event = #PB_Event_CloseWindow
EndIf
End