Смекни!
smekni.com

Разработка файловой оболочки (стр. 2 из 6)

Системные требования: Операционная система Windows’95 и выше, 500 килобайт дискового пространства.

Главная форма программы

Модуль описывающий главную форму

unit UMainForm; // главная форма программы

interface

// подключаемые модули (стандартные)

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

Menus, ExtCtrls, ComCtrls, StdCtrls, FileCtrl, Grids, Outline, DirOutln,

ToolWin, Buttons;

type

TMainForm = class(TForm)

MainMenu1: TMainMenu;

File1: TMenuItem;

About1: TMenuItem;

N1: TMenuItem;

Exit1: TMenuItem;

Options1: TMenuItem;

Directory: TDirectoryOutline;

FileList: TFileListBox;

Drv: TDriveComboBox;

StatusBar: TStatusBar;

DirectoryMenu: TPopupMenu;

FileMenu: TPopupMenu;

Splitter: TSplitter;

Cut: TMenuItem;

Copy: TMenuItem;

Paste: TMenuItem;

Rename1: TMenuItem;

Delete: TMenuItem;

NewDir: TMenuItem;

CopyDir: TMenuItem;

RenameDir: TMenuItem;

DeleteDir: TMenuItem;

PasteDir: TMenuItem;

TempDelete: TListBox;

TempCopyMove: TListBox;

Open: TMenuItem;

View: TMenuItem;

FileMask1: TMenuItem;

CMDirList: TListBox;

DFileList: TListBox;

Find1: TMenuItem;

Info1: TMenuItem;

CMFileList: TListBox;

FileAttr: TMenuItem;

SizeDirectory1: TMenuItem;

CutDir: TMenuItem;

ToolBar1: TToolBar;

DrBox: TDriveComboBox;

Bevel1: TBevel;

Bevel2: TBevel;

SpeedButton1: TSpeedButton;

SCut: TSpeedButton;

Bevel3: TBevel;

SCopy: TSpeedButton;

SPaste: TSpeedButton;

SDel: TSpeedButton;

Up: TSpeedButton;

Bevel4: TBevel;

Cut1: TMenuItem;

Copy1: TMenuItem;

Paste1: TMenuItem;

Rename: TMenuItem;

Delete1: TMenuItem;

Selectall: TMenuItem;

InvertSelect: TMenuItem;

procedure About1Click(Sender: TObject);

procedure Exit1Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure Options1Click(Sender: TObject);

procedure DrivesSectionClick(HeaderControl: THeaderControl;

Section: THeaderSection);

procedure DrivesMouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure NewDirClick(Sender: TObject);

procedure DirectoryChange(Sender: TObject);

procedure CopyClick(Sender: TObject);

procedure CutClick(Sender: TObject);

procedure PasteClick(Sender: TObject);

procedure Rename1Click(Sender: TObject);

procedure DeleteDirClick(Sender: TObject);

procedure DeleteClick(Sender: TObject);

procedure FileMenuPopup(Sender: TObject);

procedure FileMask1Click(Sender: TObject);

procedure FileListDblClick(Sender: TObject);

procedure SplitterMoved(Sender: TObject);

procedure Find1Click(Sender: TObject);

procedure Info1Click(Sender: TObject);

procedure CopyDirClick(Sender: TObject);

procedure RenameDirClick(Sender: TObject);

procedure FileAttrClick(Sender: TObject);

procedure ViewClick(Sender: TObject);

procedure SizeDirectory1Click(Sender: TObject);

procedure FileListMouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure FileListKeyPress(Sender: TObject; var Key: Char);

procedure FileListKeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

procedure PasteDirClick(Sender: TObject);

procedure DirectoryMenuPopup(Sender: TObject);

procedure File1Click(Sender: TObject);

procedure OpenClick(Sender: TObject);

procedure DrBoxChange(Sender: TObject);

procedure UpClick(Sender: TObject);

procedure SCutClick(Sender: TObject);

procedure SPasteClick(Sender: TObject);

procedure SDelClick(Sender: TObject);

procedure SCopyClick(Sender: TObject);

procedure FileListClick(Sender: TObject);

procedure CutDirClick(Sender: TObject);

procedure Cut1Click(Sender: TObject);

procedure Copy1Click(Sender: TObject);

procedure Paste1Click(Sender: TObject);

procedure Delete1Click(Sender: TObject);

procedure RenameClick(Sender: TObject);

procedure FormResize(Sender: TObject);

procedure InvertSelectClick(Sender: TObject);

procedure FileListKeyUp(Sender: TObject; var Key: Word;

Shift: TShiftState);

procedure SelectallClick(Sender: TObject);

private

public

end;

var

MainForm: TMainForm;

Size:integer;

implementation

// подключаемые модули (не стандартные)

uses UAboutBox,UMainForm_, UOptionsForm, UCreateDir, UProgressForm,

URenameForm, UAskDeleteForm, UGetFileMask, FmxUtils, UFindForm, UInfoForm,

UAttrFilesForm,UNotTrivial, UDeleteDir, URenameDirForm, URunForm,

UViewForm;

{$R *.DFM}

procedure TMainForm.About1Click(Sender: TObject);

// вывод формы "ИНФОРМАЦИЯ О ПРОГРАММЕ"

begin

AboutBox.Show;

end;

procedure TMainForm.Exit1Click(Sender: TObject);

// Обработка выхода из программы

begin

If AskExit then

begin

// Подтверждение выхода

If Application.MessageBox('Exit ?','Exit',MB_APPLMODAL+MB_ICONQuestion+MB_YESNO)=IDYes then

Begin

// запись информации о программе в файл МС.INI

SaveIniMainForm;

Close;

end

end

else

begin

SaveIniMainForm;

Close;

end;

end;

procedure TMainForm.FormCreate(Sender: TObject);

//Установка начльных параметров для компонент главной формы

begin

SetUpMainForm;

SetUpComponents;

end;

procedure TMainForm.Options1Click(Sender: TObject);

//Вывод формы параметров

begin

// Центрирование выводимой формы относительно главной формы

GetFormToCenter(OptionsForm);

OptionsForm.ShowModal;

end;

procedure TMainForm.DrivesSectionClick(HeaderControl: THeaderControl;

Section: THeaderSection);

// Смена текущего диска

begin

Directory.Drive:=Section.Text[1];

Directory.SetDirectory(Section.Text[1]+':\');

MainForm.Directory.BuildTree;

end;

procedure TMainForm.DrivesMouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

//перерисовка списка директорий при необходимости

Directory.Repaint;

end;

procedure TMainForm.NewDirClick(Sender: TObject);

// Создание директории и вывод соответствующей формы

begin

CreateDirForm.Show;

end;

Function CountDir(Str:String):String;

// Определение количества поддиректорий в текущей директории

Var F:TSearchRec;

C:integer;

begin

c:=0;

findfirst(Str+'\*.*',faAnyFile,F);

findnext(F);

repeat

if (f.Attr>=16) and (f.attr<32) and (f.Name<>'.') and (f.Name<>'..') then

c:=c+1;

Until(findnext(f)<>0);

CountDir:=IntToStr(c);

end;

procedure TMainForm.DirectoryChange(Sender: TObject);

//Смена текущей директории

begin

//Обновление списка файлов

FileList.SetDirectory(Directory.Directory);

//Заполнение статус-строки

MainForm.StatusBar.Panels[0].Text:=CountDir(Directory.Directory)+' dir. & '+IntToStr(MainForm.FileList.Items.Count)+

' files ';

MainForm.StatusBar.Panels[1].Text:='';

//Определение активных кнопок панели управления

If UpperCase(MainForm.Directory.Directory)=UpperCase(MainForm.DrBox.Drive+':&bsol;') then

begin

Up.Enabled:=False;

SCut.Enabled:=False;

SCopy.Enabled:=False;

SDel.Enabled:=False;

end

else

begin

Up.Enabled:=True;

SCut.Enabled:=True;

SCopy.Enabled:=True;

SDel.Enabled:=True;

end;

end;

procedure TMainForm.CopyClick(Sender: TObject);

// Копирование файлов

begin

FlagCopyFile:=True;

FlagMoveFile:=False;

CopyPathFileInTemp;

end;

procedure TMainForm.CutClick(Sender: TObject);

// Вырезание файлов

begin

FlagMoveFile:=True;

CopyPathFileInTemp;

end;

procedure TMainForm.PasteClick(Sender: TObject);

begin

ProgressForm.Show;

PasteFileFromTemp;

ProgressForm.Close;

MainForm.TempCopyMove.Clear;

end;

procedure TMainForm.Rename1Click(Sender: TObject);

// Переименование файлов в соответствующей экранной форме

begin

GetFormToCenter(RenameFileForm);

RenameFileForm.ShowModal;

end;

procedure TMainForm.DeleteDirClick(Sender: TObject);

// Удаление директории

begin

// Обнуление временных списков

MainForm.CMDirList.Clear;

MainForm.CMFileList.Clear;

DeleteEmptyDirectory(MainForm.Directory.Directory);

//Обновление списка директорий

MainForm.Directory.Invalidate;

end;

procedure TMainForm.DeleteClick(Sender: TObject);

//Удаление файлов

begin

AskDeleteForm.Show;

end;

procedure TMainForm.FileMenuPopup(Sender: TObject);

//Определение видимых строк в контектсном меню файловой области

//в момент его вызова

begin

if MainForm.FileList.SelCount=0 then

begin

with MainForm.FileMenu do

begin

Delete.Enabled:=False;

Cut.Enabled:=False;

Copy.Enabled:=False;

Rename1.Enabled:=False;

end;

end

else

begin

with MainForm.FileMenu do

begin

Delete.Enabled:=True;

Cut.Enabled:=True;

Copy.Enabled:=True;

Rename1.Enabled:=True;

end;

end;

if MainForm.TempCopyMove.Items.Count = 0 then

Paste.Enabled:=False

else

Paste.Enabled:=True;

end;

procedure TMainForm.FileMask1Click(Sender: TObject);

// Запрос маски файлов для списка файлов (в дальнейшем СФ)

begin

GetFileMask.Show;

end;

procedure TMainForm.FileListDblClick(Sender: TObject);

// Запуск программ/редактирование(просмотр) во внешнем редакторе

// при двойном щелчке мышкой

Var

str:string;

begin

Str:=FileList.FileName;

ExecuteFile(Str,'','',SW_SHOW);

end;

procedure TMainForm.SplitterMoved(Sender: TObject);

//Перемещение разделителя СФ и Списка директорий (В Дальнейшем СД)

begin

// Ограничение на положение разделителя

// Ширина СД не должна быть меньше Списка дисков (В дальнейшем СПД)

if Splitter.Left<=DrBox.Width then

begin

Directory.Width:=DrBox.Width+6;

end;

// Сохранение положения разделителя для следующего запуска программы

McIni.WriteInteger('ASWindow','Splitter',MainForm.Directory.Width);

// Установка размеров панелей статус-строки

MainForm.StatusBar.Panels[0].Width:=MainForm.Directory.Width;

end;

procedure TMainForm.Find1Click(Sender: TObject);

// Поиск файлов

begin

FindForm.Show

end;

procedure TMainForm.Info1Click(Sender: TObject);

// Вывод информации о текущем диске и директории

begin

GetFormToCenter(InfoForm);

InfoForm.ShowModal;

end;

procedure TMainForm.CopyDirClick(Sender: TObject);

//Копирование директорий (Выбран пункт меню копировать)

begin

SourseDir:=MainForm.Directory.Directory;

DoingWithDir:=True;

CopyMoveDirectory;

end;

procedure TMainForm.RenameDirClick(Sender: TObject);

//Переименование директории в соответствующей форме

begin

GetFormToCenter(RenameDirForm);

RenameDirForm.ShowModal;

end;

procedure TMainForm.FileAttrClick(Sender: TObject);

//Получение установка атрибутов файла в соотв. форме

begin

GetFormToCenter(AttrFileForm);

AttrFileForm.ShowModal;

end;

procedure TMainForm.ViewClick(Sender: TObject);

// Определение видимых компонент в меню VIEW

// в момент его открытия

begin

if MainForm.FileList.SelCount = 0 then

begin

MainForm.FileAttr.Enabled:=False;

end

else

begin

MainForm.FileAttr.Enabled:=True;

end;

if UpperCase(MainForm.Directory.Directory)=UpperCase(MainForm.DrBox.Drive+':&bsol;') then

MainForm.SizeDirectory1.Enabled:=False

else

MainForm.SizeDirectory1.Enabled:=True;

end;

Procedure DDD(DirS:string);

// Определение размера текущей директории

Var

d:TSearchRec;

begin

FindFirst(DirS+'&bsol;'+'*.*',faAnyFile,D);

FindNext(D);

repeat

if (D.Name<>'.') and (D.Name<>'..') then

begin

if (D.Attr=faDirectory) Or (D.Attr=18) then

begin

DDD(DirS+'&bsol;'+D.Name);

end

else

begin

Size:=Size+D.Size;

end;

end;

Until(FindNext(D) <> 0);

FindClose(D);

end;

procedure TMainForm.SizeDirectory1Click(Sender: TObject);

// Вывод информации о текущей директории в статус-строке

begin

Size:=0;

MainForm.StatusBar.Panels[0].Text:='Wait...';

DDD(MainForm.Directory.Directory);

MainForm.StatusBar.Panels[0].Text:=FormatSize(IntToStr(Size)); // перевод числа в читабельный формат

MainForm.StatusBar.Panels[0].Text:=MainForm.StatusBar.Panels[0].Text+' b';

end;

procedure TMainForm.FileListMouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

// Левая кнопка мышки отпущена

Var

i:integer;

F:TSearchRec;

str:string;

begin

str:=' ';

Size:=0;

//Если при помощи мышки выделена группа файлов определить их суммарный размер

for i:=0 to MainForm.FileList.Items.Count-1 do

begin

if MainForm.FileList.Selected[i] then

begin

FindFirst(MainForm.FileList.Items[i],faAnyFile,F);

Size:=Size+F.Size;

if MainForm.FileList.SelCount=1 then break;

end;

end;

// Если один выделенный файл, вывести информацию о нем в строке статуса

if MainForm.FileList.SelCount=1 then

begin

MainForm.StatusBar.Panels[1].Text:=ExtractFileName(F.Name)+' '+

FormatSize(IntToStr(F.Size))+' b'+' '+

DateToStr(FileDateTime(F.Name))+' '+TimeToStr(FileDateTime(F.Name));

end

else

begin

MainForm.StatusBar.Panels[1].Text:=FormatSize(intToStr(Size))+' b'+

' in '+IntToStr(MainForm.FileList.SelCount)+ ' selected files';

end;

end;

Procedure ReselectAllFile;

// Инвертирование выделения файлов

Var i:integer;

begin

For i:=0 to MainForm.FileList.Items.Count-1 do

MainForm.FileList.Selected[i]:=not MainForm.FileList.Selected[i];

end;

Procedure SelectAllF(Key:Char);

// Выделить все файлы в СФ