weiteres bei Drag und Drop

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
duli
Beiträge: 75
Registriert: 17.04.2007 11:39

weiteres bei Drag und Drop

Beitrag von duli »

Hallo

möchte nun einen kleinen Explorer erstellen mit welchen ich Dateien oder Verzeichnise, per drag und drop hin und her schieben kann zwischen zwei explorergadgets.

Code: Alles auswählen

; Wählen Sie einige Dateien oder Ordner und ziehen Sie diese zu einer anderen Applikation
  ;
  If OpenWindow(1, 200, 200, 420, 400, "Drag & Drop", #PB_Window_SystemMenu)
    CreateGadgetList(WindowID(1))
    ExplorerListGadget(1, 10, 10, 200, 380, "*", #PB_Explorer_MultiSelect)
    ExplorerListGadget(2, 210, 10, 200, 380, "*", #PB_Explorer_MultiSelect)
      
    Repeat
      Event = WaitWindowEvent()  
          
      If Event = #PB_Event_Gadget And EventGadget() = 1 And EventType() = #PB_EventType_DragStart
        Files$ = ""       
        For i = 0 To CountGadgetItems(1)-1
          If GetGadgetItemState(1, i) & #PB_Explorer_Selected
            Files$ + GetGadgetText(1) + GetGadgetItemText(1, i) + Chr(10)
          EndIf
        Next i        
        EventDropFiles(#PB_Drop_Files )

;         DragFiles(Files$)
      EndIf      
      
    Until Event = #PB_Event_CloseWindow
  EndIf
Das Greifen geht aber das einfügen habe ich nicht verstanden, habe schon einiges versucht aber irgendwie klappt es nicht.

Danke für euere Hilfe
Man kann nicht wissen was man nicht weiss..
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Code: Alles auswählen

  If OpenWindow(0, 200, 200, 430, 400, "Drag & Drop", #PB_Window_SystemMenu)
    CreateGadgetList(WindowID(0))
    
    ListIconGadget(0, 10 , 10, 200, 380,"Test 1",160)
    ListIconGadget(1, 215, 10, 200, 380,"Test 2",160)
    
    EnableGadgetDrop(0, #PB_Drop_Text, #PB_Drag_Move)
    EnableGadgetDrop(1, #PB_Drop_Text, #PB_Drag_Move)
    
    For a = 1 To 12
      AddGadgetItem (0, -1, "Item " + Str(a) + " of the ListIcon 1")   
      AddGadgetItem (1, -1, "Item " + Str(a) + " of the ListIcon 2")   
    Next 
    
    
    Repeat
      event = WaitWindowEvent() 
      
      If event = #PB_Event_Gadget
        
        id = EventGadget()
        
        If EventType() = #PB_EventType_DragStart 
          
          text.s = GetGadgetText(id) 
          
          DragText(text,#PB_Drag_Move) 
          
        EndIf
        
        
      ElseIf event = #PB_Event_GadgetDrop
        
        id   = EventGadget() 
        text = EventDropText()
        
        AddGadgetItem(id,-1,text)
        
      EndIf
      
    Until event = #PB_Event_CloseWindow
    
  EndIf
Benutzeravatar
duli
Beiträge: 75
Registriert: 17.04.2007 11:39

Beitrag von duli »

Danke Edel

Aber das mit den Text gadget und File Gadget verwirrt mich sehr, bei den Texten ist es mir irgenwie klar, aber bei den files weiss ich nicht so genau.

Ich weiss das bei meinem Beispiel der Wert weitergegeben wir aber wie der Wert dann so ausgewertet wird das daraus ein wirklicher Kopie befehl wird ist mir unklar. :oops:
Man kann nicht wissen was man nicht weiss..
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Es werden Dir nur die Dateinamen einschl. Pfad übergeben, die sind durch
Chr(10) getrennt. Das kopieren mußte selber machen, die Namen haste ja,
das erledigt niemand für Dich
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
duli
Beiträge: 75
Registriert: 17.04.2007 11:39

Beitrag von duli »

Das will ich auch gar nicht :roll: nur ist mir nicht klar wie ich es grundsätzlich angehen soll. Muss ich das mit einem Befehl aus der möglichkeiten von Drag und Drop machen, Oder wie bekomme ich den wert wo ich die Maus wieder losslasse so das ich daraus dann einen Copiebefehl machen kann. Ich weis vom Ansatz her nicht mehr weiter.

:oops:
Man kann nicht wissen was man nicht weiss..
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Code: Alles auswählen

      ElseIf event = #PB_Event_GadgetDrop
       
        id   = EventGadget()
        text = EventDropText()
       
        AddGadgetItem(id,-1,text)
       
      EndIf 
Der einzige Unterschied ist, das es EventDropFiles() heisst und der übergebene Text durch Chr(10) getrennte Dateinamen enthält, die kannste
mit CopyFile irgendwohin kopieren, wo sie sind steht im Text
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
duli
Beiträge: 75
Registriert: 17.04.2007 11:39

Beitrag von duli »

:D Ja jetzt dämmert es mir, danke. Ich such einfach oft viel zu weit, weg.
Danke werde es noch ausprobieren, aber ich glaube das ich nun doch erst mal ein paar Stunden schlaf brauche war ein lehreicher Tag heute für mich.

Grüsse aus der Ostschweiz Duli :allright:
Man kann nicht wissen was man nicht weiss..
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Hier mal ein simples Beispiel, bitte mit Debugger testen, einfach eine oder
mehrere Dateien aufs Fenster droppen (vom Explorer z.B.)

Code: Alles auswählen

If OpenWindow(0, #PB_Ignore, #PB_Ignore, 200, 200, "DropClient")
  EnableWindowDrop(0, #PB_Drop_Files, #PB_Drag_Copy)
  
  Repeat
  Event = WaitWindowEvent()
  
  If Event = #PB_Event_WindowDrop; Drop ereignis auf Fenster
    If EventDropType() = #PB_Drop_Files; Dateien wurden gedropped
      Dateien.s = EventDropFiles(); den String mit den Dateinamen in Variable speichern
      Anzahl = CountString(Dateien, Chr(10)) + 1; Anzahl ermitteln
      For I = 1 To Anzahl
        Debug StringField(Dateien, I, Chr(10)); die einzelnen Datein ausgeben, hier könnte auch kopiert werden
      Next
    EndIf 

  EndIf 
  
  Until Event = #PB_Event_CloseWindow

EndIf 
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
duli
Beiträge: 75
Registriert: 17.04.2007 11:39

Beitrag von duli »

hallo ts-soft
Du warst schneller als ich.

hier mal das zwischenresultat von dem was ich begriffen habe.

Code: Alles auswählen

If OpenWindow(0, 200, 200, 430, 400, "Drag & Drop", #PB_Window_SystemMenu)
    CreateGadgetList(WindowID(0))
   
   
    ExplorerListGadget(1, 10, 10, 200, 380, "*", #PB_Explorer_MultiSelect)
    ExplorerListGadget(2, 210, 10, 200, 380, "*", #PB_Explorer_MultiSelect)
   
    EnableGadgetDrop(0, #PB_Drop_Files, #PB_Drag_Move)
    EnableGadgetDrop(1, #PB_Drop_Files, #PB_Drag_Move) 
    

   
 Repeat
 event = WaitWindowEvent()
     
     
 If Event = #PB_Event_Gadget And EventGadget() = 1 And EventType() = #PB_EventType_DragStart
      Files$ = ""       
        For i = 0 To CountGadgetItems(1)-1
          If GetGadgetItemState(1, i) & #PB_Explorer_Selected
            Files$ + GetGadgetText(1) + GetGadgetItemText(1, i) + Chr(10)
          EndIf
        Next i        
      DragFiles(Files$)
      
      ElseIf event = #PB_Event_GadgetDrop
       
        id   = EventGadget()
        Dateinamen = EventDropFiles()
       
        AddGadgetItem(id,-1,Dateinamen)
       
      EndIf
     
    Until event = #PB_Event_CloseWindow
   
  EndIf 
Ich weiss das im Bereich

Code: Alles auswählen

ElseIf event = #PB_Event_GadgetDrop
       
        id   = EventGadget()
        Dateinamen = EventDropFiles()
       
        AddGadgetItem(id,-1,Dateinamen)
       
      EndIf

das Programm nicht stimmt. möchte auch gar nicht etwas vorgekautes, sondern möchte es einfach lernen wie gebe ich nun die Werte weiter.

Ich meine verstanden zu haben das ich fest stellen muss wo ich die Maus auf dem zweiten explorergadget loslasse so das das Ziel klar ist wo die Kopie hin geht.
Weiter muss ich nachher einen Dateispeichern befehl erzeugen mit den Werten in der Variable Files$ und dem Zielort. Mir ist dabei nicht klar muss ich dafür z.B. auch eine Schlaufe machen oder geht das auf einen rutsch?

Danke für euere Geduld
Man kann nicht wissen was man nicht weiss..
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Sieh Dir mein Beispiel an, das enthält nur den Bereich, den Du nicht
verstehst, der Einfachheit wegen ist der Dropempfänger das ganze Fenster
Mit StringField wird der String zerlegt (Trennzeichen ist ja Chr(10))
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten