скачать рефераты
  RSS    

Меню

Быстрый поиск

скачать рефераты

скачать рефератыРеферат: Object Pascal

Создает новый файл и открывает его. Если файл существует, то он уничтожается и создается как новый.

Procedure Reset( f: File[; Size: Word]);

Открывает существующий файл и устанавливает указатель на первую запись. При отсутствии файла возникает ошибка ввода/вывода. Параметр Size указывает размер записи открываемого файла. При его отсутствии размер записи по умолчанию равен 1.

Procedure BlockRead( f: File; Var Buf; Count: Word[; Var Result: Word]);

Читает из файла Count записей в переменную Buf. Result – реально прочитанное количество записей.

Procedure BlockWrite( f: File; Var Buf; Count: Word[; Var Result: Word]);

Пишет в файл первых Count записей из переменной Buf. Result – реально записанное количество записей.

Procedure Seek( f: File; N: LongInt);

Перемещает указатель на запись с номером N. Первая запись имеет порядковый номер 0.

Function FilePos( f: File): LongInt;

Возвращает номер записи, на которую установлен указатель.

Procedure CloseFile( f: File);

Закрывает файл.

Function Eof(f: File): boolean;

Возвращает True, если достигнут конец файла.

Function FileSize(f: File): LongInt;

Возвращает количество записей в файле. Например, Seek(f, FileSize(f)) установит указатель в конец файла (после последней записи).

Procedure Truncate(f: File of Type);

Уничтожает (отрубает) конец файла начиная с записи, на которую установлен указатель.

Язык Object Pascal не накладывает никаких ограничений на длину записи (теоретически она может иметь размер до 2 Гб).

Пример описания и обращения к функции ReadFromFile, читающей из файла nF в позиции Pos запись r размером Sz.

function ReadFromFile(nF: String; Pos: Word; Var r; Sz: Word): boolean;

Var

g: File;

Recs, ReadReal: Integer;

RecRead: boolean;

Begin

Assign(g, nF);

Recs:= FileSize(g) div Sz; {количество записей в файле}

RecRead:= (Pos < Recs); {запись с номером Pos есть ?}

if RecRead then begin {если запись есть}

Reset(g, Sz); {открыть файл}

try

Seek(g, Pos); {установить указатель на запись}

BlockRead(g, r, 1, ReadReal); {прочитать запись}

RecRead:= (ReadReal = 1); {прочитано успешно ?}

finally

Close(g); {закрыть файл}

end;

end;

Result:= RecRead;

end {ReadFromFile};

Type

tStud = Record

Fio: String [60];

Curs: byte;

Stipendiya, Room: boolean;

End;

Var Stud: tStud;

if ReadFromFile('base2.ff1', 12, Stud, SizeOf(Stud))

then Writeln('Запись из 12-й позиции прочитана');

Приведем еще пример. В директории 'c:\Bases\SdudBase' находится файл 'AllStuds.bs', в котором хранятся данные о студентах в виде записей типа

Type

TStud = Record {студент}

Fio: String[50]; {'Фамилия Имя Отчество'}

Born: byte; {Год рождения, например, 1979}

Faculty: String[4]; {Факультет, например, 'МТФ'}

Group: String[8]; {Группа, например, 'МТ 17-2'}

End;

Ниже приведена универсальная процедура, которая копирует из этого файла в другой файл данные только о тех студентах, которые имеют заданный год рождения:

Procedure StudsCopy(nF1, nF2: ShortString; BornYear: byte;

Var Count: Word; Var: Ind: ShortInt);

{nF1 – файл-источник, nF2 – файл-приёмник,

BornYear – требуемый год рождения,

Count – скопировано записей,

Ind – индикатор контроля:

 0 – нормально, 1 – было неверное чтение, была неверная запись}

Var

g: tStud;

K, Sz, i,j: Word;

f1, f2: File;

Begin

Count:= 0; {инициализация счетчика}

Ind:=0; {изначально предполагаем нормальный процесс, иначе Ind изменим}

Sz:= SizeOf(g); {размер одной записи}

K:= KdnFileSize(nF1, Sz); {количество записей в файле-источнике}

If (K > 0) then {если в файле-источнике есть записи }

Begin

Assign(f1, nF1); {файл-источник связываем переменной f1}

Reset(f,Sz); {открываем файл-источник с записями размера Sz}

Assign(f2, nF2); {файл-приёмник связываем переменной f2 }

Rewrite(f2,Sz); {создаем новый файл-приёмник под записи размера Sz}

try

For j:=1 to K do

Begin

BlockRead(f1, g, 1, i); {чтение записи}

Case i of

1: {запись прочитана}

if (g.Born = BornYear) then { студент имеет требуемый год рождения}

begin

BlockWrite(f2, g, 1, i); {запись в файл-приёмник}

If (i > 0) then Inc(Count) {если записано правильно}

else

begin Ind:= 1; Break; End; {записано неверно, сразу выход из цикла}

end; {if}

0: begin Ind:= -1; Break; end; {запись не прочитана, сразу выход из цикла}

end; {Case}

end; {цикла For}

finally

CloseFile(f1); {закрываем файл-источник}

CloseFile(f2); {закрываем файл-приёмник}

end; {блока try – finally – end}

End {If };

End {StudsCopy};

Операторы, реализующие копирование требуемых данных в файл '1979.bs':

StudsCopy ('AllStuds.bs', '1979.bs', 1979, Count1979, Ind1979);

Case Ind1979 of

-1: Writeln('Зафиксирована ошибка чтения');

1: Writeln('Зафиксирована ошибка записи');

0: Writeln('Процесс прошел нормально');

end; {Case}

Writeln('Скопировано записей: ' + IntToStr(Count1979));

В этом примере использована внешняя процедура KdnFileSize {количество записей в файле }. Приведем ее текст:

function KdnFileSize(nF: ShortString, Siz: Word): LongInt;

{nF – имя файла, Siz – размер одной записи }

Var

F: File;

L: LongInt;

Begin

L:=0;

If FileExists(nF) then

begin

Assign(f, nF);

Reset(f,1);

L:= SizeOf(f);

If not (L mod Siz = 0) then Writeln('Файл ' + nF + имеет другой тип');

L:= L div Siz;

CloseFile(f);

End;

Result:= L;

End;

17.5. Процедуры и функции для работы с файлами

Эти подпрограммы предназначены для работы с файлами, папками (директориями) и дисками.

Procedure ChDir(Dir: String);

Делает папку Dir текущей. Пример: ChDir('c:\');

Procedure GetDir(D: Byte; Var Dir: String);

Возвращает текущую папку на заданном устройстве. (D= 0 – текущий диск, 1 – диск А, 2 – диск B и т.д.). Пример: GetDir(0, s);

Procedure RmDir(Dir: String);

Уничтожает заданную папку. Папка не должна содержать вложенных папок или файлов. Пример: RmDir('Folder66');

Procedure Erase(f);

Удаляет файл, связанный с файловой переменной f. Файл должен быть закрыт.

Procedure Rename(f, FileName: String);

Переименовывает файл, связанный с файловой переменной f. Файл должен быть закрыт. Пример: Rename(g, 'studs.txt');

Function DiskFree(D: byte): LongInt;

Возвращает количество свободной памяти в байтах на устройстве D. Код драйвера задается так же, как в процедуре GetDir. Если код указан неверно, то возвращает -1.

Function DiskSize(D: byte): LongInt;

Возвращает количество свободной памяти в байтах на устройстве D. Код драйвера задается так же, как в процедуре GetDir. Если код указан неверно, то возвращает -1.

Function FindFirst(const Path: string; Attr: Integer;

var F: TSearchRec): Integer;

Находит имя первого файла с заданными атрибутами Attr в папке Path. Результат поиска выводит в переменную F. Если поиск успешен, то функция вернет 0, иначе вернет код ошибки Widows. К FindFirst можно обращаться не только как к функции, но и как к процедуре.

Атрибуты файла приведены в табл. 17.

Таблица 17

Атрибут Описание файлов

faReadOnly

faHidden

faSysFile

faVolumeID

faDirectory

faArchive

faAnyFile

Файлы "Только для чтения"

Скрытые файлы

Системные файлы

Файл ID-значений

Папки (директории)

Архивы (файлы)

Все файлы

Тип, характеризующий найденный файл, представляет запись вида :

type

TSearchRec = Record

Time: Integer; {время}

Size: Integer; {размер файла в байтах}

Attr: Integer; {атрибуты файла}

Name: TFileName; {DOS-путь файла}

ExcludeAttr: Integer;

FindHandle: THandle;

FindData: TWin32FindData; {дополнительная информация о файле}

end;

Пример:

Var

SR: TSearchRec;

S: String;

FindFirst('c:\Program Files\delphi4\bin\*.*', faAnyFile, SR);

if (SR.Attr = faArchive) then

S:= 'Файл ' + SR.Name + ' имеет размер ' + IntToStr(SR.Size) + ' байт';

В данном примере процедура FindFirst ищет первый файл по маске '*.*' (все файлы) в папке 'c:\Program Files\delphi4\bin'. Атрибут faAnyFile означает, что поиск производится по всем видам файлов, под которыми понимаются папки (директории), '.', '..' – ссылки на текущую и родительскую папку, внутренние папки и собственно файлы. Последние в терминологии файловой атрибутики называются архивами. Далее, если найденный файл есть архив, т е. файл в общепринятой терминологии, то в строку S будет помещено сообщение. Например, если найденный файл имеет имя Ig.ttg и его размер равен 15899, то S= 'Файл Ig.ttg имеет размер 15889 байтов'.

Function FindNext(var F: TSearchRec): Integer;

Находит следующий файл, атрибуты которого указаны в FindFirst.

Procedure FindClose(var F: TSearchRec);

Закрывает действие FindFirst/FindNext.

Function DeleteFile(const FileName: string): Boolean;

Удаляет файл по имени. Если файл не может быть удален или не существует – возвращает False.

Function CreateDir(const Dir: string): Boolean;

Создает новую папку.

Function GetCurrentDir: string;

Возвращает текущую папку.

Function GetCurrentDir: string;

Возвращает текущую папку.

Function SetCurrentDir(const Dir: string): Boolean;

Установка новой текущей папки.

Function RemoveDir(const Dir: string): Boolean;

Удаление папки. Перед удалением папка должна быть пустой.

Function ExtractFileDir(const FileName: string): string;

Выделяет из полного имени файла FileName папку, в которой содержится это файл.

Function ExtractFilePath(const FileName: string): string;

Выделяет из полного имени файла FileName путь до файла.

Function ExtractFileExt(const FileName: string): string;

Возвращает расширение файла FileName.

Function ExtractFileName(const FileName: string): string;

Возвращает имя файла FileName (без расширения).

Function DirectoryExists(Dir: string): boolean;

Проверяет существование директории. Пример:

if DirectoryExists('C:\APPS\SALES\LOCAL') then ;

Function FileExists(FileName: string): boolean;

Проверяет существование файла. Примеры:

B:= FileExists('C:\APPS\SALES\LOCAL\Fort.pas'); {полное имя}

B:= FileExists('Fort.pas'); {указано усеченное имя файла, проверка его существования только в текущей директории}

Procedure ForceDirectories(Dir: string);

Создает новую директорию.

Procedure ForceDirectories(C:\APPS\SALES\LOCAL).

П р и м е ч а н и е. К моменту обращения к процедуре директории APPS и SALES должны существовать.

Пример процедуры удаления данных из текущей директории, включая файлы и вложенные папки.

Procedure DelInsideDir(FullDir: tPathStr);

Var

L: Integer;

Sr: TSearchRec;

dr, q: tPathStr;

begin

if ExistDir(FullDir) then {такая директория есть}

begin

GetDir(0,dr); {запомнить текущую директорию}

ChDir(FullDir); {текущей становится удаляемая директория}

L:=FindFirst(Slash(FullDir)+'*.*',faAnyFile,Sr);{поиск первого файла}

try

While (L = 0) do begin {пока файлы находятся}

Case Sr.Attr of

faDirectory:{найденный файл – внутренняя директория}

if (Sr.Name<>'.') and (Sr.Name<>'..') then {это не ссылка, директория}

begin

{удаление внутреннего содержимого директории}

DelInsideDir(Slash(FullDir)+Sr.Name);

q:= Slash(FullDir)+Sr.Name;

ChDir(ExtractFilePath(q));

{удаление самой директории (можно, т. к. она теперь пуста)}

if NotEmpStr(ExtractFileName(q)) then RmDir(ExtractFileName(q));

end;

faArchive: DeleteFile(Sr.Name); {это файл, удаляется}

end; {Конец Case-оператора}

L:= FindNext(Sr); {следующий файл директории}

end; {цикла While}

finally

FindClose(Sr); {закрыть поиск файлов}

end; {try – finally – end}

ChDir(dr); {вернуться в текущую директорию}

end; {if}

end;{процедуры}

Например, если необходимо стереть данные с дискеты, то это можно сделать с помощью оператора: DelInsideDir('A:\');

18. Классы и объекты

В Object Pascal классами называются специальные типы, которые содержат поля, методы и свойства. Предшественником класса является устаревший ныне тип языка Turbo Pascal, называемый объектом. Объект был введен в Turbo Pascal до создания Delphi. С появлением Delphi в новой версии языка Object Pascal объекты, для совместимости со старым программным продуктом, сохранены. Однако ныне использование объектов не актуально.

Класс представляет собой указатель. Однако в отличие от традиционных указателей это указатель особого типа: в нем нельзя использовать символ "^" при обращении к классу.

18.1. Инкаспуляция, наследование и полиморфизм

Класс, объединяя в себе поля, методы и свойства в единое целое, является законченной структурной единицей, предназначенной для решения отдельной задачи. Обычно такой задачей является задача разрешения некоторого круга сопутствующих проблем. Так, класс TRichEdit представляет собой мощный текстовой редактор rtf-файлов (файлов в формате Rich Text Format), который предназначен для организации просмотра и редактирования файла, сохранения и изменения размеров и типов шрифтов, поиска строк символов и многого другого. Такое объединение полей, методов и свойств в единое целое называется инкаспуляцией.

В языке существует множество классов (около 300), которые созданы разработчиками языка Object Pascal – сотрудниками фирмы Inprise International – для программистов, использующих среду Delphi. Такие классы можно назвать фирменными.

Программист, составляя программу, всегда создает свои пользовательские классы. Эти классы создаются либо неявно, когда программист конструирует программу визуальными средствами Delphi, а текст классов при этом составляет сама Delphi, либо явно, когда программист пишет код класса средствами языка Object Pascal.

Новый класс строится на основе другого, более простого, класса. Для этого в заголовке класса указывается его класс-родитель. Синтаксис заголовка нового класса имеет вид

type className = class (ancestorClass)

Здесь className – имя нового класса; ancestorClass – имя класса-родителя. Новый класс автоматически наследует поля, методы и свойства своего родителя и может пополниться своими полями, методами и свойствами. Это свойство классов называется наследованием. Возможность наследования позволяет, следуя методу от простого к сложному, создавать классы какой угодно степени сложности. Простейшим классом является класс TObject, который не содержит полей и свойств, однако имеет некоторое множество методов, обеспечивающих создание, уничтожение и обслуживание этого класса и необходимых для нормального функционирования программы. Именно на основе этого общего для всех классов прародителя строится дерево наследования классов. Например:

type TPersistent = class (TObject),

Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11


Новости

Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

  скачать рефераты              скачать рефераты

Новости

скачать рефераты

© 2010.