unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    lvwPowerStatus: TListView;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    procedure AddParam( name, value: String );
    procedure LoadPowerStatus();
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//Добавляет название и значение параметра в список
procedure TForm1.AddParam( name, value: String );
var
  item: TListItem;
begin
  item := lvwPowerStatus.Items.Add();
  item.Caption := name;
  item.SubItems.Insert(0, value);
end;

procedure TForm1.LoadPowerStatus();
var
  batFlags: String;
  status: TSystemPowerStatus;
begin
  lvwPowerStatus.Clear;
  //Получаем информацию о состоянии питания
  ZeroMemory(Addr(status), SizeOf(status));
  GetSystemPowerStatus(status);
  //Заполняем список информации состоянии питания
  //..подключение к сети
  case status.ACLineStatus of
    0: AddParam('Подключение в сети', 'Отключен');
    1: AddParam('Подключение в сети', 'Подключен');
  else AddParam('Подключение в сети', 'Неизвестно');
  end;
  //..заряд батареи (битовая маска)
  if status.BatteryFlag and 1 <> 0 then batFlags := 'Высокий ';
  if status.BatteryFlag and 2 <> 0 then batFlags := batFlags + 'Низкий ';
  if status.BatteryFlag and 4 <> 0 then batFlags := batFlags + 'Критический ';
  if status.BatteryFlag and 8 <> 0 then batFlags := batFlags + '(Идет зарядка)';
  if status.BatteryFlag and 128 <> 0 then batFlags := batFlags + 'Батарея не установлена';
  if status.BatteryFlag = 255 then batFlags := batFlags + 'Неизвестно';
  AddParam('Заряд батареи', batFlags);

  //..численные характеристики батареи
  if status.BatteryLifePercent <> 255 then
    AddParam('Остаток заряда батареи',
             IntToStr(Integer(status.BatteryLifePercent)))
  else
    AddParam('Остаток заряда батареи', 'Неизвестно');

  if status.BatteryLifeTime <> Cardinal(-1) then
    AddParam('Время работы батареи (остаток, сек.)',
             IntToStr(Integer(status.BatteryLifeTime)))
  else
    AddParam('Время работы батареи (остаток, сек.)', 'Неизвестно');

  if status.BatteryFullLifeTime <> Cardinal(-1) then
    AddParam('Полное время работы батареи, сек.',
             IntToStr(Integer(status.BatteryFullLifeTime)))
  else
    AddParam('Полное время работы батареи, сек.', 'Неизвестно');
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  LoadPowerStatus();
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  LoadPowerStatus();
end;

end.
