Dymamisches verschieben in einer Liste ? (Erledigt)
- silbersurfer
- Beiträge: 174
- Registriert: 06.07.2014 12:21
Dymamisches verschieben in einer Liste ? (Erledigt)
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)
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
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)
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
- man-in-black
- Beiträge: 362
- Registriert: 21.08.2006 17:39
Re: Dymamisches verschieben in einer Liste ?
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
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
- silbersurfer
- Beiträge: 174
- Registriert: 06.07.2014 12:21
Re: Dymamisches verschieben in einer Liste ?
@man-in-black
dieser soll nicht auf die Position 2 springen sondern sollte dann auf die position von 3 springen oder habe ich das jetzt falsch verstanden
ja so in etwa meinte ich dasBei letzterem sollte es recht einfach sein:
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,den gegriffenen Eintrag mit dem aktuell von der Maus berührten "n".
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
- man-in-black
- Beiträge: 362
- Registriert: 21.08.2006 17:39
Re: Dymamisches verschieben in einer Liste ?
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:
MFG
MIB
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
MIB
- silbersurfer
- Beiträge: 174
- Registriert: 06.07.2014 12:21
Re: Dymamisches verschieben in einer Liste ?
@man-in-black
ja das sieht gut aus werde das gleich mal ausprobierén, danke für den Tip man-in-blackguter Einwand. Das Rutschen habe ich vergessen. Wenn du Start und Ziel kennst
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
Re: Dymamisches verschieben in einer Liste ?
Vielleicht kannst du damit was anfangen:
https://www.purebasic.fr/english/viewto ... 12&t=61911
https://www.purebasic.fr/english/viewto ... 12&t=61911
Re: Dymamisches verschieben in einer Liste ?
Wäre das nicht ein typischer Fall für Drag & Drop ?
Als Aktion wird dann #PB_Drag_Move verwendet.
Als Aktion wird dann #PB_Drag_Move verwendet.
PB 5.60
- silbersurfer
- Beiträge: 174
- Registriert: 06.07.2014 12:21
Re: Dymamisches verschieben in einer Liste ?
super nice, genau sowas meinte ich danke Josh
@H.Brill
Kann da jetzt noch keinen Ansatz daraus erkennen.
@H.Brill
hast du einen code-schnipsel der das optische bewegen Demonstriert ?Wäre das nicht ein typischer Fall für Drag & Drop ?
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
Re: Dymamisches verschieben in einer Liste ?
Da müßte ich jetzt selber schauen.
Aber da gibt es im Forum auch genügend Beispielcodes
dazu.
z.B. das hier :
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
- silbersurfer
- Beiträge: 174
- Registriert: 06.07.2014 12:21
Re: Dymamisches verschieben in einer Liste ?
@H.Brill
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:
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,z.B. das hier :
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:
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander