ListIcon + MultiSelect + Drag&Drop

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

ListIcon + MultiSelect + Drag&Drop

Beitrag von H.Brill »

Ich möchte gerne per Drag&Drop mehrere Einträge vom obigen
Listicon ins untere Listicon kopieren. Mit Einzel-Items gehts ja
wunderbar. Nur wie gehts am besten mit mehreren ?
Wahrscheinlich mit einer Liste. Kann ich dazu SetDragCallback()
und SetDropCallback() benutzen und wie ?
Evtl. hat ja jemand schon sowas gemacht.
Es sollten Einzeleinträge und auch Multiselect gehen.

Code: Alles auswählen

#Window = 0
Enumeration
  #SourceText
  #TargetText
EndEnumeration

Structure Felder
  Name.s{100}
  Ort.s{100}
  Telefon.s{12}
EndStructure
Global NewList Felderliste.Felder()

Global Event.l, i.l, Text.s

If OpenWindow(#Window, 0,0,600,600, "Drag & Drop", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  ListIconGadget(#SourceText, 10,10,500,200, "Name", 180,#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect|#PB_ListIcon_MultiSelect) 
  ListIconGadget(#TargetText, 10,300, 500,200, "Name",  180, #PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
  
  AddGadgetColumn(#SourceText, 1, "Ort", 180)
  AddGadgetColumn(#SourceText, 2, "Telefon", 100)
  AddGadgetColumn(#TargetText, 1, "Ort", 180)
  AddGadgetColumn(#TargetText, 2, "Telefon", 100)
  
  AddGadgetItem(#SourceText, -1, "Maier" + Chr(10) + "Köln" + Chr(10) + "4711")
  AddGadgetItem(#SourceText, -1, "Schmidt" + Chr(10) + "Hamburg" + Chr(10) + "12345")
  AddGadgetItem(#SourceText, -1, "Müller" + Chr(10) + "Bonn" + Chr(10) + "6789")
  
  EnableGadgetDrop(#TargetText, #PB_Drop_Text, #PB_Drag_Copy)
  
  Repeat
    Event = WaitWindowEvent()
    If Event = #PB_Event_Gadget And EventType() = #PB_EventType_DragStart
      Select EventGadget()
        Case #SourceText
          Text = GetGadgetItemText(#SourceText, GetGadgetState(#SourceText),0) + Chr(10) + GetGadgetItemText(#SourceText, GetGadgetState(#SourceText),1) + Chr(10) + GetGadgetItemText(#SourceText, GetGadgetState(#SourceText),2)
          DragText(Text)
      EndSelect
    ElseIf Event = #PB_Event_GadgetDrop
      Select EventGadget()
        Case #TargetText
          AddGadgetItem(#TargetText, -1, EventDropText())
      EndSelect
    EndIf
  Until Event = #PB_Event_CloseWindow
EndIf

End

PB 6.10
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: ListIcon + MultiSelect + Drag&Drop

Beitrag von STARGÅTE »

Du kannst (es gibt auch andere Möglichkeiten) das mit einem Privaten Drag&Drop-Typ realisieren.

Zum Beispiel so:

Code: Alles auswählen

#Window = 0
Enumeration
  #SourceText
  #TargetText
  #PrivateType1
EndEnumeration

Structure Felder
  Name.s{100}
  Ort.s{100}
  Telefon.s{12}
EndStructure
Global NewList Felderliste.Felder()

Global Event.l, i.l, Text.s
Define Index.i, TargetIndex.i, Count.i, Column.i

If OpenWindow(#Window, 0,0,600,600, "Drag & Drop", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  ListIconGadget(#SourceText, 10,10,500,200, "Name", 180,#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect|#PB_ListIcon_MultiSelect) 
  ListIconGadget(#TargetText, 10,300, 500,200, "Name",  180, #PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
  
  AddGadgetColumn(#SourceText, 1, "Ort", 180)
  AddGadgetColumn(#SourceText, 2, "Telefon", 100)
  AddGadgetColumn(#TargetText, 1, "Ort", 180)
  AddGadgetColumn(#TargetText, 2, "Telefon", 100)
  
  AddGadgetItem(#SourceText, -1, "Maier" + Chr(10) + "Köln" + Chr(10) + "4711")
  AddGadgetItem(#SourceText, -1, "Schmidt" + Chr(10) + "Hamburg" + Chr(10) + "12345")
  AddGadgetItem(#SourceText, -1, "Müller" + Chr(10) + "Bonn" + Chr(10) + "6789")
  
  EnableGadgetDrop(#TargetText, #PB_Drop_Private, #PB_Drag_Copy, #PrivateType1)
  
  Repeat
    Event = WaitWindowEvent()
    If Event = #PB_Event_Gadget And EventType() = #PB_EventType_DragStart
      Select EventGadget()
        Case #SourceText
          DragPrivate(#PrivateType1)
      EndSelect
    ElseIf Event = #PB_Event_GadgetDrop
      Select EventGadget()
        Case #TargetText
          If EventDropPrivate() = #PrivateType1
            Count = CountGadgetItems(#SourceText)
            For Index = 0 To Count
              If GetGadgetItemState(#SourceText, Index) & #PB_ListIcon_Selected
                AddGadgetItem(#TargetText, -1, "")
                TargetIndex = CountGadgetItems(#TargetText)-1
                For Column = 0 To 2
                  SetGadgetItemText(#TargetText, TargetIndex, GetGadgetItemText(#SourceText, Index, Column), Column)
                Next
              EndIf
            Next
          EndIf
      EndSelect
    EndIf
  Until Event = #PB_Event_CloseWindow
EndIf

End
Die Callbacks sind nur für die Aktionen während du die Maus bewegst, also zwischen Drag und Drop
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: ListIcon + MultiSelect + Drag&Drop

Beitrag von H.Brill »

Wunderbar, klappt bestens.
Damit kann ich mir das Hantieren mit
LinkedList sparen.
Die Callbacks sind nur für die Aktionen während du die Maus bewegst, also zwischen Drag und Drop
Also gut fürs Ändern des Mauszeigersymbols zum Beispiel.

Besten Dank nochmals.
PB 6.10
Antworten