Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Delphi. Π’Ρ€ΡŽΠΊΠΈ ΠΈ эффСкты». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 16

Автор Π’Π°Π»Π΅Ρ€ΠΈΠΉ Борисок

//Π’ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Caps Lock

if not initCaps then PressKey(VK_CAPITAL);

curCaps := True;

if initNum then PressKey(VK_NUMLOCK);

curNum := False;

if initScroll then PressKey(VK_SCROLL);

curScroll := False;

//ЗапускаСм Β«Π±Π΅Π³ΡƒΡ‰ΠΈΠ΅ ΠΎΠ³Π½ΠΈΒ»

Timer1.Interval := StrToInt(txtInterval.Text);

Timer1.Enabled := True;

cmbStart.Caption := \'Π‘Ρ‚ΠΎΠΏ\

end

else

begin

//ΠžΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Β«Π±Π΅Π³ΡƒΡ‰ΠΈΠ΅ ΠΎΠ³Π½ΠΈΒ»

Timer1.Enabled := False;

cmbStart.Caption := \'Π‘Ρ‚Π°Ρ€Ρ‚\

//ВосстанавливаСм ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ состояния клавиш

if initCaps <> curCaps then PressKey(VK_CAPITAL);

if initNum <> curNum then PressKey(VK_NUMLOCK);

if initScroll <> curScroll then PressKey(VK_SCROLL);

end;

end;

Π’ Π½Π°Ρ‡Π°Π»Π΅ листинга 3.23 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅:

β€’ initCaps, initNum, initScroll – для сохранСния ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ состояния клавиш Caps Lock, Num Lock ΠΈ Scroll Lock с Ρ†Π΅Π»ΡŒΡŽ Π΅Π³ΠΎ восстановлСния ΠΏΡ€ΠΈ остановкС ΠΎΠ³Π½Π΅ΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Ρ€Π°Π·Π΄Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ состояния этих клавиш;

β€’ curCaps, curNum, curScroll – для быстрого опрСдСлСния Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ состояния клавиш (вмСсто постоянного обращСния ΠΊ функциям Ρ‚ΠΈΠΏΠ° GetKeyboardState).

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΠ³Π½Π΅ΠΉ происходит ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ срабатывании Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° Timer1 (листинг 3.24).

...

Листинг 3.24.

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΠ³Π½Π΅ΠΉ

procedure TForm1.Timer1Timer(Sender: TObject);

begin

//ИзмСняСм состояниС Π»Π°ΠΌΠΏΠΎΡ‡Π΅ΠΊ Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅

if curCaps then

begin

//Π‘ Caps Lock Π½Π° Num Lock

PressKey(VK_NUMLOCK);

PressKey(VK_CAPITAL);

curCaps := False;

curNum := True;

end

else if curNum then

begin

//Π‘ Num Lock Π½Π° Scroll Lock

PressKey(VK_SCROLL);

PressKey(VK_NUMLOCK);

curNum := False;

curScroll := True;

end

else

begin

//Π‘ Scroll Lock Π½Π° Caps Lock

PressKey(VK_CAPITAL);

PressKey(VK_SCROLL);

curScroll := False;

curCaps := True;

end;

end;

...

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Если Ρƒ вашСй ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ порядок слСдования Π»Π°ΠΌΠΏΠΎΡ‡Π΅ΠΊ отличаСтся ΠΎΡ‚ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ (Π² ΠΊΠ°ΠΊΡƒΡŽ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ сторону), Ρ‚ΠΎ слСдуСт ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ порядок ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² листингС 3.24, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Β«Π±Π΅Π³ΡƒΡ‰ΠΈΠ΅ ΠΎΠ³Π½ΠΈΒ» Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Β«Π±Π΅ΠΆΠ°Π»ΠΈΒ».

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ заставку ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎΠ΅ ΡƒΠΊΡ€Π°ΡˆΠ΅Π½ΠΈΠ΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для Π½ΠΎΠ²ΠΎΠ³ΠΎΠ΄Π½Π΅ΠΉ Слки… ΠΈΠ· ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°.

Π“Π»Π°Π²Π° 4 Диски, ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ, Ρ„Π°ΠΉΠ»Ρ‹

β€’ Π”иски

β€’ ΠšΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ ΠΈ ΠΏΡƒΡ‚ΠΈ

β€’ Π€Π°ΠΉΠ»Ρ‹

Π’ этой Π³Π»Π°Π²Π΅ Π²Ρ‹ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚Π΅ΡΡŒ с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ возмоТностями получСния ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС (ΠΈ ΠΎΡ‚ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы). ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π³Π»Π°Π²Ρ‹ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ основаны Π½Π° использовании API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для получСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, Ρ‚Π°ΠΊ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΈΠ· ΠΏΠ΅Ρ€Π²Ρ‹Ρ… Ρ€ΡƒΠΊ. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Borland Π½Π΅ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ эту Ρ‚Π΅ΠΌΡƒ ΠΏΡ€ΠΈ написании Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ для Delphi: Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ SysUtils ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ ряд Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΡ… Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² этой Π³Π»Π°Π²Π΅ Π² основном Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, Π½Π΅Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΡƒΡŽ ΠΏΡ€ΠΈ использовании ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ модуля SysUtils, Π΄Π°Π±Ρ‹ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π½Π΅ Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» этой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.

4.1. Диски

НачнСм с получСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ дисках ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°. Как Π²Ρ‹, Π½Π°Π²Π΅Ρ€Π½ΠΎΠ΅, Π½Π΅ Ρ€Π°Π· ΠΌΠΎΠ³Π»ΠΈ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, ряд ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ (хотя Π±Ρ‹ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Internet Explorer) ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ Π³ΠΎΡ€Π°Π·Π΄ΠΎ большСй ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎ дисках, Π½Π΅ΠΆΠ΅Π»ΠΈ ΠΈΡ… ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (Π±ΡƒΠΊΠ²Π°) ΠΈΠ»ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€. Π”Π°Π»Π΅Π΅ рассмотрСно, ΠΊΠ°ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π±ΡƒΠΊΠ²Ρ‹ всСх установлСнных Π½Π° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ дисков, ΠΌΠ΅Ρ‚ΠΊΠΈ дисков, сСрийныС Π½ΠΎΠΌΠ΅Ρ€Π° Ρ‚ΠΎΠΌΠΎΠ² ΠΈ Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС. Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΊΠΈ дисков.

ВсС рассмотрСнныС Π½ΠΈΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с дисками Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ DriveTools, располоТСнном Π½Π° дискС, ΠΏΡ€ΠΈΠ»Π°Π³Π°Π΅ΠΌΠΎΠΌ ΠΊ ΠΊΠ½ΠΈΠ³Π΅, Π² ΠΏΠ°ΠΏΠΊΠ΅ с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π°.

Π‘Π±ΠΎΡ€ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ дисках

Π˜Ρ‚Π°ΠΊ, Π½Π°Ρ‡Π½Π΅ΠΌ ΠΏΠΎ порядку. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ список дисков ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° (строк Π²ΠΈΠ΄Π°<Π±ΡƒΠΊΠ²Π°>: \) ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ функция ΠΈΠ· листинга 4.1.

...

Листинг 4.1.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π±ΡƒΠΊΠ² дисков

function GetDriveLetters(letters: TStrings):Integer;

var

buffer: String;

i, len, start: Integer;

begin

SetLength(buffer, 110);

len := GetLogicalDriveStrings(110, PAnsiChar(buffer));

//Π Π°Π·Π±ΠΈΡ€Π°Π΅ΠΌ строку Π²ΠΈΠ΄Π° \'c:\#0d:\#0…#0#0\',

//Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ GetLogicalDriveStrings

start := 1;

for i := 2 to len do

if (buffer[i] = #0) and (start <> i) then

begin

//Нашли ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ диска

letters.Append(Copy(buffer, start, i–start));

start := i+1;

end;

GetDriveLetters := letters.Count;

end;

Ѐункция ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ссылку Π½Π° список ΠΈ заполняСт Π΅Π³ΠΎ строками с путями ΠΊΠΎΡ€Π½Π΅Π²Ρ‹Ρ… ΠΏΠ°ΠΏΠΎΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· дисков (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с: \). Вся ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ состоит Π² нСобходимости выдСлСния ΠΏΡƒΡ‚Π΅ΠΉ ΠΈΠ· строки, заполняСмой API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ GetLogicalDriveStrings. Ѐункция GetDriveLetters Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ количСство строк, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹Ρ… Π² список letters.

ΠšΡ€ΠΎΠΌΠ΅ API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ GetLogicalDriveStrings, для получСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Ρ‚ΠΎΠΌ, Π·Π° ΠΊΠ°ΠΊΠΈΠΌΠΈ Π±ΡƒΠΊΠ²Π°ΠΌΠΈ Π·Π°ΠΊΡ€Π΅ΠΏΠ»Π΅Π½Ρ‹ диски, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΎΠ΄Π½Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ – GetLogicalDrives. Она Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° DWORD, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅Π΅ собой Π±ΠΈΡ‚ΠΎΠ²ΡƒΡŽ маску. БостояниС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π±ΠΈΡ‚Π° маски (ΠΎΡ‚ 1 Π΄ΠΎ 26) соотвСтствуСт Π½Π°Π»ΠΈΡ‡ΠΈΡŽ Π»ΠΈΠ±ΠΎ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΈΡŽ диска ΠΏΠΎΠ΄ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Π½ΠΎΠΌΠ΅Ρ€Ρƒ Π±ΡƒΠΊΠ²ΠΎΠΉ латинского Π°Π»Ρ„Π°Π²ΠΈΡ‚Π°. Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΈΠ· маски (ΠΈ соотвСтствСнно составлСниС списка дисков) ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊ Π² листингС 4.2.

...

Листинг 4.2.

БоставлСниС списка дисков

function GetDriveLetters(letters: TStrings):Integer;

var

mask: DWORD;

i: Integer;

letter: Char;

begin

//ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ маску, Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ΠΈΠ·ΡƒΡŽΡ‰ΡƒΡŽ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ дисков

mask := GetLogicalDrives();

//Π Π°Π·Π±ΠΈΡ€Π°Π΅ΠΌ маску (опрСдСляСм значСния ΠΏΠ΅Ρ€Π²Ρ‹Ρ… 26 Π±ΠΈΡ‚ΠΎΠ²)

i := 1;

for letter := \'A\' to \'Z\' do

begin

if mask and i <> 0 then

//Π•ΡΡ‚ΡŒ диск ΠΏΠΎΠ΄ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Π±ΡƒΠΊΠ²ΠΎΠΉ

letters.Append(letter + \':\\');

i := i * 2; //ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ Π±ΠΈΡ‚Ρƒ

end;

GetDriveLetters := letters.Count;

end;

Π’Π΅ΠΏΠ΅Ρ€ΡŒ напишСм нСслоТныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠΎΠ»Π½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ свободного пространства Π½Π° дискС (листинг 4.3).

...

Листинг 4.3.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° свободного пространства диска

//Ѐункция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠΎΠ»Π½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ диска Π² Π±Π°ΠΉΡ‚Π°Ρ…

function GetDriveSize(root: String): Int64;

var

freeToCaller, totalBytes, freeBytes: Int64;

begin

if GetDiskFreeSpaceEx(PAnsiChar(root), freeToCaller,

totalBytes, PLargeInteger(Addr(freeBytes))) <> False

then

GetDriveSize := totalBytes

else

GetDriveSize := -1;

end;

//Ѐункция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ свободного мСста Π½Π° дискС (Π² Π±Π°ΠΉΡ‚Π°Ρ…)

function GetDriveFreeSpace(root: String): Int64;

var

freeToCaller, totalBytes, freeBytes:Int64;

begin

if GetDiskFreeSpaceEx(PAnsiChar(root), freeToCaller,

totalBytes, PLargeInteger(Addr(freeBytes))) <> False

then

GetDriveFreeSpace := freeBytes

else

GetDriveFreeSpace := –1;

end;

Π’ ΠΎΠ±Π΅ΠΈΡ… функциях листинга 4.3 для достиТСния Π΄Π²ΡƒΡ… Ρ€Π°Π·Π½Ρ‹Ρ… Ρ†Π΅Π»Π΅ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ API-функция GetDiskFreeSpaceEx:

...

function GetDiskFreeSpaceEx(lpDirectoryName: PChar;

var lpFreeBytesAvailableToCaller,

lpTotalNumberOfBytes;

lpTotalNumberOfFreeBytes: PLargeInteger): BOOL;

Ѐункция ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΡƒΡ‚ΡŒ (любой) Ρ„Π°ΠΉΠ»Π° ΠΈΠ»ΠΈ ΠΏΠ°ΠΏΠΊΠΈ Π½Π° ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰Π΅ΠΌ дискС ΠΈ заполняСт Ρ‚Ρ€ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°:

β€’ lpFreeBytesAvailableToCaller – Ρ€Π°Π·ΠΌΠ΅Ρ€ свободного пространства, доступного ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ, ΠΏΠΎΠ΄ Ρ‡ΡŒΠΈΠΌΠΈ ΠΏΡ€Π°Π²Π°ΠΌΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊ, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ (Π² Π±Π°ΠΉΡ‚Π°Ρ…);

β€’ lpTotalNumberOf Bytes – ΠΏΠΎΠ»Π½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ диска (Π² Π±Π°ΠΉΡ‚Π°Ρ…);

β€’ lpTotalNumberOf FreeBytes – Ρ€Π°Π·ΠΌΠ΅Ρ€ свободного пространства Π½Π° дискС (Π² Π±Π°ΠΉΡ‚Π°Ρ…).

ВсС пСрСчислСнныС значСния ΡΠ²Π»ΡΡŽΡ‚ΡΡ 64-Π±ΠΈΡ‚Π½Ρ‹ΠΌΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°ΠΌΠΈ дисков Π±ΠΎΠ»Π΅Π΅ 4 Π“Π±Π°ΠΉΡ‚. Если Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ GetDiskFreeSpaceEx оказываСтся Π½Π΅ΡƒΠ΄Π°Ρ‡Π½Ρ‹ΠΌ, Ρ‚ΠΎ возвращаСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ False. Π’ этом случаС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ листинга 4.3 Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ -1, сигнализируя ΠΎΠ± ошибкС.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ самоС интСрСсноС – ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС Π½Π° дисках. Много интСрСсного ΠΎ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ дискС ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ GetVolumelnformation. Она ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²ΠΈΠ΄:

...

function GetVolumeInformation(lpRootPathName: PChar;

lpVolumeNameBuffer: PChar; nVolumeNameSize: DWORD;

lpVolumeSerialNumber: PDWORD; var lpMaximumComponentLength,

lpFileSystemFlags: DWORD; lpFileSystemNameBuffer: PChar;

nFileSystemNameSize: DWORD): BOOL;

ОбъявлСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ выглядит довольно Π³Ρ€ΠΎΠΌΠΎΠ·Π΄ΠΊΠΈΠΌ Π·Π° счСт большого количСства ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Однако ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ GetVolumelnformation ΠΎΡ‡Π΅Π½ΡŒ просто. Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π²Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π² Π΄ΠΎΠ»Π³ΠΎΠ΅ описаниС Π΅Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², рассмотрим Π΅Π΅ использованиС Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ (листинг 4.4).

...

Листинг 4.4.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ дискС

//Ѐункция опрСдСляСт ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ дискС

//Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ False, Ссли Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ошибка

function GetDriveInformation(root: String;

var info: DriveInfo):Boolean;

var

bufDriveName, bufFSNAme: String;

SN: DWORD;

maxFileName, fsOptions: Cardinal;

begin

SetLength(bufDriveName, 101);

SetLength(bufFSName, 101);

//ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ дискС

if GetVolumeInformation(PAnsiChar(root),

PAnsiChar(bufDriveName), 100,

Addr(SN), maxFileName, fsOptions,

PAnsiChar(bufFSName), 100) <> False

then

begin

//ЗаполняСм структуру ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎ дискС

with info do

begin

DriveLabel := bufDriveName;

FileSystemName := bufFSName;

SerialNumber := SN;

MaxFileNameLen := maxFileName;

//..ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы

with info.FileSystemOptions do

begin

CaseSensitive := fsOptions and FS_CASE_SENSITIVE <> 0;

SupportCompression := fsOptions and

FS_FILE_COMPRESSION <> 0;

IsCompressed := fsOptions and FS_VOL_IS_COMPRESSED <> 0;

end;

end;

//Ѐункция ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Π»Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ

GetDriveInformation := True;

end

else

//Ошибка

GetDriveInformation := False;

end;

Если ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ листинг, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ GetVolumelnf ormation, ΠΊΡ€ΠΎΠΌΠ΅ ΠΏΡƒΡ‚ΠΈ, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰Π΅Π³ΠΎ диску, пСрСдаСтся Ρ‚Π°ΠΊΠΆΠ΅:

β€’ Π±ΡƒΡ„Π΅Ρ€ для ΠΌΠ΅Ρ‚ΠΊΠΈ диска (ΠΈ Π΄Π»ΠΈΠ½Π° этого Π±ΡƒΡ„Π΅Ρ€Π°);

β€’ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Ρ‚ΠΈΠΏΠ° DWORD для записи Π² Π½Π΅Π΅ сСрийного Π½ΠΎΠΌΠ΅Ρ€Π° Ρ‚ΠΎΠΌΠ° диска (присваиваСтся ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ создании Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, послС форматирования диска);

β€’ ссылка Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Ρ‚ΠΈΠΏΠ° Cardinal для сохранСния Π² Π½Π΅ΠΉ максимальной Π΄Π»ΠΈΠ½Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° ΠΏΡƒΡ‚ΠΈ (ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π° ΠΈΠ»ΠΈ ΠΏΠ°ΠΏΠΊΠΈ);