Постановка задачи
Разработать программу, которая отображает информацию о физической, страничной и виртуальной памяти.
Разработка формы
Создайте новый проект 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.