none
"New Font" für ein Label setzt neue Schriftart für alle Labels RRS feed

  • Frage

  • Hallo allerseits.

    In meinem UserControl habe ich folgenden Code (vereinfacht):

    Imports System.Drawing
    Imports System.Windows.Forms
    
    Friend Class PP
    
    Private WithEvents Label1 As Label
    
    Public Sub AddLabel()
    
        Me.Label1 = New Label
    
        Me.SuspendLayout()
    
        Me.Controls.Add(Me.Label1)
    
        With Me.Label1
    
          Dim F As Font
    
          With .Font
            F = New Font(.FontFamily, .Size, FontStyle.Bold, .Unit, .GdiCharSet, .GdiVerticalFont)
          End With
    
          Me.Font = F
    
          .Name = "Label1"
          .Text = "Test"
    
        End With
    
        Me.ResumeLayout(False)
    
      End Sub
    
    End Class
    
    

    Die ganze Sache mit der Font soll eigentlich nur bewirken, dass die Schriftart übernommen wird, mit dem kleinen Unterschied, dass sie Fett dargestellt werden soll. Das merkwürdige ist, dass auf diesen Aufruf hin alle Labels Fett dargestellt werden?1??

    Kann mir jemand sagen wo hier der Fehler liegt.

    Gruß Janus

    PS: Benutze VB10

    Montag, 13. September 2010 15:32

Antworten

  • Hallo Janus,

    so nett With gelegentlich sein kann, so kann es auch den Code undurchsichtiger machen,
    deswegen sollte man es sparsam einsetzen und tiefe Schachtelungen vermeiden.

    Oben hat es dazu geführt dass Du die Font Eigenschaften des UserControls gesetzt hast.
    Damit wird der Font für alle Steuerlemente verwendet, die keine spezifischen Font
    zugewiesen bekommen haben.

    Eine mögliche Variante (ungetestet):

    Public Sub AddLabel()
      Me.SuspendLayout()
    
      Me.Label1 = New Label()
      With Me.Label1
        .Name = "Label1"
        ' Da wo es hin soll...
        .Location = new Point(10, 20)
        
        ' Schriftart
        .Font = new New System.Drawing.Font("Tahoma", 8.25!, FontStyle.Regular)
        .Text = "Label Text"
      End With
    
      ' Empfohlen: erst anfügen, wenn komplett erstellt
      Me.Controls.Add(Me.Label1)
      Me.ResumeLayout(False)
    End Sub
    
    
    Gruß Elmar

    • Als Antwort markiert Janus_777 Dienstag, 14. September 2010 11:09
    Montag, 13. September 2010 16:35
  • Hallo,

    In meinem UserControl habe ich folgenden Code (vereinfacht):


    Imports System.Drawing Imports System.Windows.Forms Friend Class PP Private WithEvents Label1 As Label Public Sub AddLabel() Me.Label1 = New Label Me.SuspendLayout() Me.Controls.Add(Me.Label1) With Me.Label1 Dim F As Font With .Font F = New Font _ (.FontFamily, .Size, _ FontStyle.Bold, .Unit, _ .GdiCharSet, .GdiVerticalFont) End With Me.Font = F

    Mit dem Setzen von Me.Font übernehmen alle auf Me liegenden
    Labels die Fonteinstellung F. Wenn nur die Font-Eigenschaft von
    Label1 auf "Bold" eingestellt werden soll, dann schreibe einfach
    Label1.Font = New Font(Label1.Font, FontStyle.Bold)

            .Name = "Label1"
            .Text = "Test"
        End With
        Me.ResumeLayout(False)
    End Sub
    End Class

    Die ganze Sache mit der Font soll eigentlich nur bewirken, dass
    die Schriftart übernommen wird, mit dem kleinen Unterschied,
    dass sie Fett dargestellt werden soll. Das merkwürdige ist,
    dass auf diesen Aufruf hin alle Labels Fett dargestellt werden.

    s.oben:
    Wenn Du die Font-Eigenschaft der Form oder sonstigen
    umgebenden Containers änderst, übernehmen alle darauf
    liegenden Labels diese Font-Einstellung, soll nur die Font-
    einstellung eines bestimmten Labels auf Bold geändert
    werden dann, wie schon oben gezeigt, einfach

        Label1.Font = New Font(Label1.Font, FontStyle.Bold)

    Kann mir jemand sagen wo hier der Fehler liegt.

    s.oben.

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    • Als Antwort markiert Janus_777 Dienstag, 14. September 2010 11:09
    Montag, 13. September 2010 16:36

Alle Antworten

  • Hallo Janus,

    so nett With gelegentlich sein kann, so kann es auch den Code undurchsichtiger machen,
    deswegen sollte man es sparsam einsetzen und tiefe Schachtelungen vermeiden.

    Oben hat es dazu geführt dass Du die Font Eigenschaften des UserControls gesetzt hast.
    Damit wird der Font für alle Steuerlemente verwendet, die keine spezifischen Font
    zugewiesen bekommen haben.

    Eine mögliche Variante (ungetestet):

    Public Sub AddLabel()
      Me.SuspendLayout()
    
      Me.Label1 = New Label()
      With Me.Label1
        .Name = "Label1"
        ' Da wo es hin soll...
        .Location = new Point(10, 20)
        
        ' Schriftart
        .Font = new New System.Drawing.Font("Tahoma", 8.25!, FontStyle.Regular)
        .Text = "Label Text"
      End With
    
      ' Empfohlen: erst anfügen, wenn komplett erstellt
      Me.Controls.Add(Me.Label1)
      Me.ResumeLayout(False)
    End Sub
    
    
    Gruß Elmar

    • Als Antwort markiert Janus_777 Dienstag, 14. September 2010 11:09
    Montag, 13. September 2010 16:35
  • Hallo,

    In meinem UserControl habe ich folgenden Code (vereinfacht):


    Imports System.Drawing Imports System.Windows.Forms Friend Class PP Private WithEvents Label1 As Label Public Sub AddLabel() Me.Label1 = New Label Me.SuspendLayout() Me.Controls.Add(Me.Label1) With Me.Label1 Dim F As Font With .Font F = New Font _ (.FontFamily, .Size, _ FontStyle.Bold, .Unit, _ .GdiCharSet, .GdiVerticalFont) End With Me.Font = F

    Mit dem Setzen von Me.Font übernehmen alle auf Me liegenden
    Labels die Fonteinstellung F. Wenn nur die Font-Eigenschaft von
    Label1 auf "Bold" eingestellt werden soll, dann schreibe einfach
    Label1.Font = New Font(Label1.Font, FontStyle.Bold)

            .Name = "Label1"
            .Text = "Test"
        End With
        Me.ResumeLayout(False)
    End Sub
    End Class

    Die ganze Sache mit der Font soll eigentlich nur bewirken, dass
    die Schriftart übernommen wird, mit dem kleinen Unterschied,
    dass sie Fett dargestellt werden soll. Das merkwürdige ist,
    dass auf diesen Aufruf hin alle Labels Fett dargestellt werden.

    s.oben:
    Wenn Du die Font-Eigenschaft der Form oder sonstigen
    umgebenden Containers änderst, übernehmen alle darauf
    liegenden Labels diese Font-Einstellung, soll nur die Font-
    einstellung eines bestimmten Labels auf Bold geändert
    werden dann, wie schon oben gezeigt, einfach

        Label1.Font = New Font(Label1.Font, FontStyle.Bold)

    Kann mir jemand sagen wo hier der Fehler liegt.

    s.oben.

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    • Als Antwort markiert Janus_777 Dienstag, 14. September 2010 11:09
    Montag, 13. September 2010 16:36
  • Hallo zusammen.

    Wie ich sehe liegt der Teufel hier im Detail. Funltioniert so, dank euch beiden.

    Eine Frage habe ich allerdings noch:

    Wenn ich schreibe:

    With Me.Label1
    
      With .Font
    
      End With
    
    End With
    

    Warum bezieht sich dann der zweite With-Block auf das Formular respektive auf den Container?F ür mich wärs eigentlich logischer, dass sich das auf Me.Label1 bezieht, da es sich ja in diesem With-Block befindet!

    Gruß Janus

    PS: Bin eigentlich auch kein Freund übertriebener With-Schachtelungen, aber da hielt ichs für übersichtlicher.

    PPS: Mental-Notice: Überladungen besser durchforsten.

    PPS: \(^-^)/

    Dienstag, 14. September 2010 11:07
  • Hallo,

    beim obigen Konstrukt würdest Du auf Me.Label1.Font zugreifen.
    Der "Bösewicht" im ersten Posting war

       Me.Font = F
    

    denn mit Me wird die aktuelle Instanz (hier das UserControl) angesprochen
    und nicht das Label im With Block. Richtiger wäre gewesen:

      With Me.Label1
        .Font = New Font(.FontFamily, .Size, FontStyle.Bold, .Unit, .GdiCharSet, .GdiVerticalFont)
      End With
    
    

    Ein ähnliches Beispiel wird gezeigt bei: Gewusst wie: Ausführen von mehreren Aktionen für ein Objekt

    Auf With ... End With sollte man verzichten, wo bereits ein Konstruktor vorhanden ist,
    der die passenden Parameter annimmt => Font hat davon reichlich.
    Nicht nur dass es weniger verwirrend ist, schneller (weniger Code) ist es auch.

    Und für das Initialisieren gibt es zudem (seit VB 2008) eine weitere Variante mit With,
    siehe Objektinitialisierer: Benannte und anonyme Typen
    womit zumindest der syntaktische Ausrutscher vermieden wird.

    Gruß Elmar

    Dienstag, 14. September 2010 13:50
  • Hoi^^

    Na lol, selbst bei euren ersten Antworten ist mir das Me dort zuerst nicht aufgefallen. XD Musste >natürlich< nur .Font heissen. Manchmal sieht man halt den Wald vor lauter Mes nicht. ^^

    Objektinitialisierer ist natürlich ne tolle Sache benutze ich eigentlich auch ganz gern. Bin aber erst kürzlich direkt von VB6 auf VB10 umgestiegen, da Fall ich manchmal noch in alte Muster zurück. ^^

    Danke nochmals..

    Gruß Janus

    Dienstag, 14. September 2010 17:08