DirectoryEntryName() & GetGadgetState() irgendwie verknüpfen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Pr0fessor
Beiträge: 40
Registriert: 21.07.2011 16:13
Computerausstattung: Intel Qore2Quad Q6600, 4GB RAM, Radeon HD 5770, Windows 8.1 Pro 64bit
Wohnort: Hagenow
Kontaktdaten:

DirectoryEntryName() & GetGadgetState() irgendwie verknüpfen

Beitrag 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?
~ PureBasic 5.21 LTS x86 | PureBasic 5.21 LTS x64 | Windows 8.1 Pro with Media Center x64 ~
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

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

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Sirius-2337
Beiträge: 71
Registriert: 29.05.2010 20:55

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

Beitrag 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.
Benutzeravatar
Pr0fessor
Beiträge: 40
Registriert: 21.07.2011 16:13
Computerausstattung: Intel Qore2Quad Q6600, 4GB RAM, Radeon HD 5770, Windows 8.1 Pro 64bit
Wohnort: Hagenow
Kontaktdaten:

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

Beitrag 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
~ PureBasic 5.21 LTS x86 | PureBasic 5.21 LTS x64 | Windows 8.1 Pro with Media Center x64 ~
Benutzeravatar
Pr0fessor
Beiträge: 40
Registriert: 21.07.2011 16:13
Computerausstattung: Intel Qore2Quad Q6600, 4GB RAM, Radeon HD 5770, Windows 8.1 Pro 64bit
Wohnort: Hagenow
Kontaktdaten:

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

Beitrag von Pr0fessor »

:oops:

könnte es mir jemand bitte noch ein bissel kommentieren? das würde es mir doch wesentlich erleichtern :oops:
~ PureBasic 5.21 LTS x86 | PureBasic 5.21 LTS x64 | Windows 8.1 Pro with Media Center x64 ~
Sirius-2337
Beiträge: 71
Registriert: 29.05.2010 20:55

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

Beitrag 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
Benutzeravatar
Pr0fessor
Beiträge: 40
Registriert: 21.07.2011 16:13
Computerausstattung: Intel Qore2Quad Q6600, 4GB RAM, Radeon HD 5770, Windows 8.1 Pro 64bit
Wohnort: Hagenow
Kontaktdaten:

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

Beitrag von Pr0fessor »

DAAANKE :D

das werd´ ich mir gleich ausdrucken
~ PureBasic 5.21 LTS x86 | PureBasic 5.21 LTS x64 | Windows 8.1 Pro with Media Center x64 ~
Antworten