//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include <shellapi.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
FileListBox1->MultiSelect = true;
FileListBox2->MultiSelect = true;
FileListBox1->DragMode = dmAutomatic;
FileListBox2->DragMode = dmAutomatic;
ActiveApp = this->WindowProc;
this->WindowProc = GetActiveApp;
}
//---------------------------------------------------------------------------
/* Funkcja przechwytująca komunikaty WindowProc - tutaj komunikat o aktywacji okna ma za zadanie odświeżać zawartość TFielListBox, gdy zmiany w zawartości katalogów zaszły poza programe, czyli np. kopiujesz w programie do katalogu [ c:\moje pliki jakiś ] plik, a potem w 'Eksploratorze Windows' usuwasz ten plik. Potem wracasz do swojego programu, a plik mimo iż został usunięty wciąż widnieje na liście TFileListBox. Ta funkcja eliminuje ten błąd odświeżając TFileList, gdy aktywujesz okno programu */
void __fastcall TForm1::GetActiveApp(TMessage &Msg)
{
/* Msg.WParam == TRUE - odnosi się do aktywacji, FALSE - do dezaktywacji, bez tego warunku obsługiwane były by zarówno aktywacja i dezaktywacja */
if(Msg.Msg == WM_ACTIVATEAPP && Msg.WParam == TRUE)
{
FileListBox1->Update();
FileListBox2->Update();
}
ActiveApp(Msg);
}
//---------------------------------------------------------------------------
void CopyDirectory(AnsiString oldDir, AnsiString newDir)
{
SHFILEOPSTRUCTA fos;
fos.hwnd = Application->Handle;
fos.wFunc = FO_COPY;
fos.pFrom = (oldDir + "\0").c_str();
fos.pTo = (newDir + "\0").c_str();
fos.fFlags = 0;
SHFileOperationA(&fos);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CopyFileListBox(TFileListBox *FromFileListBox,
TFileListBox *ToFileListBox)
{
String oldFile = FromFileListBox->FileName;
int count = -1, selCount = FromFileListBox->SelCount;
if(FromFileListBox->ItemIndex < 0)
{
ShowMessage("Nie wybrano pliku!");
return;
}
if(FromFileListBox->Directory == ToFileListBox->Directory)
{
ShowMessage("Nie można kopiować pliku na ten sam plik!");
return;
}
do
{
if(selCount > 1)
{
++count;
oldFile = FromFileListBox->Directory + "\\" +
FromFileListBox->Items->Strings[count];
if(!FromFileListBox->Selected[count]) continue;
}
if(FileGetAttr(oldFile) & faDirectory)
{
oldFile = StringReplace(oldFile, "[", "", TReplaceFlags() << rfReplaceAll);
oldFile = StringReplace(oldFile, "]", "", TReplaceFlags() << rfReplaceAll);
String dotDir = ExtractFileName(oldFile);
if(DirectoryExists(oldFile) && dotDir != "." && dotDir != "..")
CopyDirectory(oldFile, ToFileListBox->Directory);
}
else
{
String newFile = ToFileListBox->Directory + "\\" + ExtractFileName(oldFile);
if(FileExists(newFile))
{
int IDx = Application->MessageBox( ("Ten folder zawiera już plik o nazwie: '"
+ ExtractFileName(oldFile) + "'\n\nCzy chcesz zastąpić istniejący plik?").c_str(),
L"Kopiowanie plików", MB_YESNO | MB_ICONQUESTION);
if(IDx == ID_YES) CopyFile( oldFile.c_str(), newFile.c_str(), false );
}
else
CopyFile( oldFile.c_str(), newFile.c_str(), true );
}
}while(FromFileListBox->Items->Count - 1 > count && selCount > 1);
ToFileListBox->Update() ; //odświeżam listę
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FDragDrop(TObject *Source, TFileListBox *FListBox)
{
CopyFileListBox(dynamic_cast<TFileListBox *>(Source), FListBox);
}
// EVENTS ---------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender) /* Button1 Event OnClick */
{
CopyFileListBox(FileListBox1, FileListBox2);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FileListBox1DragOver(TObject *Sender, TObject *Source,
int X, int Y, TDragState State, bool &Accept) /* FileListBox1 Event OnDragOver */
{
Accept = Source->ClassNameIs("TFileListBox");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FileListBox2DragOver(TObject *Sender, TObject *Source,
int X, int Y, TDragState State, bool &Accept) /* FileListBox2 Event OnDragOver */
{
Accept = Source->ClassNameIs("TFileListBox");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FileListBox1DragDrop(TObject *Sender, TObject *Source,
int X, int Y) /* FileListBox1 Event OnDragDrop */
{
FDragDrop(Source, FileListBox1);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FileListBox2DragDrop(TObject *Sender, TObject *Source,
int X, int Y) /* FileListBox2 Event OnDragDrop */
{
FDragDrop(Source, FileListBox2);
}
//---------------------------------------------------------------------------