Код этого примера в приложениях VCL .NET существенно отличается от рассмотренного:

uses System.Text;
procedure TForml. ButtonlClick (Sender TObject) ;
var Number, FileLength, VolFlags: DWORD;
SystemName, Buf: StringBuilder;
Drives: array [0..255] of Byte;
S, SI: string;
i: integer;
P: integer;

FreeAvailable, TotalSpace, TotalFree: TLargelnteger; begin

SystemName : = StringBuilder.Create(128);
Buf := StringBuilder.Create(256);
RichEditl.Clear;

if GetLogicalDriveStrings(256, Drives) > 256

then exit;
P := 0;

while Char(Drives[P]) #0 do

begin

// формирование в SI корневого каталога SI : =

while(Char(Drives[P]) #0) do begin

SI := SI + Char(Drives[P]);
Inc(P, 2);
end;
S := 'Диск ' + Sl[l];
i := GetDriveType(SI);

case i of

DRIVE_FIXED: S := S + ' локальный';
DRIVE_REMOVABLE: S := S + ' съемный';
DRIVE_REMOTE: S := S + ' сетевой';
DRIVE_CDROM: S := S + ' CD-ROM';
DRI VE_RAMDI SK: S := S + ' в ОЗУ;
else S := S + ' неизвестного типа';
end;
RichEditl.SelAttributes.Style := [fsBold];
RichEditl.Lines.Add(S);

RichEditl.SelAttributes := RichEditl.DefAttributes; if (i = DRIVE_FIXED) or (i = DRIVE_REMOTE) then begin if GetVolumelnformation(SI, Buf, 256, Number, FileLength, VolFlags, SystemName, 128)

then begin

RichEditl.Lines.Add('идентификатор - ' + Buf.ToString);
RichEditl.Lines.Add('серийный номер - ' + IntToStr(Number));
GetDiskFreeSpaceEx(SI, FreeAvailable, TotalSpace, TotalFree);

RichEditl.Lines.Add('емкость - ' +

IntToStr(TotalSpace shr 20) +

' МВ'С + IntToStr(TotalSpace) + ' байт)1);

RichEditl.Lines.Add('свободно - ' +

IntToStr(TotalFree shr 20) +

' МБ (' + IntToStr(TotalFree) + 1 байт)');

RichEditl.Lines.Add('доступно - ' +

IntToStr(FreeAvailable shr 20) +

' МБ (' + IntToStr(FreeAvailable) +

' байт)');
RichEditl.Lines.Add('система - ' + SystemName.ToString);

if (VolFlags and FS_FILE_COMPRESSION) > 0 then RichEditl.Lines.Add('поддерживает сжатие') else RichEditl.Lines.Add('не поддерживает сжатие') ; RichEditl.Lines.Add('максимальная длина имен файлов - ' +

IntToStr(FileLength)); if (VolFlags and FS_CASE_IS_PRESERVED) > 0

then RichEditl.Lines.Add('сохраняет регистр имен файлов');
if (VolFlags and FS_PERSISTENT_ACLS) >
0 then RichEditl.Lines.Add('поддерживает ACL');
end;
end;
Inc(P, 2);
end;
end;

В этом коде жирным шрифтом выделены операторы, отличающиеся от реализации кода в VCL Win32. Оператор uses подключает к проекту пространство имен System.Text, в котором объявлен класс StringBuilder. Этот класс используется как тип переменных SystemName и Buf. Объекты этих переменных создаются двумя первыми исполняемыми операторами процедуры ButtonlClick.

Переменная Р, которая в предыдущем варианте была указателем, в данном варианте является целой переменной, используемой в качестве индекса при итерациях по массиву Drives. Цикл while, осуществляющий итерации, начинается с формирования в переменной S1 с именем корневого диалога очередного диска. Окончание этого имени определяется по появлению нулевого символа в массиве Drives. Сформированная строка S1 используется далее в вызовах функций GetDriveType, GetVolumelnformation и GetDiskFreeSpaceEx. Функция GetVolumeln-formation заносит идентификатор диска в объект Buf, а наименование системы в объект SystemName. Строки из этих объектов читаются далее методом ToString.

В конце цикла индекс Р увеличивается на 2, поскольку каждый символ занимает в массиве Drives 2 байта.

Следует сказать, что в приводимом коде я не стал заменять многочисленные функции IntToStr применением метода ToString, так как иначе в множестве строк, выделенных жирным шрифтом, потонули бы действительно принципиальные изменения в коде. В реализации на приложенном к книге диске такие замены сделаны. Например, оператор:

RichEditl.Lines.Add(1 емкость - 1 +

IntToStr(TotalSpace shr 20) +

1 МБ (1 + IntToStr(TotalSpace) + 1 байт)1);

в приложениии VCL .NET можно заменить оператором:

RichEditl.Lines.Add(1 емкость - 1 +

TLargelnteger(TotalSpace shr 20).ToString + 1 МБ (1 + TotalSpace.ToString + ' байт)1);

Ничего принципиального такая замена не вносит, но она представляется более органичной в приложениях .NET.

9.9 Доступ к удаленным данным из сервера Web || Оглавление || 10.2 Папки и их интерфейсы


⇐ Предыдущая страница|

Приемы программирования в Delphi на основе VCL



Новости за месяц

  • Май
    2020
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс