Aktuelle Zeit: 15.10.2018 15:03

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Ungültige ImageID ?
BeitragVerfasst: 13.03.2018 12:01 
Offline
Benutzeravatar

Registriert: 06.07.2014 12:21
Hallo Leute,
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,
Zitat:
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

zumal dieser erst beim zweiten mal vom einlesen auftritt ????
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:
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


Gruß Silbersurfer

_________________
Intel Quad Core 3,2 Ghz Radeon HD6950 2GB BlitzBasic Plus 1.48 , PureBasic 5.21 LTS/5.30


Zuletzt geändert von silbersurfer am 13.03.2018 22:37, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Ungültige ImageID ?
BeitragVerfasst: 13.03.2018 12:35 
Offline
Benutzeravatar

Registriert: 27.02.2006 22:30
Wohnort: Neumünster
Füge Zeile 53 Debug FileName + Icon\hIcon ein

SHGetFileInfo_(PahtUndDatei, #Null, @Icon ..... liefert irgendwie irgendwann null fürs Icon

Abhilfe: Abfrage ob größer null und Dummy Icon angeben, oder ....

_________________
Purebasic 5.60 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Ungültige ImageID ?
BeitragVerfasst: 13.03.2018 12:42 
Offline
Benutzeravatar

Registriert: 01.04.2007 20:18
Das gleiche hier.

Kann es sein, dass Du Windows 10 benutzt ?. Ich habe festgestellt, es passiert im System32 Ordner bei einigen PNG Dateien...
Das Problem wird wohl das "@" Symbol am Anfang des Dateinamens sein. Tippe ich jetzt mal drauf...

Edit: @hjbremer : Das hatte ich auch vermutet. Allerdings ist die Ausgabe : [Debug] 464115 : @AudioToastIcon.png
Also ImageID und Dateiname...

_________________
PureBasic 5.46 LTS / 5.62 (Windows x86/x64) | Windows10 Pro x64 | Z370 Extreme4 | i7 8770k | 32GB RAM | iChill GeForce GTX 980 X4 Ultra | HAF XF Evo​​


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Ungültige ImageID ?
BeitragVerfasst: 13.03.2018 13:03 
Offline
Benutzeravatar

Registriert: 06.07.2014 12:21
@hjbremer
Zitat:
SHGetFileInfo_(PahtUndDatei, #Null, @Icon ..... liefert irgendwie irgendwann null fürs Icon

das ist ja das merkwürdige, da es beim ersten durchlauf nicht zu diesem Fehler kommt
Bei "Debug Daten()\ImageID" wird irgendwann nur noch 0 zurückgegeben, das kann doch nicht sein?

@Bisonte
Zitat:
Kann es sein, dass Du Windows 10 benutzt ?

Ja Ich arbeite mit Windows 10

_________________
Intel Quad Core 3,2 Ghz Radeon HD6950 2GB BlitzBasic Plus 1.48 , PureBasic 5.21 LTS/5.30


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Ungültige ImageID ?
BeitragVerfasst: 13.03.2018 13:24 
Offline
Benutzeravatar

Registriert: 30.03.2010 15:24
Könnte sein das Du schon das GDI limit des Processes erreicht hast.

Google mal nach SHGFI_SYSICONINDEX und system image list.

_________________
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Falling Bug


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Ungültige ImageID ?
BeitragVerfasst: 13.03.2018 14:17 
Offline
Benutzeravatar

Registriert: 06.07.2014 12:21
@_JON_
Zitat:
Könnte sein das Du schon das GDI limit des Processes erreicht hast.


und wie könnte man diese verhindern ?

_________________
Intel Quad Core 3,2 Ghz Radeon HD6950 2GB BlitzBasic Plus 1.48 , PureBasic 5.21 LTS/5.30


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Ungültige ImageID ?
BeitragVerfasst: 13.03.2018 14:37 
Offline
Benutzeravatar

Registriert: 08.09.2004 00:57
Wohnort: Berlin
Da fehlt in jedem Fall ein "DestroyIcon_(?)" an geeigneter Stelle, ansonsten haben wir mehr Handles als erlaubt. Wird ja auch nicht mehr gebraucht, nach Erstellung einer ImageID()

Woher ich das weiß? Weil dasselbe Problem hatte ich vor Jahren mit meinem jaCommander :mrgreen:

_________________
PureBasic 5.70 | SpiderBasic 2.10 | Windows 10 Pro (x64) | Linux Mint 19.0 (x64)
"Ich möchte gerne die Welt verändern, doch Gott gibt den Quellcode nicht frei."
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Ungültige ImageID ? "Gelöst"
BeitragVerfasst: 13.03.2018 14:43 
Offline
Benutzeravatar

Registriert: 06.07.2014 12:21
@ts-soft :allright: :allright: :allright: :allright:
Zitat:
Da fehlt in jedem Fall ein "DestroyIcon_(?)

ja stimmt, habe ich gerade im Englischen Forum gefunden und eingebaut
http://www.purebasic.fr/english/viewtopic.php?f=12&t=35696

Edit: so geht es nicht ?????????
Code:
         ForEach Dateien()
            AddGadgetItem(gadget, -1,  Dateien()\Datei+Chr(10)+Dateien()\Adatum+Chr(10)+Dateien()\Typ+Chr(10)+Str(Dateien()\Dsize)+" kb",Dateien()\ImageID)
            DestroyIcon_(Dateien()\ImageID)
         Next

aber so: warum ich nicht nachträglich das Icon aus der Structur Freigeben kann versteh ich jetzt nicht
Code:
         ForEach Dateien()
            SHGetFileInfo_(Quellenfolder+Dateien()\Datei, #Null, @Icon, SizeOf(SHFILEINFO), #SHGFI_ICON|#SHGFI_SMALLICON|#SHGFI_USEFILEATTRIBUTES)
            AddGadgetItem(Activeliste, -1,  Dateien()\Datei+Chr(10)+Dateien()\Adatum+Chr(10)+Dateien()\Typ+Chr(10)+Str(Dateien()\Dsize)+" Kb",Icon\hIcon)
            DestroyIcon_(Icon\hIcon)
         Next

_________________
Intel Quad Core 3,2 Ghz Radeon HD6950 2GB BlitzBasic Plus 1.48 , PureBasic 5.21 LTS/5.30


Zuletzt geändert von silbersurfer am 13.03.2018 15:18, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Ungültige ImageID ?
BeitragVerfasst: 13.03.2018 15:00 
Offline
Benutzeravatar

Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte
Ist deinen 45 Smileys zu entnehmen das es jetzt funktioniert? Ich bekomme weiterhin den gleichen Fehler.

_________________
Windows 10 Pro, 64-Bit / Outtakes | Derek


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Ungültige ImageID ?
BeitragVerfasst: 13.03.2018 15:23 
Offline
Benutzeravatar

Registriert: 06.07.2014 12:21
@Fluid Byte
Zitat:
Ist deinen 45 Smileys zu entnehmen das es jetzt funktioniert?

ja es funzt nun, hast du meinen Edit gelesen Fluid Byte

es geht nur wenn ich in der selben schleife einlese und dann auch gleich freigebe " Warum auch immer ?"
Code:
         ForEach Dateien()
            SHGetFileInfo_(Quellenfolder+Dateien()\Datei, #Null, @Icon, SizeOf(SHFILEINFO), #SHGFI_ICON|#SHGFI_SMALLICON|#SHGFI_USEFILEATTRIBUTES)
            AddGadgetItem(Activeliste, -1,  Dateien()\Datei+Chr(10)+Dateien()\Adatum+Chr(10)+Dateien()\Typ+Chr(10)+Str(Dateien()\Dsize)+" Kb",Icon\hIcon)
            DestroyIcon_(Icon\hIcon)
         Next


den anderen natürlich löschen aus der Procedure
Code:
SHGetFileInfo_(pahtunddatei, #Null, @Icon, SizeOf(SHFILEINFO), #SHGFI_ICON|#SHGFI_SMALLICON|#SHGFI_USEFILEATTRIBUTES)

_________________
Intel Quad Core 3,2 Ghz Radeon HD6950 2GB BlitzBasic Plus 1.48 , PureBasic 5.21 LTS/5.30


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 3 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye