Seite 1 von 2

Multiselect bei ExplorerList

Verfasst: 21.07.2005 14:03
von Karl
Hallo,

folgendes Problem: Der Befehl

Code: Alles auswählen

GetGadgetState(#ExplorerList)
, wobei #ExplorerList ein zuvor definiertes entsprechendes Gadget ist, bringt ja nur die erste Position bei mehrfachausgewählten Elementen. Wie kann ich mich also zum nächsten markierten Element durchhangeln? Jemand ´ne Idee?

Gruß Karl :cry:

Verfasst: 21.07.2005 15:22
von Batze
Für alle Einträge mit ner Schleife.

Code: Alles auswählen

If OpenWindow(0,0,0,400,200,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"ExplorerListGadget") And CreateGadgetList(WindowID(0))
  ExplorerListGadget(0, 10, 10, 380, 180, "*.*", #PB_Explorer_MultiSelect)
  Repeat
    
    Event = WaitWindowEvent()
    If Event = #PB_Event_Gadget And EventGadgetID() = 0
      Datei = ""
      For i=0 To CountGadgetItems(0)-1
        If GetGadgetItemState(0, i) = 1
          Datei.s + GetGadgetItemText(0, i, 0) + ";"
        EndIf
      Next
      Debug Datei
    EndIf
  
  Until Event=#PB_Event_CloseWindow
EndIf

Verfasst: 21.07.2005 15:44
von NicTheQuick
Besser und kompatibler wäre wohl diese Variante mit der entsprechenden Konstanten:

Code: Alles auswählen

If OpenWindow(0,0,0,400,200,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"ExplorerListGadget") And CreateGadgetList(WindowID(0))
  ExplorerListGadget(0, 10, 10, 380, 180, "*.*", #PB_Explorer_MultiSelect)
  Repeat

    Event = WaitWindowEvent()
    If Event = #PB_Event_Gadget And EventGadgetID() = 0
      Datei.s = ""
      For I=0 To CountGadgetItems(0)-1
        If GetGadgetItemState(0, I) & #PB_Explorer_Selected
          Datei.s + GetGadgetItemText(0, I, 0) + ";"
        EndIf
      Next
      Debug Datei
    EndIf

  Until Event=#PB_Event_CloseWindow
EndIf

Multiselect: Second Best

Verfasst: 22.07.2005 07:54
von Karl
Hallo,

nun ja. Diese Art Schleife ist eigentlich nur zweite Wahl (trotzdem Danke für den Hinweis). Bei den Requestern gibt es ja auch die Möglichkeit, auf das nächste ausgewählte File zuzugreifen.

Im Prinzip weiss ja Windows schon, welche Dateien ausgewählt sind. Vielleicht könnte man einen Index-Array als feste Funktion beim nächsten Release einbauen.

Warum? Angenommen die Dateiliste enthält einige hundert oder tausend Dateien (gerade bei Temp-Ordnern). Das Testen ob ein Eintrag ausgewählt ist oder nicht, ist nicht unbedingt effizient.

Vielleicht gibt es ja auch über WinAPI ne Lösung.

Gruß Karl

Re: Multiselect: Second Best

Verfasst: 22.07.2005 12:11
von freedimension
Karl hat geschrieben:Hallo,

nun ja. Diese Art Schleife ist eigentlich nur zweite Wahl (trotzdem Danke für den Hinweis). Bei den Requestern gibt es ja auch die Möglichkeit, auf das nächste ausgewählte File zuzugreifen.

Im Prinzip weiss ja Windows schon, welche Dateien ausgewählt sind. Vielleicht könnte man einen Index-Array als feste Funktion beim nächsten Release einbauen.

Warum? Angenommen die Dateiliste enthält einige hundert oder tausend Dateien (gerade bei Temp-Ordnern). Das Testen ob ein Eintrag ausgewählt ist oder nicht, ist nicht unbedingt effizient.

Vielleicht gibt es ja auch über WinAPI ne Lösung.

Gruß Karl
Da PureBasic zur Bereitstellung eines solchen Arrays ebenfalls alle Einträge in einer Schleife durchgehen müsste und ebenso auch eine API-Funktion, stellt sich die Frage ob es wirklich so sinnvoll wäre dies einzubauen. Nehmen wir einmal an, jemand will kein solches Array oder muss evtl. auch auf die nicht ausgewählten Einträge eingehen, er würde alleine durch das Erstellen des zusätzlichen Arrays unnötig Speicherplatz und ,was wahrscheinlich noch wichtiger ist, Geschwindigkeit verlieren. Ob dass dann immer noch effizient ist bleibt dahingestellt.
Keine Frage, dein Wunsch wäre durchaus etwas um die Bequemlichkeit des Programmierers zu bedienen, wenn man das aber konsequent weiterdenkt, merkt man schnell dass es keinen zusätzlichen Nutzen bringt.
Als Kompromiss könnte man jedoch eine optimierte Funktion fordern welche eine Linked List mit den ausgewählten Einträgen befüllt!?

Verfasst: 25.07.2005 08:03
von Karl
Wenn Files eine Selected-Eigenschaft besitzen, ist keine Komplettschleife notwendig. Der Status wird geändert (ausgewählt oder nicht) , die dynamische Liste bekommt ein neues Element (oder es wird entfernt), fertig. Klingt doch schön einfach, oder?

Aber solange nehme ich die Komplettschleife.

Danke nochmal.

Karl

Verfasst: 25.07.2005 10:40
von Batze
Das Problem ist, dass nicht alle das brauchen was du benötigst.
Vielleicht will ja jemand auch wissen welche Elemente nicht ausgewählt sind.
Daher hat man so viel mehr Freiheit beim Programmieren.

Verfasst: 25.07.2005 13:08
von freak
Man bekommt ja mit GetGadgetState() beweits die erste selektierte Datei, und alle anderen selektierten Dateien folgen direkt danach (kann keine Lücken geben)
Man braucht also garnicht alle Dateien zu testen. So sollte es am schnellsten gehen:

Code: Alles auswählen

index = GetGadgetState(#ExplorerList)
If index <> -1 ; wenn nix selektiert ist kann man hier schon abbrechen
  total = CountGadgetItems(#ExplorerList)
  Repeat
    ;
    ; aktion für selektierte Dateien
    ;
    index + 1
  Until index >= total Or GetGadgetItemState(#ExplorerList, index) & #PB_Explorer_Selected = 0
EndIf

Verfasst: 25.07.2005 13:15
von HeX0R
Wieso soll es keine Lücken geben können :shock: ?

Verfasst: 25.07.2005 13:19
von freedimension
HeX0R hat geschrieben:Wieso soll es keine Lücken geben können :shock: ?
Weil freak die Strg-Taste noch nicht kennt ;)