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

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

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

ΠšΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΈΠ· рассмотрСнных Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² соотвСтствуСт Π±ΠΈΡ‚ Π² Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ GetFileAttributes Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ. Π’ΠΎΡ‚ ΠΎΡ‚Ρ€Ρ‹Π²ΠΎΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅ΠΉ, являСтся Π»ΠΈ Ρ„Π°ΠΉΠ» систСмным:

...

var attrs: DWORD;

begin

attrs := GetFileAttribute(PAnsiChar(\'C:\boot.ini\'));

if (attrs and FILE_ATTRIBUTE_SYSTEM <> 0) then {Ρ„Π°ΠΉΠ» систСмный};

Атрибуты ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SetFileAttributes. Она ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°: ΠΏΡƒΡ‚ΡŒ Ρ„Π°ΠΉΠ»Π° ΠΈΠ»ΠΈ ΠΏΠ°ΠΏΠΊΠΈ (PChar) ΠΈ Π±ΠΈΡ‚ΠΎΠ²ΡƒΡŽ маску Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ². Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 0 (False) Π² случаС Π½Π΅ΡƒΠ΄Π°Ρ‡ΠΈ ΠΈ Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ SetFileAttributes пСрСдаСтся маска, хранящая свСдСния сразу ΠΎΠ±ΠΎ всСх Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°Ρ… Ρ„Π°ΠΉΠ»Π° ΠΈΠ»ΠΈ ΠΏΠ°ΠΏΠΊΠΈ, Ρ‚ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Π½ΡƒΠΆΠ½ΠΎ Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½ΠΎ (Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ установлСнныС Ρ€Π°Π½Π΅Π΅). ΠŸΡ€ΠΈΠΌΠ΅Ρ€ (ΠΎΡ‚Ρ€Ρ‹Π²ΠΎΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹) Β«Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΒ» ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ Β«Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΒ» Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° Ρ„Π°ΠΉΠ»Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 4.22 (ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ошибок для простоты Π½Π΅ производится).

...

Листинг 4.22.

ИзмСнСниС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Ρ„Π°ΠΉΠ»Π°

var attrs: DWORD;

begin

attrs := GetFileAttributes(\'C:\text.txt\');

attrs := attrs or FILE_ATTRIBUTE_HIDDEN; //Установка Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° «скрытый»

attrs := attrs and not FILE_ATTRIBUTE_ARCHIVE; //БнятиС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° Β«Π°Ρ€Ρ…ΠΈΠ²Π½Ρ‹ΠΉΒ»

SetFileAttributes(\'C:\text.txt\', attrs);

Поиск Π² ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠ΅

Поиск Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠΈ прСдставляСт собой простой ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€ всСх элСмСнтов ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° с ΠΎΡ‚Π±ΠΎΡ€ΠΎΠΌ Ρ‚Π΅Ρ…, ΠΈΠΌΠ΅Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‚ маскС ΠΈ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ Π½Π°Π±ΠΎΡ€Ρƒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ². Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ (листинг4.23) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ API-функция FindFirstFile, которая Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ просмотр Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°, автоматичСски отсСивая ΠΈΠΌΠ΅Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΏΠ°ΠΏΠΎΠΊ, Π½Π΅ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‰ΠΈ Ρ… маскС. Ѐункция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ дСскриптор (THandle), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π½Π°Ρ‡Π°Ρ‚ΠΎΠ³ΠΎ просмотра ΠΏΠ°ΠΏΠΊΠΈ ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠΈ поиска (Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ FindNextFile).

ПослС окончания просмотра ΠΏΠ°ΠΏΠΊΠΈ вызываСтся функция FindClose, Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰Π°Ρ просмотр ΠΏΠ°ΠΏΠΊΠΈ. ΠžΡ‡Π΅Π½ΡŒ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ с ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ Ρ„Π°ΠΉΠ»ΠΎΠΌ (ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅, просмотр, Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅), Π½Π΅ Ρ‚Π°ΠΊ Π»ΠΈ?

...

Листинг 4.23.

Поиск в заданной папкС

function SearchInFolder(folder, mask: String; flags: DWORD;

names: TStrings; addpath: Boolean = False): Boolean;

var

hSearch: THandle;

FindData: WIN32_FIND_DATA;

strSearchPath: String;

bRes: Boolean; //Если Ρ€Π°Π²Π΅Π½ True, Ρ‚ΠΎ нашли хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½

//Ρ„Π°ΠΉΠ» ΠΈΠ»ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³

begin

strSearchPath := folder + \'\\' + mask;

bRes := False;

//НачинаСм поиск

hSearch := FindFirstFile(PAnsiChar(strSearchPath), FindData);

if (hSearch <> INVALID_HANDLE_VALUE) then

begin

//Π˜Ρ‰Π΅ΠΌ всС ΠΏΠΎΡ…ΠΎΠΆΠΈΠ΅ элСмСнты (информация ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠΌ элСмСнтС

//ΡƒΠΆΠ΅ записана Π² FindData Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ FindFirstFile)

repeat

if (String(FindData.cFileName) <> \'..\') and

(String(FindData.cFileName) <> \'.\') then

//ΠŸΡ€ΠΎΠΏΡƒΡΠΊΠ°Π΅ΠΌ . ΠΈ ..

begin

if MatchAttrs(flags, FindData.dwFileAttributes) then

begin

//Нашли подходящий ΠΎΠ±ΡŠΠ΅ΠΊΡ‚

if addpath then

names.Add(folder + \'\\' + FindData.cFileName)

else

names.Add(FindData.cFileName);

bRes := True;

end;

end;

until FindNextFile(hSearch, FindData) = False;

//Π—Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°Π΅ΠΌ поиск

FindClose(hSearch);

end;

SearchInFolder := bRes;

end;

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SearchlnFolder являСтся Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ списка names ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΈΠ»ΠΈ, Ссли Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° addpath Ρ€Π°Π²Π½ΠΎ True, ΠΏΠΎΠ»Π½Ρ‹ΠΌΠΈ путями Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ². Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° flags (битовая маска Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ²) формируСтся Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SetFileAttributes. Волько ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰ΠΈΠ΅ программиста Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹. ΠŸΡ€ΠΈ Π½Π°Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΈ хотя Π±Ρ‹ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΈΠ»ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° SearchlnFolder Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ True.

Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ поиска ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° соотвСтствия Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² производится ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ MatchAttrs. Код этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 4.24.

...

Листинг 4.24.

Π€ΠΈΠ»ΡŒΡ‚Ρ€ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ²

function MatchAttrs(flags, attrs: DWORD): Boolean;

begin

MatchAttrs := (flags and attrs) = flags;

end;

ΠœΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ строки – слишком слабый Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ для создания ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’ рассматриваСмом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ функция MatchAttrs Π²Ρ‹Π΄Π΅Π»Π΅Π½Π° для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ отсСиваниС Ρ„Π°ΠΉΠ»ΠΎΠ² (ΠΈ ΠΏΠ°ΠΏΠΎΠΊ) ΠΏΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌ Π±ΠΎΠ»Π΅Π΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ.

Π’ листингС 4.24 приводится рСализация нСстрогого Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°: ΠΎΠ½ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ„Π°ΠΉΠ» ΠΈΠ»ΠΈ ΠΏΠ°ΠΏΠΊΡƒ, Ссли ΠΎΠ½ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ всС установлСнныС Π² flags Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, нСзависимо ΠΎΡ‚ наличия Ρ„Π°ΠΉΠ»Π° ΠΈΠ»ΠΈ ΠΏΠ°ΠΏΠΊΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ². Π’Π°ΠΊ, Ссли ΠΌΡ‹ Π·Π°Π΄Π°Π»ΠΈ flags:= FILE_ATTRIBUTE_READONLY, Ρ‚ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ Π½Π°ΠΉΠ΄Π΅Π½Ρ‹ ΠΊΠ°ΠΊ Ρ„Π°ΠΉΠ»Ρ‹, Ρ‚Π°ΠΊ ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ, Π° Ρ‚Π°ΠΊΠΆΠ΅ скрытыС, систСмныС ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹, Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ FILE_ATTRIBUTE_READONLY. Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ строгого Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π° ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ MatchAttrs простым равСнством: flags = attrs.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ поиска с использованиСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SearchlnFolder приводится Π½Π° рис. 4.5.

Рис. 4.5. Поиск Π² Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠ΅

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SearchlnFolder (для ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π½Π° рис. 4.5 прилоТСния) ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 4.25.

...

Листинг 4.25.

ИспользованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SearchlnFolder

//Запуск поиска Ρ„Π°ΠΉΠ»Π° Π² Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠ΅

procedure TForm2.Button1Click(Sender: TObject);

var

flags: DWORD;

begin

//Π€ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ Π½Π°Π±ΠΎΡ€ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² (ΠΏΠΎ установлСнным Ρ„Π»Π°ΠΆΠΊΠ°ΠΌ Π½Π° Ρ„ΠΎΡ€ΠΌΠ΅)

flags := 0;

if (chkDirs.Checked) then flags := flags or FILE_ATTRIBUTE_DIRECTORY;

if (chkHidden.Checked) then flags := flags or FILE_ATTRIBUTE_HIDDEN;

if (chkSystem.Checked) then flags := flags or FILE_ATTRIBUTE_SYSTEM;

if (chkReadOnly.Checked) then flags := flags or FILE_ATTRIBUTE_READONLY;

if (chkArchive.Checked) then flags := flags or

FILE_ATTRIBUTE_ARCHIVE;

lblFound.Caption := \'ΠŸΠΎΠΈΡΠΊβ€¦\

lstFiles.Clear;

Refresh;

//Поиск (Ρ„Π°ΠΉΠ»Ρ‹ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ прямо Π² список Π½Π° Ρ„ΠΎΡ€ΠΌΠ΅)

if not SearchInFolder(txtFolder.Text, txtMask.Text, flags,

lstFiles.Items)

then

lblFound.Caption := \'Поиск Π½Π΅ Π΄Π°Π» Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ²\'

else

lblFound.Caption := \'НайдСно ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²: \' +

IntToStr(lstFiles.Count);

end;

Поиск ΠΏΠΎ всСму Π΄Π΅Ρ€Π΅Π²Ρƒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ²

Π’ листингС 4.26 приводится ΠΎΠ΄Π½Π° ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ рСкурсивного поиска ΠΏΠΎ Π΄Π΅Ρ€Π΅Π²Ρƒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ². Алгоритм поиска Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

1. Π’ыполняСтся поиск Π² ΠΏΠ°ΠΏΠΊΠ΅ folder (всС Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ»ΠΈ ΠΏΠ°ΠΏΠΊΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² список names).

2. Π€ΡƒΠ½ΠΊΡ†ΠΈΡ SearchlnTree вызываСтся для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° BfoLder для продолТСния поиска Π² ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²Π΅, опрСдСляСмом ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠΌ.

...

Листинг 4.26.

Поиск ΠΏΠΎ Π΄Π΅Ρ€Π΅Π²Ρƒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ²

function SearchInTree(folder, mask: String; flags: DWORD;

names: TStrings; addpath: Boolean = False): Boolean;

var

hSearch: THandle;

FindData: WIN32_FIND_DATA;

bRes: Boolean; //Если Ρ€Π°Π²Π΅Π½ True, Ρ‚ΠΎ нашли хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ Ρ„Π°ΠΉΠ» ΠΈΠ»ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³

begin

//ΠžΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΠ΅ΠΌ поиск Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΏΠ°ΠΏΠΊΠ΅

bRes := SearchInFolder(folder, mask, flags, names, addpath);

//ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ поиск Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ²

hSearch := FindFirstFile(PAnsiChar(folder + \'\*\'), FindData);

if (hSearch <> INVALID_HANDLE_VALUE) then

begin

repeat

if (String(FindData.cFileName) <> \'..\') and

(String(FindData.cFileName) <> \'.\') then

//ΠŸΡ€ΠΎΠΏΡƒΡΠΊΠ°Π΅ΠΌ . ΠΈ ..

begin

if (FindData.dwFileAttributes and

FILE_ATTRIBUTE_DIRECTORY <> 0)

then

//Нашли ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ – Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ Π² Π½Π΅ΠΌ поиск

if SearchInTree(folder + \'\\' + String(FindData.cFileName),

mask, flags, names, addpath)

then

bRes := True;

end;

until FindNextFile(hSearch, FindData) = False;

FindClose(hSearch);

end;

SearchInTree := bRes;

end;

Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SearchlnTree Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ просмотр ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° folder Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ (ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ) ΠΈΠ· сообраТСний эффСктивности. Если Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ поиск ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SearchlnFolder. ΠŸΡ€Π°Π²Π΄Π°, ΠΏΡ€ΠΈ этом Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ завСсти Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ список (TStringList) для сохранСния Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Ρ… Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ². Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹ списка Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·: для поиска Π² ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°Ρ….

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ поиска с использованиСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SearchlnTree приводится Π½Π° рис. 4.6.

Рис. 4.6. Поиск ΠΏΠΎ Π΄Π΅Ρ€Π΅Π²Ρƒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ²

Π‘ нСбольшими модификациями Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ рСкурсивного ΠΎΠ±Ρ…ΠΎΠ΄Π° Π΄Π΅Ρ€Π΅Π²Π° ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ², Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π² листингС 4.25, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΏΡ€ΠΈ опСрациях, ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΎΡ‚ простого поиска: Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ Π΄Π΅Ρ€Π΅Π²Π° ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ². Для этого достаточно Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ.

ΠŸΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΠ΅ Π΄Π΅Ρ€Π΅Π²Π° ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ²

Рассмотрим довольно интСрСсный ΠΏΡ€ΠΈΠΌΠ΅Ρ€, основанный Π½Π° использовании Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ поиска SearchlnFolder, β€“ построСниС Π΄Π΅Ρ€Π΅Π²Π° ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² для ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ диска (рис. 4.7).

Рис. 4.7. Π”Π΅Ρ€Π΅Π²ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ²

Для простоты (ΠΈ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΎΡ‚Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒ внимания ΠΎΡ‚ построСния Π΄Π΅Ρ€Π΅Π²Π°) диск задаСтся Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ТСстко. ΠŸΡ€ΠΈ нСобходимости это ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ (ΠΊΠ°ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ диски, Π²Ρ‹ ΡƒΠΆΠ΅ Π·Π½Π°Π΅Ρ‚Π΅).

Рассмотрим Ρ€Π°Π±ΠΎΡ‚Ρƒ прилоТСния ΠΏΠΎ порядку. Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ управлСния TreeView Π½Π° Ρ„ΠΎΡ€ΠΌΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ имя tree. Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ списка ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ (ImageList), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π΄Π΅Ρ€Π΅Π²ΠΎΠΌ, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΎ Π½Π° рис. 4.8.

Рис. 4.8. Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡ для элСмСнтов Π΄Π΅Ρ€Π΅Π²Π°

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт Π΄Π΅Ρ€Π΅Π²Π° (соотвСтствуСт диску) образуСтся ΠΏΡ€ΠΈ создании Ρ„ΠΎΡ€ΠΌΡ‹ (листинг 4.27).

...

Листинг 4.27.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ элСмСнта Π΄Π΅Ρ€Π΅Π²Π° – диска

procedure TForm3.FormCreate(Sender: TObject);

begin

//ΠšΠΎΡ€Π½Π΅Π²ΠΎΠΉ элСмСнт Π΄Π΅Ρ€Π΅Π²Π° (диск)

root := tree.Items.Add(tree.Items.GetFirstNode, \'C:\');

root.ImageIndex := 0;

root.SelectedIndex := 0;

SetExpanded(root, False);

end;

Π—Π΄Π΅ΡΡŒ ΠΈ Π΄Π°Π»Π΅Π΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ root позволяСт быстро ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ доступ ΠΊ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΌΡƒ элСмСнту Π΄Π΅Ρ€Π΅Π²Π°. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ Π² листингС 4.27 ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° примСняСтся для установки состояния элСмСнтов Π΄Π΅Ρ€Π΅Π²Π° (листинг 4.28).

...

Листинг 4.28.

Установка состояния элСмСнта Π΄Π΅Ρ€Π΅Π²Π°

procedure TForm3.SetExpanded(Node: TTreeNode; isExpanded: Boolean);

begin

if isExpanded then

begin

//ΠŸΠΎΠ΄Π³ΠΎΡ‚Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ элСмСнт ΠΊ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ содСрТимого ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°

Node.Data := Pointer(1);

Node.DeleteChildren;

end

else

begin

//Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π½Π΅ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½ΠΎ (ΠΈΠ»ΠΈ Π΅Π³ΠΎ слСдуСт ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ)