BOOL fNC; // is it on NonClient area
// and pt is in screen coords
BOOL fWide; // WIDE character switch
};
class TForm1 : public TForm
{
__published: // IDE-managed Components
TMainMenu *MainMenu1;
TMenuItem *NFile;
TTreeView *TreeView1;
TSplitter *Splitter1;
TListView *ListView1;
TImageList *ImageList1;
TImageList *ImageList2;
TMenuItem *NProperty;
TImageList *ImageList3;
TImageList *ImageList4;
TControlBar *ControlBar1;
TToolBar *TBMain;
void __fastcall TreeView1Expanding(TObject *Sender,
TTreeNode *Node, bool &AllowExpansion);
void __fastcall TreeView1Compare(TObject *Sender, TTreeNode *Node1,
TTreeNode *Node2, int Data, int &Compare);
void __fastcall TreeView1Expanded(TObject *Sender,
TTreeNode *Node);
void __fastcall TreeView1Collapsing(TObject *Sender,
TTreeNode *Node, bool &AllowCollapse);
void __fastcall TreeView1Editing(TObject *Sender, TTreeNode *Node,
bool &AllowEdit);
void __fastcall ListView1Compare(TObject *Sender, TListItem *Item1,
TListItem *Item2, int Data, int &Compare);
void __fastcall ListView1DblClick(TObject *Sender);
void __fastcall ListView1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y);
void __fastcall TreeView1DragOver(TObject *Sender, TObject *Source,
int X, int Y, TDragState State, bool &Accept);
void __fastcall TreeView1DragDrop(TObject *Sender, TObject *Source,
int X, int Y);
void __fastcall TreeView1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y);
void __fastcall NPropertyClick(TObject *Sender);
void __fastcall NOpenClick(TObject *Sender);
void __fastcall NExitClick(TObject *Sender);
void __fastcall NDeleteClick(TObject *Sender);
void __fastcall TBDeleteClick(TObject *Sender);
void __fastcall TBPropertyClick(TObject *Sender);
void __fastcall TBExitClick(TObject *Sender);
void __fastcall NViewClick(TObject *Sender);
void __fastcall NPanelClick(TObject *Sender);
void __fastcall NStatusBarClick(TObject *Sender);
void __fastcall TBUpClick(TObject *Sender);
void __fastcall TreeView1Edited(TObject *Sender, TTreeNode *Node,
AnsiString &S);
void __fastcall ListView1Edited(TObject *Sender, TListItem *Item,
AnsiString &S);
void __fastcall NRenameClick(TObject *Sender);
void __fastcall TBRenameClick(TObject *Sender);
void __fastcall NIconClick(TObject *Sender);
void __fastcall NSmallIconClick(TObject *Sender);
void __fastcall NListClick(TObject *Sender);
void __fastcall NReportClick(TObject *Sender);
void __fastcall ListView1DragOver(TObject *Sender, TObject *Source,
int X, int Y, TDragState State, bool &Accept);
void __fastcall ListView1DragDrop(TObject *Sender, TObject *Source,
int X, int Y);
void __fastcall TBUpdateClick(TObject *Sender);
void __fastcall TreeView1Click(TObject *Sender);
void __fastcall TBPasteClick(TObject *Sender);
void __fastcall TBCopyClick(TObject *Sender);
void __fastcall TBCutClick(TObject *Sender);
void __fastcall NUpdateClick(TObject *Sender);
void __fastcall NCutClick(TObject *Sender);
void __fastcall NPasteClick(TObject *Sender);
void __fastcall NCopyClick(TObject *Sender);
void __fastcall NSelectAllClick(TObject *Sender);
void __fastcall ListView1ColumnClick(TObject *Sender,
TListColumn *Column);
void __fastcall NSort0Click(TObject *Sender);
void __fastcall NCreateFolderClick(TObject *Sender);
void __fastcall NFileClick(TObject *Sender);
void __fastcall NEditClick(TObject *Sender);
void __fastcall ListView1ContextPopup(TObject *Sender,
TPoint &MousePos, bool &Handled);
void __fastcall TreeView1ContextPopup(TObject *Sender,
TPoint &MousePos, bool &Handled);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
void ShowDrives();
void ViewChild(TTreeNode *child);
void DeleteChild(TTreeNode *Node);
void ViewFailAndFolderInListView(AnsiString dir);
void ExpandTreeForFile(AnsiString FileName);
int FileAndFolderOperation(char *frombuf, char *tobuf, unsigned int operation);
TTreeNode* AddChildInNodeTree(TTreeNode *Node, AnsiString Dir);
TListItem *AddItemInListView(TSearchRec sr,AnsiString dir);
void ViewProperty();
void OpenFileOrFolder(); //Открыть в Listview файл или папку
void DeleteFileOrFolder();
void PrepareBufForOperationInListView(char * &frombuf);
AnsiString RenameFileOrFolder(AnsiString);
void RecursTree(TTreeNode *node,bool); //Рекурсивное обновление дерева
voidUpdateTreeView(bool); //Функция запуска рекурсивного обновления дерева
voidUpdateListView(bool); //Функция обновления listview
void UpdateAll(bool);
void PasteFileFromClipboard(); //Вставить из буфера
void CopyFileToClipboard(bool); //Копировать файлы в буфер
void CreateFol();
void UpdateLabel();
} ;
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
1.2. Листинг Unit1.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <shellapi.h>
#include "Unit1.h"
#include <winbase.h>
#include <vector.h>
#include "PropertyFile.h"
#include "PropertyDrive.h"
#include <ole2.h>
#define CFSTR_PREFERREDDROPEFFECT TEXT("Preferred DropEffect")
using namespace std;
vector <int> set_drive_num; //Векторсномерамиустановленныхдисков
TTreeNode *head, *tpItem; //Головаитемповаяпеременная
//указатель на верхний отображаемый
//узел для отсутствия скачков
unsigned int type_file_operation_drag_drop;
//Типоперациипри drag drop
AnsiString CurrentDir=""; //Текущийкаталог
TViewStyle StyleListView=vsReport;
Set<char, 'A', 'Z'> DiskIn;
bool DragnDrop=true; //Флаг разрешения перетаскивания
int ColumnToSort=0; //Номер колонки по которой сортируют
int Direct=1; //Направлениесоритировки
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
voidFirstUpOtherDown(char *str) //Опускает все буквы кроме первой
{
if((str[0]>96 && str[0]<123) || (str[0]>223 && str[0]<255))
str[0]-=32;
for(int i=1;str[i]!='\0';i++)
if((str[i]>64 && str[i]<91) || (str[i]>191 && str[i]<224))
str[i]+=32;
}
void FirstUpOtherDown(AnsiString &str)
{
if((str[1]>96 && str[1]<123) || (str[1]>223 && str[1]<255))
str[1]-=32;
for(int i=2;i<=str.Length();i++)
if((str[i]>64 && str[i]<91) || (str[i]>191 && str[i]<224))
str[i]+=32;
}
void GetDrives() //Определяет установленные диски
{ //и сохраняет их номера в set_drive_num
unsigned int set_drive=GetLogicalDrives();
for(int i=0;set_drive!=0;i++)
{
if(set_drive%2) set_drive_num.push_back(i);
set_drive>>=1;
}
}
void TForm1::ShowDrives() //Отображаетдискивдереве
{
char str[10];
char inf[20];
for(unsigned int i=0;i<set_drive_num.size();i++)
{
TTreeNode *temp; //Загрузкаузла
str[0]=(char)('A'+set_drive_num[i]);
str[1]='\0';
strcat(str,":\");
if(set_drive_num[i]!=0 && set_drive_num[i]!=1) //Заполнениеинформационногополя
{
if(!GetVolumeInformation(str,inf,20,NULL,NULL,NULL,NULL,NULL)) //Получениеметкитома
strcpy(inf,"");
}
else
{
strcpy(inf,"");
}
FirstUpOtherDown(inf);
AnsiString *p=new AnsiString(str);
temp=TreeView1->Items->AddChildObject(head,AnsiString(inf)+" ("+(char)('A'+set_drive_num[i])+":)",p);
switch(unsigned int p=GetDriveType(str)) //Загрузка image
{
case DRIVE_REMOVABLE:
temp->SelectedIndex=ImageFloppy;
temp->ImageIndex=ImageFloppy;
break;
case DRIVE_FIXED:
case DRIVE_RAMDISK:
temp->SelectedIndex=ImageDrive;
temp->ImageIndex=ImageDrive;
break;
case DRIVE_CDROM:
temp->SelectedIndex=ImageCD;
temp->ImageIndex=ImageCD;
break;
default:
temp->SelectedIndex=ImageWindows;
temp->ImageIndex=ImageWindows;
break;
}
}
}
TTreeNode* TForm1::AddChildInNodeTree(TTreeNode *Node, AnsiString Dir)
{
AnsiString temp=Dir;
AnsiString Name=ExtractFileName(temp.SetLength(temp.Length()-1));
FirstUpOtherDown(Name);
AnsiString *p=new AnsiString(Dir); //Добавляемновыйпотомокк treeview
TTreeNode *t=TreeView1->Items->AddChildObject(Node,Name,p);
t->ImageIndex=ImageCloseFolder;
t->SelectedIndex=ImageOpenFolder;
return t; //Возвращаем указатель на него
}
void TForm1::ViewChild(TTreeNode *Node) //Отображение детей узла в treeview
{
//Перебор детей открывамого узла
TTreeNode *child=Node->getFirstChild();
TSearchRec sr;
AnsiString dir,name;
do
{
dir=*((AnsiString *)child->Data);
//Проверка диска на гибкую дискету и вообще отсутствие детей
if((((GetDriveType(dir.c_str())==DRIVE_REMOVABLE) || (GetDriveType(dir.c_str())==DRIVE_CDROM)) && !DiskIn.Contains(ExtractFileDrive(dir)[1])) || FindFirst(dir+"*",faAnyFile,sr)!=0) //Просмотр папок в детях
continue; //Гибкую дискету нельзя отображать из-за обращения к ней при ее отсутствии
do
if((sr.Attr & faDirectory) && sr.Name!="." && sr.Name!="..")
AddChildInNodeTree(child,dir+sr.Name+"\");
while(FindNext(sr)==0);
FindClose(sr);
}
while((child=Node->GetNextChild(child))!=NULL);
}
void TForm1::DeleteChild(TTreeNode *Node) //Удаление потомков потомков узла (их уже не видно)
{
TTreeNode *child=Node->getFirstChild();
TTreeNode *childchild;
do
while((childchild=child->getFirstChild())!=NULL)
{
delete childchild->Data;
TreeView1->Items->Delete(childchild);
}
while((child=Node->GetNextChild(child))!=NULL);
}
bool CheckExpandedChild(TTreeNode *Node) //Проверка раскрытия ветви хотя бы одного
{ //потомка
bool flag=false;
TTreeNode *child;
if((child=Node->getFirstChild())!=NULL)
do
flag=flag || child->Expanded;
while((child=Node->GetNextChild(child))!=NULL);
return flag;
}
int TForm1::FileAndFolderOperation(char *frombuf, char *tobuf, unsigned int operation)
{ //Осуществление операций над файлами - копирование, перемещение
//удаление, переименование
SHFILEOPSTRUCT OpStruc;
OpStruc.hwnd= Handle;
OpStruc.wFunc= operation;
OpStruc.pFrom= frombuf;
OpStruc.pTo=tobuf;
OpStruc.fFlags=0;
OpStruc.fAnyOperationsAborted= false;
OpStruc.hNameMappings= NULL;
OpStruc.lpszProgressTitle= NULL;
int p=SHFileOperation(&OpStruc);
return p;
}
TListItem *TForm1::AddItemInListView(TSearchRec sr,AnsiString dir)
{ //Добавление записи в listview из sr и каталога dir
TListItem *p;
AnsiString date;
int size=sr.Size/1024;
p=ListView1->Items->Add(); //Добавление нового элемента
FirstUpOtherDown(sr.Name); //Выравнивание у имени символов
DateTimeToString(date,"dd/mm/yy h:nn",FileDateToDateTime(sr.Time));
AnsiString *a;
if(sr.Attr & faDirectory)
{
a=new AnsiString(dir+sr.Name+"\"); //Сохранение полного имени для доступа
p->SubItems->Add(""); //Для директорий (папок)
p->SubItems->Add("Папка");
p->ImageIndex=ImageCloseFolder;
}
else
{
a=new AnsiString(dir+sr.Name);
SHFILEINFO sfi; //Структура содержащая инфу о файле
ZeroMemory(&sfi,sizeof(sfi)); //Очистка
SHGetFileInfo(sr.Name.c_str(),FILE_ATTRIBUTE_NORMAL,&sfi,sizeof(sfi),
SHGFI_USEFILEATTRIBUTES|SHGFI_TYPENAME|SHGFI_ICON | SHGFI_SMALLICON); //Получениеданных
TIcon *icon=new TIcon(); //Создание динамической иконки
icon->Handle=sfi.hIcon; //Загрузка в нее дескриптора нужной иконки
int num=ImageList2->AddIcon(icon); //Занесениедескрипторав imagelist
p->ImageIndex=num;
p->SubItems->Add(AnsiString(size==0?1:size)+" KB"); //2 Добавлениеразмера
p->SubItems->Add(sfi.szTypeName); //3 Добавлениеименитипа
ZeroMemory(&sfi,sizeof(sfi));
SHGetFileInfo(sr.Name.c_str(),FILE_ATTRIBUTE_NORMAL,&sfi,sizeof(sfi),
SHGFI_USEFILEATTRIBUTES|SHGFI_TYPENAME|SHGFI_ICON | SHGFI_LARGEICON ); //Получениеданных
icon->Handle=sfi.hIcon; //Загрузка в нее дескриптора нужной иконки
ImageList4->AddIcon(icon);
delete icon;
}
p->SubItems->Add(date); //4 Добавлениедаты
p->Data=a;
p->Caption=sr.Name; //1 Запись названия
return p;
}
void TForm1::ViewFailAndFolderInListView(AnsiString dir)
{ //Отображение в listview папки указанной dir
for(int i=0;i<ListView1->Items->Count;i++)
delete ListView1->Items->Item[i]->Data; //Очистка данных о полном пути к файлам
ImageList2->Clear();
ImageList4->Clear();
ListView1->Clear(); //Очисткасписка
ImageList2->AddImages(ImageList1);
ImageList4->AddImages(ImageList3);
AnsiString path=dir.SubString(1,3); //Извлечение названия корневого каталога
char inf[20];
unsigned int p=GetDriveType(path.c_str());
if(p==DRIVE_REMOVABLE || p==DRIVE_CDROM)
{
if(GetVolumeInformation(path.c_str(),inf,20,NULL,NULL,NULL,NULL,NULL))
{
if(!(DiskIn.Contains(path[1]))) DiskIn<<path[1];
UpdateTreeView(false);
UpdateLabel();
}
else
{
UpdateTreeView(false);
if(DiskIn.Contains(path[1])) DiskIn>>path[1];
UpdateLabel();
CurrentDir="";
return;
}
}
while(ExtractFileDrive(dir).AnsiCompareIC(dir)!=0 && GetFileAttributes(dir.c_str())==-1)
dir=ExtractFilePath(dir.SetLength(dir.Length()-1));
TSearchRec sr;
if(FindFirst(dir+"*",faAnyFile,sr)!=0) //Просмотрпапоквдетях
return;
do
{
int Attr=FileGetAttr(dir+sr.Name);
if(Attr==-1 || sr.Name=="." || sr.Name=="..")
continue; //Проверка на отсутствующие в действиетельности папки
AddItemInListView(sr,dir);
}
while(FindNext(sr)==0);
FindClose(sr);
CurrentDir=dir; //Запоминание текущего каталога
double c=10.0;