Multiselect bei ExplorerList

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Karl
Beiträge: 520
Registriert: 21.07.2005 13:57
Wohnort: zu Hause

Multiselect bei ExplorerList

Beitrag 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:
The Kopyright Liberation Front also known as the justified ancients of Mumu!
PB 5.X
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Beitrag 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
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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
Benutzeravatar
Karl
Beiträge: 520
Registriert: 21.07.2005 13:57
Wohnort: zu Hause

Multiselect: Second Best

Beitrag 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
The Kopyright Liberation Front also known as the justified ancients of Mumu!
PB 5.X
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Re: Multiselect: Second Best

Beitrag 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!?
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
Benutzeravatar
Karl
Beiträge: 520
Registriert: 21.07.2005 13:57
Wohnort: zu Hause

Beitrag 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
The Kopyright Liberation Front also known as the justified ancients of Mumu!
PB 5.X
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Beitrag 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.
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
freak
PureBasic Team
Beiträge: 766
Registriert: 29.08.2004 00:20
Wohnort: Stuttgart

Beitrag 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
Benutzeravatar
HeX0R
Beiträge: 3056
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Wieso soll es keine Lücken geben können :shock: ?
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag von freedimension »

HeX0R hat geschrieben:Wieso soll es keine Lücken geben können :shock: ?
Weil freak die Strg-Taste noch nicht kennt ;)
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
Antworten