ExplorerTreeGadget mit Datei als Vorauswahl

Anfängerfragen zum Programmieren mit PureBasic.
Olaf.Renns
Beiträge: 27
Registriert: 26.02.2009 10:11

ExplorerTreeGadget mit Datei als Vorauswahl

Beitrag 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
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: ExplorerTreeGadget mit Datei als Vorauswahl

Beitrag 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
a²+b²=mc²
Dark
Beiträge: 93
Registriert: 24.08.2007 20:36
Kontaktdaten:

Re: ExplorerTreeGadget mit Datei als Vorauswahl

Beitrag 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
Olaf.Renns
Beiträge: 27
Registriert: 26.02.2009 10:11

Re: ExplorerTreeGadget mit Datei als Vorauswahl

Beitrag von Olaf.Renns »

@ Dark

Du verwendest aber ein ExplorerListGadget.

@ Kiffi

Genau, also entweder ist die Beschreibung nicht richtig oder wir machen etwas falsch.
Dark
Beiträge: 93
Registriert: 24.08.2007 20:36
Kontaktdaten:

Re: ExplorerTreeGadget mit Datei als Vorauswahl

Beitrag 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
Olaf.Renns
Beiträge: 27
Registriert: 26.02.2009 10:11

Re: ExplorerTreeGadget mit Datei als Vorauswahl

Beitrag 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?
Dark
Beiträge: 93
Registriert: 24.08.2007 20:36
Kontaktdaten:

Re: ExplorerTreeGadget mit Datei als Vorauswahl

Beitrag 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
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: ExplorerTreeGadget mit Datei als Vorauswahl

Beitrag 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
Benutzeravatar
Vera
Beiträge: 928
Registriert: 18.03.2009 14:47
Computerausstattung: Win XP SP2, Suse 11.1
Wohnort: Essen

Re: ExplorerTreeGadget mit Datei als Vorauswahl

Beitrag 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
°
<°)))o><
~~~~~~~~~
echo "Don't worry"
echo "Keep quiet"
@echo off
format forum:\
Benutzeravatar
michel51
Beiträge: 84
Registriert: 01.11.2005 20:00
Wohnort: Dornhan-Weiden

Re: ExplorerTreeGadget mit Datei als Vorauswahl

Beitrag 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.
michel51

Mac OS X Snow Leopard (10.6.8 ) Intel
PureBasic V 5.11(X64), V 5.21(x64)

Zum Lernen ist niemand zu alt.
Antworten