Обратный отсчёт до полуночи

"My cat, as it turns out, is an excellent debugger, and she has helped me solve a number of nasty bugs when I talked to her about them."
John Robbins, Debugging Applications, Microsoft Press, 2000
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */

Обратный отсчёт до полуночи

Статья-оригинал

Одна из целей, которые я ставлю перед собой в этом цикле статей — это делать приложение в день публикации. Это не оставляет мне выбора, я не уверен, что буду успевать, но это только добавляет веселья. У меня есть жизнь, а между семьёй, друзьями, карьерой, хобби и мечтами, остаётся не так уж и много времени, как мне бы иногда хотелось. Так что разрабатывая по одному приложению в день, я заодно выясню, сколько у меня обычно остаётся свободного времени.

Сколько минут до полуночи


Простое, но полезное приложение. Сначала я полагал, что буду отображать данные в формате, например, «2 часа 45 минут 38 секунд», но решил, что это слишком уж просто, поэтому я буду использовать индикаторы прогресса, потому что они добавят приложению, ну, скажем, немного «веса».

Но даже после использования индикаторов прогресса, приложение выглядело слишком стерильным. Воспользовавшись одной из палитр с сайта http://www.colourlovers.com/, я немного раскрасил приложение.

Очень быстро я понял, что есть небольшая проблема. С моей точки зрения, возможно субъективной, индикатор прогресса был неправильным. progressBarHours.Value = timeSpan.Hours; должен был быть
progressBarHours.Value = 24 — timeSpan.Hours;. Как только я внес данное изменение, всё сразу встало на свои места.

Верхний индикатор меня не радовал. Он должен был показывать общее время до конца дня, но не хватало места ещё для одного заголовка. Есть поговорка «лучшее — враг хорошего». Я её понимаю так, что если всегда пытаться стремиться достичь идеала, из этого никогда не выйдет ничего хорошего. В итоге я разбил форму на логические секции путём выставления разного цвета фона у нижних панелей.

Всё, что оставалось сделать — это общее количество оставшихся минут. В зависимости от используемых вычислений, иногда получалось нечто типа "X.666666666 of 1440 total minutes left". К счастью есть простое решение — пользовательское форматирование числа: timeSpan.TotalMinutes.ToString("#.0").

private void timer_Tick(object sender, EventArgs e)
{
TimeSpan timeSpan = DateTime.Now.Date.AddDays(1) - DateTime.Now;
labelHours.Text = string.Format("{0} of 24 hours left", timeSpan.Hours);
labelMinutes.Text = string.Format("{0} of 60 minutes left", timeSpan.Minutes);
labelSeconds.Text = string.Format("{0} of 60 seconds left", timeSpan.Seconds);

labelTotalMinutes.Text = string.Format("{0} of 1440 total minutes left",
timeSpan.TotalMinutes.ToString("#.0"));
labelTotalSeconds.Text = string.Format("{0} of 86400 total seconds left",
timeSpan.TotalSeconds);

progressBarTotal.Value = 86400 - (int) timeSpan.TotalSeconds;

progressBarHours.Value = 24 - timeSpan.Hours;
progressBarMinutes.Value = 60 - timeSpan.Minutes;
progressBarSeconds.Value = 60 - timeSpan.Seconds;

progressBarTotalMinutes.Value = 1440 - (int) timeSpan.TotalMinutes;
progressBarTotalSeconds.Value = 86400 - (int) timeSpan.TotalSeconds;
}


Исходный код C#.

Перевод: Андрей Коновалов