Файл: Основы программирования на языке Pascal.pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 29.03.2023

Просмотров: 207

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Компонент списка найденных файлов.

Также, на форме расположена кнопка выбора файла. Поле отображения пути выбранного файла. Поле отображение имени выбранного файла. Поле отображение размера выбранного файла в килобайтах. Кнопка открытия файла в программе, назначенной по умолчанию для расширения файла. Кнопка удаления файла. Кнопка выбора директории для копирования и поле для указания директории назначения копирования файла. Кнопка копирования файла. Кнопка закрытия формы.

В главном модуле предусмотрено 7 процедур.

----------------//Процедура создания дерева

procedure TfrmMain.CraeteTree;

const

IconNames: array [0..6] of string = ('CLOSEDFOLDER', 'OPENFOLDER', 'FLOPPY', 'HARD', 'NETWORK', 'CDROM', 'RAM');

var

bm, mask: TBitmap;

i: integer;

diskChar: char;

disk: string;

node: TTreeNode;

DriveType: integer;

begin

tvCatalog.Items.BeginUpdate;

tvCatalog.Images := TImageList.CreateSize(16, 16);

bm := TBitmap.Create;

mask := TBitmap.Create;

for i := low(IconNames) to high(IconNames) do begin

bm.Handle := LoadBitmap(HInstance, PChar(IconNames[i]));

bm.Width := 16;

bm.Height := 16;

mask.Assign(bm);

mask.Mask(clBlue);

tvCatalog.Images.Add(bm, mask);

end;

for diskChar:= 'A' to 'Z' do begin

disk := diskChar + ':';

DriveType := GetDriveType(PChar(disk));

if DriveType = 1 then continue; //Корневой директории не существует

node := tvCatalog.Items.AddChild(nil, disk);

case DriveType of

DRIVE_REMOVABLE: node.ImageIndex := 2; //Съёмный диск

DRIVE_FIXED: node.ImageIndex := 3; //Жёсткий диск

DRIVE_REMOTE: node.ImageIndex := 4; //Сетевой диск

DRIVE_CDROM: node.ImageIndex := 5; //CD-ROM

else node.ImageIndex := 6; //RAM-диск

end;

node.SelectedIndex := node.ImageIndex;

node.HasChildren := true;

end;

tvCatalog.Items.EndUpdate;

end;

----------------//Процедура открытия каталога в дереве и поиска подкаталогов

procedure TfrmMain.OpenCatalog(ParentNode: TTreeNode);

function DirectoryName(name: string): boolean;

begin

result := (name <> '.') and (name <> '..');

end;

var

sr, srChild: TSearchRec;

node: TTreeNode;

path: string;

begin

node := ParentNode;

path := '';

repeat

path := node.Text + '\' + path;

node := node.Parent;

until node = nil;

if FindFirst(path + '*.*', faDirectory, sr) = 0 then begin

repeat

if (sr.Attr and faDirectory <> 0) and DirectoryName(sr.Name) then begin

node := tvCatalog.Items.AddChild(ParentNode, sr.Name);

node.ImageIndex := 0;

node.SelectedIndex := 1;

node.HasChildren := false;

if FindFirst(path + sr.Name + '\*.*', faDirectory, srChild) = 0 then begin

repeat

if (srChild.Attr and faDirectory <> 0) and DirectoryName(srChild.Name)

then node.HasChildren := true;

until (FindNext(srChild) <> 0) or node.HasChildren;

end;

FindClose(srChild);

end

until FindNext(sr) <> 0;

end else ParentNode.HasChildren := false;

FindClose(sr);

end;

----------------//Процедура создания формы

procedure TfrmMain.FormCreate(Sender: TObject);

begin

CraeteTree;

end;

----------------//Процедура раскрытия узла дерева

procedure TfrmMain.tvCatalogExpanding(Sender: TObject; Node: TTreeNode;

var AllowExpansion: Boolean);

begin

tvCatalog.Items.BeginUpdate;

node.DeleteChildren;

OpenCatalog(node);

tvCatalog.Items.EndUpdate;

end;

----------------//Процедура обновления


procedure TfrmMain.btnRefreshClick(Sender: TObject);

begin

tvCatalog.Items.Clear;

CraeteTree;

end;

----------------//Процедура открытия формы работы с файлами

procedure TfrmMain.imFileWorkClick(Sender: TObject);

var

frm: TfrmFiles;

begin

Application.CreateForm(TfrmFiles,frm);

frm.ShowModal;

frm.Free;

end;

----------------//Процедура закрытия приложения

procedure TfrmMain.imCloseClick(Sender: TObject);

begin

Application.Terminate;

end;

В модуле работы с файлами предусмотрены следующие процедуры и функции, относящиеся к самой форме.

----------------//Показ формы

procedure TfrmFiles.FormShow(Sender: TObject);

begin

lbFiles.Clear;

ChoiseFile:=nil;

edtCatalog.Text:='';

edtName.Text:='';

edtExt.Text:='';

edtFilePath.Text:='';

edtFileName.Text:='';

edtFileSize.Text:='';

end;

----------------//Основная процедура поиска

procedure TfrmFiles.FindFile(Dir, FileName, FileExt: string);

Var

I: Integer;

dirList: TStringList;

begin

// dirList:=TStringList.Create;

dirList:=FindDir(Dir);

dirList.Add(Dir);

for I := 0 to dirList.Count-1 do

FindFileDir(dirList.Strings[i],FileName,FileExt);

end;

----------------//Поиск файла в директории

procedure TfrmFiles.FindFileDir(Dir, FileName, FileExt: string);

var SR:TSearchRec;

FindRes:Integer;

begin

if FileName='' then FileName:='*';

if FileExt='' then FileExt:='*';

FindRes:=FindFirst(Dir+FileName+'.'+FileExt,faAnyFile,SR);

While FindRes=0 do

begin

// если найден не каталог, то

if ((SR.Attr and faDirectory)<>faDirectory) then

lbFiles.Items.Add(Dir+SR.Name);

FindRes:=FindNext(SR);

end;

FindClose(SR);

end;

----------------//Составление списка подкаталогов указанного каталога

function TfrmFiles.FindDir(Dir: string): TStringList;

Var SR:TSearchRec;

FindRes:Integer;

begin

Result:=TStringList.Create;

FindRes:=FindFirst(Dir+'*',faDirectory,SR);

While FindRes=0 do

begin

if ((SR.Attr and faDirectory)=faDirectory) and

((SR.Name='.')or(SR.Name='..')) then

begin

FindRes:=FindNext(SR);

Continue;

end;

// если найден каталог, то

if ((SR.Attr and faDirectory)=faDirectory) then

begin

// входим в процедуру поиска с параметрами текущего каталога

// каталог, что мы нашли

Result.Add(Dir+SR.Name+'\');

Result.AddStrings(FindDir(Dir+SR.Name+'\'));

FindRes:=FindNext(SR);

// после осмотра вложенного каталога мы продолжаем поиск

// в этом каталоге

Continue; // продолжить цикл

end;

FindRes:=FindNext(SR);

end;

FindClose(SR);

end;

Реализован класс выбранного файла:

TChoiseFile = class

Filename: string;

FileExt: string;

FilePath: string;

FileSize: Double;

constructor Create(fn: string); overload;

function Copy(path: string): TResult;

function Delete: TResult;

end;

----------------//Обработка события нажатия на кнопку поиска

procedure TfrmFiles.btnSearchClick(Sender: TObject);

var

dir, fileName, fileExt: string;

begin

if (edtCatalog.Text='') or (not DirectoryExists(edtCatalog.Text)) then

ShowMessage('Каталог поиска указан неверно')

else

begin

Dir:=edtCatalog.Text+'\';

fileName:=edtName.Text;

fileExt:=edtExt.Text;

lbFiles.Clear;

FindFile(dir, fileName, fileExt);

end;

end;

----------------//Обработка события нажатия на кнопку открытия файла

procedure TfrmFiles.btnOpenFileClick(Sender: TObject);


begin

if Assigned(ChoiseFile) then

begin

if FileExists(ChoiseFile.FilePath) then

begin

ShellExecute(0,'open',PChar(ChoiseFile.FilePath),'','',SW_SHOW);

end

else

ShowMessage('Выбранный файл был удалён или перемещён');

end;

end;

----------------//Обработка события нажатия на кнопку закрытия формы

procedure TfrmFiles.btnCloseClick(Sender: TObject);

begin

if edtFilePath.Text<>'' then ChoiseFile.Free;

ModalResult:=mrOk;

end;

----------------//Обработка события нажатия на кнопку выбора каталога поиска

procedure TfrmFiles.btnODClick(Sender: TObject);

var

dir: string;

begin

SelectDirectory('Выбор каталога поиска', '', dir);

edtCatalog.Text:=dir;

end;

----------------//Обработка события нажатия на кнопку выбора файла

procedure TfrmFiles.btnChoiseFileClick(Sender: TObject);

begin

if Assigned(ChoiseFile) then ChoiseFile.Free;

ShowMessage(lbFiles.Items[lbFiles.ItemIndex]);

ChoiseFile:=TChoiseFile.Create(lbFiles.Items[lbFiles.ItemIndex]);

edtFileName.Text:=ChoiseFile.FileName;

edtFilePath.Text:=ChoiseFile.FilePath;

edtFileSize.Text:=FloatToStr(ChoiseFile.FileSize)+' Кб.';

end;

----------------//Обработка события нажатия на кнопку удаления файла

procedure TfrmFiles.btnDeleteFileClick(Sender: TObject);

var

res: TResult;

begin

if MessageDlg('Вы действительно хотите удалить файл?',mtWarning,mbOkCancel,0)=mrOk then

begin

res:=ChoiseFile.Delete;

ShowMessage(res.msg);

if res.code<>-1 then begin

edtFilePath.Text:='';

edtFileName.Text:='';

edtFileSize.Text:='';

end;

end;

end;

----------------//Обработка события нажатия на кнопку выбора каталога для копирования файла

procedure TfrmFiles.btnChoiseCatalogToCopyClick(Sender: TObject);

var

dir: string;

begin

SelectDirectory('Выбор каталога назначения', '', dir);

edtCatalogToCopy.Text:=dir;

end;

----------------//Обработка события нажатия на кнопку копирования файла

procedure TfrmFiles.btnCopyFileClick(Sender: TObject);

var

res: TResult;

begin

if edtCatalogToCopy.Text<>'' then begin

res:=ChoiseFile.Copy(edtCatalogToCopy.Text);

ShowMessage(res.msg);

case res.code of

0: edtFilePath.Text:=ChoiseFile.FilePath;

-2: begin

edtFilePath.Text:='';

edtFileName.Text:='';

edtFileSize.Text:='';

ChoiseFile.Free;

end;

end;

end;

end;

Реализация методов класса TChoiseFile представлена ниже.

----------------//Конструктор класса

Constructor TChoiseFile.Create(fn: string);

var

str: string;

fl: integer;

begin

FilePath:=fn;

str:=AnsiReverseString(fn);

self.FileName:=AnsiReverseString(System.Copy(str,Pos('.',str)+1,Pos('\',str)-Pos('.',str)-1));

self.FileExt:=AnsiReverseString(System.Copy(str,1,Pos('.',str)-1));

try

fl:=FileOpen(FilePath, fmOpenRead);

FileSize:= RoundTo(GetFileSize(fl, nil) / 1024,-2);

finally

FileClose(fl);

end;

end;

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

function TChoiseFile.Copy(path: string): TResult;

begin

try

if FileExists(self.FilePath) then begin

Result.code:=0;

if CopyFile(PWideChar(self.FilePath), PWideChar(path+'\'+self.FileName+'.'+self.FileExt), false) then Result.msg:='Файл скопирован';

self.FilePath:=path+'\'+self.FileName+'.'+self.FileExt;

end else

begin

Result.code:=-2;

Result.msg:='Файл был удалён или перемещён';

end;

except

on E : Exception do

begin

Result.msg:=E.Message;

Result.code:=-1;


end;

end;

end;

----------------//Удаление файла

function TChoiseFile.Delete: TResult;

begin

try

if FileExists(self.FilePath) then begin

DeleteFile(self.FilePath);

Result.msg:='Операция удаления выполнена';

Result.code:=0;

end else

begin

Result.code:=-2;

Result.msg:='Файл был удалён или перемещён';

end;

self.Free;

except

on E : Exception do

begin

Result.msg:=E.Message;

Result.code:=-1;

end;

end;

end;

Программный код тела программы выглядит таким образом, как представлено ниже.

program FileManager;

uses

Vcl.Forms,

uMain in 'uMain.pas' {frmMain},

uFiles in 'uFiles.pas' {frmFiles};

{$R *.res}

begin

Application.Initialize;

Application.MainFormOnTaskbar := True;

Application.CreateForm(TfrmMain, frmMain);

Application.Run;

end.

Испытания полученной программы

Методика испытаний

Были выявлены следующие требования к программе:

  1. Построение дерева каталогов при запуске программы.
  2. Обновления дерева каталогов по требованию пользователя.
  3. Поиск файла в заданном каталоге с возможным названием или расширением файла, или без них.
  4. Открытие выбранного файла в приложении по умолчанию для расширения файла.
  5. Копирование выбранного файла с подтверждением выполненной операции.
  6. Удаление выбранного файла с предупреждением пользователя и возможностью отказа от действия и с подтверждением выполненной операции.

Для испытания программы требуется проверить работу по всем требованиям.

Проверка программы

Было проведено ручное испытание разработанной системы по указанным требования к программе.

1. Построение дерева каталогов при запуске программы.

После запуска программы появляется главное окно с построенным деревом каталогов файловой системы. При раскрытии каталога отображаются подкаталоги – рисунок 5.

Рисунок 5 – Проверка построения дерева каталогов

2. Обновления дерева каталогов по требованию пользователя.

Приложение запущено в этот момент, к компьютеру подключается съёмный носитель – usb-флэш. Для обновления каталогов требуется нажать кнопку «Обновить». Дерево перестраивается и появляется новый каталог съёмного носителя – рисунок 6 (появился диск F:).

Рисунок 6 – Обновление дерева каталога по требованию пользователя

3. Поиск файла в заданном каталоге с возможным названием или расширением файла, или без них.


Для доступа к поиску файлов требуется выбрать в главном меню пункт «Файл» и «Работа с файлами». Для поиска указывается каталог поиска. А также, можно указать расширение файла или его название. После нажатия кнопки «Поиск» все найденные файлы будут отображены в списке поиска – рисунок 7.

Рисунок 7 – Проверка поиска файлов

4. Открытие выбранного файла в приложении по умолчанию для расширения файла.

Для выбора файла в приложении требуется выбрать файл в списке и нажать кнопку «Выбрать файл». В полях появятся данные файла – рисунок 8.

Рисунок 8 – Проверка выбора файла

Для запуска файла в приложении, которое назначено для данного типа файла по умолчанию требуется нажать кнопку «Открыть». Файл будет открыт в своём приложении – рисунок 9.

Рисунок 9 – Проверка открытия файла

5. Копирование выбранного файла с подтверждением выполненной операции.

Для копирования файла требуется указать каталог копирования и нажать кнопку «Копировать». На рисунке 10 представлено подтверждение копирования файла. После удачного копирования выдаётся сообщение о проделанной операции – рисунок 11.

Рисунок 10 – Проверка копирования файла

Рисунок 11 – Подтверждение выполнения операции копирования

6. Удаление выбранного файла с предупреждением пользователя и возможностью отказа от действия и с подтверждением выполненной операции.

Для удаления файла требуется нажать кнопку «Удалить», появится окно подтверждения операции пользователем – рисунок 12. При подтверждении файл удаляется и появляется сообщение об успешно выполненной операции удаления – рисунок 13. В окне очищаются данные о выбранном файле – рисунок 14.

Рисунок 12 – Проверка подтверждения операции удаления файла

Рисунок 13 – Проверка сообщения об успешном завершении операции удаления файла

Рисунок 14 – Проверка удаления файла

Заключение

Разработка компьютерных программ – сложное, требующее специальных навыков и опыта дело.