Состояние батареи

altОбладателям ноутбуков приходиться заботиться об уровне заряда батареи, в том случае если питание от сети невозможно, к примеру, в походе за город и в других подобных случаях.

В этой ситуации возникает потребность в программах, которые будут информировать пользователя о состоянии батареи. В большинстве ноутбуков похожие программы установлены по умолчанию вместе с операционной системой, если же предустановленной ОС нет, можно скачать программку с сети, но нам это не интересно и данный вариант просто не подходит — будем создавать ее сами. Хочу заметить, что создаваемая нами программа будет работать не только на ноутбуках, но и так же, на стационарных машинах (читай персональных/домашних компьютерах). Инструментарий для создания приложения, стандартный: любая версия Дельфи (выше 6-ой).

Задача состоит в следующем — сделать программу наиболее информативной, для этого она должна «уметь» выполнять следующие функции:

1. Определение текущего подключения (от батареи/от сети);
2. Уровень заряда батареи;
3. Время работы от батареи;
4. Максимальное время батареи;

Для первой версии программы, этого будет вполне достаточно. Далее приступим к реализации нашей задумки — все значения, которые необходимо получить, можно выводить, при помощи компонентов Label, Memo, SrtingGrid, так и при помощи ListBox или других компонентов, которые позволяют работать со строковыми значениями. Последний и используем.

var
SystemPowerStatus: TSystemPowerStatus;
str: string;
begin
GetSystemPowerStatus(SystemPowerStatus);
Первым делом определим, текущее подключение. Здесь возможны три варианта: от сети, от батареи, неизвестно (последнее вариант возможен в случае какой-либо ошибки).

with SystemPowerStatus do begin
case ACLineStatus of
0: str := ‘от батареи’;
1: str := ‘от сети’;
else str := ‘не известно’;
end;
ListBox1.Items.Add(‘Источник питания: ‘+ str);
Приступим к получению информации об уровне заряда батерии, с помощью некоторых значений флага «BatteryFlag». Самым полезным будет знать уровень в процентном соотношении и здесь на выручку прийдет функция «BatteryLifePercent», если вы работаете от сети, то параметр будет равен «255», если от батареи, то параметр будет равен уровню заряда батареи.

case BatteryFlag of
0: str:= ‘нормальный’;
1: str:= ‘высокий’;
2: str:= ‘низкий’;
4: str:= ‘критический’;
8: str:= ‘заряжается’;
128: str:= ‘батарея отсутствует’;
else str:= ‘неизвестно’;
end;
ListBox1.Items.Add(Format(‘Уровень заряда: %d%% (%s)’, [BatteryLifePercent,str]));
Обратите внимание на форматирование вывода строки, в предыдущих статьях я отдельно рассматривал данную функцию — «Format», здесь опишу кратко, для того чтобы вывести данные используем константу и переменную:

«BatteryLifePercent, str». Чтобы вывести знак «%», нужно всего лишь его продублировать, т.к. данные одиночный символ говорит о том, что в данном месте будет вывод значений, описанных в массиве, при этом указав литеры их типа.

Переходим к определению времени работы от батареи, получаемый параметр у нас будет в секундах, поэтому его необходимо преобразовать путем деления на костанту, которая выдает число секунд в дне (Пример: 24 * 60 * 60 = 86400). Если вас это не устраиват, есть другие похожие команды:

DaysInAMonth — выдает число дней в указаном году и месяце;
DaysInAYear — выдает число дней в году;
MinsPerDay — выдает число минут в дне;
MonthDays — выдает число дней в месяце;

Об этих константах более подробно читайте здесь: SecsPerDay

if Integer(BatteryLifeTime) < 0 then
str:=’неизвестно’
else
str:=TimeToStr(BatteryLifeTime / SecsPerDay);
ListBox1.Items.Add(‘Время работы от батереи: ‘ + str);
Идем дальше, к заключительному этапу. Определяем максимальное время работы батареи, оно, как и предыдущее значение определяется в секундах. Имя функции, с помощью которой будем получать необходимое значение, имеет следующее имя: «BatteryFullLifeTime».

if Integer(BatteryFullLifeTime) = -1 then
str:= ‘неизвестно’
else
str:= TimeToStr(BatteryFullLifeTime / SecsPerDay);
ListBox1.Items.Add(‘Максимальное время работы: ‘ + str);
end;
end;
Данную функцию получения можно расположить в таймере, но я советую вам, использовать следующую процедуру:

procedure PowerStatusChange(var Message: TMessage); message WM_POWERBROADCAST;
При получении программой сообщения «WM_POWERBROADCAST», данные должны будут обновиться. Надобность в таймере сразу отпадает.

Понравилась статья? Поделиться с друзьями: