Страницы

Поиск по вопросам

пятница, 12 июля 2019 г.

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

Хочу передать переменные (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; } } }


Ответ

Сделайте поля ...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 - поля объекта? Подумайте.

Комментариев нет:

Отправить комментарий