Parametry okna z pliku

0

"Napisz aplikację okienkową,w której tytuł i rozmiary okna będą wczytywane z pliku tekstowego o nazwie przekazanej jako argument wywołania. W przypadku niepodania nazwy pliku bądź wykrycia nieprawidłowego formatu danych powinny zostać zastosowane wartości domyślne"

Cześć. Jak oceniacie moje rozwiązanie? Czy dobrze używam try catch i czy to nic złego że konwertuje ewentualny null do int?
Mam do rozwiązania podobne zadanie, w którym z pliku wczytywana jest struktura menu jakie ma być w tym oknie i nie wiem jak się za to zabrać. Macie jakieś pomysły?

public class MyForm : Form
    {
        public MyForm(string tytul,int szerokosc,int wysokosc)
        {
            Width = szerokosc;
            Height = wysokosc;
            Text = tytul;

            MainMenu mm = new MainMenu();

            MenuItem m1 = new MenuItem();

            MenuItem m11 = new MenuItem();
            MenuItem m12 = new MenuItem();
            MenuItem m13 = new MenuItem();


            m1.Text = "Plik";
            m11.Text = "Nowy";
            m12.Text = "Otwórz";
            m13.Text = "Opcje";

            mm.MenuItems.Add(m1);

            m1.MenuItems.Add(m11);
            m1.MenuItems.Add(m12);
            m1.MenuItems.Add(m13);

            Menu = mm;
        }
    }

    class Program
    {
        public static void Main(string[] args)
        {
            string tytul = "domyślny tytuł";
            int szerokosc = 640;
            int wysokosc = 480;

            if(args.Length < 1)
            {
                Application.Run(new MyForm(tytul, szerokosc, wysokosc));
            }
            else
            {
                string plik = args[0];
                StreamReader sr;

                try
                {
                    sr = new StreamReader(plik);
                }
                catch(Exception)
                {
                    Console.WriteLine("nie udalo sie otworzyc pliku");
                    return;
                    
                }

                tytul = sr.ReadLine();
                string szerokosctekst = sr.ReadLine();// jeśli koniec pliku, zwraca null
                string wysokosctekst = sr.ReadLine();

                sr.Close();
                try
                {
                        szerokosc = Convert.ToInt32(szerokosctekst);//Convert.ToInt32(null) == 0
                        wysokosc = Convert.ToInt32(wysokosctekst);
                }
                catch (Exception)
                {
                        szerokosc = 640;
                        wysokosc = 480;
                }

                if((szerokosc <= 0)||(wysokosc <= 0))
                {
                    szerokosc = 640;
                    wysokosc = 480;
                }
                
                Application.Run(new MyForm(tytul, szerokosc, wysokosc));

            }
        }
    }
1

Możesz pokusić się o stworzenie takiego małego menadżera rozmiaru okna:

using System;
using System.Text;
using System.Linq;
using System.Collections.Generic;
using System.Windows.Forms;
using System.IO;
using System.Xml.Serialization;

public class FormSize
{
    private int height;
    public int Height
    {
        get { return Math.Max(this.height, this.MinHeight); }
        set { this.height = value; }
    }

    private int width;
    public int Width
    {
        get { return Math.Max(this.width, this.MinWidth); }
        set { this.width = value; }
    }

    [XmlIgnore]
    public int MinHeight { get; private set; }

    [XmlIgnore]
    public int MinWidth { get; private set; }

    public FormSize()
    {
        this.MinHeight = this.Height = 480;
        this.MinWidth = this.Width = 640;
    }
}

public class FormSizeManager
{
    public FormSize Size { get; private set; }

    public FormSizeManager()
    {
        this.Size = new FormSize();
    }

    public void Save(string destinationPath)
    {
        var serial = new XmlSerializer(typeof(FormSize));
        using (var stream = new StreamWriter(destinationPath))
        {
            serial.Serialize(stream, this.Size);
        }
    }

    public void Load(string sourcePath)
    {
        var deserial = new XmlSerializer(typeof(FormSize));
        using (var stream = new StreamReader(sourcePath))
        {
            var data = deserial.Deserialize(stream) as FormSize;
            this.Size.Height = data.Height;
            this.Size.Width = data.Width;
        }
    }
}

class Program
{
    public static void Main(string[] args)
    {
        var form = new Form();
        var sizemanager = new FormSizeManager();
        try
        {
            sizemanager.Load(args[0]);
            form.Height = sizemanager.Size.Height;
            form.Width = sizemanager.Size.Width;
            form.FormClosing += (sender, e) =>
            {
                sizemanager.Size.Height = form.Height;
                sizemanager.Size.Width = form.Width;
                sizemanager.Save(args[0]);
            };
        }
        catch (Exception)
        {
            Console.WriteLine("File reading error! Setting default form size.");
            form.Height = sizemanager.Size.MinHeight;
            form.Width = sizemanager.Size.MinWidth;
        }
        finally
        {
            form.ShowDialog();
        }
    }
}

Spróbuj zamienić np args[0] na args[1] żeby program wyrzucił wyjątek to zobaczysz jak to działa. Zanim uruchomisz utwórz taki plik np. w katalogu debugowania:

<?xml version="1.0" encoding="utf-8"?>
<FormSize xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Height>480</Height>
  <Width>640</Width>
</FormSize>

Ścieżkę do niego podajesz jako args[0].

1 użytkowników online, w tym zalogowanych: 0, gości: 1