Neuer Versuch mit Drag & Drop

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

Neuer Versuch mit Drag & Drop

Beitrag von duli »

Hallo Zusammen habe mich erneut versucht mit den d&d und habe so einiges nun verstanden aber in dem Code in der Zeile 53 und 68 bekomme ich einfach nicht den Wert von dem Verzeichnis und Dateiname von dem Explorertree zurück, habe ein Debuger eingebaut und gesehen es wird in der IF abfrage das richtige Gadget erkannt, (in der Zeile 52 u. 66) aber wenn ich den Wert in die Variable Zieldatei$ geben möchte kommt einfach nur gähnende Leere, was habe ich nicht verstanden oder ist das ein Bug vom PB 4.1?

Code: Alles auswählen

; Enumeration ; hier sind die gadgets
;   #Hauptfenster
;   #explorerfeld1
;   #explorerfeld2
; EndEnumeration



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(1, #PB_Drop_Files, #PB_Drag_Copy)
   EnableGadgetDrop(2, #PB_Drop_Files, #PB_Drag_Copy) 
    

   
 Repeat
 event = WaitWindowEvent(0)
     
     
 If Event = #PB_Event_Gadget And EventType() = #PB_EventType_DragStart
      Files$ = ""       
                
        If EventGadget() = 1    ;wird beim drag vom ExplorerList 1 ausgeführt
          For i = 0 To CountGadgetItems(1)-1
            If GetGadgetItemState(1, i) & #PB_Explorer_Selected
              Files$ + GetGadgetText(1) + GetGadgetItemText(1, i) + Chr(10)
              Debug Files$
            EndIf
          Next i 
        EndIf 
        
         
        If EventGadget() = 2    ;wird beim drag vom ExplorerList 1 ausgeführt
          For i = 0 To CountGadgetItems(2)-1
            If GetGadgetItemState(2, i) & #PB_Explorer_Selected
              Files$ + GetGadgetText(2) + GetGadgetItemText(2, i) + Chr(10)
              Debug Files$
            EndIf
          Next i 
        EndIf 
             
      DragFiles(Files$)
            
 ElseIf event = #PB_Event_GadgetDrop 
        
    If EventGadget() = 1    ;wird beim drop im ExplorerList 1 ausgeführt
      Zieldatei$ = GetGadgetText(1)
      Dateien.s = EventDropFiles(); 
      Anzahl = CountString(Dateien, Chr(10)) + 1; 
      ev = EventDropAction()  
        Debug Zieldatei$
        For I = 1 To Anzahl
          If ev = #PB_Drag_Copy
                 
;           CopyFile(StringField(Dateien, I, Chr(10)), Zieldatei$)
          EndIf
        Next
    EndIf
    
   If EventGadget() = 2    ;wird beim drop im ExplorerList 2 ausgeführt
    
      Zieldatei$ = GetGadgetText(2)
      Dateien.s = EventDropFiles(); 
      Anzahl = CountString(Dateien, Chr(10)) + 1; 
      ev = EventDropAction()  ;
       Debug Zieldatei$
        For I = 1 To Anzahl
          
          If ev = #PB_Drag_Copy
         
;           CopyFile(StringField(Dateien, I, Chr(10)), Zieldatei$)
          EndIf
       Next
     EndIf
   EndIf 
       
    Until event = #PB_Event_CloseWindow
   
   EndIf 
:( gruss Duli
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 »

Laß doch mal den unnötigen Kram weg :wink:

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(1, #PB_Drop_Files, #PB_Drag_Copy)
  EnableGadgetDrop(2, #PB_Drop_Files, #PB_Drag_Copy)



  Repeat
    event = WaitWindowEvent(0)


    If Event = #PB_Event_Gadget And EventType() = #PB_EventType_DragStart
      Files$ = ""

      If EventGadget() = 1    ;wird beim drag vom ExplorerList 1 ausgeführt
        For i = 0 To CountGadgetItems(1)-1
          If GetGadgetItemState(1, i) & #PB_Explorer_Selected
            Files$ + GetGadgetText(1) + GetGadgetItemText(1, i) + Chr(10)
            Debug Files$
          EndIf
        Next i
      EndIf


      If EventGadget() = 2    ;wird beim drag vom ExplorerList 1 ausgeführt
        For i = 0 To CountGadgetItems(2)-1
          If GetGadgetItemState(2, i) & #PB_Explorer_Selected
            Files$ + GetGadgetText(2) + GetGadgetItemText(2, i) + Chr(10)
            Debug Files$
          EndIf
        Next i
      EndIf

      DragFiles(Files$)

    ElseIf event = #PB_Event_GadgetDrop

      If EventGadget() = 1    ;wird beim drop im ExplorerList 1 ausgeführt
        Zieldatei$ = GetGadgetText(1)
        Dateien.s = EventDropFiles();
        Anzahl = CountString(Dateien, Chr(10)) + 1;
        Debug Zieldatei$
        For I = 1 To Anzahl
          Debug StringField(Dateien, I, Chr(10))
        Next
      EndIf

      If EventGadget() = 2    ;wird beim drop im ExplorerList 2 ausgeführt

        Zieldatei$ = GetGadgetText(2)
        Dateien.s = EventDropFiles();
        Anzahl = CountString(Dateien, Chr(10)) + 1;
        Debug Zieldatei$
        For I = 1 To Anzahl
          Debug StringField(Dateien, I, Chr(10))
        Next
      EndIf
    EndIf

  Until event = #PB_Event_CloseWindow

EndIf
Das Gadget wo was draufgedropped wird ist das Ziel, der Text in EventDropFiles(); ist die Quelle!
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 »

Danke vielmals für das bereinigen, aber das mit dem Ziel habe ich nicht begriefen.

In deinem Beispiel zeigt der Debuger dennoch nur das Quellenverzeichniss an.

Wie bekomme ich das Verzeichniss wo ich die Maustaste loslasse, also wenn ich vom Gadget 1 die Eigenen Dateien drage und dann auf dem Gadget 2 auf dem Verzeichnis E: losslasse wie bekomme ich das Verzeichnis in die Variable Zieldatei$. Das ist genau das was ich nicht hinbekomme. :freak:
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 »

>> In deinem Beispiel zeigt der Debuger dennoch nur das Quellenverzeichniss an.
Mehr brauchste doch auch garnicht! Das Ziel ist das Gadget wo das
Dropereignis stattfindet, damit haste alles.
Also das dort geöffnete Laufwerk, bzw. der Ordner, dessen Inhalt Du dort
siehst, sind das Ziel. Wenn man in Unterordner möchte, so sind diese
vorher zu öffnen, mit Mauspostion ist da nichts. Ich glaube da bringste
was durcheinander.

Aber bevor Du so weitermachst, nimm bitte einfache Gadgets, versuche es
erst mit Text und kopiere nicht einfach das Eventloop des Hilfebeispiels.
Durch kopieren lernste garnichts.

Eventloop:
Was für ein Ereignis
Gadget
Welches Gadget
1
Welcher EventType
Drop
usw. diese verknüpfte Abfrage der Hilfe ist dort nur der Kürze wegen. Du
solltest lieber versuchen es zu verstehen und an das vorher gelernte
anzupassen.
2x If EventGadget() = 1, sowie 2x mit der 2 ist unnötig und
unübersichtlich.

Warum nutzt Du keine Konstanten mehr, schon wieder verlernt :mrgreen:

PS: ExplorerTreeGadget wird in der Praxis höchst selten benötigt, für
Drop aktionen sind ListView oder ein Image oder einfach das ganze
Fenster besser geeignet, solange man nicht einen Dateimanager
programmieren möchte, wovon Du ja noch eine Ecke weit entfernt bist.

Erstell doch lieber mal ein Fenster mit einem Button und Ereignisschleife
ohne einmal in die Hife zu schauen, wenn das geklappt hat, machen wir
mit droppen weiter. Vorher sehe ich da keinen Sinn Dich beim Beispiel
zusammenkopieren zu unterstützen.

Gruß
Thomas
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 Danke für die Zeilen

:mrgreen: Ne habe es noch nicht verlernt mit Konstanten zu Arbeiten, aber wollte die Fehlerquellen minimieren, und da ich mit den Konstanten noch nicht so sicher war, z.B. ob ich nun für das Windows eine 0 nehmen kann und für das erste Explorergadget auch wiederum eine 0 oder so wie ich es im Moment habe ein 1 weiterlaufend sein muss habe ich im Moment auf Zahlen umgestellt, welche ich direkt erkennnen kann.

Das ist es ja, ich will einen einfachen Explorer machen.
Ja ich gebe Dir recht das ich sicher in Grundlegenden angelegenheiten noch etwas unerfahren bin. Aber vieleicht stelle ich einfach mein Frage nicht genau genug.

In dem Code der jetzt vorliegt, kann ich zwei Explorertrees darstellen.
wenn ich nun ein drag und drop auslöse, kann ich das Verzeichnis und die Dateinamen die ich Drage in die Variable Files$ geben. Wenn es mehrer Dateien sind die Markiert wurden, sind dort mehrere Einträge mit Chr(10)getrennt drin.

Nun also nehme ich diese eine oder mehrer Dateien, und ziehe sie von einem Explorertree zum anderen und lasse es dort mit der Maus, auf ein Verzeichnis, das ich vorher geöffnet habe, sprich genauer gesagt, ich in das Verzeichnis gehe wo das Verzeichnis ist, dass ich sehen möchte. Nach dem ich es dort gedropt habe, möchte ich dass mir die Variable Zieldatei$ das Verzeichnis enthält wo ich die Maus beim Dropen losgelassen habe. Klar wenn es kein Verzeichnis ist soll es das unterscheiden können, aber das krieg ich schon geregelt.

Zu dem, was Du mir empfihlst über die Textgadget's dass habe ich eh schon probiert. Und dort ist es auch ok den Text den ich Markiere in eine Variable zu bekommen und diesen dann in das Textgadget zu geben welches aktive ist wenn ich die Maus loslasse, sprich Drope. Jedoch kann ich den Text nicht an eine bestimmte Stelle in dieses Textgadget geben, sondern die Darstellung erreiche ich über eine Sortierung.

Ich weiss dass ich immer wieder blöde Fehler im Code mache weil ich noch nicht so geübt bin mit dem richtigen Syntax und der Programm Struktur, aber ich denke schon dass ich einiges Verstanden habe. Klar könnte ich noch mehr Sicherheit haben mit Events und wie man mit Ihnen umgeht, z.B. Buttoms oder anderes.

Aber ich denke nicht, dass es eine Anmassung ist anhand von diesem Beispiel weiter zu gehen nur, wenn weil es ein etwas anspruchsvolleres Beispiel ist.

So jetzt hoffe ich das ich meine Frage klar genug Stellen konnte. Und danke vielmals für Deine Geduld, welche ich echt zu schätzen weiss.

gruss Duli
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 »

PB unterstützt Drag und Drop zwiscchen Fenstern und Gadgets, Du möchtest
als Dropziel aber nicht das Gadget, sondern den Gadgetitem über dem sich
die Maus befindet wenn der Knopf gelöst wird. Das wird so nicht unterstützt.

Bzw. das ist nur mit sehr viel Aufwand möglich und wäre in Deinem Beispiel
fehl am Platze. Soetwas benötigt man z.B. um Items per Drag und Drop
zu sortieren. An solchem Code beissen sich auch die Profis die Zähne aus,
und es macht bei Deinem Beispiel überhaupt keinen Sinn!

>> Aber ich denke nicht, dass es eine Anmassung ist anhand von diesem Beispiel weiter zu gehen nur, wenn weil es ein etwas anspruchsvolleres Beispiel ist.
Wenn Du Dich unnötiger Weise damit belasten willst, korrigiere doch bitte
den Eventloop, die doppelten Abfragen sollteste dann ja selber sehen und
entfernen können, wenn Du dies Verstanden hast. Habs ja im vorigen
Beitrag aufgezäht wie ein EventLoop aussieht. Aber das wird ansccheinend
nur irgnoriert.
Eventloop mußte korrekt aufbauen können, unabhängig von Drag&Drop
was lediglich ein zusätzlichen EventType darstellt. Nicht mehr und nicht weniger.

Ansonsten macht der Code bereits das was in dieser Situation überlich ist.
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
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 »

PS: In dem Zielgadget ist natürlich vorher ein Laufwerk oder Ordner durch
Doppelclick auszuwählen, ansonsten bleibt der String leer, es gibts also kein Ziel!

Nach nichts kann nichts kopiert werden :mrgreen: , aber nichts anderes
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 »

:roll: Ok die Abfragen sind nicht Optimal, und nur so zum Sagen, sicher habe ich es gesehen und ernst genommen, wollte aber einfach halt zuerst das was mich ehrlicherweis interesiert hat fragen.

:cry: schade das es nicht möglich ist im Gadget den Wert zu erhalten von dem Verzeichnis wo es lossgelassen wird. Und das mich das dann etwas überfordert wenn ich das mit Umwegen erreichen möchte, ist mir sehr wohl bewusst, kannst sicher sein das ich so zimlich alles gelesen habe bezüglich drag und drop im PB und mir gedacht habe wenn das 4.10 kommt, kann ich es ja nocheinmal versuchen.

Aber in der Zwischenzeit :allright: danke für das Mitdenken.

Duli

Somit beende ich hiermit diesen Threat. :cry:
Man kann nicht wissen was man nicht weiss..
Antworten