Хочу передать переменные (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 - поля объекта? Подумайте.
Комментариев нет:
Отправить комментарий