New Pen(color.black) mit mehreren Parametern in einer Zeile?

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von FormFollowsFunction.

    New Pen(color.black) mit mehreren Parametern in einer Zeile?

    Hallo Leute,

    ich möchte das machen:

    VB.NET-Quellcode

    1. ​Dim PenRed As New Pen(Color.Orange, 2)
    2. PenRed.StartCap = System.Drawing.Drawing2D.LineCap.Round
    3. PenRed.EndCap = System.Drawing.Drawing2D.LineCap.Round


    Ich möchte die obigen drei Zeilen hier als einen Parameter haben: g.DrawLine(PenRed,0,0,100,100)

    g.DrawLine(New Pen(color.orange,2),0,0,100,100) geht ja, aber wie hänge ich da nach dem Pen die StartCap und EndCap an? Gibts da nicht etwas mit geschweiften Klammern?

    Ich möchte den Code einfach etwas verkürzen und den Pen mit den Informationen Farbe, Breite, StartCap und Endcap direkt in DrawLine drin haben.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Such' dir was aus :P

    VB.NET-Quellcode

    1. Dim PenRed As New Pen(Color.Orange, 2) With {.StartCap = System.Drawing.Drawing2D.LineCap.Round, .EndCap = System.Drawing.Drawing2D.LineCap.Round}
    2. g.DrawLine(New Pen(Color.Orange, 2) With {.StartCap = System.Drawing.Drawing2D.LineCap.Round, .EndCap = System.Drawing.Drawing2D.LineCap.Round}, 0, 0, 100, 100)

    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    VS2022 schlägt es Dir sogar vor:


    Falls Du das häufiger brauchst, dann auslagern:

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    2. GetNewPen(Color.Orange, 2, Drawing2D.LineCap.Round, Drawing2D.LineCap.Round)
    3. End Sub
    4. Private Function GetNewPen(Color As Color, Width As Single, StartCap As Drawing2D.LineCap, EndCap As Drawing2D.LineCap) As Pen
    5. Return New Pen(Color, Width) With {.StartCap = StartCap, .EndCap = EndCap}
    6. End Function

    ABER: Pen implementiert IDisposable, daher sollte der auch nach Verwendung disposed werden.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @tragl
    Super Danke. Genau das mit dem With habe ich gesucht.

    @VaporiZed

    Achja, an eine separate Funktion habe ich gar nicht gedacht. Wäre das einfachste und am besten lebsbar.
    Wie oder wann würdest Du den Pen dann wieder disposen?
    Macht das nicht die Garbage-Dingsbums-Aufräumung automatisch irgendwann?

    Oder einen Pen mit New definieren und den dann immer wieder "nur" ändern und am Ende dann den einen disposen?

    Habe es nun so gemacht:

    VB.NET-Quellcode

    1. Public GlobalPen As New Pen(Color.Orange, 2)
    2. '.....
    3. Public Function Round2Pencil(DerPen As Pen, DieFarbe As Color) As Pen
    4. DerPen.Color = DieFarbe
    5. DerPen.Width = 2
    6. DerPen.StartCap = System.Drawing.Drawing2D.LineCap.Round
    7. DerPen.EndCap = System.Drawing.Drawing2D.LineCap.Round
    8. Return DerPen
    9. End Function
    10. '......
    11. g.DrawLine(Round2Pencil(GlobalPen, HistoricColors(3)),0,0,100,100)


    Mit den Roundet Caps schauen die Charts einfach besser aus.
    Bilder
    • bopv.info.jpg

      919,49 kB, 1.919×1.079, 35 mal angesehen
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „dive26“ ()

    Ja, das mit dem klassenweiten Pen und der Änderungsfunktion ist ein m.E. guter Weg. Das Disposen machst Du dann im FormClosing-, FormClosed- oder Closed-EventHandler. Oder früher, wenn er eben nicht mehr benötigt wird.
    Der GarbageCollector kann sich um die Sachen, die disposed werden müssen, eben nicht kümmern, sonst bräuchte man die IDisposable-Schnittstelle und -implementierung ja nicht.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ich verwende wenn es möglich ist, konsequent die Using Anweisung und würde das auch jedem empfehlen.

    VB.NET-Quellcode

    1. Using pen As New Pen(HistoricColors(3), 1) With {.StartCap = LineCap.Round, .EndCap = LineCap.Round}
    2. Graphics.DrawLine(pen, 0, 0, 100, 100)
    3. End Using

    * Korrigiert

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „FormFollowsFunction“ ()

    @FormFollowsFunction

    Ja, die Using-Anweisung würde ich normalerweise verwenden, aber das würde den Code dort wo ich das brauche so aufblähen, dass es nicht mehr lesbar wäre.
    Ich wollte es ja in der Zeile der graphics.Draw belassen.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

    FormFollowsFunction schrieb:


    VB.NET-Quellcode

    1. Using graphics As Graphics = e.Graphics
    2. '...
    nein, using graphics=e.Graphics ist nix gutt.
    Du bekommst e.Graphics von einem Aufrufer übergeben - da sollteste es nicht disposen, weil quasi es "gehört" dir nicht.
    Eventuell will der Aufrufer ja danach noch weiteres mit dem Graphics anstellen.

    Es gibt eine c-Regel, die für uns glaub auch gilt: "Zerstöre nur die Objekte, die du selbst erstellt hast"
    @ErfinderDesRades
    Das trifft aber nur zu, wenn man in der Paint-Routine mit dem graphics Objekt hantiert?

    Außerhalb muss es ja gemacht werden!?

    VB.NET-Quellcode

    1. Using g As Graphics = PanelControl.CreateGraphics
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    @ErfinderDesRades
    Ups ! Da hast du latürnich recht.

    @dive26
    So sparst du allerdings eine Klassenweite Variable und ne extra Methode ist auch nicht nötig.
    Als "aufgebläht" würde ich die drei Zeilen auch nicht bezeichnen.

    Wenn vielen Objeke gezeichnet werden müßen, mache ich immer so,
    daß ich für jedes Objekt, oder auch Gruppen von Objekten, eine Methode schreibe, die dann im Paint Event aufgerufen werden.

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