Seite 1 von 1

Dymamisches verschieben in einer Liste ? (Erledigt)

Verfasst: 10.03.2019 10:24
von silbersurfer
Hallo Leute,
ich bin es mal wieder, habe da ein Problem wo ich nicht richtig weiter komme.
Ich möchte gerne in einer Liste einen Eintrag Dynamisch verschieben (ein Element greifen und dann in der Liste hoch und runter bewegen)
Bild
wobei sich die anderen Elemente in der listen optisch der verschiebung anpassen (wenn Element 2 ausgewähl ist und richtung 3 verschoben wird sollte 3 dann an die Position von 2 rutschen genauso halt anderes herum).
Ich hoffe das ich das verständlich erklärt habe, und ihr mir da auf die sprünge helfen könnt.

Gruß Silbersurfer

Re: Dymamisches verschieben in einer Liste ?

Verfasst: 10.03.2019 11:19
von man-in-black
Hi,

womit willst du das machen? Gadget (Desktop) oder Sprites (Screen)?

Bei letzterem sollte es recht einfach sein:
- Liste zeichnen
- bei Mausklick (halten) aktuelle Position ermitteln
- Eintrag auslesen und optisch an die Maus pinnen (Liste aber nicht verändern!)
- ständig die Mausposition ermitteln
- wenn diese die absoluten Grenzen eines anderen Eintrages überfährt oder in der relativen Bewegung (bezogen auf die Position des ersten Klicks) n*Eintraghöhe übersteigt (auch negativ), dann tauschst du erst den gegriffenen Eintrag mit dem aktuell von der Maus berührten "n".
(Code wäre via Handy jetzt zu aufwändig ;) )

MFG
MIB

Re: Dymamisches verschieben in einer Liste ?

Verfasst: 10.03.2019 11:33
von silbersurfer
@man-in-black
Bei letzterem sollte es recht einfach sein:
ja so in etwa meinte ich das
den gegriffenen Eintrag mit dem aktuell von der Maus berührten "n".
wenn ich das richtig verstehe, der listeintrag befindet sich auf position 2 verschiebe ich diesen auf 3 dann tauschen? aber was wenn ich über 4 bin,
dieser soll nicht auf die Position 2 springen sondern sollte dann auf die position von 3 springen oder habe ich das jetzt falsch verstanden

Re: Dymamisches verschieben in einer Liste ?

Verfasst: 10.03.2019 13:12
von man-in-black
Hi.

guter Einwand. Das Rutschen habe ich vergessen. Wenn du Start und Ziel kennst,
kannst du via For-Schleife (i von Start zu Ziel-1) zwei benachbarte Elemente tauschen:

Code: Alles auswählen

speicher = liste(start)
for i ... 
liste (i) = liste (i+1)
next
liste(ziel) = speicher 
MFG
MIB

Re: Dymamisches verschieben in einer Liste ?

Verfasst: 10.03.2019 15:19
von silbersurfer
@man-in-black
guter Einwand. Das Rutschen habe ich vergessen. Wenn du Start und Ziel kennst
ja das sieht gut aus werde das gleich mal ausprobierén, danke für den Tip man-in-black :allright: :allright:

Re: Dymamisches verschieben in einer Liste ?

Verfasst: 10.03.2019 15:36
von Josh
Vielleicht kannst du damit was anfangen:
https://www.purebasic.fr/english/viewto ... 12&t=61911

Re: Dymamisches verschieben in einer Liste ?

Verfasst: 10.03.2019 15:41
von H.Brill
Wäre das nicht ein typischer Fall für Drag & Drop ?

Als Aktion wird dann #PB_Drag_Move verwendet.

Re: Dymamisches verschieben in einer Liste ?

Verfasst: 10.03.2019 17:08
von silbersurfer
super nice, genau sowas meinte ich danke Josh :allright: :allright: :allright:

@H.Brill
Wäre das nicht ein typischer Fall für Drag & Drop ?
hast du einen code-schnipsel der das optische bewegen Demonstriert ?
Kann da jetzt noch keinen Ansatz daraus erkennen.

Re: Dymamisches verschieben in einer Liste ?

Verfasst: 10.03.2019 19:17
von H.Brill
Da müßte ich jetzt selber schauen.
Aber da gibt es im Forum auch genügend Beispielcodes
dazu.
z.B. das hier :

Code: Alles auswählen


Procedure ListIconGadgetColumns(GadgetNo)
  i = 0
  While GetGadgetItemAttribute(GadgetNo, 0, #PB_ListIcon_ColumnWidth, i) > 0
    i + 1
  Wend
  ProcedureReturn i
EndProcedure

Procedure ListIconGadgetMove(GadgetNo.i, Source.i, Dest.i)
  Columns = ListIconGadgetColumns(GadgetNo) - 1
  For j = 0 To Columns
    Source$ = GetGadgetItemText(GadgetNo, Source, j)
    If Source < Dest
      For i = Source To Dest - 1
        Help$ = GetGadgetItemText(GadgetNo, i + 1, j)
        SetGadgetItemText(GadgetNo, i, Help$, j)
      Next i
    Else
      For i = Source To Dest + 1 Step - 1
        Help$ = GetGadgetItemText(GadgetNo, i - 1, j)
        SetGadgetItemText(GadgetNo, i, Help$, j)
      Next i
    EndIf
    SetGadgetItemText(GadgetNo, i, Source$, j)
  Next j
EndProcedure

Procedure ListViewGadgetMove(gad.i, Source.i, Dest.i)
  Protected i, Help$, Source$
  Source$ = GetGadgetItemText(gad, Source)
  If Source < Dest
    For i = Source To Dest - 1
      Help$ = GetGadgetItemText(gad, i + 1)
      SetGadgetItemText(gad, i, Help$)
    Next
  Else
    For i = Source To Dest + 1 Step - 1
      Help$ = GetGadgetItemText(gad, i - 1)
      SetGadgetItemText(gad, i, Help$)
    Next
  EndIf
  SetGadgetItemText(gad, i, Source$)
EndProcedure

OpenWindow(0, 0, 0, 600, 600, "Drag'n drop test", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)

; ContainerGadget is more for testing only (if the Drag'n'Drop also works, if the related gadgets are placed inside)
gad = ContainerGadget(#PB_Any, 5, 5, 460, 265, #PB_Container_Double)
     
listicon = ListIconGadget(#PB_Any, 10, 10, 440, 240, "Test 1", 100 , #PB_ListIcon_FullRowSelect|#PB_ListIcon_HeaderDragDrop)
AddGadgetColumn(listicon, 1, "Test 2", 100)
AddGadgetColumn(listicon, 2, "Test 3", 100)
AddGadgetColumn(listicon, 3, "Test 4", 100)
For i = 1 To 10
  AddGadgetItem(listicon, -1, "Line " + Str(i) + " Col 1" + Chr(10) + "Line " + Str(i) + " Col 2"+  Chr(10) + "Line " + Str(i) + " Col 3" + Chr(10) + "Line " + Str(i) + " Col 4")
Next i
CloseGadgetList()  ;Remember to close the GadgetList()
EnableGadgetDrop(Listicon, #PB_Drop_Private, #PB_Drag_Move, 1)

button = ButtonGadget(#PB_Any, 520, 15, 50, 24,"TEST")

Exit = #False
DragItem = -1

Repeat
  Event = WaitWindowEvent()
  EventType = EventType()
  EventGadget = EventGadget()
 
  Select Event
    Case #PB_Event_Gadget
     Select EventGadget()
       Case button
        listicon2 = ListIconGadget(#PB_Any, 10, 340, 440, 240, "Test 1", 100 , #PB_ListIcon_FullRowSelect|#PB_ListIcon_HeaderDragDrop)
        AddGadgetColumn(listicon2, 1, "Test 2", 100)
        AddGadgetColumn(listicon2, 2, "Test 3", 100)
        AddGadgetColumn(listicon2, 3, "Test 4", 100)
        For i = 1 To 10
          AddGadgetItem(listicon2, -1, "Line " + Str(i) + " Col 1" + Chr(10) + "Line " + Str(i) + " Col 2"+  Chr(10) + "Line " + Str(i) + " Col 3" + Chr(10) + "Line " + Str(i) + " Col 4")
        Next i 
        EnableGadgetDrop(Listicon2, #PB_Drop_Private, #PB_Drag_Move, 1)


       Case listicon,listicon2
        Select EventType
          Case #PB_EventType_DragStart
            DragItem = GetGadgetState(EventGadget)
            DragPrivate(1, #PB_Drag_Move)
        EndSelect
     EndSelect
        
    Case #PB_Event_GadgetDrop
      EventGadget = GetActiveGadget()
      If EventDropPrivate() = 1
        TargetItem = GetGadgetState(EventGadget)
        ; Debug "Target: " + Str(TargetItem)
        If EventGadget = listicon Or EventGadget = listicon2
          ListIconGadgetMove(EventGadget, DragItem, TargetItem)
        EndIf
      EndIf
          
          
    Case #PB_Event_CloseWindow
      Exit = #True
  EndSelect
 
Until Exit

Re: Dymamisches verschieben in einer Liste ?

Verfasst: 16.03.2019 10:00
von silbersurfer
@H.Brill
z.B. das hier :
Sorry H.Brill, das war mit meiner Frage nicht gemeint, hier ging es um Linked lists und deren Optischen Verschiebung wie es Josh sein Code zeigt,
bin gerade dabei Josh seinen Code für meine zwecke anzupassen (an dieser stelle nochmals danke Josh)

Edit: dank Josh habe ich das jetzt für mich umsetzen können :-)

Siehe:
Bild