Delphi. Учимся на примерах

Парижский Сергей Михайлович

Глава 11

Информация о памяти

 

 

Постановка задачи

Разработать программу, которая отображает информацию о физической, страничной и виртуальной памяти.

 

Разработка формы

Создайте новый проект Delphi и присвойте свойству Caption формы значение Memory Info.

Для вывода различной информации о памяти мы будем использовать компонент Label категории Standard. Разместите на форме один над другим семь таких компонентов, присвоив свойству Left каждого из них значение 230, а свойству Caption — значение 0.

Слева от этого столбца меток разместите в столбец еще семь компонентов Label, которые будут пояснять числа, отображаемые предыдущими семью метками. Присвойте их свойству Caption следующие значения (сверху вниз): Загруженность памяти:, Всего физической:, Свободно физической:, Всего страничной:. Свободно страничной:, Всего swap: И Свободно swap:.

Еще одним способом отображения загруженности физической памяти будет компонент Gauge категории Samples. Разместите этот компонент вдоль правого края формы и измените значение его свойства Kind на gkVerticalBar, чтобы изменения свойства Gauge.Progress отображались вдоль вертикальной шкалы.

Теперь обеспечим настройку автообновления данных о памяти. Для этого нам понадобится компонент Timer категории System. Пользователь будет задавать период обновления информация о памяти, с помощью компонента SpinEdit категории Samples. В его свойствах следует изменить значение MaxValue на 60, a MinValue — на 1. Это даст возможность пользователю задавать диапазон обновления от 1 до 60 секунд.

Слева от компонента SpinEdit разместите поясняющую метку с текстом Частота обновления:, а справа — метку с текстом секунд.

В правом нижнем углу формы разместите кнопку (компонент Button категории Standard) и присвойте ее свойству Caption значение Установить. По нажатию этой кнопки будет устанавливаться указанная в компоненте SpinEdit частота обновления информации.

Полученная форма должна соответствовать рис. 11.1.

Рис. 11.1. Форма для отображения информации о памяти компьютера

 

Разработка программного кода

В программе будет только две процедуры: первая — обработчик события Timer1.OnTimer, которая определяет и отображает информацию о памяти; вторая — обработчик события OnClick кнопки Установить для задания частоты обновления информации.

Создадим вначале главную часть программы — обработчик события Timer1.OnTimer:

procedure TForm1.Timer1Timer(Sender: TObject);

var

 mem: TMemoryStatus; //хранит всю информацию о памяти

begin

 mem.dwLength:= SizeOf(mem); //размер памяти

 GlobalMemoryStatus(mem); //узнаем всю информацию о памяти

 //выводим информацию в соответствующие метки

В with mem do begin

  // Загруженность памяти

В  Label1.Caption:= IntToStr(dwMemoryLoad) + ' %';

  Label2.Caption:= IntToStr((dwTotalPhys) div 1024) + 'Кбайт' ; // Всего физической

   Label3.Caption:= IntToStr((dwAvailPhys) div 1024) + 'Кбайт' ; // Свободно физической

   Label4.Caption:= IntToStr((dwTotalPageFile) div 1024) + 'Кбайт' ; // Всего страничной

   Label5.Caption:= IntToStr((dwAvailPageFile) div 1024) + 'Кбайт'; // Свободно страничной

  Label6.Caption:= IntToStr((dwTotalVirtual) div 1024) + 'Кбайт' ; // Всего swap

   Label7.Caption:= IntToStr((dwAvailVirtual) div 1024) + ' Кбайт' ; // Свободно swap

  Gauge1.MaxValue:= dwTotalPhys; //определяем максимум

  //отображаем процент загруженности памяти

В В  Gauge1.Progress:= dwTotalPhys-dwAvailPhys;

В end;

end;

Сначала мы объявляем переменную mem, которая служит для хранения информации о памяти, полученной с помощью функции GlobalMemoryStatus. После того как мы получили всю необходимую информацию о памяти, делим все значения на 1024, чтобы перевести данные в килобайты. Затем выводим информацию с помощью соответствующих меток, а также изменяем текущую позицию для компонента Gauge.

Осталось только реализовать изменение частоты обновления информации, для чего достаточно изменять значение свойства Timer1.Interval. Обработаем нажатие кнопки Установить:

procedure TForm1.Button1Click(Sender: TObject);

begin

 //установка интервала работы таймера

В  Timer1.Interval:= SpinEdit1.Value*1000;

end;

Поскольку интервал для таймера задается в мс, а в SpinEdit мы вводим значение в секундах, то мы должны умножать значение свойства SpinEdit.Value на 1000.

Программа в действии показана на рис. 11.2.

Рис. 11.2. Программа отображения информации о памяти в действии

 

Полный исходный код модуля

Полный исходный код модуля программы отображения информации о памяти представлен в листинге 11.1.

Листинг 11.1. Модуль программы Memory info

unit Unit1

interface

uses

В Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Gauges, ExtCtrls, Spin;

type TForm1 = class(TForm)

В Label1: TLabel;

В Label2: TLabel;

В Label3: TLabel;

В Label4: TLabel;

В Label5: TLabel;

В Label6: TLabel;

В Label7: TLabel;

В Gauge1: TGauge;

В Timer1: TTimer;

В Label8: TLabel;

В Label9: TLabel;

В Label10: TLabel;

В Label11: TLabel;

В Label12: TLabel;

В Label13: TLabel;

В Label14: TLabel;

В SpinEdit1: TSpinEdit;

В Label15: TLabel;

В Label16: TLabel;

В Button1: TButton;

В procedure Timer1Timer(Sender: TObject);

В procedure Button1Click(Sender: TObject);

private

В { Private declarations }

public

В { Public declarations }

end;

var

В Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);

var

 mem: TMemoryStatus; //хранит всю информацию о памяти

begin

 mem.dwLength:= SizeOf(mem); //размер памяти

 GlobalMemoryStatus(mem); //узнаем всю информацию о памяти

 //выводим информацию в соответствующие метки

В with mem do begin

  // Загруженность памяти

В  Label1.Caption:= IntToStr(dwMemoryLoad) + ' %';

  Label2.Caption:= IntToStr((dwTotalPhys) div 1024) + 'Кбайт'; // Всего физической

  Label3.Caption:= IntToStr((dwAvailPhys) div 1024) + 'Кбайт'; // Свободно физической

  Label4.Caption:= IntToStr((dwTotalPageFile) div 1024) + 'Кбайт'; // Всего страничной

  Label5.Caption:= IntToStr((dwAvailPageFile) div 1024) + 'Кбайт'; // Свободно страничной

  Label6.Caption:= IntToStr((dwTotalVirtual) div 1024) + 'Кбайт'; // Всего swap

  Label7.Caption:= IntToStr((dwAvailVirtual) div 1024) + ' Кбайт'; // Свободно swap

  Gauge1.MaxValue:= dwTotalPhys; //определяем максимум

  //отображаем процент загруженности памяти

В В Gauge1.Progress:= dwTotalPhys-dwAvailPhys;

В end;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

 //установка интервала работы таймера

В Timer1.Interval:= SpinEdit1.Value*1000;

end;

end.

⊚ Р’СЃРµ файлы проекта Рё исполняемый файл рассмотренной программы находятся РЅР° прилагаемом Рє РєРЅРёРіРµ компакт-РґРёСЃРєРµ РІ папке Chapter_11.