Seite 1 von 1

DirectoryEntryName() & GetGadgetState() irgendwie verknüpfen

Verfasst: 08.10.2012 15:01
von Pr0fessor
...

Ich möchte ein kleines Progrämmle basteln welches einen Ordner rekursiv durchsucht und dann alle gefundenen *.exe auflistet die ich dann per doppelklick ausführen kann.

Allerdings stehe ich vor einem Problem....

Als erstes muss ich ja per examineDirectory() und addgadgetelement den ordner durchlaufen und dann
mittels GetGadgetState() kann ich ja die index# aus dem listviewgadget abfragen aber ich weiß nicht wie ich die nummer mit dem pfad + exe verknüpfen soll damit ich einen eintrag aus der liste starten kann.

kann mir jemand helfen?

Re: DirectoryEntryName() & GetGadgetState() irgendwie verknü

Verfasst: 08.10.2012 15:14
von STARGÅTE
Wenn du mit ExamineDirectory() deine Verzeichnisse durchsuchst, kannst du deine Exen (mit Pfad) in einer LinkedList abspeichern.
Danach kannst du die LinkedList mit Foreach durchlaufen und die Einträge in dein Gadget machen.
Mit SetGadgetItemData() kannst du dann bei jedem eintrag den Pointer zu dem LinkedListElement hinterlegen, sodass du dann bei einem Doppelklick über GetGadgetItemData das Element bekommst und somit alle Informationen die du brauchst.

Re: DirectoryEntryName() & GetGadgetState() irgendwie verknü

Verfasst: 08.10.2012 17:39
von Sirius-2337

Code: Alles auswählen

Procedure SucheExen(Directory$, List GefundeneExen.s(), IncludeHidden = #False)
  
  Protected Dir
  Protected EntryName$, EntryAtrributes, EntryType
  
  Dir = ExamineDirectory(#PB_Any, Directory$, "*.*")
  
  If Dir
    
    While NextDirectoryEntry(Dir)
      
      EntryName$      = DirectoryEntryName(Dir)
      EntryAtrributes = DirectoryEntryAttributes(Dir)
      EntryType       = DirectoryEntryType(Dir)
      
      If EntryName$ = "." Or EntryName$ = ".."
        Continue
      EndIf
      
      If Not IncludeHidden And (EntryAtrributes & #PB_FileSystem_Hidden)
        Continue
      EndIf
      
      Select EntryType
        
        Case #PB_DirectoryEntry_Directory
          
          SucheExen(Directory$ + EntryName$ + "\", GefundeneExen(), IncludeHidden)
          
        Case #PB_DirectoryEntry_File
          
          If GetExtensionPart(EntryName$) = "exe"
            AddElement(GefundeneExen())
            GefundeneExen() = Directory$ + EntryName$
          EndIf
          
      EndSelect
      
    Wend
    
    FinishDirectory(Dir)
    
  EndIf
  
EndProcedure

NewList Exe.s()

SucheExen(PathRequester("Startordner wählen", ""), Exe())

If OpenWindow(0, 0, 0, 600, 500, "Start Exe", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  ListIconGadget(0, 0, 0, WindowWidth(0), WindowHeight(0), "Exe", 180, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
  AddGadgetColumn(0, 2, "Full Path", 380)
  
  HideGadget(0, 1)
  
  Define FileInfos.SHFILEINFO
  
  ForEach Exe()
    SHGetFileInfo_(Exe(), 0, @FileInfos, SizeOf(SHFILEINFO), #SHGFI_TYPENAME|#SHGFI_ICON|#SHGFI_SMALLICON)
    AddGadgetItem(0, -1, GetFilePart(Exe()) + Chr(10) + Exe(), FileInfos\hIcon)
    DestroyIcon_(FileInfos\hIcon)
  Next
  
  HideGadget(0, 0)
  
  Repeat
    
    Select WaitWindowEvent()
      
      Case #PB_Event_CloseWindow
        End
      
      Case #PB_Event_Gadget
        
        If EventGadget() = 0 And EventType() = #PB_EventType_LeftDoubleClick
          If GetGadgetState(0) <> -1
            RunProgram(GetGadgetItemText(0, GetGadgetState(0), 1))
          EndIf
        EndIf
      
    EndSelect
    
  ForEver
  
EndIf
Sorry das keine Kommentare drin sind.

Re: DirectoryEntryName() & GetGadgetState() irgendwie verknü

Verfasst: 08.10.2012 18:24
von Pr0fessor
Danke euch beiden - besonderen Dank gilt Sirius-2337

das ist genau das was ich wollte :D

jetzt schaue ich mir das skript noch genau an (da wären doch kommentare besser... ) und werde da garantiert was lernen.
nochmals Danke :D

Re: DirectoryEntryName() & GetGadgetState() irgendwie verknü

Verfasst: 09.10.2012 09:26
von Pr0fessor
:oops:

könnte es mir jemand bitte noch ein bissel kommentieren? das würde es mir doch wesentlich erleichtern :oops:

Re: DirectoryEntryName() & GetGadgetState() irgendwie verknü

Verfasst: 09.10.2012 17:48
von Sirius-2337
Hier das ganze mit Kommentaren

Code: Alles auswählen

Procedure SucheExen(Directory$, List GefundeneExen.s(), IncludeHidden = #False)
  
  ;Diese Prozedur durchsucht, angefangen bei Directory$, alle Verzeichnisse nach .exe-Dateien
  ;und fügt 'GefundeneExen()' ein Element mit dem Pfad hinzu.
  
  Protected Dir
  Protected EntryName$, EntryAtrributes, EntryType
 
  Dir = ExamineDirectory(#PB_Any, Directory$, "*.*")
 
  If Dir
   
    While NextDirectoryEntry(Dir) ;Gehe alle Dateien/Ordner nacheinander durch
     
      EntryName$      = DirectoryEntryName(Dir)       ;Dateiname der aktuellen Datei (o. Ordner)
      EntryAtrributes = DirectoryEntryAttributes(Dir) ;Diverse Attribute (hier ist nur '#PB_FileSystem_Hidden' wichtig)
      EntryType       = DirectoryEntryType(Dir)       ;Datei oder Ordner
     
      If EntryName$ = "." Or EntryName$ = ".." ;Jeder ordner enthält diese beiden "Ordner". '..' führt ein Verzeichnis aufwärts. '.' führt ins selbe Verzeichnis (Refresh)
        Continue ;Die beiden überspringen wir, da das sonst zu einer Endlos-Rekursion führen würde
      EndIf
     
      If Not IncludeHidden And (EntryAtrributes & #PB_FileSystem_Hidden) ;Wenn wir über den Parameter 'IncludeHidden' angegeben haben, das Versteckte '.exe' nicht gelistet werden sollen (Standard), 
        Continue                                                         ;dann überspringen wir die aktuelle Datei/ den Ordner
      EndIf
     
      Select EntryType
       
        Case #PB_DirectoryEntry_Directory
          
          ;Wenn ein Verzeichnis gefunden wurde wird auch das nache '.exe' durchsucht (Das ist der Rekursive teil an der Prozedur)
          SucheExen(Directory$ + EntryName$ + "\", GefundeneExen(), IncludeHidden)
         
        Case #PB_DirectoryEntry_File
          
          ;Wenn eine Datei gefunden wurde und sie auf "exe" endet wird sie der Liste hinzugefügt
          If GetExtensionPart(EntryName$) = "exe"
            AddElement(GefundeneExen())
            GefundeneExen() = Directory$ + EntryName$
          EndIf
         
      EndSelect
     
    Wend
   
    FinishDirectory(Dir)
   
  EndIf
 
EndProcedure

NewList Exe.s() ;Hier wird die Prozedur 'SucheExen()' die Ergebnisse (Pfade zu '.exe'-Dateien) einfügen

SucheExen(PathRequester("Startordner wählen", ""), Exe()) ;'.exe'-Dateien suchen

If OpenWindow(0, 0, 0, 600, 500, "Start Exe", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) ;Fenster öffnen
 
  ListIconGadget(0, 0, 0, WindowWidth(0), WindowHeight(0), "Exe", 180, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection) ;ListIconGadget erstellen
  AddGadgetColumn(0, 2, "Full Path", 380)                                                                                             ;und eine Spalte hinzufügen
 
  HideGadget(0, 1) ;ListIconGadget kurz verstecken, damit das hinzufügen der Items schneller geht
  
  
  Define FileInfos.SHFILEINFO ;Wird nur für 'SHGetFileInfo_()' und 'DestroyIcon_()' gebraucht
 
  ForEach Exe()
    SHGetFileInfo_(Exe(), 0, @FileInfos, SizeOf(SHFILEINFO), #SHGFI_TYPENAME|#SHGFI_ICON|#SHGFI_SMALLICON) ;Speichert einige Informationen über die Datei in 'FileInfos' (hier wollen wir nur das Icon der '.exe'
    AddGadgetItem(0, -1, GetFilePart(Exe()) + Chr(10) + Exe(), FileInfos\hIcon)
    DestroyIcon_(FileInfos\hIcon) ;Das ListIconGadget hat sich das Icon kopiert deshalb können wir dieses wieder zerstören
  Next
 
  HideGadget(0, 0) ;ListIconGadget wider sichtbar machen
  
  Repeat ;Event-Loop
   
    Select WaitWindowEvent()
     
      Case #PB_Event_CloseWindow
        End
     
      Case #PB_Event_Gadget
       
        If EventGadget() = 0 And EventType() = #PB_EventType_LeftDoubleClick ;Wenn auf das ListIconGadget geDoppelClickt wurde
          If GetGadgetState(0) <> -1 ;Wenn ein Listen-eintrag ausgewählt ist
            AusgewaehltesListIconGadgetItem = GetGadgetState(0)
            VollstaendigerPfadZurExe$ = GetGadgetItemText(0, AusgewaehltesListIconGadgetItem, 1) ;Der vollständige Pfad steht in der 1. Spalte (die Nummerierung fängt mit 0 an)
            RunProgram(VollstaendigerPfadZurExe$) ;Starte '.exe'. 
          EndIf
        EndIf
     
    EndSelect
   
  ForEver
 
EndIf
Ich hoffe es ist alles verständlich

Re: DirectoryEntryName() & GetGadgetState() irgendwie verknü

Verfasst: 09.10.2012 18:32
von Pr0fessor
DAAANKE :D

das werd´ ich mir gleich ausdrucken