Announcement

Collapse
No announcement yet.

Drag'n Drop im MonthCalendar - Übersetzung von C# nach VB

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

  • Drag'n Drop im MonthCalendar - Übersetzung von C# nach VB

    Hallo,

    ich hätte gern in meiner Applikation die Möglichkeit, einen Eintrag auf ein Datum zu ziehen und damit dessen Datum zu ändern. Hierzu habe ich folgendes Beispiel gefunden: http://social.msdn.microsoft.com/for...-d29968cff4ac/

    Allerdings stelle ich mich zu dusslig an, das bei mir unter VB umzusetzen. Ich kenne mich nicht aus mit dem Aufruf externer Funktionen, um ehrlich zu sein, ich verstehe es auch nicht, aber ich würde es gern nutzen. Im Grunde habe ich alles, nur die Zeilen:
    Code:
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
    
        private void monthCalendar1_DragDrop(object sender, DragEventArgs e) {
          // Generate the mouse down/up messages to select the date
          Point loc = monthCalendar1.PointToClient(new Point(e.X, e.Y));
          IntPtr lp = (IntPtr)(loc.X | (loc.Y << 16));
          SendMessage(monthCalendar1.Handle, 0x201, IntPtr.Zero, lp);
          SendMessage(monthCalendar1.Handle, 0x202, IntPtr.Zero, lp);
          // Do your stuff now
          //...
          Console.WriteLine(monthCalendar1.SelectionStart.ToString());
        }
    sehen bei mir so aus:
    Code:
     Private Declare Function SendMessage Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal msg As Integer, ByVal wp As IntPtr, ByVal lp As IntPtr) As IntPtr
    
      Private Sub lvTag1_DragDrop(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles dtpKalender.DragDrop
        If CType(sender, Control).Name = "dtpKalender" Then
          Dim loc As Point = dtpKalender.PointToClient(New Point(e.X, e.Y))
          Dim lp As IntPtr = ctype((loc.X | (loc.Y << 16)),IntPtr)  ' verursacht Fehler
          SendMessage(dtpKalender.Handle, 0x201, IntPtr.Zero, lp)   ' verursacht Fehler
          SendMessage(dtpKalender.Handle, 0x202, IntPtr.Zero, lp)   ' verursacht Fehler
        End If
    ...
    Kann mir jemand helfen? Gern auch mit ein paar Erklärungen, aber ich würde mich schon freuen, wenn ich es zum laufen brächte.

    Dankeschön ...

    Dave

  • #2
    Hallo,

    C# zu VB.net kann zB mit http://www.developerfusion.com/tools.../csharp-to-vb/ konvertiert werden. Mehr kann ich auch nicht tun (denn VB.net kann ich nicht, Übersetzungen mache ich mit diesem Tool).


    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Hi,

      Folgendes könnte funktionieren:

      [highlight=vb]
      Dim lp As IntPtr = new IntPtr(loc.X | (loc.Y << 16))
      [/highlight]

      Oder auch Folgendes:

      [highlight=vb]
      Dim lp As IntPtr = IntPtr.op_Explicit (loc.X | (loc.Y << 16))
      [/highlight]

      Konvertiert den Wert einer 32-Bit-Ganzzahl mit Vorzeichen in einen IntPtr-Konstruktor.
      Zuletzt editiert von Novi; 29.10.2009, 19:34.
      "(...) deshalb mag ich Binärtechnik. Da gibt es nur drei Zustände: High, Low und Kaputt." (Wau Holland)

      Viele Grüße Novi

      Comment


      • #4
        verursacht Fehler
        was für ein Fehler ?
        Bitte vergessen Sie nicht die Antwort zu bewerten. Danke.:-)

        Comment


        • #5
          Vielen Dank schon mal. Dieser Übersetzer funktioniert ja wirklich nicht schlecht. Prima Link, Danke. Allerdings gibt es nach wie vor Probleme mit einer Zeile:

          aus dem Übersetzer:
          Code:
          Dim lp As IntPtr = DirectCast((loc.X Or (loc.Y << 16)), IntPtr)
          'Der Wert vom Typ Integer kann nicht in "System.IntPtr" konvertiert werden.
          und bei den anderen beiden Varianten
          Code:
          Dim lp As IntPtr = IntPtr.op_Explicit (loc.X | (loc.Y << 16))
          Dim lp As IntPtr = new IntPtr(loc.X | (loc.Y << 16))
          schimpft er das | als "Ungültiges Zeichen" an. Er kompiliert es nicht.

          ...

          Habe es hinbekommen, man muss einfach das | durch ein Or tauschen, schon ist es wohl syntaktisch fehlerfrei. Allerdings funktioniert das ganz irgendwie überhaupt nicht. Die Abarbeitung verabschiedet sich mit dem ersten SendMessage. Kommentarlos. Ohne Fehlermeldung oder irgendwas, das zweite SendMessage wird schon gar nicht mehr erreicht.
          Ich nahm an, dass mit dieser Prozedur das monthCalendar.SelectionStart-Datum auf den neuen Wert geändert wird (was ja im Grunde auch nicht optimal ist, da ich das Datum ja nur brauche, um ihm einen Eintrag zuzuweisen und nicht gleich das Datum meines Kalenders zu ändern, aber man kann wohl nicht alles haben), aber irgendwie passiert eben gar nichts. Ich verstehe das Beispiel einfach nicht.

          Kann mich da jemand nochmal aufklären?

          PS: Und wie schaltet Ihr dieses vb-Code-Tag hier ein? Es gibt doch nur "Code".
          Zuletzt editiert von Dave_Bowman; 30.10.2009, 09:57.

          Comment


          • #6
            Starte die Version auf c# und VB und vergleiche die Argumente von SendMessage in beiden Fällen. Sind sie gleich ?


            [highlight=vb]
            msgBox("HelloWorld")
            [/highlight]
            Zuletzt editiert von vadym voytas; 04.11.2009, 00:52.
            Bitte vergessen Sie nicht die Antwort zu bewerten. Danke.:-)

            Comment


            • #7
              Hallo,

              Und wie schaltet Ihr dieses vb-Code-Tag hier ein? Es gibt doch nur "Code".
              das steht im ersten blau hinterlegtem Beitrag in dem Forum wo du postest. Da sollte schon auffallen wenn man nicht farbenblind ist.
              http://entwickler-forum.de/forumdisplay.php?f=14

              @vadym: Für solche Fälle gibt es das [noparse]-Tag.


              mfG Gü
              "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

              Comment


              • #8
                Hallo

                Wenn ich dich richtig verstanden habe, willst du das Datum unter dem Mauszeiger auslesen.

                Geht ganz .NET ohne Sendmessage

                Code:
                Public Class Form1
                
                	Private Sub TextBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseMove
                		'zum Testen
                		If e.Button = Windows.Forms.MouseButtons.Left Then
                			TextBox1.DoDragDrop(TextBox1.Text, DragDropEffects.All)
                		End If
                	End Sub
                
                	Private Sub MonthCalendar1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles MonthCalendar1.DragDrop
                		Dim hi As MonthCalendar.HitTestInfo = MonthCalendar1.HitTest(MonthCalendar1.PointToClient(New Point(e.X, e.Y)))
                		If hi.HitArea = MonthCalendar.HitArea.Date Then
                			MsgBox(hi.Time.Date.ToString)
                		End If
                	End Sub
                
                	Private Sub MonthCalendar1_DragOver(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles MonthCalendar1.DragOver
                		If e.Data.GetDataPresent(DataFormats.Text, True) Then
                			e.Effect = DragDropEffects.All
                		End If
                	End Sub
                End Class
                cu

                Comment


                • #9
                  Hauti, perfekt. Funktioniert wunderbar. Komisch, warum dann solche "Verrenkungen" mit dem Aufruf irgendwelcher externer Funktionen? Naja, aber dieses Verfahren scheint ja wirklich nicht so bekannt zu sein.

                  Dankeschön ... auch an alle anderen ...

                  Dave

                  Comment

                  Working...
                  X