Announcement

Collapse
No announcement yet.

Drag&Drop in Visual Studio 2008

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Drag&Drop in Visual Studio 2008

    Hallo miteinander!

    Ich habe viele VB6 Projekte, deren Anwendungen auf Win7 nicht richtig laufen. Und das Konvertieren nach Visual Studio Express 2008 geht nicht für Drag&Drop und OLE.
    Man muss den Code neu schreiben. Ohne Hilfe komme ich nicht weiter.

    Links zwei PictureBox mit .jpg übereinander:
    picKuh, picPferd

    Rechts zwei leere PictureBoxübereinander:
    picKuhstall, picPferdestall


    DragDrop funktioniert gut beim waagrechten Ziehen
    (picKuh nach picKuhstall).
    Ziehe ich übers Kreuz (picPferd nach picKuhstall),
    merkt picKuhstall nicht, woher gezogen worden ist.
    Das sollte jedoch als Fehler zählen.

    [highlight=vbnet]
    Private Sub picKuhstall_DragDrop(ByVal sender As System.Object, _
    ByVal e As System.Windows.Forms.DragEventArgs) _
    Handles picKuh.DragDrop, picKuhstall.DragDrop
    Dim pic As PictureBox = CType(sender, PictureBox)
    pic.Image = CType(e.Data.GetData(DataFormats.Bitmap), Bitmap)

    If sender Is picKuh Then
    picKuhstall.Image = Nothing
    Else
    picKuh.Image = Nothing
    picKuhstall.Enabled = False
    End If
    ’’’ Das Pferd gehört nicht in den Kuhstall.
    If sender Is picPferd Then picKuhstall.Image = Nothing

    End Sub


    Private Sub picPferdestall_DragDrop(ByVal sender As System.Object, _
    '…………………… entsprechend hier oben
    End Sub[/highlight]


    Code aus MSDN / VS 2008 SP1 VBSamples / Winforms Samples / DragDrop,
    in diesem Projekt nur Example 3: Drag-and-Drop (vereinfacht und modifiziert).

    Vielen Dank für Hilfe!
    Gruß
    Peter
    Zuletzt editiert von Jürgen Thomas; 08.03.2010, 09:58. Reason: [highlight=vbnet] eingefügt; künftig bitte selbst machen!

  • #2
    Ich sehe jetzt auf die schnelle in deinem Code (bitte richtig formatieren - siehe hier) keine Code der das ~Quell~ Control ermittelt.

    Kann es sein das du den sender Parameter für die Quelle gehalten hast? Sender ist immer der Auslöser des Events. Im Fall des DragDrop Events also das Control über dem du etwas fallen läßt (also sozusagen das ~Ziel~ der DragDrop Operation).

    Comment


    • #3
      Drag&Drop in Visual Studio 2008

      Danke für die Nachmeldung und die neue gute Formatierung!
      Das ist genau das Problem: Ich weiss nicht, wie man die Quelle nennt. ... sender ... ist ganz offensichtlich falsch.
      Danke für die Geduld
      Gruss
      Peter

      Comment


      • #4
        Wie du die Quelle nennst ist eigentlich egal(wie wäre es z.B. mit source?). Du musst die nur irgendwie ermitteln denn du bekommst sie nicht im DragDrop Event serviert. Da Quelle und Ziel der DragDrop Operation vermutlich die selbe Form ist würde ich das QuellControl an der Stelle an der du die DoDragDrop Methode aufrufst in eine Klassenvariable der Form schreiben und dann im DragDrop Event des ZielControls benutzen. Wenn Ziel und Quelle auf verschieden Formen liegen müsstest du die Quellinformation im data Object der DoDragDrop Methode mit übergeben und dann am Ziel wieder raus holen(die e.Data.GetData Geschichte die du im Moment nur für das Bild verwendest).

        Comment


        • #5
          Drag&Drop in Visual Studio 2008

          Vielen Dank, Ralf!

          Deine Hinweise machen mir die Arbeit viel leichter, ich weiss nun, wo ich ansetzen muss. Ohne Fleiss kein Preis!
          oder
          Wer mit Mühe kaum geklettert ist auf einen Baum
          schon meint, dass er ein Vogel wär,
          so irrt sich der. W. Busch

          Gruss
          Peter

          Comment


          • #6
            Drag&Drop in Visual Studio 2008

            Hallo Ralf

            Arme Sache: Du hilfst, und ich kann es trotzdem nicht:
            QuellControl bei DoDragDrop schreiben.

            Ich habe lange gepröbelt. Ein ähnliches Code-Beispiel kann ich auch nicht finden, nicht in MSDN, nicht in Foren und wäre dir sehr dankbar, wenn du mir ein Muster der ominösen Zeile mitteilen würdest. An mein Projekt anpassen könnte ich sie dann gewiss.

            Vielen Dank!
            Gruß
            Peter
            [highlight=vbnet]
            Private Sub PictureBox_MouseDown(ByVal sender As System.Object, _
            ByVal e As System.Windows.Forms.MouseEventArgs) _
            Handles picKuh.MouseDown, picKuhstall.MouseDown, _
            picPferd.MouseDown, picPferdestall.MouseDown
            If e.Button = Windows.Forms.MouseButtons.Left Then
            Dim pic As PictureBox = CType(sender, PictureBox)

            If Not pic.Image Is Nothing Then
            pic.DoDragDrop(pic.Image, DragDropEffects.Move)
            End If
            End If
            End Sub[/highlight]

            Comment


            • #7
              Im Beispiel habe ich einfach mal das ~Quell~Control in DoDragDrop als zu übergebendes Element gesetzt. Im DragDrop Event kann ich das dann aus den DragEventArgs holen und Ziel und Quelle vergleichen.

              [Highlight= VB.Net]
              Private Sub pictureBox_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs)
              MyBase.DoDragDrop(sender, DragDropEffects.Move)
              End Sub

              Private Sub pictureBox_DragDrop(ByVal sender As Object, ByVal e As DragEventArgs)
              Dim targetControl As PictureBox = TryCast(sender,PictureBox)
              Dim sourceControl As PictureBox = TryCast(e.Data.GetData(GetType(PictureBox)),Pictur eBox)

              ' hier jetzt irgendwas bezüglich target und source testen.
              ' Beispielsweise wie hier das man nicht auf sich selbst zieht.
              If (((Not targetControl Is Nothing) AndAlso (Not sourceControl Is Nothing)) AndAlso (Not targetControl Is sourceControl)) Then
              targetControl.Image = sourceControl.Image


              End Sub[/Highlight]

              Comment


              • #8
                Drag&Drop in Visual Studio 2008

                Vielen Dank für die Hilfe und dazu noch so schnell!
                Ich werde deinen Rat befolgen!
                Gruss
                Peter

                Comment


                • #9
                  Schönen Tag!
                  Trotz vielen Versuchen gelingt es mir nicht, den Code in die Zeilen 11 und 12 zu schreiben. Meine If Then werden nicht beachtet.
                  picKuh soll gezogen und auf picKuhstall abgelegt werden können. Das zählt als Richtig.
                  Auch picPferd soll auf picKuhstall gezogen werden können. Im Augenblick des Ablegens weist picKuhstall picPferd gleich wieder ab. Das zählt als Falsch. picPferd bleibt an der alten Stelle.
                  Ich bin doch nochmals um Hilfe froh.
                  Gruss
                  Peter

                  Comment


                  • #10
                    Meine If Then werden nicht beachtet.
                    Was heißt hier wird nicht beachtet? Hast du denn Code debugged?
                    Und wenn du schon Code hast, dann zeig ihn.

                    Comment


                    • #11
                      Es gibt auch ein Event OnDragOver wo man entscheiden kann ob ein Element über einem anderen gedroppt werden kann. Das wäre wohl das was Du brauchst.

                      Comment


                      • #12
                        Den Code (einen von vielen Versuchen) sende ich noch so gern, nur wagte ich es bisher des grossen Umfanges wegen nicht. Vielen Dank für die Mühe! Ohne Hilfe kann ich die vielen DragDrop der migrierten Projekte nicht anpassen.

                        [highlight=vbnet]'aus VB 2008 SP1 Samples
                        'Copyright (c) Microsoft Corporation. All rights reserved.
                        'Sample DragDrop (PictureBox) vereinfacht, aber Pferd dazu,
                        'zusätzlich der Versuch (!), den Code-Hinweis von Ralf Jansen, entwickler-forum.de,
                        'für mein Bedürfnis umzuformen.

                        Public Class Form1
                        Private Sub Laden(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
                        picKuhstall.AllowDrop = True
                        picKuh.Image = System.Drawing.Bitmap.FromFile("Bilder\Kuh.jpg")
                        picPferd.Image = System.Drawing.Bitmap.FromFile("Bilder\Pferd.jpg")
                        End Sub

                        Private Sub Start(ByVal sender As Object, ByVal e As MouseEventArgs) _
                        Handles picKuh.MouseDown, picKuhstall.MouseDown, picPferd.MouseDown
                        Dim pb As PictureBox = CType(sender, PictureBox)
                        If pb.Image IsNot Nothing Then _
                        pb.DoDragDrop(pb.Image, DragDropEffects.Copy Or DragDropEffects.Move)
                        End Sub

                        Private Sub Eintritt(ByVal sender As Object, ByVal e As DragEventArgs) _
                        Handles picKuh.DragEnter, picKuhstall.DragEnter, picPferd.DragEnter
                        If e.Data.GetDataPresent(DataFormats.Bitmap) Then
                        e.Effect = DragDropEffects.Move
                        End If
                        End Sub

                        Private Sub Ende(ByVal sender As Object, ByVal e As DragEventArgs) _
                        Handles picKuh.DragDrop, picKuhstall.DragDrop, picPferd.DragDrop
                        Dim pb As PictureBox = CType(sender, PictureBox)
                        pb.Image = e.Data.GetData(DataFormats.Bitmap)
                        pb = If(pb Is picKuh, picKuhstall, picPferd)
                        pb.Image = Nothing
                        'irgendwie hängt die Reaktion mit der Reihenfolge der drei pic zusammen.
                        End Sub

                        Private Sub pictureBox_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs)
                        MyBase.DoDragDrop(sender, DragDropEffects.Move)
                        End Sub

                        Private Sub pictureBox_DragDrop(ByVal sender As Object, ByVal e As DragEventArgs)
                        Dim targetControl As PictureBox = TryCast(sender, PictureBox)
                        Dim sourceControl As PictureBox = TryCast(e.Data.GetData(GetType(PictureBox)), PictureBox)
                        'hier sollte picKuhstall das Bild der Kuh aufnehmen, picKuh jedoch verschwinden:
                        If ((targetControl Is picKuhstall) AndAlso (sourceControl Is picKuh)) Then
                        picKuh.Visible = False
                        picKuhstall.Image = Nothing
                        End If
                        'hier sollte picKustall das Bild des Pferdes abweisen, picPferd also bestehen bleiben:
                        If ((targetControl Is picKuhstall) AndAlso (sourceControl Is picPferd)) Then
                        picPferd.Visible = True
                        picKuhstall.Image = Nothing
                        End If
                        End Sub

                        End Class[/highlight]

                        Comment


                        • #13
                          Nach Sichtung des Codes: die Routine Ende() scheint mir nur ein "Zwischenversuch" zu sein, denke, daß eigentlich pictureBox_DragDrop() den auszuführenden Code enthält; leider hat pictureBox_DragDrop() kein Handles definiert, so daß die Routine niemals angesprungen wird. Aber auch mit einem Handles verzweigt die Routine in keine der beiden If-Bedingungen, da beim Einleiten des DragEvents eine Image der betreffenden PictureBox dem DragEvent zur Verfügung gestellt wird, aber im Verlauf der Routine pictureBox_DragDrop() erwartet wird, in den Daten des DragEvent die PictureBox selbst vorzufinden.
                          Im nachstehenden Code ist der vorgegebene Code nochmals nachgestellt (mit Änderung der Prozedurnamen), um zu zeigen, was anders gemacht werden muß / sollte / kann.

                          [highlight=vbnet]Public Class Form1

                          ''' <summary>
                          ''' Routine besser überschreiben als eigenes Event auffangen
                          ''' </summary>
                          ''' <param name="e"></param>
                          ''' <remarks>
                          ''' Entspricht Laden
                          ''' </remarks>
                          Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
                          MyBase.OnLoad(e)
                          picKuhstall.AllowDrop = True
                          picKuh.Image = System.Drawing.Bitmap.FromFile("Bilder\Kuh.jpg")
                          picPferd.Image = System.Drawing.Bitmap.FromFile("Bilder\Pferd.jpg")
                          End Sub

                          ''' <summary>
                          ''' leitet DragDrop ein
                          ''' </summary>
                          ''' <param name="sender"></param>
                          ''' <param name="e"></param>
                          ''' <remarks>
                          ''' Entspricht Start;
                          ''' Unterschiede: 1. Ergebnis des DoDragDrop() wird ausgewertet (bei Move wird Image des Senders gelöscht)
                          ''' 2. es wird die PictureBox im DragEvent abgelegt, nicht dessen Image; damit ist es möglich
                          ''' zu entscheiden, welche Quelle das Bild auf Reise geschickt hat.
                          ''' </remarks>
                          Private Sub BeginDragDrop(ByVal sender As Object, ByVal e As MouseEventArgs) Handles picKuh.MouseDown, picKuhstall.MouseDown, picPferd.MouseDown
                          With CType(sender, PictureBox)
                          'Bild zum Verschieben definiert
                          If .Image IsNot Nothing Then
                          'hier wird entschieden, was nach dem DragDrop-Abenteuer zu geschehen hat
                          If .DoDragDrop(sender, DragDropEffects.Copy Or DragDropEffects.Move) = DragDropEffects.Move Then
                          .Image = Nothing
                          End If
                          End If
                          End With
                          End Sub

                          ''' <summary>
                          ''' Maus über PictureBox im DragDrop-Modus
                          ''' </summary>
                          ''' <param name="sender"></param>
                          ''' <param name="e"></param>
                          ''' <remarks>
                          ''' Entspricht Eintritt
                          ''' Unterschiede: 1. es wird auf die Existenz einer PictureBox im DragEvent getestet
                          ''' 2. da nur picKuhstall ein AllowDrop = True gesetzt hat, ist auch nur der Kuhstall für
                          ''' dieses Event von Interesse
                          ''' </remarks>
                          Private Sub EnterDragDrop(ByVal sender As Object, ByVal e As DragEventArgs) Handles picKuhstall.DragEnter
                          'solange noch nicht losgelassen wurde keine Unterscheidung, ob Aktion erlaubt oder nicht
                          'im Normalfall würde hier schon entschieden, daß ein Pferd beispielsweise nichts im Kuhstall
                          'verloren hat
                          If e.Data.GetData(GetType(PictureBox)) IsNot Nothing Then e.Effect = DragDropEffects.Move
                          End Sub

                          ''' <summary>
                          ''' Abschluß einer DragDrop-Aktion
                          ''' </summary>
                          ''' <param name="sender"></param>
                          ''' <param name="e"></param>
                          ''' <remarks>
                          ''' Entspricht pictureBox_DragDrop
                          ''' Unterschiede: 1. das Zurücksetzen von picKuh.Image bleibt dem Initiator des DoDragDrop() überlassen
                          ''' 2. da nur picKuhstall ein AllowDrop = True gesetzt hat, ist auch nur der Kuhstall für
                          ''' dieses Event von Interesse
                          ''' </remarks>
                          Private Sub EndDragDrop(ByVal sender As Object, ByVal e As DragEventArgs) Handles picKuhstall.DragDrop
                          'Standard: nichts tun
                          e.Effect = DragDropEffects.None

                          'nur reagieren, wenn überhaupt etwas zur Kopie/zum Verschieben vorliegt
                          If e.AllowedEffect And (DragDropEffects.Copy Or DragDropEffects.Move) Then
                          'nur der Kuhstall kommt als Ablage für Tiere infrage
                          If sender Is picKuhstall Then 'Abfrage obsolet, da nur auf den Kuhstall reagiert wird
                          'picKuh wird verschoben
                          If e.Data.GetData(GetType(PictureBox)) Is picKuh Then
                          e.Effect = If(e.AllowedEffect And DragDropEffects.Move, DragDropEffects.Move, DragDropEffects.Copy)
                          'Image übernehmen (hier ist es erst einmal nur eine Kopie)
                          picKuhstall.Image = picKuh.Image
                          End If
                          End If
                          End If
                          End Sub
                          End Class[/highlight]

                          Comment


                          • #14
                            Danke für die grosszügige Bedienung, es funktioniert! Es tut mir leid, dass du und deine Mit-Entwickler einen solchen Aufwand für einen Anfänger betreiben müssen, und schade auch, dass Bücher und Openbooks einen entsprechenden Code nicht anbieten. VB 6.0 und Java (Eclipse) waren im Vergleich dazu ein Kinderspiel. Aber jetzt klappt es auch in .NET, tausend und mehr DragDrop warten aufs Umschreiben.
                            Gruss aus den noch tief verschneiten Davos Bergen
                            Peter

                            Comment

                            Working...
                            X