Передача переменных и использования их (C#)

285
03 декабря 2017, 10:42

Хочу передать переменные (Swt, Srt) из формы Settings в Main, и использовать их. Проблема в том что при запуске программы WorkDelay и RecreationDelay создаются пустыми и не изменяются в дальнейшим.

public static int Swt, Srt;
public TimeSpan WorkDelay = TimeSpan.FromMinutes(Swt); //Work time in minutes
public TimeSpan WorkDelay = TimeSpan.FromMinutes(Swt); //Work time in minutes

Форма Main

public partial class Main : Form
{
    private DateTime _globalTimeDate;
    public static int Swt, Srt;
    private DateTime _workExpiry;
    public TimeSpan WorkDelay = TimeSpan.FromMinutes(Swt); //Work time in minutes
    private DateTime _recreationExpiry;
    public TimeSpan RecreationDelay = TimeSpan.FromMinutes(Srt); // Recreation time in minutes
    public Main()
    {
        InitializeComponent();
        stop.Enabled = false;
        global.Text = @"Stoped";
        work.Text = @"Stoped";
        recreation.Text = @"Stoped";
    }
    private void globalTimer_Tick(object sender, EventArgs e)
    {
        long tick = DateTime.Now.Ticks - _globalTimeDate.Ticks;
        DateTime stopWatch = new DateTime();
        stopWatch = stopWatch.AddTicks(tick);
        global.Text = $@"{stopWatch:HH:mm:ss}";
    }
    private void workTimer_Tick(object sender, EventArgs e)
    {
        TimeSpan remaining = _workExpiry - DateTime.Now;
        work.Text = remaining.ToString("hh\\:mm\\:ss");
        if (work.Text == @"00:00:00")
        {
            workTimer.Stop();
            work.Text = @"Stoped, start recreation";
            _recreationExpiry = DateTime.Now.Add(RecreationDelay);
            recreationTimer.Start();
        }
    }
    private void recreationTimer_Tick(object sender, EventArgs e)
    {
        TimeSpan remaining = _recreationExpiry - DateTime.Now;
        recreation.Text = remaining.ToString("hh\\:mm\\:ss");
        if (recreation.Text == @"00:00:00")
        {
            recreationTimer.Stop();
            recreation.Text = @"Stoped, strart work";
            _workExpiry = DateTime.Now.Add(WorkDelay);
            workTimer.Start();
        }
    }
    private void start_Click(object sender, EventArgs e)
    {
        _globalTimeDate = DateTime.Now;
        _workExpiry = DateTime.Now.Add(WorkDelay);
        globalTimer.Start();
        workTimer.Start();
        start.Enabled = false;
        stop.Enabled = true;
    }
    private void stop_Click(object sender, EventArgs e)
    {
        globalTimer.Stop();
        workTimer.Stop();
        recreationTimer.Stop();
        work.Text = @"Stoped";
        recreation.Text = @"Stoped";
        stop.Enabled = false;
        start.Enabled = true;
    }
    private void exitToolStripMenuItem_Click(object sender, EventArgs e)
    {
        globalTimer.Stop();
        workTimer.Stop();
        recreationTimer.Stop();
        Application.Exit();
    }
    private void settingsToolStripMenuItem_Click(object sender, EventArgs e)
    {
        Settings settings = new Settings();
        settings.Show();
    }
}
}

Форма Settings

public partial class Settings : Form
{
    public Settings()
    {
        InitializeComponent();
    }
    private void buttonSet_Click(object sender, EventArgs e)
    {
        try
        {
            Main.Swt = (int) Convert.ToDouble(textBoxW.Text.Replace(',', '.'));
            Main.Srt = (int) Convert.ToDouble(textBoxR.Text.Replace(',', '.'));
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        Close();
    }
    private void buttonReset_Click(object sender, EventArgs e)
    {
        Main.Swt = 0;
        Main.Srt = 0;
    }
}
}
Answer 1

Сделайте поля ...Delay свойствами и вычисляйте их значения при обращении к этим свойствам. Это решит вопрос - "не изменяются в дальнейшем".

public TimeSpan WorkDelay { get { return TimeSpan.FromMinutes(Swt); } }

В C# 6 (экономим на чернилах для фигурных скобок):

public TimeSpan WorkDelay => TimeSpan.FromMinutes(Swt);

По поводу "создаются пустыми". Это происходит потому, что начальные значения Swt и Srt - нули. Присваивайте им какие-нибудь ненулевые значения:

public static int Swt = 5;
public static int Srt = 5;

P.S.

Вопрос: почему Swt и Srt - статические, а WorkDelay и RecreationDelay - поля объекта? Подумайте.

READ ALSO
Синхронизация потоков WPF

Синхронизация потоков WPF

Создаю я второй поток для расчетов параллельных, расчеты в циклеВ итоге, чтобы после итерации добавить данные в таблицу основного потока,...

323
Эхо клиент сервер

Эхо клиент сервер

Здравствуйте, реализую клиент-сервер по типу-эхо: клиент каждые 10 секунд шлет пакет серверу, а тот отвечаетЕсли нужно отрубить клиента, то все...

257
Как получить доступ к классу настроек приложения из библиотеки dll?

Как получить доступ к классу настроек приложения из библиотеки dll?

Имеется приложение и подключенная к нему библиотекаНеобходимо из библиотеки изменить некоторые настройки (user settings)

209
Неправильное отображение Версии Windows

Неправильное отображение Версии Windows

Всем приветРаботаю с Visual Studio 2012 и на Windows 10

239