ExplorerTreeGadget - mehrere Dateien mit Strg markieren

Anfängerfragen zum Programmieren mit PureBasic.
Excalibur
Beiträge: 27
Registriert: 26.02.2007 23:56

Noch wach?

Beitrag von Excalibur »

Daß jetzt noch einer wach ist, echt der Hammer. Das hat mich schon letzte Woche gewundert.

Ich probiers aus und melde mich wieder.

Danke schon mal. Das macht richtig Spaß hier. :)

Jetzt muß ich aber irgendwann mal schlafen. Zur Zeit arbeite ich 3-Schicht am Stück mit PB. :wink:
PB v4.02 XP
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Beitrag von Shardik »

Kaeru Gaman hat geschrieben: das ExplorerTreeGadget ist nicht dafür vorgesehen, um mehrere Ordner zu markieren.
das kann die linke spalte in deinem explorer auch nicht.
Obwohl es für ExplorerTreeGadgets in der Tat nicht vorgesehen ist, kann man die Mehrfachselektion sehr wohl mit Ordnern realisieren; zumindest hat es freak bei mit Checkbox versehenen Ordnern in diesem Posting demonstriert:
http://www.purebasic.fr/english/viewtop ... 08&start=1

Und die Mehrfachselektion für Dateien im ExplorerTreeGadget läßt sich auch realisieren. Ich habe schon einmal vor zwei Jahren eine solche Lösung gebastelt, die auch ohne Shift- und Strg-Taste funktioniert (für Anwender, denen man das Festhalten einer zusätzlichen Taste beim Markieren nicht zumuten kann :wink: ): einfach eine oder mehrere Dateien nacheinander anklicken zum Markieren. Ein Löschen der Markierung erfolgt durch Anklicken einer schon markierten Datei. Allerdings funktioniert diese Lösung im Moment nur für ein einzelnes Verzeichnis, der Wechsel in ein anderes Verzeichnis löscht alle bisherigen Markierungen:

Code: Alles auswählen

#Button = 0
#ExplorerTree = 1
#Window = 0

Procedure.B HighlightItem(HighlightFlag.B)
  ItemHandle.L
  TVHitTest.TV_HITTESTINFO
  TVItem.TV_ITEM

  TVHitTest\Pt\x = WindowMouseX(#Window) - GadgetX(#ExplorerTree)
  TVHitTest\Pt\y = WindowMouseY(#Window) - GadgetY(#ExplorerTree)

  ItemHandle = SendMessage_(GadgetID(#ExplorerTree), #TVM_HITTEST, 0, @TVHitTest)

  If ItemHandle <> 0
    If TVHitTest\Flags <> #TVHT_ONITEMBUTTON
      TVItem\Mask = #TVIF_STATE
      TVItem\hItem = ItemHandle

      If HighlightFlag = #True
        TVItem\StateMask = #TVIS_DROPHILITED
        TVItem\State = #TVIS_DROPHILITED
      Else
        TVItem\StateMask = #TVIS_DROPHILITED | #TVIS_SELECTED
        TVItem\State = 0
      EndIf

      SendMessage_(GadgetID(#ExplorerTree), #TVM_SETITEM, 0, @TVItem)

      RedrawWindow_(GadgetID(#ExplorerTree), 0, 0, #RDW_UPDATENOW)

      ProcedureReturn #True
    EndIf
  EndIf

  ProcedureReturn #False
EndProcedure


EntryFound.B
i.W
Msg.S
WindowEvent.L

NewList MarkedItems.S()

If OpenWindow(#Window, 0, 0, 321, 330, "MultiSelect-Demo", #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered)
  If CreateGadgetList(WindowID(#Window))
    ExplorerTreeGadget(#ExplorerTree, 9, 12, 303, 279, "", #PB_Explorer_NoMyDocuments)
    ButtonGadget(#Button, 80, 300, 150, 20, "Markierte Dateien anzeigen")
    Repeat
      WindowEvent = WaitWindowEvent()

      If EventType() = #PB_EventType_LeftClick
        If EventGadget() = #Button
          Break
        EndIf

        If GetGadgetState(#ExplorerTree) = #PB_Explorer_File
          EntryFound = #False

          If CountList(MarkedItems()) = 0
            If HighlightItem(#True) = #True
              AddElement(MarkedItems())
              MarkedItems() = GetGadgetText(#ExplorerTree)
            EndIf
          Else              
            FirstElement(MarkedItems())
          
            Repeat
              If MarkedItems() = GetGadgetText(#ExplorerTree)
                If HighlightItem(#False) = #True
                  DeleteElement(MarkedItems())
                  EntryFound = #True
                EndIf

                Break
              EndIf
            Until NextElement(MarkedItems()) = #False

            If EntryFound = #False
              If HighlightItem(#True) = #True
                AddElement(MarkedItems())
                MarkedItems() = GetGadgetText(#ExplorerTree)
              EndIf
            EndIf
          EndIf
        EndIf
      EndIf  
    Until WindowEvent = #PB_Event_CloseWindow
    
    If CountList(MarkedItems()) > 0
      Msg = "Anzahl ausgewählter Dateien: " + Str(CountList(MarkedItems())) + Chr(13) + Chr(13)
      
      FirstElement(MarkedItems())

      For i = 1 To CountList(MarkedItems())
        Msg = Msg + MarkedItems() + Chr(13)
        NextElement(MarkedItems())
      Next i
      
      MessageRequester("Info", Msg)
    Else
      MessageRequester("Info", "Es wurden keine Dateien markiert!")
    EndIf
  EndIf
EndIf
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

@Shardik

yo prima. :allright:

...allerdings bin ich bei Excaliburs unschuldiger fragestellung davon ausgegangen,
dass er den vorgang meint der nativ vorgesehen ist,
und sich daher einfach im Gadget vertan hat. ;)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Excalibur
Beiträge: 27
Registriert: 26.02.2007 23:56

Beitrag von Excalibur »

Ich nehme alle Schuld auf mich und habe mich auch vertan.

Allerdings finde ich es schon klasse, wie Ihr hier nachts um halb 2 so kurz mal ein Programm aus dem Ärmel zaubert. :allright:

Habt Ihr sowas vorrätig oder macht Ihr das aus dem FF?
PB v4.02 XP
Excalibur
Beiträge: 27
Registriert: 26.02.2007 23:56

Frage an Kiffi

Beitrag von Excalibur »

Hallo Kiffi,

Dein Programm funktioniert.

So einigermaßen verstehe ich es. Aber doch nicht ganz.

Wäre es möglich, daß Du noch ein paar Kommentare reinschreibst?

Noch eine Frage: Was bedeutet die -1 hinter der For Next Schleife?

Über eine Antwort würde ich mich freuen.

Danke :oops:
PB v4.02 XP
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Noch eine Frage: Was bedeutet die -1 hinter der For Next Schleife?

CountGadgetItems() gibt die gesamte Anzahl der Elemente zurück.
da die nummerierung bei 0 beginnt, ist die nummer des letzten Elementes =Anzahl-1
z.b. 8 elemente, nummern 0-7, 7 = 8-1
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Excalibur
Beiträge: 27
Registriert: 26.02.2007 23:56

Beitrag von Excalibur »

Ok danke, das leuchtet mir ein.
PB v4.02 XP
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

bitte im Hinterkopf behalten:
die -1 steht nicht irgendwie "hinter der schleife",
sie ist ein bestandteil des zweiten Parameters der nach To steht. ;)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten