if(hGlobal)
MoveMemory(&lngEffect,hGlobal, 4);
if((lngEffect & DROPEFFECT_COPY) == DROPEFFECT_COPY)
FileAndFolderOperation(frombuf,tobuf , FO_COPY);
if((lngEffect & DROPEFFECT_MOVE) == DROPEFFECT_MOVE)
FileAndFolderOperation(frombuf,tobuf , FO_MOVE);
UpdateAll(false);
}
CloseClipboard();
}
void TForm1::CopyFileToClipboard(bool Copy)
{
if(CurrentDir=="") return;
char *frombuf;
unsigned int uDropEffect, uBufLen;
DROPFILES dropFiles;
unsigned int uGblLen,uDropFilesLen;
HGLOBAL hGblFiles,hGblEffect;
char *szData,*szFileList;
DWORD *dwDropEffect;
uDropEffect=RegisterClipboardFormat("Preferred DropEffect"); //Регистрацияформата
//дляуказаниятипакопирования
hGblEffect=GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE,sizeof(DWORD));
dwDropEffect=(DWORD*)GlobalLock(hGblEffect); //Выделениепамятиподхранение
if(Copy) //инфы о виде перемещения
*dwDropEffect=DROPEFFECT_COPY; //Записьэтойинфы
else
*dwDropEffect=DROPEFFECT_MOVE;
GlobalUnlock(hGblEffect); //Разлочиваниепамяти
uDropFilesLen=sizeof(DROPFILES); //Заполнение структуры содержащей инфу
dropFiles.pFiles =uDropFilesLen; //о строке с именами перемещаемых файлов
dropFiles.pt.x=0;
dropFiles.pt.y=0;
dropFiles.fNC =FALSE;
dropFiles.fWide =FALSE;//TRUE;
if(ListView1->ItemFocused==NULL)
{
if(TreeView1->Selected!=NULL) //Есливфокусенаходится treeview
if(TreeView1->Selected->Level>1)
{
AnsiString sourcestr=*((AnsiString *)(TreeView1->Selected->Data));
sourcestr.SetLength(sourcestr.Length()-1);
frombuf=new char[MAX_PATH+1];
strcpy(frombuf,sourcestr.c_str());
finstr(frombuf);
}
else
return; //Выход в том случае если в фокусе Диск или Мой компьютер
}
else if((ListView1->Selected)!=NULL)
PrepareBufForOperationInListView(frombuf);
uBufLen=lengthfinstr(frombuf);
uGblLen=uDropFilesLen+uBufLen+2;
hGblFiles= GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE, uGblLen);
szData=(char*)GlobalLock(hGblFiles);
memcpy(szData,&dropFiles,uDropFilesLen);
szFileList=szData+uDropFilesLen;
memcpy(szFileList,frombuf,uBufLen);
/*MultiByteToWideChar(CP_ACP,MB_COMPOSITE,
frombuf,uBufLen,(WCHAR *)szFileList,uBufLen*2+8);*/
GlobalUnlock(hGblFiles);
if( OpenClipboard(NULL) )
{
EmptyClipboard();
SetClipboardData( CF_HDROP, hGblFiles );
SetClipboardData(uDropEffect,hGblEffect);
CloseClipboard();
}
}
void TForm1::CreateFol() //Создаетпапкувтекущемкаталоге
{
if(CurrentDir=="") return;
AnsiString c="Новая папка",dir; //Производит поиск отсутствующей папки
for(int i=1;(GetFileAttributes((dir=CurrentDir+c+i).c_str()))!=-1;i++);
if(ListView1->Selected!=NULL) //Еслиестьвыделенныеузлы
for(int i=0;i<ListView1->Items->Count;i++) //отменяемвыделение
ListView1->Items->Item[i]->Selected=false;
if(CreateDir(dir)) //Создаетее
{
TSearchRec sr;
FindFirst(dir,faDirectory,sr);
TListItem *p=AddItemInListView(sr,ExtractFilePath(dir));
ListView1->ItemFocused=p;
p->Selected=true;
p->EditCaption();
}
UpdateAll(false);
}
//*************************************************************************
//------------------------------------------------------------------------
//***********************************************************************
__fastcall TForm1::TForm1(TComponent* Owner) //Конструкторформы
: TForm(Owner)
{
ShortDateFormat="dd/mm/yy";
DateSeparator = '/';
TimeSeparator=':';
ShortTimeFormat="h:nn";
AnsiString *a=new AnsiString("");
TreeView1->Items->Item[0]->Data=a;
head=TreeView1->Items->Item[0]; //Сохранениекорня
GetDrives(); //Загрузкадисков
ShowDrives(); //Отображениев treview
TreeView1->AlphaSort();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TreeView1Expanding(TObject *Sender,
TTreeNode *Node, bool &AllowExpansion)//Событие - открытиеузла
{
DragnDrop=false; //Запрещениеперемещения
TreeView1->Items->BeginUpdate();
tpItem=TreeView1->TopItem; //Сохранение верхнего узла
if(!CheckExpandedChild(Node)) //Если ни один из потомков не расширен
ViewChild(Node);
TreeView1->AlphaSort(); //Сортировка
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TreeView1Compare(TObject *Sender, TTreeNode *Node1,
TTreeNode *Node2, int Data, int &Compare) //Функциясравнения
{
if(Node1->Level==1) //Дляупорядочивания treeview
Compare=Node1->Text[Node1->Text.Length()-2]>Node1->Text[Node1->Text.Length()-2]?1:-1;
else
Compare=Node1->Text.AnsiCompare(Node2->Text);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TreeView1Expanded(TObject *Sender, TTreeNode *Node)
{ //Сообщение об окончании
TTreeNode * temp=TreeView1->TopItem; //Раскрытия списка
TreeView1->TopItem=tpItem; //Проверка выхода конца открытой ветви за экран
if((TreeView1->GetNodeAt(TreeView1->Width/2,TreeView1->ClientHeight-1))!=NULL)
{ //Если это так то сдвигаем всю ветвь вверх автоматом
int p=(TreeView1->GetNodeAt(TreeView1->Width/2,TreeView1->ClientHeight-1))->AbsoluteIndex;
if(p<=Node->GetLastChild()->AbsoluteIndex) TreeView1->TopItem=temp;
} //если нет то ставим первым сохранненый ранее первый элемент
TreeView1->Items->EndUpdate();
DragnDrop=true; //Разрешениеперемещения
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TreeView1Collapsing(TObject *Sender,
TTreeNode *Node, bool &AllowCollapse) //Событие - передсвертыванием
{
DragnDrop=false;
TreeView1->Items->BeginUpdate();
if(!CheckExpandedChild(Node)) //Если ветвь ни одного из потомков не расширена
DeleteChild(Node); //Удалениедетейдетей
TreeView1->Items->EndUpdate();
DragnDrop=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TreeView1Editing(TObject *Sender, TTreeNode *Node,
bool &AllowEdit)
{
if(Node->Level<2) AllowEdit=false; //Запрет на редактирование Мой комп и названий дисков
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ListView1Compare(TObject *Sender, TListItem *Item1,
TListItem *Item2, int Data, int &Compare)
{
bool temp1=false, temp2=false;
if(((FileGetAttr(*((AnsiString *)Item1->Data))) & faDirectory)!=0)
temp1=true;
if(((FileGetAttr(*((AnsiString *)Item2->Data))) & faDirectory)!=0)
temp2=true;
AnsiString s1,s2;
switch(ColumnToSort)
{
case 0:
if(temp1==temp2)
Compare=(Item1->Caption).AnsiCompare(Item2->Caption);
else
Compare=temp2?1:-1;
break;
case 2:
if(temp1==temp2)
Compare=(Item1->SubItems->Strings[1]).AnsiCompare(Item2->SubItems->Strings[1]);
else
Compare=temp2?1:-1;
break;
case 1:
if(temp1) s1="0 ";
else s1= Item1->SubItems->Strings[0];
if(temp2) s2="0 ";
else s2= Item2->SubItems->Strings[0];
s1=s1.SubString(1,s1.Pos(" ")-1);
s2=s2.SubString(1,s2.Pos(" ")-1);
Compare=StrToInt(s1)>StrToInt(s2)?1:-1;
break;
case 3:
TDateTime dt1=StrToDateTime(Item1->SubItems->Strings[2]);
TDateTime dt2=StrToDateTime(Item2->SubItems->Strings[2]);
if(temp1==temp2)
Compare=dt1>dt2?1:-1;
else
Compare=temp2?1:-1;
break;
}
Compare*=Direct;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ListView1DblClick(TObject *Sender)
{ //Двойнойкликна ListView
OpenFileOrFolder();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ListView1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if(DragnDrop && Button == mbLeft) //Событие по нажатию мыши и начало перемещения
{
if(Shift.Contains(ssCtrl))
type_file_operation_drag_drop=FO_COPY;
else
type_file_operation_drag_drop=FO_MOVE;
ListView1->BeginDrag(false,5);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TreeView1DragOver(TObject *Sender, TObject *Source,
int X, int Y, TDragState State, bool &Accept)
{ //Процессперетаскивания
Accept=(TreeView1->GetNodeAt(X,Y)!=NULL) && (Source->ClassNameIs("TListView") || Source->ClassNameIs("TTreeView"));
} //Даем возможность положить объект если есть куда класть и объект из list и tree
//---------------------------------------------------------------------------
void __fastcall TForm1::ListView1DragOver(TObject *Sender, TObject *Source,
int X, int Y, TDragState State, bool &Accept)
{
TListItem *p=ListView1->GetItemAt(X,Y);
Accept=(p!=NULL) && ((FileGetAttr(*((AnsiString *)(p->Data))) & faDirectory) !=0) &&
(Source->ClassNameIs("TListView") || Source->ClassNameIs("TTreeView"));
//Даем возможность положить если есть куда если это папка и объект из list или tree
if((StyleListView==vsIcon || StyleListView==vsSmallIcon) && !Accept && p==NULL)
Accept=true;
//в случае значков даем возможность положить значок в пустое место
}
//---------------------------------------------------------------------------
void strcat0(char * &dest,char *source)
{ //Объединение двуч строк с оставлением между ними
for(;(*dest)!='\0';dest++); //нулевогосимвола
for(dest++;(*source!='\0');dest++,source++)
*dest=*source;
*dest='\0';
}
void finstr(char *dest)
{
for(;(*dest)!='\0';dest++);
dest++;
*dest='\0';
}
unsigned int lengthfinstr(char *dest)
{
unsigned int l=0;
do
{
for(;(*dest)!='\0';dest++,l++);
dest++;
l++;
}
while((*dest)!='\0');
return l+1;
}
void __fastcall TForm1::ListView1DragDrop(TObject *Sender, TObject *Source,
int X, int Y)
{
int operation=type_file_operation_drag_drop;
if(ListView1->GetItemAt(X,Y)==NULL)
{ //Если перенос делается на пустое место
ListView1->Selected->Position=Point(X,Y); //просто меняем место значка и выходим
return;
}
if(Source->ClassNameIs("TListView")) //Если объект перетащен из listview
{ //извлекаем нужные папки и делаем операцию
char *frombuf, tobuf[MAX_PATH+1]={'\0'};
TListView *sender=(TListView *)Sender;
PrepareBufForOperationInListView(frombuf);
AnsiString senderstr=*((AnsiString *)(sender->GetItemAt(X,Y)->Data));//+ExtractFileName(*((AnsiString *)(source->Selected->Data)));
strcpy(tobuf,senderstr.c_str()); //Вызываем функции и указываем операцию
FileAndFolderOperation(frombuf,tobuf,operation);
}
if(Source->ClassNameIs("TTreeView"))
{
char frombuf[MAX_PATH+1]={'\0'}, tobuf[MAX_PATH+1]={'\0'};
TTreeView *source=(TTreeView *)Source;
TListView *sender=(TListView *)Sender;
AnsiString sourcestr=*((AnsiString *)(source->Selected->Data));
AnsiString senderstr=*((AnsiString *)(sender->GetItemAt(X,Y)->Data));//+ExtractFileName(*((AnsiString *)(source->Selected->Data)));
sourcestr.SetLength(sourcestr.Length()-1);
strcpy(frombuf,sourcestr.c_str());
strcpy(tobuf,senderstr.c_str());
FileAndFolderOperation(frombuf,tobuf,operation);
}
UpdateAll(false); //Обновление
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TreeView1DragDrop(TObject *Sender, TObject *Source,
int X, int Y) //Окончание перетаскивания
{
int operation=type_file_operation_drag_drop;
if(Source->ClassNameIs("TListView")) //Еслиобъектперетащениз listview
{ //извлекаем нужные папки и делаем операцию
char *frombuf, tobuf[MAX_PATH+1]={'\0'};
TTreeView *sender=(TTreeView *)Sender;
PrepareBufForOperationInListView(frombuf);
AnsiString senderstr=*((AnsiString *)(sender->GetNodeAt(X,Y)->Data));//+ExtractFileName(*((AnsiString *)(source->Selected->Data)));
strcpy(tobuf,senderstr.c_str()); //Вызываем функции и указываем операцию
FileAndFolderOperation(frombuf,tobuf,operation);
}
if(Source->ClassNameIs("TTreeView"))
{
TTreeView *source=(TTreeView *)Source;
TTreeView *sender=(TTreeView *)Sender;
char frombuf[MAX_PATH+1]={'\0'}, tobuf[MAX_PATH]={'\0'};
AnsiString sourcestr=*((AnsiString *)(source->Selected->Data));
AnsiString senderstr=*((AnsiString *)(sender->GetNodeAt(X,Y)->Data));//+ExtractFileName(*((AnsiString *)(source->Selected->Data)));
sourcestr.SetLength(sourcestr.Length()-1);
strcpy(frombuf,sourcestr.c_str());
strcpy(tobuf,senderstr.c_str());
FileAndFolderOperation(frombuf,tobuf,operation);
}
UpdateAll(false); //Обновление
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TreeView1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if(DragnDrop && Button == mbLeft) //начало перетаскивания по нажатию на treeview
{
if(Shift.Contains(ssCtrl))
type_file_operation_drag_drop=FO_COPY;
else
type_file_operation_drag_drop=FO_MOVE;
TreeView1->BeginDrag(false,5);
}
}
void __fastcall TForm1::TreeView1Edited(TObject *Sender, TTreeNode *Node,
AnsiString &S)
{
S=RenameFileOrFolder(S);
UpdateTreeView(false);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ListView1Edited(TObject *Sender, TListItem *Item,
AnsiString &S)
{
S=RenameFileOrFolder(S);
UpdateTreeView(false);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::NRenameClick(TObject *Sender)
{
if(ListView1->ItemFocused==NULL)
{
if(TreeView1->Selected!=NULL)
if(TreeView1->Selected->Level>1)
TreeView1->Selected->EditText();
}
else
if((ListView1->Selected)!=NULL)
ListView1->Selected->EditCaption();
}
void __fastcall TForm1::TreeView1ContextPopup(TObject *Sender,