Entwickler-Ecke

WinForms - Font Werte speichern


Csharp-programmierer - Sa 12.03.16 13:34
Titel: Font Werte speichern
Hallo ihr Experten.
Ich habe eine Form mit 5 Buttons, die alle dem selben Ereignis unterliegen. In diesem Ereignis wird ein FontDialog aufgerufen und der Button, der gedrückt wurde, bekommt als Text die ausgewählte Schriftart:


C#-Quelltext
1:
2:
3:
4:
5:
if (fontDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    Button b = sender as Button;
                    b.Text = fontDialog1.Font.Name.ToString();
                }


Gespeichert wird das ganze so:

C#-Quelltext
1:
2:
3:
4:
if (this.button21.Text != "")
                    f.Font1 = new Font(this.button21.Text, 11.0f);
                else
                    f.Font1 = new Font("- - -"11.0f);



C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
[XmlIgnore]
        public Font Font1 { get; set; }
        [XmlElement("Font1")]
        public string _font1
        {
            get
            {
                if (Font1 == null)
                    return null;

                var converter = TypeDescriptor.GetConverter(typeof(Font));
                return converter.ConvertToString(Font1);
            }
            set
            {
                var converter = TypeDescriptor.GetConverter(typeof(Font));
                Font1 = (Font)converter.ConvertFromString(value);
            }
        }


Das klappt. Wenn aber ein Button keinen Text hat, wird Microsoft Sans Serif als Schriftart angezeigt (wahrscheinlich wegen - - -). Aber wie kann ich es machen, dass der leere Button beim Laden leer bleibt?


Ralf Jansen - Sa 12.03.16 14:34

Zitat:

C#-Quelltext
1:
f.Font1 = new Font("- - -"11.0f);                    


Wenn du keinen Font hast setzt doch Font1 einfach auf null?


Csharp-programmierer - Sa 12.03.16 14:51

Das habe ich versuche. Doch beim Laden kommt dann der Fehler: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

Laden:

C#-Quelltext
1:
this.button1.Text = toolbox.Font1.Name;                    


Ralf Jansen - Sa 12.03.16 15:04

Zitat:
Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt


Das "wo" sollte dir helfen das "warum" zu bestimmen.


Csharp-programmierer - Sa 12.03.16 15:12

Das verstehe ich jetzt nicht. Oder soll ich das catch { } leer lassenP


Ralf Jansen - Sa 12.03.16 15:19

Zitat:
Das verstehe ich jetzt nicht. Oder soll ich das catch { } leer lassenP


Das verstehe wiederum ich nicht ;) Was für ein catch?

Wenn du eine Fehlermeldung bekommst bekommst du auch gesagt wo die aufgetreten ist. Erst recht wenn dir das beim debuggen passiert. Wenn du dir die konkrete Codestelle dann ansiehst sollte sich klären lassen warum die Fehlermeldung auftritt.


Csharp-programmierer - Sa 12.03.16 15:22

Der Code kommt mir an der Stelle um die Ohren geflogen, wo der Button den Text der Font annehmen soll, der Button beim Speichern aber leer war :-)


Ralf Jansen - Sa 12.03.16 16:07

Das ist dann offensichtlich Code der nichts mit dem zu tun hat denn du hier zeigst.


Th69 - Sa 12.03.16 17:17

user profile iconCsharp-programmierer hat folgendes geschrieben Zum zitierten Posting springen:
Laden:

C#-Quelltext
1:
this.button1.Text = toolbox.Font1.Name;                    

Ist doch logisch, daß dann eine NullReferenceException kommt, wenn Font1 null ist (denn ein nicht vorhandenes Objekt hat keinen Namen...).

Wenn du schon C#6 (d.h. VS 2015) benutzt, dann kannst du z.B. folgendes schreiben:

C#-Quelltext
1:
this.button1.Text = toolbox.Font1?.Name; // beachte den ?.-Operator                    


Ansonsten einfach selber auf Null prüfen:

C#-Quelltext
1:
this.button1.Text = (toolbox.Font1 != null)? toolbox.Font1.Name : "---";                    


Diese Grundlagen solltest du aber langsam beherrschen.

Edit: Da user profile iconChristian S. mir diese Woche diesen eleganten Code [http://www.entwickler-ecke.de/viewtopic.php?p=699023#699023] gezeigt hat, geht auch (mit C#6) folgendes

C#-Quelltext
1:
this.button1.Text = toolbox.Font1?.Name ?? "---";                    


Csharp-programmierer - Sa 12.03.16 23:50

Vielen Dank. Jetzt funktioniert es :)