Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Основы программирования в Delphi. Учебно-методическое пособие
.pdf
Основы программирования в Delphi
lbStandard
Стандартный список
lbOwnerDrawFixed
Каждый элемент имеет фиксированную высоту
lbOwnerDrawVariable
Необходимо явно задавать размер каждого элемента списка
9. В Текстовой области и в Раскрывающемся списке допускается редак-
тирование текста. Когда в этих видах списка происходит изменение текста, то
генерируется событие OnChange. Это событие следует обрабатывать, например, если необходимо изменить значение текстового поля связанного с текущей
строкой списка.
10. Свойство Style определяет тип Списка или Раскрывающегося списка.
Для Списка оно может иметь 3 основных значения:
Если значение свойства Style не равно lbStandard, то программист должен
сформировать для списка обработчик события OnDrawItem, в котором само-
стоятельно организовать отрисовку содержимого. Такой список может содер-
жать не только текст, но и другие объекты, например рисунки.
Для Раскрывающегося списка свойство Style также может иметь 3 основных значения. Названия этих параметров и назначения, из-за нехватки времени,
здесь рассматривать не будем.
Пример. Программа выбора конфигурации компьютера.
Требуется создать приложение, которое позволяет выбрать конфигура-
цию компьютера и вычислить его стоимость. Для этого разместим на форме
3 компонента TListBox и компонент ComboBox1, 3 текстовых поля - для ввода
количества денег и вывода стоимости покупки, а также необходимые поясне-
ния. На рис. 13.4 показан внешний вид работающего приложения.
121

Основы программирования в Delphi
Рис. 13.4 Выбор конфигурации компьютера
Для выбора конкретной модели процессора и жесткого диска, разместим на форме 2 командные кнопки. Код этой простейшей программы предстален ниже.
implementation
{$R *.dfm}
var
Stoim, Money: integer;
procedure TForm1.FormCreate(Sender: TObject);
begin
Stoim:= 0;
end;
// Для кнопки выбора процессора
procedure TForm1.Button1Click(Sender: TObject);
var
CurIndex : integer;
Vybor, Zena : string;
begin
122

Основы программирования в Delphi
CurIndex := ListBox1.ItemIndex;
Vybor := ListBox1.Items [CurIndex];
ListBox3.Items. Add (Vybor);
Zena := ListBox1.Items.ValueFromIndex[CurIndex];
Stoim := Stoim + StrToInt(Zena);
Edit1.Text := IntToStr(Stoim);
Money := StrToInt (Edit2.Text);
Edit3.Text := IntToStr(Money - Stoim);
end;
// Для кнопки выбора жесткого диска
procedure TForm1.Button2Click(Sender: TObject);
var
CurIndex : integer;
Vybor, Zena : string;
begin
CurIndex := ComboBox1.ItemIndex;
Vybor := ComboBox1.Items [CurIndex];
ListBox3.Items.Add (Vybor);
Zena := ComboBox1.Items.ValueFromIndex [CurIndex];
Stoim := Stoim + StrToInt (Zena);
Edit1.Text := IntToStr (Stoim);
Money := StrToInt (Edit2.Text);
Edit3.Text := IntToStr (Money - Stoim);
end;
end.
КОНТРОЛЬНЫЕ ВОПРОСЫ
1. Перечислите основные компоненты для работы со списком строк.
2. В каком свойстве хранится список строк компонента Memo?
3. В каком свойстве хранится список строк компонентов ListBox и ComboBox?
4. Каким образом можно обработать список в прогорамме?
123

Основы программирования в Delphi
14. РАБОТА С ФАЙЛАМИ
Работа с файлами на любом языке программирования связана с возможно-
стями операционной системы по работе с файлами. Поэтому на всех языках
программирования функции для работы с файлами выглядят почти одинаково.
Порядок действий при работе с файлами обычно следующий:
1. Вначале файл открывается. При открытии файла системе управления
файлами обычно сообщается, в каком режиме файл будет открыт (чтение, запись, чтение и запись). После того, как файл успешно открыт, в программу воз-
вращается его идентификатор – переменная, которая будет использоваться для
идентификации этого файла во всех процедурах обработки.
2. Начинается работа с файлом. Это может быть считывание из него дан-
ных, запись, поиск и другие операции.
3. Файл закрывается.
При работе с файлами в Delphi 7 возможны 2 принципиально разных под-
хода. Первый состоит в использовании стандартных функций работы с файла-
ми (они имелись еще в Pascal под MS-DOS). Второй подход связан с появлением объектно-ориентированного программирования (ООП). По этой причине, в
языке Delphi появились средства - классы для объектной работы с файлами.
14.1 Стандартный подход работы с файлами
В Delphi 7 имеется стандартный тип File, на основе которого можно со-
здавать новые файловые типы. Переменную файлового типа можно описать
двумя способами.
1-й способ. Файл с неизвестной структурой:
var F: file
В этом случае структура файл не определяется. При этом данные будут считываться и записываться блоками (по умолчанию по 128 байт). Размер блока мож-
но указать в момент открытия файла.
2-ой способ. Файл, состоящий из последовательности одинаковых записей.
Вначале определяется структура записи, затем объявляется переменная связан-
ная с файлом. Например,
type TMyFile = record;
Name : string [20];
Number : integer;
end;
var F : file of TMyFile;
124

Основы программирования в Delphi
Теперь рассмотрим функций для работы с файлами.
Открытие файлов
Перед тем как выполнить физическое открытие файла, программе надо
сообщить, где он расположен. Для этого файловая переменная должна быть
связана с именем файла с помощью процедуры AssignFile. Например,
AssignFile (F, „test.dat‟);
AssignFile (F, „С:\projects\test.dat‟);
Если путь поиска не указан, то файл разыскивается в текущем каталоге.
Процедур открытия файлов в Pascal две. Первая из них, ReWrite, использу-
ется для открытия файла в режиме записи (при этом происходит полное уничтожение его содержимого, а размер файла становится равным нулю). Вторая
процедура – это Reset, используется для открытия файла в режиме чтения (при
этом вносить изменения в содержимое файла не разрешается).
Каждая из этих процедур может иметь второй параметр, который опреде-
ляет длину записи не структурированного файла в байтах. Например,
var F: file;
. . . . . . . . . . . . . .
ReWrite (F, 256);
Запись в файл.
Для записи данных в файл, имеющий определенную структуру, применяется процедура Write. В качестве первого параметра указывается файловая пе-
ременная, а далее следует список переменных типа, соответствующего типу
файла. Например,
var F : file of TMyFile;
A, MyData : TMyFile;
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ReWrite (F);
Write (F, A, MyData);
Значения из этих переменных будут последовательно записываться в конец
файла.
Считывание из файла
Чтобы считать данные из файла, необходимо использовать процедуру
Read. Она записывается аналогично процедуре Write.
var F : file of TMyFile;
125

Основы программирования в Delphi
A, MyData : TMyFile;
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Reset (F);
Read (F, MyData, A);
Начиная с текущей позиции в файле F (исходно это начало файла) из него
будут последовательно считаны блоки данных, размером записи TMyFile, и записаны в переменные MyData и A. По окончании операции считывания, текущая позиция в файле F сдвинется на два элемента.
Специальная процедура Truncate (var F) позволяет отсечь (удалить) все
содержимое файла, начиная с текущей позиции до его конца.
Закрытие файла.
По завершении работы с файлом его надо закрыть. Это выполняется вызо-
вом процедуры CloseFile. Например,
CloseFile (F);
Работа с неструктурированными файлами
Когда структура записей в файле неизвестна, рекомендуется считывать
файл по 1-му байту. В этом случае применяют процедуру блочного ввода/вывода BlockRead и BlockWrite. Они имеют одинаковый список параметров
и отличаются только названиями:
procedure BlockWrite (var F : file; var Buf; Count : Integer;
var AmtTransferred : Integer);
Параметр Buf – это произвольная переменная, где содержится записываемая или считываемая информация. Параметр Count – это число блоков считываемой или записываемой информации. Обычно длину блока задают равной 1му байту и в параметр Count записывают просто число байтов.
Параметр AmtTransferred – необязательный. По окончании выполнения
процедуры в нем будет храниться число реально считанных или записанных
блоков.
Установка новых позиций в файле
Считывание и запись информации в файл происходит последовательно,
блок за блоком. Если же, например, требуется считать пятую запись из файла, в
котором ранее было сохранено 10 записей, или изменить ее, не перезаписывая
все остальные данные, то можно воспользоваться процедурой Seek.
procedure Seek (var F; N : LongInt);
126

Основы программирования в Delphi
Здесь второй параметр – это номер записи в файле, начиная с которой бу-
дет выполнена следующая операция ввода/вывода. Нумерация записей в файле
начинается с нуля. В случае неструктурированного файла второй параметр
определяет номер байта, с которого начинается запись и чтение информации.
Пример 1.
Часть 1. Создание и редактирование неструктурированного файла
var F : file;
B : byte;
I : Integer;
begin
AssignFile (F, „c: \A.dat‟);
ReWrite (F, 1);
B := $41;
For I := 1 to 100 do
BlockWrite (F, B, 1);
CloseFile (F);
В результате выполнения этого кода на диске С: создается файл A.dat, со-
держащий 100 символов „A‟ ($41 – шестнад. ASCII-код буквы „A‟).
Часть 2. Следующий фрагмент программы изменит одиннадцатый байт в
этом файле на $42 (буквы „В‟). Хотя в процедуре Seek указано смещение 10,
изменен будет 11-ый байт, потому что отсчет блоков внутри файла ведется с
нуля.
AssignFile (F, „c‟:\A.dat‟);
B := $42;
Reset (F, 1);
Seek (F, 10);
BlockWrite (F, B, 1);
CloseFile (F);
Для редактирования содержимого файла его надо открывать с помощью
процедуры Reset, так как процедура ReWrite уничтожает всю информацию в
файле.
Пример 2.
Часть 1. Создание и редактирование файла, определенной структуры.
127

Основы программирования в Delphi
type TF = record
x, y : Integer
end;
var F : File of TF;
i : Integer ;
Rec : TF;
begin
Rec.x := $42; Rec.y := $43;
AssignFile (F, „c:\A.dat‟);
ReWrite (F);
For i := 1 to 100 do
Write (F, Rec);
CloseFile (F);
В результате выполнения этого фрагмента программы в файл записывается
100 записей – последовательность букв „B‟ и „C‟.
Часть 2. Модификация четвертой записи файла.
Rec.x := $45; Rec.y := $46;
AssignFile (F, „c:\A.dat‟);
Reset (F);
Seek (F, 3);
Write (F, Rec);
CloseFile (F);
Конец файла.
В процессе обработки файла часто возникает потребность обнаруживать
его конец. В Pascal имеется функция EOF, которая возвращает значение True,
если после выполнения последней операции ввода/вывода текущая позиция
оказывается в самом конце файла. При работе с файлами, чтобы не выходить за
пределы файла, надо ставить цикл вида:
While not EOF (F) do
begin
. . . . . . . . . . . . . . . . .
end;
128

Основы программирования в Delphi
14.2 Работа с файловой системой Windows
При создании программ для Windows более корректно применять стан-
дартные функции этой операционной системы. Для работы с ними не требуется
создавать специальные переменные файлового типа: в системе Windows каждый
файл имеет уникальный цифровой идентификатор (Handle – дискриптор файла)
типа Integer.
Файл создается с помощью функции
function FileCreate (сonst FileName : String) : Integer;
Функция возвращает идентификатор файла (целое положительное число)
или значение -1, если создать файл не удалось. В Windows режимы создания и
открытия файла различаются.
Открытие файла выполняется функцией
function OpenFile (const FileName : String; Mode : LongWord) : Integer;
Параметр Mode определяет режим открытия и может принимать следующие значения:
FmOpenRead – открытие только на чтение;
FmOpenWrite – открытие только на запись;
FmOpenReadWrite – открытие и на чтение, и на запись.
Для чтения данных из файла имеется функция
function FileRead (Handle : Integer; var : Buffer; Count : Integer) : Integer;
Параметр Count указывает число считываемых байтов, параметр Buffer -
это переменная, в которую эти байты записываются. Как правило, в качестве
такой переменной выступает массив из элементов типа Char или Byte.
Аналогично выглядит и функция записи данных:
function FileWrite (Handle : Integer; const Buffer; Count : Integer) : Integer;
Данные для записи содержатся в параметре Buffer. Параметр Count задает
число записываемых байтов.
Закрытие файла происходит с помощью процедуры:
procedure FileClose (Handle : Integer);
Пример. Создаем новый файл и записываем в него содержимое текстовой строки.
var FileHandle: Integer;
S: String;
129

Основы программирования в Delphi
Значение
Способ отсчета
0
1
2
От начала файла
От текущей позиции
От конца файла
begin
S := „Текстовая строка‟;
FileHandle := FileCreate („c:\tmp\s.txt‟);
FileWrite (FileHandle, S, SizeOf (S));
FileClose (FileHandle);
end;
Для установки текущей позиции в файле предназначена процедура
FileSeek.
function FileSeek (Handle, Offset, Origin : Integer) : Integer;
Параметр Offset задает сдвиг в байтах относительно позиции, определяемой параметром Origin. Параметр Origin может принимать один из следущих
значений:
14.3 Объектный подход в работе с файлами
После появления ООП был создан ряд новых типов, позволивших абстрагироваться от конкретного понятия «файл». С помощью объектного подхода
можно одинаково работать с любым внешним хранилищем данных (дисковая
память и другие способы хранения данных).
Эти новые типы основаны на базовом классе TStream (поток). Базовый
класс имеет набор виртуальных методов записи и считывания информации и
установки позиции внутри набора данных. Здесь будет рассмотрен класс
TFileStream, предназначенный для работы с файлами на жестком диске.
Класс TFileStream
Этот класс является наследником класса THandleStream, берущего свое
начало непосредственно от класса TStream.
Процесс работы с файлом, представленным в программе в виде объекта,
аналогичен обычному процессу работы с файлом. Сначала файл открывается
(для объекта эту функцию выполняет конструктор), затем происходит запись
или считывание данных, в заключение файл закрывается (вызывается деструк-
тор).
130
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
