Visual Studio 2013 stürtzt ab

  • Allgemein

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Radinator.

    Visual Studio 2013 stürtzt ab

    Hallo,
    ich bin jetzt mal wieder in C# unterwegs und wollte mir ein kleines Simulationsprogramm schreiben. Es kann sein, dass ich ein wenig raus bin. Ich bin mir nicht sicher ob das Problem bei mir liegt oder VS. Ich habe eine Klasse die von Control erbt, nach dem Kompilieren ist das Control in der Toolbox. Ziehe ich nun das Control auf eine Form stürtzt Visual Studio ab ("Visual Studio 2013 funktioniert nicht mehr.."). Füge ich das Control per Hand in die Designer-Datei funktionierts und ich kann auch Debuggen. Ich hab mal testweise ein neues Projekt gemacht und die 2 Klassen hinzugefügt (s.u.) und es verhält sich so wie vorher. Ist also reproduzierbar. Ich verwende Visual Studio 2013 Community.

    Component.cs

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Drawing;
    4. using System.Drawing.Drawing2D;
    5. using System.Linq;
    6. using System.Text;
    7. namespace CurcuitSim
    8. {
    9. public interface IDrawable
    10. {
    11. void Draw(Graphics g, Font f);
    12. bool Contains(Point position, Matrix transform);
    13. void MoveTo(Point from, Point to, Matrix transform);
    14. }
    15. public struct Connection :
    16. IDrawable
    17. {
    18. public Connection(string name, bool state)
    19. {
    20. Name = name;
    21. State = state;
    22. }
    23. public string Name;
    24. public bool State; // true == high , false == low
    25. public void Draw(Graphics g, Font f)
    26. {
    27. }
    28. public bool Contains(Point position, Matrix transform)
    29. {
    30. return false;
    31. }
    32. public void MoveTo(Point from, Point to, Matrix transform)
    33. {
    34. throw new NotImplementedException();
    35. }
    36. }
    37. public class Component :
    38. IDrawable
    39. {
    40. public Point Position { get { return pos; } set { pos = value; } }
    41. protected Point pos;
    42. public virtual string Name {get {return "Component";}}
    43. protected Size componentSize = new Size(50, 100);
    44. public Component() { pos = new Point(0, 0); }
    45. public Component(Point position)
    46. {
    47. pos = position;
    48. }
    49. public virtual void MoveTo(Point from, Point to, Matrix transform)
    50. {
    51. to = TransformPointI(to, transform);
    52. from = PointToClient(TransformPointI(from, transform));
    53. pos = new Point(to.X - from.X, to.Y - from.Y);
    54. }
    55. public virtual void Draw(Graphics g, Font f)
    56. {
    57. g.FillRectangle(Brushes.Black, new Rectangle(pos, componentSize));
    58. }
    59. public virtual bool Contains(Point posi, Matrix transform)
    60. {
    61. posi = TransformPointI(posi, transform);
    62. return (posi.X > pos.X) && (posi.Y > pos.Y) && (posi.X < (pos.X + componentSize.Width)) && (posi.Y < (pos.Y + componentSize.Height));
    63. }
    64. public Point PointToClient(Point origin)
    65. {
    66. return new Point(origin.X - pos.X, origin.Y - pos.Y);
    67. }
    68. private Point TransformPointI(Point posi, Matrix transform)
    69. {
    70. Point[] p = new Point[] { posi };
    71. // Copy Matrix
    72. Matrix transform2 = new Matrix(transform.Elements[0], transform.Elements[1], transform.Elements[2], transform.Elements[3], transform.Elements[4], transform.Elements[5]);
    73. transform2.Invert();
    74. transform2.TransformPoints(p);
    75. return p[0];
    76. }
    77. protected void DrawName(string name, Graphics g, Font f)
    78. {
    79. SizeF stringSize = g.MeasureString(name, f);
    80. g.DrawString(name, f, Brushes.Black, new PointF(pos.X + componentSize.Width/2.0f - stringSize.Width/2.0f, pos.Y));
    81. }
    82. }
    83. public class AndGate :
    84. Component
    85. {
    86. public AndGate(){ }
    87. public AndGate(Point p) : base(p) {}
    88. public override string Name { get { return "And Gate"; } }
    89. public override void Draw(Graphics g, Font f)
    90. {
    91. var bounds = new Rectangle(pos, componentSize);
    92. g.FillRectangle(Brushes.White, bounds);
    93. g.DrawRectangle(Pens.Black, bounds);
    94. DrawName("&", g, f);
    95. }
    96. }
    97. }


    und das eigentliche Control:
    ComponentContainer.cs

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Drawing;
    4. using System.Drawing.Drawing2D;
    5. using System.Linq;
    6. using System.Text;
    7. using System.Windows.Forms;
    8. namespace CurcuitSim
    9. {
    10. public class ComponentContainer :
    11. Control
    12. {
    13. private List<IDrawable> drawItems = new List<IDrawable>();
    14. public void AddItem(IDrawable item) { drawItems.Add(item); Invalidate(); }
    15. public void RemoveItem(IDrawable item) { drawItems.Remove(item); Invalidate(); }
    16. public void ClearItems() { drawItems.Clear(); Invalidate(); }
    17. public float Zoom { get { return Zoom; } set { zoom = value; UpdateMatrix(new Point(0, 0)); } }
    18. float zoom = 1.0f;
    19. public Point Offset { get { return offset; } set { offset = value; UpdateMatrix(new Point(0, 0)); } }
    20. Point offset = new Point(0, 0);
    21. Matrix currentTransform = new Matrix();
    22. public ComponentContainer()
    23. {
    24. DoubleBuffered = true;
    25. Text = "";
    26. }
    27. protected override void OnPaint(PaintEventArgs e)
    28. {
    29. base.OnPaint(e);
    30. e.Graphics.Transform = currentTransform;
    31. for (int i = 0; i < drawItems.Count; ++i)
    32. {
    33. drawItems[i].Draw(e.Graphics, Font);
    34. }
    35. }
    36. IDrawable drawItemCaught = null;
    37. Point lastPosition;
    38. protected override void OnMouseDown(MouseEventArgs e)
    39. {
    40. base.OnMouseDown(e);
    41. if (e.Button != System.Windows.Forms.MouseButtons.Left && e.Button != System.Windows.Forms.MouseButtons.Right)
    42. return;
    43. for (int i = 0; i < drawItems.Count; ++i)
    44. {
    45. if (drawItems[i].Contains(e.Location, currentTransform)) // Capture last DrawItem caught by Mouse
    46. {
    47. drawItemCaught = drawItems[i];
    48. lastPosition = e.Location;
    49. }
    50. }
    51. }
    52. protected override void OnMouseUp(MouseEventArgs e)
    53. {
    54. base.OnMouseUp(e);
    55. drawItemCaught = null;
    56. }
    57. protected override void OnMouseMove(MouseEventArgs e)
    58. {
    59. base.OnMouseMove(e);
    60. if (drawItemCaught == null)
    61. return;
    62. drawItemCaught.MoveTo(lastPosition, e.Location, currentTransform);
    63. lastPosition = e.Location;
    64. Invalidate();
    65. }
    66. protected override void OnMouseWheel(MouseEventArgs e)
    67. {
    68. base.OnMouseWheel(e);
    69. if (drawItemCaught != null)
    70. return;
    71. zoom += e.Delta * 0.0005f;
    72. zoom = Math.Min(Math.Max(zoom, 0.002f), 5.0f);
    73. UpdateMatrix(e.Location);
    74. }
    75. protected override void OnKeyDown(KeyEventArgs e)
    76. {
    77. switch(e.KeyCode)
    78. {
    79. case Keys.Up:
    80. offset.Y -= 15;
    81. break;
    82. case Keys.Down:
    83. offset.Y += 15;
    84. break;
    85. case Keys.Left:
    86. offset.X -= 15;
    87. break;
    88. case Keys.Right:
    89. offset.X += 15;
    90. break;
    91. }
    92. UpdateMatrix(new Point(0, 0));
    93. base.OnKeyDown(e);
    94. }
    95. private void UpdateMatrix(Point offs)
    96. {
    97. currentTransform.Reset();
    98. currentTransform.Translate(Offset.X, Offset.Y);
    99. currentTransform.Translate(offs.X, offs.Y);
    100. currentTransform.Scale(zoom, zoom);
    101. currentTransform.Translate(-offs.X, -offs.Y);
    102. Invalidate();
    103. }
    104. }
    105. }


    Weiß jemand wo der Fehler liegt? Auf den Designer verzichten wollte ich ungern :/ .
    Grüße

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    @Gonger96 Ich kann Deinen Effekt im VS2013 Ultimate reproduzieren.

    C#-Quellcode

    1. public float Zoom { get { return Zoom; } set { zoom = value; UpdateMatrix(new Point(0, 0)); } }
    machst Du

    C#-Quellcode

    1. public float Zoom { get { return zoom; /* das hier */} set { zoom = value; UpdateMatrix(new Point(0, 0)); } }
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Is ne Rekursion sonst oder? :D Deswegen nehm ich bei lokalen Variablen als Return Wert für Properties immer this her.
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell