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

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

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

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

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

begin

if isExpanded then

begin

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

Node.Data := Pointer(1);

Node.DeleteChildren;

end

else

begin

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

Node.Data := Pointer(0);

Node.Collapse(False);

Node.DeleteChildren;

tree.Items.AddChild(Node, \'\'); //Π€ΠΈΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ элСмСнт(Ρ‡Ρ‚ΠΎΠ±Ρ‹

//отобраТался "+", ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ

//Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ элСмСнт)

end;

end;

Если послС создания элСмСнтов Π΄Π΅Ρ€Π΅Π²Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° SetExpanded вызываСтся с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ isExpanded, Ρ€Π°Π²Π½Ρ‹ΠΌ False (ΠΊΠ°ΠΊ Π² листингС 4.27), Ρ‚ΠΎ для ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ элСмСнта Π΄Π΅Ρ€Π΅Π²Π° создаСтся Ρ„ΠΈΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ элСмСнт. Π­Ρ‚ΠΎ дСлаСтся для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π·Π°Ρ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ содСрТимоС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π½Π΅ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΠΎΠ³ΠΎ Π΅Ρ‰Π΅ элСмСнта Π΄Π΅Ρ€Π΅Π²Π° (для ΠΏΠ°ΠΏΠΎΠΊ с большим количСство Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π±ΡƒΠ΄Π΅Ρ‚ сильно Β«Ρ‚ΠΎΡ€ΠΌΠΎΠ·ΠΈΡ‚ΡŒΒ»). А Ρ‚Π°ΠΊ Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π΅Ρ‰Π΅ Π½Π΅ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΠΎΠ³ΠΎ элСмСнта отобраТаСтся символ +, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π΅Π³ΠΎ Π² Π½ΡƒΠΆΠ½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚. ΠŸΡ€ΠΈ этом Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π·Π°Π±Ρ‹Π²Π°Ρ‚ΡŒ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ созданный Ρ„ΠΈΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ элСмСнт Π΄Π΅Ρ€Π΅Π²Π° (Ρ‡Ρ‚ΠΎ ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚ SetExpanded с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ isExpanded, Ρ€Π°Π²Π½Ρ‹ΠΌ True).

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Π½Π΅ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚Ρ‹ΠΉ Π΅Ρ‰Π΅ элСмСнт Π΄Π΅Ρ€Π΅Π²Π° помСчаСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ поля Node. Data, Ρ€Π°Π²Π½Ρ‹ΠΌ 0. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт, содСрТимоС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΡƒΠΆΠ΅ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½ΠΎ с диска, помСчаСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ поля Node. Data, Ρ€Π°Π²Π½Ρ‹ΠΌ 1. Для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ, Π±Ρ‹Π»ΠΎ Π»ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½ΠΎ содСрТимоС ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ элСмСнту Π΄Π΅Ρ€Π΅Π²Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ простая функция IsExpanded (листинг 4.29).

...

Листинг 4.29.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°, Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½ΠΎ Π»ΠΈ содСрТимоС ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°

function TForm3.IsExpanded(Node: TTreeNode): Boolean;

begin

IsExpanded := Integer(Node.Data) = 1;

end;

Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° содСрТимого ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° ΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… элСмСнтов Π² Π΄Π΅Ρ€Π΅Π²Π΅ происходят ΠΏΡ€ΠΈ Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π½ΠΈΠΈ элСмСнта Π΄Π΅Ρ€Π΅Π²Π° (листинг 4.30).

...

Листинг 4.30.

Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° содСрТимого ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°

procedure TForm3.treeExpanding(Sender: TObject; Node: TTreeNode;

var AllowExpansion: Boolean);

var

strFolder: String;

subfolders: TStrings;

i: Integer;

item: TTreeNode;

begin

if not IsExpanded(Node) then

//Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π½ΡƒΠΆΠ½ΠΎ Π·Π°Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ

SetExpanded(Node, True)

else

begin

//Бписок ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² для Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°

//Π±Ρ‹Π» составлСн Ρ€Π°Π½Π΅Π΅

AllowExpansion := True;

Exit;

end;

//БоставлСниС списка ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ²

strFolder := NodeToFolderPath( Node );

subfolders := TStringList.Create;

if SearchInFolder(strFolder, \'*\', FILE_ATTRIBUTE_DIRECTORY,

subfolders)

then begin

//Π”ΠΎΠ±Π°Π²ΠΈΠΌ Π² Π΄Π΅Ρ€Π΅Π²ΠΎ элСмСнты, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°ΠΌ

for i := 0 to subfolders.Count – 1 do

begin

item := tree.Items.AddChild(Node, subfolders[i]);

item.ImageIndex := 1;

item.SelectedIndex := 2;

SetExpanded(item, False); //Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π΅Ρ‰Π΅

//Π½Π΅ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½ΠΎ

end;

AllowExpansion := True;

end

else

//Π’ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ Π½Π΅Ρ‚ ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ²

AllowExpansion := False;

subfolders.Free;

end;

Π’ листингС 4.30 для опрСдСлСния ΠΏΡƒΡ‚ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°, Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ элСмСнтом Π΄Π΅Ρ€Π΅Π²Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция NodeToFolderPath. РСализуСтся ΠΎΠ½Π° совсСм нСслоТно (листинг 4.31).

...

Листинг 4.31.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΏΡƒΡ‚ΠΈ элСмСнта Π΄Π΅Ρ€Π΅Π²Π°

function TForm3.NodeToFolderPath(Node: TTreeNode): String;

var

path: String;

item: TTreeNode;

begin

item := Node;

while item <> nil do

begin

if path <> \'\' then

path := item.Text + \'\\' + path

else

path := item.Text;

item := item.Parent;

end;

NodeToFolderPath := path;

end;

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ здСсь ΠΏΡ€ΠΈΠΌΠ΅Ρ€ построСния Π΄Π΅Ρ€Π΅Π²Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ³ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ΠΏΡ€ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΆΠ΅ Π½ΡƒΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ Samples (Delphi 7) ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹, прСкрасно подходящиС для построСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ для просмотра содСрТимого Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ физичСски ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… дисков: ΠΏΠΎΠ»Π½ΠΎΠ΅ Π΄Π΅Ρ€Π΅Π²ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² SheLLTreeView (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ элСмСнт Π Π°Π±ΠΎΡ‡ΠΈΠΉ стол ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ), список основных элСмСнтов систСмы ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² (ShellComboBox), Π° Ρ‚Π°ΠΊΠΆΠ΅ элСмСнт управлСния для просмотра содСрТимого ΠΏΠ°ΠΏΠΊΠΈ (SheLLListView).

4.3. Π€Π°ΠΉΠ»Ρ‹

Π’ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Π³Π»Π°Π²Ρ‹ рассмотрим Ρ‚Ρ€ΠΈ нСслоТных ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ: ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° (с ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ Ρ…ΠΎΠ΄Π° копирования Π² ProgressBar), ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π·Π½Π°Ρ‡ΠΊΠΎΠ², ассоциированных с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ, ΠΈ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π·Π½Π°Ρ‡ΠΊΠΎΠ² ΠΈΠ· Π•Π₯Е– ΠΈ DLL-Ρ„Π°ΠΉΠ»ΠΎΠ².

ΠšΡ€Π°ΡΠΈΠ²ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π°

Казалось Π±Ρ‹, Ρ‡Ρ‚ΠΎ особСнного Π² ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ копирования большого Ρ„Π°ΠΉΠ»Π° с ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ процСсса: Ρ‡ΠΈΡ‚Π°ΠΉ Ρ„Π°ΠΉΠ» порциями, записывай ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π² Ρ„Π°ΠΉΠ» назначСния, ΠΏΠΎΠΏΡƒΡ‚Π½ΠΎ показывая Π² ProgressBar ΠΈΠ»ΠΈ Π³Π΄Π΅-Ρ‚ΠΎ Π΅Ρ‰Π΅ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ объСма пСрСписанной ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΊ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ Ρ„Π°ΠΉΠ»Π°. Однако Π·Π°Ρ‡Π΅ΠΌ Ρ‚Π°ΠΊΠΈΠ΅ слоТности? Π’Π΅Π΄ΡŒ Ρƒ API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CopyFi 1Π΅, ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‰Π΅ΠΉ простоС ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π°, Π΅ΡΡ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ – функция CopyFileEx, Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ встроСна ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° отобраТСния процСсса копирования (ΠΈ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ это). Π’ΠΎΡ‚ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CopyFileEx:

...

function CopyFileEx(lpExistingFileName, lpNewFileName: PChar;

lpProgressRoutine: TFNProgressRoutine; lpData: Pointer;

pbCancel: PBool; dwCopyFlags: DWORD): BOOL; stdcall;

Π˜Ρ‚Π°ΠΊ, ΠΊΡ€ΠΎΠΌΠ΅ ΠΏΡƒΡ‚ΠΈ исходного ΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»ΠΎΠ², Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ„Π»Π°Π³ΠΎΠ² (послСдний ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€), функция ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ряд Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²: адрСс Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° (IpProgressRoutine), ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π΄Π°Π½Π½Ρ‹Π΅, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° (lpData), Π° Ρ‚Π°ΠΊΠΆΠ΅ адрСс ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ‚ΠΈΠΏΠ° BOOL (pbCancel), ΠΏΡ€ΠΈ установкС значСния ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π² True ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ прСрываСтся.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CopyFileEx Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 4.32. Π—Π΄Π΅ΡΡŒ подразумСваСтся, Ρ‡Ρ‚ΠΎ ΠΊΠ½ΠΎΠΏΠΊΠ° cmbCopy ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ°ΠΊ для запуска, Ρ‚Π°ΠΊ ΠΈ для остановки процСсса копирования. Π’Π°ΠΊΠΆΠ΅ Π½Π° Ρ„ΠΎΡ€ΠΌΠ΅ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ элСмСнты управлСния:

β€’ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ pbCopyProgress, Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΡ‚ 0 Π΄ΠΎ 100;

β€’ тСкстовоС ΠΏΠΎΠ»Π΅ txtFrom с ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°;

β€’ тСкстовоС ΠΏΠΎΠ»Π΅ txtTo с ΠΈΠΌΠ΅Π½Π΅ΠΌ Ρ„Π°ΠΉΠ»Π° назначСния.

...

Листинг 4.32.

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

procedure TForm1.cmbCopyClick(Sender: TObject);

begin

if cmbCopy.Caption = \'ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ\' then

begin

//ЗапускаСм ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

progress := pbCopyProgress; //НастроСн ΠΎΡ‚ 0 Π΄ΠΎ 100 %

bCancelCopy := False;

cmbCopy.Caption := \'ΠžΡ‚ΠΌΠ΅Π½Π°\

if CopyFileEx(PAnsiChar(txtFrom.Text), PAnsiChar(txtTo.Text),

Addr(CopyProgressFunc), nil, Addr(bCancelCopy),

COPY_FILE_FAIL_IF_EXISTS) = False

then

MessageBox(Handle, \'НС удаСтся ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»\',

\'ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅\', MB_ICONEXCLAMATION);

end

else

begin

//ΠžΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ процСсс копирования

bCancelCopy := True;

cmbCopy.Caption := \'ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ\

end;

end;

Из листинга 4.32 ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² качСствС значСния послСднСго ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CopyFileEx ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ константу COPY_FILE_FAIL_IF_EXISTS (функция Π²Π΅Ρ€Π½Π΅Ρ‚ False, Ссли Ρ„Π°ΠΉΠ» назначСния ΡƒΠΆΠ΅ сущСствуСт, ΠΈ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅).

На самом Π΄Π΅Π»Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° dwCopyFlags Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CopyFileEx ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠ΅ΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ COPY_FILE_FAIL_IF_EXISTS И COPY_FILE_RES TARTABLE, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ прСдставляСт собой Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ Ρ„Π»Π°Π³. ПослСднСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² случаС прСрывания ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ. Ѐункция CopyFileEx Π² этом случаС сохраняСт Π² Ρ„Π°ΠΉΠ»Π΅ назначСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, Π΄ΠΎΡΡ‚Π°Ρ‚ΠΎΡ‡Π½ΡƒΡŽ для возобновлСния процСсса копирования.

Π’ листингС 4.32 измСняСтся пСрСмСнная progress – глобальная пСрСмСнная-ссылка Π½Π° TProgressBar, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ bCancelCopy, адрСс ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ пСрСдаСтся Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ CopyFileEx, Ρ‚Π°ΠΊΠΆΠ΅ объявлСна глобальной (Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… модуля).

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, рассмотрим Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°, ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‰ΡƒΡŽ Π² нашСм случаС ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ…ΠΎΠ΄Π° копирования Π½Π° ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π΅ (листинг 4.33).

...

Листинг 4.33.

Ѐункция, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π°Ρ Ρ…ΠΎΠ΄ копирования Ρ„Π°ΠΉΠ»Π°

function CopyProgressFunc( TotalFileSize: Int64;

TotalBytesTransferred: Int64;

StreamSize: Int64;

StreamBytesTransferred: Int64;

dwStreamNumber: DWORD;

dwCallbackReason: DWORD;

hSourceFile: THandle;

hDestinationFile: THandle;

lpData: Pointer): DWORD; stdcall;

begin

progress.Position := 100 * TotalBytesTransferred div

TotalFileSize;

Application.ProcessMessages; //Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ «зависал»

//интСрфСйс прилоТСния

CopyProgressFunc := PROGRESS_CONTINUE;

end;

ΠŸΡƒΡΡ‚ΡŒ вас Π½Π΅ смущаСт большоС количСство ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² функцииБоруРгодгСззЕипс. ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈΡ… всС Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ (Π½ΠΎ ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹), хотя Π½ΠΈΡ‡Π΅Π³ΠΎ слоТного здСсь Π½Π΅Ρ‚. Π’ листингС 4.33 использованиС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ простым (Π½Π° наш взгляд) ΠΈ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: значСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² TotalBytesTransferred ΠΈ TotalFileSize ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ для опрСдСлСния Π΄ΠΎΠ»ΠΈ скопированной ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ.

Π’ листингС 4.33 Π²Ρ‹Π·ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ProcessMessages ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Application ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ функция CopyFileEx Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ (ΠΈΠ»ΠΈ прСрывания) копирования. Π˜Π½Π°Ρ‡Π΅ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π±Ρ‹ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ для копирования ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ, услоТняя листинг ΠΈ отвлСкая вас ΠΎΡ‚ Π³Π»Π°Π²Π½ΠΎΠΉ Ρ†Π΅Π»ΠΈ этого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ нСсколько слов ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ CopyProgressFunc значСниях (Π² нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… доступных Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ). Бписок цСлочислСнных констант, значСния ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ функция CopyProgressFunc, Ρ‚Π°ΠΊΠΎΠ²:

β€’ PROGRESS_CONTINUE – ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ процСсс копирования;

β€’ PROGRESS_CANCEL – ΠΎΡ‚ΠΌΠ΅Π½Π° копирования;

β€’ PROGRESS_STOP – остановка копирования (ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ);

β€’ PROGRESS_QUIET – ΠΏΡ€ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π΅ этого значСния систСма пСрСстаСт Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ CopyProgressFunc.

Π’Π½Π΅ΡˆΠ½ΠΈΠΉ Π²ΠΈΠ΄ Ρ„ΠΎΡ€ΠΌΡ‹ ΠΏΡ€ΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ большого Ρ„Π°ΠΉΠ»Π° приводится Π½Π° рис. 4.9.

Рис. 4.9. ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ большого Ρ„Π°ΠΉΠ»Π°

Волько Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π·Π°Π±Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ прилоТСния ΠΈΠ»ΠΈ Π² ΠΏΡ€ΠΎΡ‡ΠΈΡ… экстрСнных ситуациях. Π’Π°ΠΊ, Ссли Π½Π΅ ΠΏΡ€Π΅Π΄ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ события CloseQuery для Ρ„ΠΎΡ€ΠΌΡ‹ (рис. 4.9), Ρ‚ΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ Π΅Π΅ Π² Ρ…ΠΎΠ΄Π΅ копирования ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ способом Π½Π΅ удастся. Π—Π°Ρ‚ΠΎ послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ копирования (ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠžΡ‚ΠΌΠ΅Π½Π°) Ρ„ΠΎΡ€ΠΌΠ° Ρ‚ΡƒΡ‚ ΠΆΠ΅ исчСзнСт. Π‘Ρ‚Ρ€Π°Π½Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, Π½Π΅ ΠΏΡ€Π°Π²Π΄Π° Π»ΠΈ? Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ Π±ΠΎΠ»Π΅Π΅-ΠΌΠ΅Π½Π΅Π΅ Π°Π΄Π΅ΠΊΠ²Π°Ρ‚Π½ΠΎΠΉ Ρ€Π΅Π°ΠΊΡ†ΠΈΠΈ Π½Π° Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Ρ„ΠΎΡ€ΠΌΡ‹ приводится Π² листингС 4.34.