Seite 1 von 3

ExplorerTreeGadget mit Datei als Vorauswahl

Verfasst: 04.08.2010 16:17
von Olaf.Renns
Guten Tag,

ich möchte gern ein ExplorerTreegadget mit Vorauswahl laden. Mit Verzeichnissen kein Problem, aber ich möchte auch gerne eine Datei direkt ausgewählt haben. Wenn ich eine Datei mit vollständigen Pfad übergebe, wird lediglich der letzte Verzeichnisbaum aufgeklappt und markiert, die Datei aber selber nicht:

Verzeichnis ok:

Code: Alles auswählen

  If OpenWindow(0, 0, 0, 300, 300, "ExplorerTreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ExplorerTreeGadget(0, 10, 10, 280, 280, "*.*")
    SetGadgetText(0,"C:\Windows\")
    SetActiveGadget(0)
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf 
Datei nicht ok:

Code: Alles auswählen

  If OpenWindow(0, 0, 0, 300, 300, "ExplorerTreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ExplorerTreeGadget(0, 10, 10, 280, 280, "*.*")
    SetGadgetText(0,"C:\Windows\winhlp32.exe\*.*")
    SetActiveGadget(0)
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf 
Wäre für einen kleinen entscheidenen Hinweis dankbar :bounce:

Grüße
Olaf

Re: ExplorerTreeGadget mit Datei als Vorauswahl

Verfasst: 04.08.2010 17:39
von Kiffi
meinem Verständnis nach müsste das so aussehen:

Code: Alles auswählen

SetGadgetText(0,"C:\Windows\winhlp32.exe")
(also ohne die Sternchen).

Funktioniert aber auch nicht. :|

Bug? Denn in der Hilfe steht: "Set the currently selected file/directory."

Grüße ... Kiffi

Re: ExplorerTreeGadget mit Datei als Vorauswahl

Verfasst: 04.08.2010 18:24
von Dark
Hallo,

ich habe etwas rumprobiert und eine Lösung gefunden:

Code: Alles auswählen

  Procedure SelectFile(Gadget.i, File.s)
    Protected Index.i
    For Index = 0 To CountGadgetItems(Gadget)
      If GetGadgetItemText(Gadget,Index) = File
        Item.LVITEM
        Item\mask = #LVIF_STATE
        Item\state = #LVIS_SELECTED
        Item\stateMask = #LVIS_SELECTED
        SendMessage_(GadgetID(Gadget),#LVM_SETITEMSTATE, Index, @Item)
        ProcedureReturn #True
      EndIf
    Next
    ProcedureReturn #False
  EndProcedure
  
  If OpenWindow(0, 0, 0, 400, 200, "ExplorerListGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ExplorerListGadget(0, 10, 10, 380, 180, "C:\", #PB_Explorer_MultiSelect|#PB_Explorer_AlwaysShowSelection)
    Debug SelectFile(0,"bug.pb")
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


mfg,
Dark

Re: ExplorerTreeGadget mit Datei als Vorauswahl

Verfasst: 05.08.2010 09:06
von Olaf.Renns
@ Dark

Du verwendest aber ein ExplorerListGadget.

@ Kiffi

Genau, also entweder ist die Beschreibung nicht richtig oder wir machen etwas falsch.

Re: ExplorerTreeGadget mit Datei als Vorauswahl

Verfasst: 05.08.2010 17:32
von Dark
Da habe ich wohl nicht ganz genau hingeschaut :oops:

Hier mal die neue Version:

Code: Alles auswählen

  Procedure SelectFile(Gadget.i, File.s, Hitem.i = 0)

    Protected CurItem.i
    Protected String.s = Space(256)
    If Hitem = 0 
      Hitem = SendMessage_(GadgetID(Gadget), #TVM_GETNEXTITEM, #TVGN_ROOT, 0)
    EndIf
    
    If HItem
      CurItem = SendMessage_(GadgetID(Gadget), #TVM_GETNEXTITEM, #TVGN_CHILD, HItem)
      If CurItem
        SelectFile(Gadget.i, File.s, CurItem)
      EndIf
      
      CurItem = HItem
      While CurItem
        Item.TVITEMEX
        Item\hItem = CurItem
        Item\mask = #TVIF_HANDLE | #TVIF_TEXT
        Item\cchTextMax = 256
        Item\pszText = @String
        
        If SendMessage_(GadgetID(Gadget), #TVM_GETITEM, 0, @Item)
          If String = File
            SendMessage_(GadgetID(Gadget),#TVM_SELECTITEM, #TVGN_CARET, CurItem)
            Break
          EndIf
        EndIf
        
        CurItem = SendMessage_(GadgetID(Gadget), #TVM_GETNEXTITEM, #TVGN_NEXT, CurItem)
      Wend   
         
    EndIf
    ProcedureReturn #False
  EndProcedure
 
  If OpenWindow(0, 0, 0, 400, 200, "ExplorerTreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ExplorerTreeGadget(0, 10, 10, 380, 180, "C:\", #PB_Explorer_AlwaysShowSelection)
    Debug SelectFile(0,"bug.pb")
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf
mfg,
Dark

Re: ExplorerTreeGadget mit Datei als Vorauswahl

Verfasst: 06.08.2010 11:35
von Olaf.Renns
Hallo,

Danke für deinen Quellcode Dark! Leider funktioniert dieser bei mir nicht (Auch unbeachtet des fehlenden True ProcedureReturns), es wird wieder lediglich das letzte Unterverzeichnis ausgewählt. Zum gleichen Effekt kamen auch meine Versuche, mich anhand der im CodeArchiv vorhandenen TreeGadget Beispiel durchzuarbeiten. Kannst du die Lauffähigkeit bei dir bestätigen?

Re: ExplorerTreeGadget mit Datei als Vorauswahl

Verfasst: 06.08.2010 17:00
von Dark
Olaf.Renns hat geschrieben:Hallo,

Danke für deinen Quellcode Dark! Leider funktioniert dieser bei mir nicht (Auch unbeachtet des fehlenden True ProcedureReturns), es wird wieder lediglich das letzte Unterverzeichnis ausgewählt. Zum gleichen Effekt kamen auch meine Versuche, mich anhand der im CodeArchiv vorhandenen TreeGadget Beispiel durchzuarbeiten. Kannst du die Lauffähigkeit bei dir bestätigen?
Hallo,

ich habe den Code sowohl unter XP wie auch Vista getestet. Mögliche Fehlerquellen wären folgende: Dem ExplorerTreeGadget muss vor dem Benutzen der Prozedur SelectFile der passende Ordner zugewiesen werden und bei SelectFile darf nur der Dateiname ohne Pfad übergeben werden. Zusätzlich würde der Code nicht im Unicode Modus funktionieren, hierfür müsste dieser noch leicht angepasst werden.

mfg,
Dark

Re: ExplorerTreeGadget mit Datei als Vorauswahl

Verfasst: 06.08.2010 17:50
von edel
Du landest bei deinem Code irgendwie immer nur ganz oben im Verzeichnis. Warum du immer ganz oben anfaengst, versteh ich auch
nicht ganz, das aktuelle Verzeichnis ist doch immer selektiert, falls vorhanden.

Ich hab dein Beispiel mal umgebaut :

Code: Alles auswählen

Procedure SelectFile(Gadget.i, File.s)
  Protected path.s
  Protected hItem.i
  Protected item.TVITEM
  Protected buffer.s{#MAX_PATH}
  Protected result.i
  
  path = GetPathPart(File)
  
  If Not path
    path = GetGadgetText(Gadget)
    path = GetPathPart(path)
  EndIf
  
  file = GetFilePart(file)
  
  SetGadgetText(Gadget,path)  
  
  hItem = SendMessage_(GadgetID(Gadget),#TVM_GETNEXTITEM, #TVGN_CARET, 0) 
  
  If hItem
    hItem = SendMessage_(GadgetID(Gadget),#TVM_GETNEXTITEM, #TVGN_CHILD, hItem)        
    
    If hItem
      
      item\mask       = #TVIF_TEXT | #TVIF_HANDLE     
      item\pszText    = @buffer    
      item\cchTextMax = #MAX_PATH
      
      While hItem
        
        item\hItem    = hItem  
        SendMessage_(GadgetID(Gadget), #TVM_GETITEM, 0, item)      
        
        If CompareMemoryString(@file,@buffer,#PB_String_NoCase) = #PB_String_Equal
          SendMessage_(GadgetID(Gadget),#TVM_SELECTITEM, #TVGN_CARET, hItem)
          result = #True
          Break
        EndIf      
        
        hItem = SendMessage_(GadgetID(Gadget),#TVM_GETNEXTITEM, #TVGN_NEXT, hItem)
      Wend 
            
    EndIf 
    
  EndIf
  
  ProcedureReturn result
EndProcedure

If OpenWindow(0, 0, 0, 400, 200, "ExplorerTreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ExplorerTreeGadget(0, 10, 10, 380, 180, "C:\Windows\*.exe")
  SetActiveGadget(0)
  Debug SelectFile(0,"notepad.exe")
  ;SelectFile(0,"C:\Windows\notepad.exe")
  
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf

Re: ExplorerTreeGadget mit Datei als Vorauswahl

Verfasst: 06.08.2010 23:17
von Vera
Kiffi hat geschrieben:Bug? Denn in der Hilfe steht: "Set the currently selected file/directory."
Olaf.Renns hat geschrieben:Genau, also entweder ist die Beschreibung nicht richtig oder wir machen etwas falsch.
Well, die Beschreibung ist nicht ausreichend, aber wenn man unter SetGadgetText() nachsieht, dann wird es etwas deutlicher:
ExplorerTreeGadget()
- SetGadgetText(): Ändert die/das aktuell ausgewählte Datei/Verzeichnis.

SetGadgetText()
- ExplorerTreeGadget(): ändert das aktuell ausgewählte Verzeichnis und/oder den Pattern (Datei-Filter) für Dateien (siehe ExplorerTreeGadget() für weitere Details).
Soweit ich das rausgekriegt habe, kann man eine einzelne Datei nicht vormarkiert anzeigen lassen, sondern diese Datei in seinem Verzeichnis unter Ausschluß aller anderen Dateien. 'Set' setzt hier den Filter, aber nicht den Fokus.

Da es sich aber unter Linux ein wenig anders verhält, hier wird zB. beim Erstaufruf eine gezielte Datei tatsächlich auch gleichfalls markiert, aber beim wiederholten Setzen nicht mehr. (andere Unterschiede habe ich noch nicht ausgearbeitet)
Die Hilfe muß in dieser Kürze versuchen alle Komponenten zu bedienen und im Fall der Verzeichniswahl, wird dieses ja auch gesetzt.

Hier mal ein kleines Beispiel, dass diesen Aspekt sofort deutlich macht

Code: Alles auswählen

Reset:
If OpenWindow(0, 320, 110, 300, 440, "ExplorerTreeGadget", #PB_Window_SystemMenu) 
    ExplorerTreeGadget(0, 10, 10, 280, 420, #PB_Compiler_Home) 
  
  If CreatePopupMenu(1) 
       MenuItem(4, "*.*") 
       MenuItem(5, "*.pb")
       MenuItem(6, "*.txt; *.ini")
       MenuItem(7, "desktop.ini")
       MenuItem(8, "compiler ?")
       MenuItem(9, "huibuh")
       MenuBar()
       MenuItem(10, "path -> clip")
       MenuBar()
       MenuItem(11, "reset")
       MenuItem(0, "quit")
  EndIf

  Repeat 
    wwe = WaitWindowEvent()
    Select wwe 
      Case #PB_Event_Gadget  
        If EventType() = #PB_EventType_RightClick 
           DisplayPopupMenu(1, WindowID(0)) 
        EndIf 
 
      Case #PB_Event_Menu
         Select EventMenu()  
          Case 4 : SetGadgetText(0,"*.*")
           Case 5 : SetGadgetText(0,"*.pb")
           Case 6 : SetGadgetText(0,"*.txt;*.ini")
           Case 7 : SetGadgetText(0,"desktop.ini")  ; readme.txt
           Case 8 : SetGadgetText(0,#PB_Compiler_Home + "compilers\pbcompiler.exe") : SetGadgetColor(0, #PB_Gadget_BackColor, $666600)
           Case 9 : SetGadgetColor(0, #PB_Gadget_BackColor, RGB(Random(255),Random(255),Random(255)) ) ; $ffffff
           Case 10 : SetClipboardText(GetGadgetText(0)) 
           Case 11 : Goto Reset 
           Case 0 : Quit = 1 
        EndSelect
        
      Case #PB_Event_CloseWindow 
        Break
    EndSelect
  Until Quit = 1 
  
EndIf
Um eine oder mehrere Dateien im ExplorerTreeGadget vorzumarkieren, muß man wohl den Weg über die API nehmen.
Olaf.Renns hat geschrieben:es wird wieder lediglich das letzte Unterverzeichnis ausgewählt. Zum gleichen Effekt kamen auch meine Versuche, mich anhand der im CodeArchiv vorhandenen TreeGadget Beispiel durchzuarbeiten.
Im TreeGadget kann man ganz gezielt jeden Eintrag selektieren lassen, aber nur unter den Bedingungen, dass die entsprechende/n Node/s aufgeklappt ist/sind und man die absolute Listenposition angibt. Diese Position ist aber abhängig von der jeweils tatsächlich 'sichbaren' Liste.

Gruß ~ Vera

Re: ExplorerTreeGadget mit Datei als Vorauswahl

Verfasst: 06.08.2010 23:20
von michel51
Hallo,

wenn ich die deutsche Hilfe richtig verstanden habe,

Code: Alles auswählen

Syntax

Ergebnis = ExplorerTreeGadget(#Gadget, x, y, Breite, Hoehe, Verzeichnis$, [, Flags])
dann kann das ExplorerTreeGadget NUR Verzeichnisse darstellen und keine Dateien.