Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Основы программирования в Delphi. Учебно-методическое пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
☆
Основы программирования в 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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]