Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° Π΄Π΅ΡΠ΅Π²Π°
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.