Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Глава 12.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
322 Кб
Скачать
☆

Interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics,

Controls, Forms, Dialogs, StdCtrls, FileCtr;

type

TForm1 = class(TForm)

Editl: TEdit; // что искать

Edit2: TEdit; // где искать

Memo1: TMemo; // результат поиска

Button1: TButton; // кнопка Поиск

Button2: TButton; // кнопка Папка

Label1: TLabel; Label2: TLabel;

Label3: TLabel; Label4: TLabel;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

private { Private declarations }

public { Public declarations }

end;

var

Form1: TForm1;

Implementation

{$R *.dfm}

var

FileName: string; // имя или маска искомого файла

cDir: string;

n: integer; // кол-во файлов, удовлетворяющих запросу

// поиск файла в текущем каталоге

procedure Find;

var

SearchRec: TSearchRec; // информация о файле или каталоге

begin

GetDir(0,cDir); // получить имя текущего каталога

if cDir [length (cDir) ] <> '\' then cDir := cDir+'\';

if FindFirst(FileName, faArchive,SearchRec) = 0

then repeat

if (SearchRec.Attr and faAnyFile) = SearchRec.Attr

then begin

Form1.Memo1.Lines.Add(cDir + SearchRec.Name);

n := n + 1; end;

until FindNext(SearchRec) <> 0;

// обработка подкаталогов текущего каталога

if FindFirst('*', faDirectory, SearchRec) = 0 then

repeat

if (SearchRec.Attr and faDirectory) = SearchRec.Attr then begin

// каталоги .. и . тоже каталоги, но в них входить не надо '.'.'

if SearchRec.Name[1] <> '.' then begin

ChDir(SearchRec.Name);// войти в каталог

Find; // выполнить поиск в подкаталоге

ChDir('..');// выйти из каталога

end;

end;

until FindNext(SearchRec) <> 0;

end;

// возвращает каталог, выбранный пользователем

function GetPath(mes: string):string;

var

Root: string; // корневой каталог

pwRoot : PWideChar; Dir: string;

begin

Root := '';

GetMem(pwRoot, (Length(Root)+1) * 2);

pwRoot := StringToWideChar(Root, pwRoot, MAX_PATH*2);

if SelectDirectory(mes, pwRoot, Dir) then

if length(Dir) =2 // пользователь выбрал корневой каталог

then GetPath := Dir+'\' else GetPath := Dir

else GetPath := '';

end;

\\щелчок на кнопке Поиск

procedure TForml.ButtonlClick(Sender: TObject);

begin

Memo1.Clear; // очистить поле Memol

Label4.Caption := '';

FileName := Edit1.Text; // что искать.

cDir := Edit2.Text; // где искать

n:=0; // кол-во найденных файлов

ChDir(cDir); // войти в каталог начала поиска

Find; // начать поиск

if n = 0 then

ShowMessage('Файлов, удовлетворяющих критерию поиска нет.')

else Label4.Caption := 'Найдено файлов:' + IntToStr(n);

end;

// щелчок на кнопке Папка

procedure TForml.Button2Click (Sender: TObject);

var

Path: string; begin

Path := GetPath('Выберите папку');

if Path <> ''

then Edit2.Text := Path;

end;

end.

Кривая Гильберта

Следующая программа вычерчивает в диалоговом окне кривую Гильберта. На рис. 12.7 приведены кривые Гильберта первого, второго и третьего порядков. Если присмотреться, то видно, что кривая второго порядка получается путем соединения прямыми линиями четырех кривых первого порядка. Аналогичным образом получается кривая третьего порядка, но при этом в качестве "кирпичиков" используются кривые второго порядка. Таким образом, чтобы нарисовать кривую третьего порядка, надо нарисовать четыре кривых второго порядка. В свою очередь, чтобы нарисовать кривую второго порядка, надо нарисовать четыре кривых первого порядка. Таким образом, алгоритм вычерчивания кривой Гильберта является рекурсивным.

Диалоговое окно программы Кривая Гильберта, в котором находится кривая пятого порядка, приведено на рис. 12.8, текст программы — в листинге 12.4.

Рис. 12.7. Кривые Гильберта первого, второго и третьего порядков

Рис. 12.8. Кривая Гильберта пятого порядка

Листинг 12.4. Кривая Гильберта

unit gilbert_;