Текст книги "Программирование в Delphi. Трюки и эффекты"
Автор книги: Александр Чиртик
Жанр: Программирование, Компьютеры
сообщить о неприемлемом содержимом
Текущая страница: 13 (всего у книги 24 страниц)
Работа с растровыми изображениями
Вы можете использовать точечный рисунок, чтобы запомнить изображение, а потом сохранить его в памяти, отобразить в другом месте окна вашего приложения или вообще в другом окне.
В некоторых случаях вам может понадобиться, чтобы ваше приложение запоминало и хранило изображение только временно, например, когда вам необходимо масштабировать его в каком-нибудь приложении для рисования. Для этого необходимо временно запомнить нормальное представление изображения и показать измененное. После того как пользователь опять выберет нормальное представление изображения, приложение будет обязано заменить масштабированное изображение копией нормального, которое временно сохранено.
Чтобы временно запомнить изображение и создать контекст устройства памяти, совместимый с контекстом устройства экрана текущего окна, приложению необходимо вызвать функцию CreateCompatibleDC. После этого вам нужно создать точечный рисунок с соответствующими атрибутами посредством вызова функции CreateCompatibleBitmap, а затем выбрать его в контекст устройства памяти уже известным вам образом.
После того как будет создан совместимый контекст устройства и выбран соответствующий точечный рисунок, вы сможете запоминать изображение. Функция BitBlt получает изображение, а также копирует данные из исходного точечного рисунка и помещает их в точечный рисунок приемника. Однако два параметра функции не являются описателями точечных рисунков. Вместо этого функция получает два описателя контекстов устройств и копирует растровые данные из точечного рисунка, выбранного в исходном контексте устройства, в точечный рисунок, выбранный в целевом контексте устройства. В этом случае целевой контекст является и совместимым контекстом устройства. Когда копирование растровых данных завершается, изображение помещается в память. Чтобы восстановить изображение, нужно повторно вызвать функцию BitBlt, указав в качестве источника совместимый контекст устройства, а в качестве приемника контекст устройства экрана (принтера и т. д.).
Следующий пример демонстрирует способ получения, а также масштабирования изображения всего Рабочего стола. В данном приложении будут обрабатываться три события формы: OnCreate, OnPaint, OnClose, а также одно событие кнопки OnClick.
Рассмотрим исходный код обработчика события OnCreate (листинг 6.5).
Листинг 6.5. Обработчик события OnCreate
procedure TfmCaptureImage.FormCreate(Sender: TObject);
begin
//создаем контекст устройства экрана
hdcScreen:= CreateDC('DISPLAY', nil, nil, nil);
//создаем совместимый контекст устройства памяти
hdcCompatible:= CreateCompatibleDC(hdcScreen);
bmpWidth:= GetDeviceCaps(hdcScreen, HORZRES);
bmpHeight:= GetDeviceCaps(hdcScreen, VERTRES);
//создаем соместимый точечный рисунок для hdcScreen
hbmScreen:= CreateCompatibleBitmap(hdcScreen, bmpWidth, bmpHeight);
if hbmScreen <> 0 then
hOldBitmap:= SelectObject(hdcCompatible, hbmScreen)
else
hOldBitmap:= 0;
Captured:= False;
end;
Здесь происходит создание контекста устройства Рабочего стола посредством вызова функции CreateDC:
hdcScreen:= CreateDC('DISPLAY', nil, nil, nil);
После этого создается совместимый контекст устройства памяти для только что основанного контекста, а затем создается совместимый точечный рисунок:
bmpWidth:= GetDeviceCaps(hdcScreen, HORZRES);
bmpHeight:= GetDeviceCaps(hdcScreen, VERTRES);
//создаем соместимый точечный рисунок для hdcScreen
hbmScreen:= CreateCompatibleBitmap(hdcScreen, bmpWidth, bmpHeight);
Если удалось создать совместимый точечный рисунок, то необходимо выбрать его в совместимом контексте устройства памяти. Также нужно ввести флаг, который указывает, сохранено ли в данный момент изображение. Все полученные данные сохраняются в полях формы, объявленных при описании ее класса.
hdcScreen, hdcCompatible: HDC;
hbmScreen, hOldBitmap: HBITMAP;
bmpWidth, bmpHeight: Integer;
Captured: LongBool;
Рассмотрим исходный код обработчика события OnPaint (листинг 6.6).
Листинг 6.6. Обработчик события OnPaint
procedure TfmCaptureImage.FormPaint(Sender: TObject);
var
hCurDC: HDC;
begin
if Captured then
begin
hCurDC:= GetDC(Handle);
StretchBlt(hCurDC, 0, 0, Width, Height, hdcCompatible,
0, 0, bmpWidth, bmpHeight, SRCCOPY);
ReleaseDC(Handle, hCurDC);
end;
end;
Здесь проверяется, есть ли необходимое для отображения изображение и, если есть, производится получение контекста устройства окна и масштабируется на него полученное изображение с помощью функции StretchBlt.
Перед закрытием формы нужно освободить занятые ресурсы системы, для чего обрабатывается событие OnClose, исходный код обработчика которого приведен ниже (листинг 6.7).
Листинг 6.7. Обработчик события OnClose
procedure TfmCaptureImage.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
//восстанавливаем точечный рисунок по умолчанию
if hOldBitmap <> 0 then
SelectObject(hdcCompatible, hOldBitmap);
//удаляем совместимый точечный рисунок
if hbmScreen <> 0 then
DeleteObject(hbmScreen);
//удаляем совместимый контекст устройства памяти
if hdcCompatible <> 0 then
DeleteDC(hdcCompatible);
//удаляем контекст устройства экрана
if hdcScreen <> 0 then
DeleteDC(hdcScreen);
end;
Осталось рассмотреть лишь последний обработчик события OnClick кнопки, помещенной на форму. Он реализует скрытие окна, сохранение изображения экрана и затем отображение окна (листинг 6.8).
Листинг 6.8. Сохранение захваченного изображения
procedure TfmCaptureImage.btnCaptureClick(Sender: TObject);
var
hdcForm: HDC;
begin
//прячем наше окно
Hide;
//сохраняем текущее изображение экрана
Captured:= BitBlt(hdcCompatible, 0, 0, bmpWidth, bmpHeight, hdcScreen, 0, 0, SRCCOPY);
//показываем наше окно
Show;
end;
В итоге получается довольно простое приложение, которое способно получать изображение всего Рабочего стола. Результат работы приложения показан на рис. 6.3.
Рис. 6.3. Результат работы приложения «Захват изображения»
Альфа-смешивание
Здесь будет рассмотрен пример, иллюстрирующий способ осуществления альфа-смешивания точечного рисунка. Будет создано приложение, в котором окно делится на три горизонтальные области, в каждой из которых затем рисуется точечный рисунок с альфа-смешиванием следующим образом:
• в верхней области постоянная альфа равна 50 %, исходная альфа отсутствует;
• в средней области постоянная альфа равна 100 %, исходная альфа равна 0 %;
• в нижней области постоянная альфа равна 75 %, исходная альфа переменная.
Для этого в описание формы сначала нужно добавить процедуру со следующим форматом заголовка:
procedure DrawAlphaBlend(hWnd: HWND; hdcwnd: HDC);
В самой процедуре объявляется ряд переменных, которые понадобятся в процессе работы. Код объявления приведен в листинге 6.9.
Листинг 6.9. Объявление переменных
var
hCurDC: HDC; //описатель контекста устройства, который
//мы создадим
bf: BLENDFUNCTION; //запись альфа-смешивания
hb mp: HBITMAP; //дескриптор точечного рисунка
bmi: BITMAPINFO; //заголовок точечного рисунка
pvBits: Pointer; //pointer to DIB section
ulWindowWidth, ulWindowHeight: ULONG; //ширина / высота клиентской
//области
ulBit mapWidth, ulBit mapHeight: ULONG; //ширина / высота точечного
//рисунка
rt: TRect; //используется для получения размеров клиентской
//области
x,y: Integer; //циклические переменные
ub Alph a: UCHAR; //используется для создания прозрачного градиента
ubRed: UCHAR;
ubGreen: UCHAR;
ubBlue: UCHAR;
fAlphaFactor: Real;
r, g, b: UCHAR;
В самом начале процедуры осуществляется подготовка необходимых данных для альфа-смешивания. Данные содержат информацию о требуемых размерах, а также необходимые данные точечного рисунка (листинг 6.10).
Листинг 6.10. Подготовка необходимых данных
//получаем размеры клиентской области
Windows.GetClientRect(hWnd, rt);
//рассчитываем ширину и высоту клиентской области
lWindowWidth:= rt.right – rt.left;
lWindowHeight:= rt.bott om – rt.top;
if (ulWindowWidth = 0) or (ulWindowHeight = 0) then
Exit;
//делим окно на три горизонтальные области
ulWindowHeight:= ulWindowHeight div 3;
//создаем контекст устройства для нашего точечного рисунка
hCurDC:= CreateCompatibleDC(hdcwnd);
ZeroMemory(@bmi, sizeof(BITMAPINFO));
//устанавливаем параметры точечного рисунка
//указываем ширину и высоту точечного рисунка для каждой из трех
//горизонтальных областей равными 60 % ширины и высоты главного окна
//позже осуществим смешивание в центре каждой из этих трех областей
with bmi.bmiHeader do
begin
biSize:= sizeof(BITMAPINFOHEADER);
biWidth:= ulWindowWidth – (ulWindowWidth div 5) * 2;
ulBitmapWidth:= biWidth;
bi Height:= ulWindowHeight – (ulWindowHeight div 5) * 2;
ulBitmapHeight:= biHeight;
biPlanes:= 1;
bi Bit Count:= 32; //четыре восьмибитных составляющих
biCompression:= BI_RGB;
biSizeImage:= ulBitmapWidth * ulBitmapHeight * 4;
end;
//создаем DIB секцию и выбираем точечный рисунок в контексте устройства
hbmp:= CreateDIBSection(hCurDC, bmi, DIB_RGB_COLORS, pvBits, 0, 0);
SelectObject(hCurDC, hbmp);
Далее необходимо осуществить описанное раннее альфа-смешивание для каждой из областей. Для первой области в точечном рисунке устанавливается синий цвет точки. В листинге 6.11 задаются необходимые параметры и выполняется альфа-смешивание.
Листинг 6.11. Альфа-смешивание верхней области
//в верхней области окна постоянная альфа = 5 0 %,
//но исходная альфа отсутствует
//цветовой формат для каждого пиксела 0xaarrggbb
//установим пикселы в синий цвет и альфа в ноль
for y:= 0 to ulBitmapHeight – 1 do
for x:= 0 to ulBitmapWidth – 1 do
PULONG(Integer(pvBits) +
(x + y * ulBitmapWidth) * sizeof(ULONG))^:= $000000ff;
bf.BlendOp:= AC_SRC_OVER;
bf.BlendFlags:= 0;
bf.Alph aFormat:= 0; //игнорировать исходный альфа-канал
bf.SourceConstant Alph a:= $7f; //половина $ff = 50 % прозрачности
if not Windows.AlphaBlend(hdcwnd, ulWindowWidth div 5,
ulWindowHeight div 5,
ulBitmapWidth, ulBitmapHeight,
hCurDC, 0, 0, ulBitmapWidth, ulBitmapHeight, bf) then
begin
DeleteObject(hbmp);
DeleteDC(hCurDC);
Exit;
end;
По аналогии выполняются необходимые действия и со средней областью. В центре точечного рисунка прозрачность отсутствует, поэтому там будет только указанный цвет. В центре устанавливается красный цвет, а остальная часть закрашивается синим цветом. Далее опять задаются необходимые параметры альфа-смешивания и осуществляется его выполнение (листинг 6.12).
Листинг 6.12. Альфа-смешивание средней области
//в средней области постоянная альфа = 100 %, исходная равна 0
for y:= 0 to ulBitmapHeight – 1 do
for x:= 0 to ulBitmapWidth – 1 do
if (x > Integer(ulBitmapWidth div 5)) and
(x < (ulBitmapWidth – ulBitmapWidth div 5)) and
(y > Integer(ulBitmapHeight div 5)) and
(y < (ulBitmapHeight – ulBitmapHeight div 5)) then
//в середине точечного рисунка альфа равна нулю
//это означает, что каждый цветной компонент умножается на 0
//таким образом, после альфа-смешивания мы получим 0 * r,
//0x00 * g, 0x00 * b ($00000000)
//установим сейчас цвет пикселов в красный
PULONG(Integer(pvBits) +
(x + y * ulBitmapWidth) * sizeof(ULONG))^ := $0000ff00
else
//остальную часть точечного рисунка сделаем синей
PULONG(Integer(pvBits) +
(x + y * ulBitmapWidth) * sizeof(ULONG))^ := $00ff0000;
bf.BlendOp:= AC_SRC_OVER;
bf.BlendFlags:= 0;
bf.Alph aFormat:= AC_SRC_ALPHA; //используем исходную альфа
bf.SourceConstant Alph a:= $ff; //непрозрачный
if not Windows.AlphaBlend(hdcwnd, ulWindowWidth div 5,
ulWindowHeight div 5 + ulWindowHeight, ulBitmapWidth,
ulBitmapHeight,
hCurDC, 0, 0, ulBitmapWidth, ulBitmapHeight, bf) then
begin
DeleteObject(hbmp);
DeleteDC(hCurDC);
Exit;
end;
В последней области происходит градиентное альфа-смешивание. Соответствующий код приведен в листинге 6.13.
Листинг 6.13. Альфа-смешивание нижней области
//нижняя область, используем альфа = 75 % и переменную исходную альфа
//создаем градиентный эффект, используя исходную альфа
ubRed:= $ff;
ubGreen:= $00;
ubBlue:= $00;
for y:= 0 to ulBitmapHeight – 1 do
for x:= 0 to ulBitmapWidth – 1 do
begin
ubAlpha:= Trunc(x / ulBitmapWidth * 255) and $FF;
fAlphaFactor:= ubAlpha / $ff;
r:= (Round(ubRed * fAlphaFactor) * (1 shl 16)) and $FF;
g:= (Round(ubGreen * fAlphaFactor) * (1 shl 8)) and $FF;
b:= Round(ubBlue * fAlphaFactor) and $FF;
PULONG(Integer(pvBits) +
(x + y * ulBitmapWidth) * sizeof(ULONG))^:=
(ubAlpha shl 24) or //0xaa000000
r or //0x00rr0000
g or //0x0000gg00
b; //0x000000bb
end;
bf.BlendOp:= AC_SRC_OVER;
bf.BlendFlags:= 0;
bf.AlphaFormat:= AC_SRC_ALPHA;
bf.SourceConstantAlpha:= $bf;
Windows.AlphaBlend(hdcwnd, ulWindowWidth div 5,
ulWindowHeight div 5 + 2 * ulWindowHeight, ulBitmapWidth,
ulBitmapHeight, hCurDC, 0, 0, ulBitmapWidth,
ulBitmapHeight, bf);
DeleteObject(hbmp);
DeleteDC(hCurDC);
Обработчик события OnPaint формы использует написанную функцию при каждой необходимости обновления формы. Для этого он получает контекст устройства формы, производит заливку фона темно-синим цветом, а затем вызывает функцию альфа-смешивания трех областей. Соответствующий исходный код приведен в листинге 6.14.
Листинг 6.14. Обработчик события OnPaint
procedure TfmAlphaBlending.FormPaint(Sender: TObject);
var
hCurDC: HDC;
hCurBrush, hOldBrush: HBRUSH;
begin
hCurDC:= GetDC(Handle);
hCurBrush:= CreateSolidBrush(RGB(128, 128, 255));
FillRect(hCurDC, Rect(0, 0, Width, Height), hCurBrush);
DrawAlphaBlend(Handle, hCurDC);
DeleteObject(hCurBrush);
ReleaseDC(Handle, hCurDC);
end;
Осталось только взглянуть на результат работы, запустив созданное приложение (рис. 6.4).
Рис. 6.4. Результат работы приложения «Alpha-смешивание точечного рисунка»
На этом рассмотрение работы с графикой в Delphi завершено.
Глава 7
Системная информация и реестр Windows
• Системная информация
• Системное время
• Реестр
Возникала ли у вас необходимость программно определять текущее состояние компьютера или узнавать какие-нибудь сведения об операционной системе? Можно только удивляться, как близко – практически «под носом» у программиста – находятся средства получения системной информации. Речь идет о средствах, которые всегда доступны при программировании для Windows – функции Windows API.
В данной главе будут рассмотрены некоторые способы, с помощью которых можно получить информацию, касающуюся операционной системы. Это может пригодиться, например, если вы используете в своих приложениях возможности, отличающиеся в различных платформах Windows, но и не только в этих случаях.
Рассмотренные в данной главе функции Windows API являются самыми обычными во всех смыслах этого слова. Просто они часто упоминаются вскользь либо вообще не упоминаются в книгах по программированию в таких средах, как Borland Delphi.
В примерах представленной вашему вниманию главы, кроме получения информации о самой Windows, некотором оборудовании компьютера, также рассмотрена работа с системным реестром Windows – своеобразной базой данных, в которой хранится много полезной и не очень информации: от параметров операционной системы и настроек приложений до сведений о работе компьютера, изменяющихся в реальном времени. Правда, по определенным причинам последние сведения хранятся не в реальных, а в виртуальных ключах реестра. Однако обо всем по порядку.
Системная информация
Начнем с несложных примеров, позволяющих получать информацию об операционной системе, установленном на компьютере оборудовании и такие сведения реального времени, как использование памяти компьютера, состояние питания и т. д.
Версия операционной системыИнформация об операционной системе хотя и не является повседневной необходимостью, но все же в некоторых случаях может понадобиться: например, когда ваша программа ведет себя по-разному при разных установленных обновлениях Windows либо когда вы самостоятельно пишете инсталлятор, который способен устанавливать версии программы, скомпилированные для Windows Me (95, 98) или Windows NT (2000, XP).
Одним из способов получения сведений о версии Windows является использование API-функции GetVersionEx. Эта функция принимает в качестве параметра структуру OSVERSIONINFO (или OSVERSIONINFOEX, но об этом позже), заполняет ее поля и в случае успешного выполнения возвращает ненулевое значение.
Объявление ANSI-версии структуры OSVERSIONINFO в библиотеке Delphi 7 выглядит следующим образом:
OSVERSIONINFOA = record
dwOSVersionlnfoSize: DWORD; //Размер структуры
dwMajorVersion: DWORD; //Старшая часть версии Windows
dwMinorVersion: DWORD; //Младшая часть версии
dwBuildNumber: DWORD; //Номер сборки операционной системы
dwPlatformId: DWORD; //Идентификатор платформы Windows
szCSDVersion: array[0..127] of AnsiChar; //Дополнительные сведения,
//например, установленный пакет обновлений
end;
Не буду вдаваться в подробное описание возможных значений полей этой структуры – практически все будет ясно из приведенного ниже примера. Не забывайте только заполнять поле dwOSVersionlnfoSize перед вызовом функции GetVersionEx.
Пример обработки данных, помещаемых в структуру OSVERSIONINFO, приведен в листинге 7.1. При загрузке формы элемент управления ListView с именем lvwVerlnfo заполняется сведениями о версии системы, представленными в форме, доступной для чтения.
Листинг 7.1. Получение и отображение сведений о Windows
procedure TForm1.FormCreate(Sender: TObject);
var
info: OSVERSIONINFO;
item: TListItem;
begin
//Получаем информацию о версии операционной системы
info.dwOSVersionInfoSizeee:= SizeOf(info);
GetVersionEx(info);
//Заполняем список информацией об операционной системе
//..версия операционной системы
item:= lvwVerInfo.Items.Add();
item.Caption:= 'Версия системы';
item.SubItems.Insert (0, IntToStr (Integer (info.dwMajorVersion)) + '.'+
IntToStr(Integer(info.dwMinorVersion)));
//..номер сборки
item:= lvwVerInfo.Items.Add();
item.Caption:= 'Сборка';
item.SubItems.Insert (0, IntToStr(Integer(info.dwBuildNumber)));
//..платформа
item:= lvwVerInfo.Items.Add();
item.Caption:= 'Платформа ';
case info.dwPlatformId of
VER_PLATFORM_WIN32s:
//Эмуляция Win32 или Win16
item.SubItems.Insert(0, 'Win16');
VER_PLATFORM_WIN32_WINDOWS:
//"Классическая" Win32: 95, 98 или Me
item.SubItems.Insert(0, 'Win32');
VER_PLATFORM_WIN32_NT:
//Ядро оNT
item.SubItems.Insert(0, 'WinNT');
end;
//..дополнительная информация (на пример, пакет обновлений)
item:= lvwVerInfo.Items.Add();
item.Caption:= 'Дополнительные сведения ';
item.SubItems.Insert(0, info.szCSDVersion);
end;
Возможный результат выполнения программы (для Windows XP SP1) показан на рис. 7.1.
Рис. 7.1. Информация о версии Windows
Теперь снова обратимся к функции GetVersionEx, а точнее, к структуре OSVERSIONINFOEX, которая может также передаваться в качестве параметра в функцию. К сожалению, в библиотеке Delphi 7 эта структура не объявлена. Однако это можно сделать самостоятельно:
OSVERSIONINFOEX = record
dwOSVersionInfoSize: DWORD;
dwMajorVersion: DWORD;
dwMinorVersion: DWORD;
dwBuildNumber: DWORD;
dwPlatformId: DWORD;
szCSDVersion: array[0..127] of AnsiChar;
//Поля, которых нет в OSVERSIONINFO
wServicePackMajor: WORD; //Старшая цифра версии ServicePack
wServicePackMinor: WORD; //Младшая цифра версии ServicePack
wSuiteMask: WORD; //Комплектация системы
wProductType: BYTE; //Дополнительная информация об операционной системе
wReserved: BYTE;
end;
Дополнительные (по сравнению с OSVERSIONINFO) поля структуры OSVERSIONINFOEX может заполнить операционная система Windows NT 4.0 SP6 и более поздние версии Windows NT (в том числе 2000 и XP). Значения дополнительных полей структуры OSVERSIONINFOEX пояснены комментариями в объявлении структуры.
Значение поля wSuiteMask (является битовой маской) может быть составлено из значений следующих констант (их объявления также пришлось добавить самостоятельно).
VER_SUITE_BACKOFFICE = 4; //Установлена Microsoft Back Office
VER_SUITE_DATACENTER = 128;//Установлена Microsoft Data Center
VER_SUITE_ENTERPRISE = 2; //Установлена операционная система Windows 2000 Advanced Server
VER_SUITE_SMALLBUSINESS = 1; //Установлена Microsoft Small Business Server
VER_SUITE_SMALLBUSINESS_RESTRICTED = 32; //Установлена ограниченная версия Microsoft Small Business Server
VER_SUITE_TERMINAL = 16; //Установлены терминальные службы
VER_SUITE_PERSONAL = 512; //Персональная версия операционной системы (типичный набор функций, меньше, чем в Professional)
Поле wProductType может иметь одно из приведенных ниже значений (тип сетевой операционной системы и, соответственно, роль, которую компьютер с данной операционной системой может исполнять при подключении в сети):
VER_NT_WORKSTATION = 1; //Рабочая станция
VER_NT_DOMAIN_CONTROLLER = 2; //Контроллер домена
VER_NT_SERVER = 3; //Сервер
Чтобы можно было передавать в функцию GetVersionEx ссылку на структуру OSVERSIONINFOEX, а не OSVERSIONINFO, следует перегрузить эту функцию следующим образом:
function GetVersionEx(var lpVersionlnformation: OSVERSIONINFOEX): BOOL;
stdcall; external kernel32 name 'GetVersionExA';
Теперь определение полной информации о версии операционной системы Windows
на платформе NT (выше NT 4.0 SP6) может выглядеть следующим образом (листинг 7.2) (часть, совпадающая с кодом листинга 7.1, опущена).
Листинг 7.2. Определение версии операционной системы (NT, 2000, ХР)
procedure TForm1.FormCreate(Sender: TObject);
var
info: OSVERSIONINFOEX;
item: TListItem;
suite, additional: String;
begin
//Получаем информацию о версии операционной системы
info.dwOSVersionInfoSizeee:= SizeOf(info);
GetVersionEx(info);
//Заполняем список информацией об операционной системе
//...
//..версия ServicePack
item:= lvwVerInfo.Items.Add();
item.Caption:= ' Версия ServicePack';
item.SubItems.Insert(0, IntToStr(Integer(info.wServicePackMajor)) + '.'
+ IntToStr(Integer(info.wServicePackMinor)));
//..комплектация операционной системы
suite:= '';
if info.wSuiteMask and VER_SUITE_BACKOFFICE <> 0 then
suite:= suite + '[ Установлен Back Office] ';
if info.wSuiteMask and VER_SUITE_DATACENTER <> 0 then
suite:= suite + '[Microsoft Data Center] ';
if info.wSuiteMask and VER_SUITE_ENTERPRISE <> 0 then
suite:= suite + '[Windows 2000 Advanced Server] ';
if info.wSuiteMask and VER_SUITE_SMALLBUSINESS <> 0 then
suite:= suite + '[Small Business Server] ';
if info.wSuiteMask and VER_SUITE_SMALLBUSINESS_RESTRICTED <> 0 then
suite:= suite + '[Small Business Server, ограниченная версия ] ';
if info.wSuiteMask and VER_SUITE_TERMINAL <> 0 then
suite:= suite + '[Terminal Service] ';
if info.wSuiteMask and VER_SUITE_PERSONAL <> 0 then
suite:= suite + '[Workstati on Personal (не Professional)] ';
item:= lvwVerInfo.Items.Add();
item.Caption:= 'Комплектация ';
item.SubItems.Add(suite);
//..дополнительные сведения
additional:= '';
case info.wProductType of
VER_NT_WORKSTATION:
additi onal:= '[ Рабочая станция] ';
VER_NT_DOMAIN_CONTROLLER:
additi onal:= '[ Контроллер домена] ';
VER_NT_SERVER:
additi onal:= '[ Сервер ] ';
end;
item:= lvwVerInfo.Items.Add();
item.Caption:= 'Дополнительно ';
item.SubItems.Add(additional);
end;
Правообладателям!
Это произведение, предположительно, находится в статусе 'public domain'. Если это не так и размещение материала нарушает чьи-либо права, то сообщите нам об этом.