Dymamisches verschieben in einer Liste ? (Erledigt)

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
silbersurfer
Beiträge: 174
Registriert: 06.07.2014 12:21

Dymamisches verschieben in einer Liste ? (Erledigt)

Beitrag 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
Zuletzt geändert von silbersurfer am 16.03.2019 12:39, insgesamt 1-mal geändert.
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
Benutzeravatar
man-in-black
Beiträge: 362
Registriert: 21.08.2006 17:39

Re: Dymamisches verschieben in einer Liste ?

Beitrag 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
(hab alles, kann alles, weiß alles!!^^)

Bild
Benutzeravatar
silbersurfer
Beiträge: 174
Registriert: 06.07.2014 12:21

Re: Dymamisches verschieben in einer Liste ?

Beitrag 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
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
Benutzeravatar
man-in-black
Beiträge: 362
Registriert: 21.08.2006 17:39

Re: Dymamisches verschieben in einer Liste ?

Beitrag 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
(hab alles, kann alles, weiß alles!!^^)

Bild
Benutzeravatar
silbersurfer
Beiträge: 174
Registriert: 06.07.2014 12:21

Re: Dymamisches verschieben in einer Liste ?

Beitrag 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:
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Dymamisches verschieben in einer Liste ?

Beitrag von Josh »

Vielleicht kannst du damit was anfangen:
https://www.purebasic.fr/english/viewto ... 12&t=61911
H.Brill
Beiträge: 356
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: Dymamisches verschieben in einer Liste ?

Beitrag von H.Brill »

Wäre das nicht ein typischer Fall für Drag & Drop ?

Als Aktion wird dann #PB_Drag_Move verwendet.
PB 5.60
Benutzeravatar
silbersurfer
Beiträge: 174
Registriert: 06.07.2014 12:21

Re: Dymamisches verschieben in einer Liste ?

Beitrag 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.
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
H.Brill
Beiträge: 356
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: Dymamisches verschieben in einer Liste ?

Beitrag 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
PB 5.60
Benutzeravatar
silbersurfer
Beiträge: 174
Registriert: 06.07.2014 12:21

Re: Dymamisches verschieben in einer Liste ?

Beitrag 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
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
Antworten