Control funktioniert nicht

  • VB.NET

Es gibt 32 Antworten in diesem Thema. Der letzte Beitrag () ist von Nikx.

    Control funktioniert nicht

    Hey :)
    Ich habe mich grade mal drangesetzt und versucht mein erstes eigenes Control zu
    schreiben. Es sollte ein Seperator sein:

    VB.NET-Quellcode

    1. Imports System.Drawing
    2. Imports System.Windows.Forms
    3. Public Class Seperator
    4. Inherits System.Windows.Forms.Control
    5. Public pa As Graphics
    6. Public Color1 As Color = Color.LightGray
    7. Public Color2 As Color = Color.White
    8. Public Align As String
    9. Public p As New Pen(Color1, 1)
    10. Public Enum alg
    11. Horizontal
    12. Vertical
    13. End Enum
    14. Sub Me_paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    15. If Align = "Horizontal" Then
    16. pa.DrawLine(p, 0, 1, 0, Width)
    17. ElseIf Align = "Vertical" Then
    18. pa.DrawLine(p, 1, 0, Height, 0)
    19. End If
    20. End Sub
    21. Private Sub Me_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize
    22. If Align = "Vertical" Then
    23. pa.DrawLine(p, 1, 0, Height, 0)
    24. ElseIf Align = "Horizontal" Then
    25. pa.DrawLine(p, 1, 0, Width, 0)
    26. End If
    27. Me.Invalidate()
    28. End Sub
    29. Public Property SeperatorAlign() As alg
    30. Get
    31. Return Align
    32. End Get
    33. Set(ByVal value As alg)
    34. Align = value
    35. MyBase.Invalidate()
    36. End Set
    37. End Property
    38. Public Sub New()
    39. MyBase.New()
    40. MyBase.SetStyle(ControlStyles.UserPaint, True) 'Der controll sagen das wir sie zeichnen
    41. MyBase.SetStyle(ControlStyles.DoubleBuffer, True) 'DoubleBuffer aktivieren
    42. MyBase.SetStyle(ControlStyles.SupportsTransparentBackColor, True) 'Transparente hintergrundfarbe aktivieren (für diese anwendung nicht zwingend notwendig)
    43. End Sub
    44. End Class


    Kann mir jemand sagen was ich falsch gemacht habe ?
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    Du vergleichst einen String mit einem enum?! mach if algin = alg.Horizontal aber nicht "Horizontal"

    Und die Variable Algin natürlich auch so deklinieren:

    VB.NET-Quellcode

    1. Dim Align As alg

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „TheMatI“ ()

    Achso, ganz vergessen :D
    Wenn ich das Control Vertikal auf die Form ziehe wird es Horizontal und wirft den Fehler "Interger geht nicht nach String", Zeile 17, 19, 25, 27.
    Ich weiß auch warum, aber wie soll ich es sonst machen.

    Und dass mit dem Horizontalen verstehe ich immer noch nicht :P


    Ich habs nun so:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Drawing
    2. Imports System.Windows.Forms
    3. Public Class Seperator
    4. Inherits System.Windows.Forms.Control
    5. Public pa As Graphics
    6. Public Color1 As Color = Color.LightGray
    7. Public Color2 As Color = Color.White
    8. Public Align As alg = alg.Horizontal
    9. Public p As New Pen(Color1, 1)
    10. Public Enum alg
    11. Horizontal
    12. Vertical
    13. End Enum
    14. Sub Me_paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    15. If Align = alg.Horizontal Then
    16. pa.DrawLine(p, 0, 1, 0, Width)
    17. ElseIf Align = alg.Vertical Then
    18. pa.DrawLine(p, 1, 0, Height, 0)
    19. End If
    20. End Sub
    21. Private Sub Me_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize
    22. If Align = alg.Vertical Then
    23. pa.DrawLine(p, 1, 0, Height, 0)
    24. ElseIf Align = alg.Horizontal Then
    25. pa.DrawLine(p, 1, 0, Width, 0)
    26. End If
    27. Me.Invalidate()
    28. End Sub
    29. Public Property SeperatorAlign() As alg
    30. Get
    31. Return Align
    32. End Get
    33. Set(ByVal value As alg)
    34. Align = value
    35. MyBase.Invalidate()
    36. End Set
    37. End Property
    38. Public Sub New()
    39. MyBase.New()
    40. MyBase.SetStyle(ControlStyles.UserPaint, True) 'Der controll sagen das wir sie zeichnen
    41. MyBase.SetStyle(ControlStyles.DoubleBuffer, True) 'DoubleBuffer aktivieren
    42. MyBase.SetStyle(ControlStyles.SupportsTransparentBackColor, True) 'Transparente hintergrundfarbe aktivieren (für diese anwendung nicht zwingend notwendig)
    43. End Sub
    44. End Class
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    Okay das ist nicht der einzige fehler :D
    Warum benutzt du

    VB.NET-Quellcode

    1. Dim pa As Graphics

    Benutz doch e.Graphics.DrawLine in der Paint sub.
    Und das drawn in der Resize Sub brauchste auch nicht, dazu ist doch schon das Invalidate da.

    Was verstehst du denn bei Horizontal nicht?

    Ok zu deinen Code oben, es reich dann einfach wenn du e.Graphics benutzt weil du pa noch garnicht erzeugt hast. Und bei Resize dein Neuzeichnen Löschen und nur Me.Invalidate benutzen.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Drawing
    2. Imports System.Windows.Forms
    3. Public Class Seperator
    4. Inherits System.Windows.Forms.Control
    5. Public Color1 As Color = Color.LightGray
    6. Public Color2 As Color = Color.White
    7. Public Align As alg = alg.Horizontal
    8. Public p As New Pen(Color1, 1)
    9. Public Enum alg
    10. Horizontal
    11. Vertical
    12. End Enum
    13. Sub Me_paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    14. If Align = alg.Horizontal Then
    15. e.Graphics.DrawLine(p, 0, 1, 0, Width)
    16. ElseIf Align = alg.Vertical Then
    17. e.Graphics.DrawLine(p, 1, 0, Height, 0)
    18. End If
    19. End Sub
    20. Private Sub Me_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize
    21. Me.Invalidate()
    22. End Sub
    23. Public Property SeperatorAlign() As alg
    24. Get
    25. Return Align
    26. End Get
    27. Set(ByVal value As alg)
    28. Align = value
    29. MyBase.Invalidate()
    30. End Set
    31. End Property
    32. Public Sub New()
    33. MyBase.New()
    34. MyBase.SetStyle(ControlStyles.UserPaint, True) 'Der controll sagen das wir sie zeichnen
    35. MyBase.SetStyle(ControlStyles.DoubleBuffer, True) 'DoubleBuffer aktivieren
    36. MyBase.SetStyle(ControlStyles.SupportsTransparentBackColor, True) 'Transparente hintergrundfarbe aktivieren (für diese anwendung nicht zwingend notwendig)
    37. End Sub
    38. End Class


    Er gibt mir immer noch den "String zu Integer" Fehler...
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    Bei der "SeperatorAlign"-Property
    Beim Test in einem neuen Projekt graut er diese Option dann aus,
    mit der Begründung wie o.g. ^^

    (Wie debuggt man eine Klasse oO)
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!

    VB.NET-Quellcode

    1. Public Align As alg

    String, hm? ;)

    Mein Code:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Drawing
    2. Imports System.Windows.Forms
    3. Public Class Seperator
    4. Inherits System.Windows.Forms.Control
    5. Public Color1 As Color = Color.LightGray
    6. Public Color2 As Color = Color.White
    7. Public Align As alg = alg.Horizontal
    8. Public p As New Pen(Color1, 1)
    9. Public Enum alg
    10. Horizontal
    11. Vertical
    12. End Enum
    13. Sub Me_paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    14. If Align = alg.Horizontal Then
    15. e.Graphics.DrawLine(p, 0, 1, 0, Width)
    16. ElseIf Align = alg.Vertical Then
    17. e.Graphics.DrawLine(p, 1, 0, Height, 0)
    18. End If
    19. End Sub
    20. Private Sub Me_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize
    21. Me.Invalidate()
    22. End Sub
    23. Public Property SeperatorAlign() As alg
    24. Get
    25. Return Align
    26. End Get
    27. Set(ByVal value As alg)
    28. Align = value
    29. MyBase.Invalidate()
    30. End Set
    31. End Property
    32. Public Sub New()
    33. MyBase.New()
    34. MyBase.SetStyle(ControlStyles.UserPaint, True) 'Der controll sagen das wir sie zeichnen
    35. MyBase.SetStyle(ControlStyles.DoubleBuffer, True) 'DoubleBuffer aktivieren
    36. MyBase.SetStyle(ControlStyles.SupportsTransparentBackColor, True) 'Transparente hintergrundfarbe aktivieren (für diese anwendung nicht zwingend notwendig)
    37. End Sub
    38. End Class
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    Achso :D
    Nein, in jedem Expander ist das geändert was mir hier gesagt wurde, deshalb lohnt es die zu öffnen ^^
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    Versteh das nicht, habe deinen Code in ein Projekt kopiert und es funktioniert wunderbar!

    Edit übrigens gehört der Code von If Horizontal und Vertikal vertauscht.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. If Align = alg.Horizontal Then
    2. e.Graphics.DrawLine(p, 0, 1, 0, Width)
    3. ElseIf Align = alg.Vertical Then
    4. e.Graphics.DrawLine(p, 1, 0, Height, 0)
    5. End If

    zu

    VB.NET-Quellcode

    1. If Align = alg.Horizontal Then
    2. e.Graphics.DrawLine(p, 1, 0, Height, 0)
    3. ElseIf Align = alg.Vertical Then
    4. e.Graphics.DrawLine(p, 0, 1, 0, Width)
    5. End If
    Wut ? Lol :D
    (Es heißt nicht 'Reperatur'? Neues gelernt :P)

    Edit: Jup, geht doch :D
    Könnte mir noch jem. erklären wie ich noch eine weiße Linie daneben zeichnen kann?
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Nikx“ ()

    Aber es heißt "Temperatur"... soll doch jemand unsere Sprache verstehen. :P

    Eine weiße Linie zeichnest du wie eine schwarze, nur halt mit Pens.White.
    Wie man sie zeichnet ist mir klar, nur wie zeichne ich sie rechts daneben, bzw. bei horizontal unten drunter ?
    (Mit Rechts oder Unter meine ich die Graue Linie :D)
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!