Benutzer mit den meisten Antworten
"New Font" für ein Label setzt neue Schriftart für alle Labels

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
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):
Gruß ElmarPublic 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
- Als Antwort markiert Janus_777 Dienstag, 14. September 2010 11:09
-
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 = FMit 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, einfachLabel1.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
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):
Gruß ElmarPublic 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
- Als Antwort markiert Janus_777 Dienstag, 14. September 2010 11:09
-
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 = FMit 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, einfachLabel1.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
-
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: \(^-^)/
-
Hallo,
beim obigen Konstrukt würdest Du auf Me.Label1.Font zugreifen.
Der "Bösewicht" im ersten Posting warMe.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
-
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