Announcement

Collapse
No announcement yet.

Point.Offset() - Befehlsverweigerung

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

  • Point.Offset() - Befehlsverweigerung

    Hallo Experten,

    auf einem Panel werden verschiedene Objekte gezeichnet. Das Panel ist scrollbar. Ich möchte eines der Objekte mit der Maus verschieben.

    Ist das Panel nicht ganz nach oben links gescrollt, wird die Position nicht korrekt berechnet. Schrittweises Debuggen zeigte, dass die Methode Offset() in diesem Codeschnipsel nichts tut.:[highlight=c#]class DragItem
    {
    private Point m_ptGrip = Point.Empty;

    public Point Grip
    {
    get { return (m_ptGrip); }
    set { m_ptGrip = value; }
    }
    }

    class MyPanel:System.Windows.Forms.Panel
    {
    private DragItem m_ItemDragging = new DragItem();
    protected override void OnMouseMove(MouseEventArgs e)
    {
    base.OnMouseMove(e);

    if (m_ItemDragging != null)
    {
    m_ItemDragging.Grip = new Point(e.Location.X, e.Location.Y);
    m_ItemDragging.Grip.Offset(-this.AutoScrollPosition.X, -this.AutoScrollPosition.Y);
    //m_ItemDragging.Grip = new Point(m_ItemDragging.Grip.X - this.AutoScrollPosition.X, m_ItemDragging.Grip.Y - this.AutoScrollPosition.Y);
    }
    }
    }[/highlight]Grip ändert seinen Wert auch dann nicht, wenn die AutoscrollPosition von (0,0) abweicht.

    Die auskommentierte Zeile funktioniert tadellos und sollte das Selbe bedeuten wie die gezeigte Verwendung von Offset(). Mein Problem hierbei ist, dass ich mich darauf verlasse, dass eine Property geschrieben wird. Ich erhalte keine Fehlermeldung, etwa dass die Property schreibgeschützt wäre. Dennoch verhält sie sich anders als erwartet.

    Woran liegt es, dass Grip durch Offset() nicht verändert wird?

    Mit freundlichem Gruß


    luker

  • #2
    Woran liegt es, dass Grip durch Offset() nicht verändert wird?
    Point ist ein struct und keine Klasse. Structs sind valuetypes, heißt sie werden in Methoden wie z.B. dem Property Getter von Grip als value übertragen und nicht als Referenz.

    Beim 'm_ItemDragging.Grip.Offset' Aufruf liefert dir m_ItemDragging.Grip also sozusagen eine ~Kopie~ von m_ptGrip die du änderst und da diese nicht weiter referenziert wird sofort vom GC vernichtet wird.

    Comment


    • #3
      Originally posted by Ralf Jansen View Post
      als value übertragen und nicht als Referenz
      Und gibt es eine Möglichkeit, die Übergabe als Referenz zu erzwingen?
      Ähnlich wie bei Parametern eines Methodenaufrufs?
      Code:
      WahnsinnigWichtigeMethode(ref int IntegerParameter)

      Comment


      • #4
        ja genau das ist ja der Trick den man anwenden kann um ValueTypes zu ändern ohne eine neue Referenz zu erstellen
        Unsere Jugend ist unerträglich, unverantwortlich und entsetzlich anzusehen! - Aristoteles

        Comment


        • #5
          Und gibt es eine Möglichkeit, die Übergabe als Referenz zu erzwingen?
          Ähnlich wie bei Parametern eines Methodenaufrufs?
          Bei Properties? Nein.

          Wenn du unbedingt den gezeigten Syntax möchtest musst du direkt aufs Feld zugreifen und die Property weglassen.

          Comment


          • #6
            ja stimmt das darf man nicht vergessen wenn mans über Properties zuweist geht eine Referenz wieder nicht mehr. Da die Setter Value bei ValueTypes wieder eine Kopie erzeugt.
            Unsere Jugend ist unerträglich, unverantwortlich und entsetzlich anzusehen! - Aristoteles

            Comment


            • #7
              Ok, dann werd ich das lassen. Für diesen Fall habe ich ja einen funktionierenden Workaround. Jetzt muss ich nur aufpassen, dass ich den Zusammenhang zwischen ValueType und Get/Set nicht vergesse und später nochmal darüber stolpere.

              Vielen Dank, Ralf Jansen und das-d.

              Comment

              Working...
              X