Диалоги открытия и сохранения файла (компоненты TOpenDialog и TSaveDialog)
Компонент TOpenDialog предназначен для выбора файла с целью последующего открытия.
Компонент TOpenDialog находится на вкладке Dialogs и выбирается щелчком мыши по кнопке .
Пример диалогового окна открытия файла приведен на рис. 30.
Рис. 30. Пример диалогового окна открытия файла
Данный компонент обладает рядом важных свойств.
FileName – выбранное пользователем имя файла вместе с полным путем поиска (естественно, это свойство получает значение при успешном завершении диалога).
property FileName: WideString;
Программа может использовать данное свойство для доступа к файлу с целью читать из него данные (TOpenDialog) или записывать в него данные (TSaveDialog). В данном диалоге пользователь может ввести произвольное имя и, следовательно, указать несуществующий файл. При чтении отсутствующего файла может произойти крах программы. Чтобы избежать этого, можно воспользоваться глобальной функцией FileExists (FileName: string) логического типа, которая проверяет, существует ли файл с именем FileName или нет.
Filter – набор масок, в соответствии с которыми отбираются имена файлов для отображения в диалоговом окне.
property Filter: String;
Каждая маска состоит из двух частей: названия и шаблона, разделенных символом |. Одному названию может соответствовать несколько шаблонов. Маски отделяются друг от друга символом |. Данные маски можно устанавливать с помощью специального редактора на этапе конструирования формы или программно. Для доступа к редактору достаточно щелкнуть по кнопке в строке Filter окна инспектора объектов.
Окно редактора фильтра приведено на рис. 31.
Рис. 31. Окно редактора фильтра
FilterIndex – номер текущей маски. Нумерация начинается с 1.
property FilterIndex: Integer;
Title – заголовок диалогового окна.
property Title: String;
Пример.
В приведенной ниже процедуре при щелчке на кнопке Button1 отображается диалоговое окно выбора имени файла (компонент OpenDialog1), которое имеет заголовок «Выбор нужного файла», а в списке отображаются все файлы, имеющие расширение .pas. Это обеспечивается присвоением свойству FilterIndex значения 2. Открытый файл загружается в компонент Memo1.
procedure TForm1.Button1Click(Sender: TObject);
Var
S: string;
F: TextFile;
Begin
OpenDialog1.Filter := ‘Все файлы (*.*) | *.* | Файлы Паскаля (*.pas) | *.pas’;
OpenDialog1.Title := ‘Выбор нужного файла’;
OpenDialog1.FilterIndex := 2;
if OpenDialog1.Execute and
FileExists(OpenDialog1.FileName) then
begin
AssignFile(F, OpenDialog1.FileName);
Reset(F);
Memo1.Lines.Clear;
while not EOF(F) do
Begin
ReadLn(F, S);
Memo1.Lines.Add(S);
End;
CloseFile(F);
End;
End;
Существует альтернативный вариант загрузки содержимого файла в поле Memo1:
if OpenDialog1.Execute and
FileExists(OpenDialog1.FileName) then
Memo1.Lines.LoadFromFile(OpenDialog1.Filename);
Диалог сохранения файла (компонент TSaveDialog) практически ничем не отличается от компонента TOpenDialog за исключением некоторых настроек, специфичных для процесса сохранения файла.
Компонент TSaveDialog находится на вкладке Dialogs и выбирается щелчком мыши по кнопке .
Пример.
Имеется текстовый файл, созданный в редакторе. Файл состоит из строк. Необходимо прочесть содержимое файла, вывести на экран и подсчитать количество строк в файле.
Решение. На форму помещают компонент Memo, компонент OpenDialog, компонет Label и две кнопки Button.
Затем создают следующие процедуры обработки событий.
Процедура связана с событием OnCreate формы (процедура задает фильтр и очищает поле Memo1)
procedure TForm1.FormCreate(Sender: TObject);
Begin
// Определение фильтра для отбора открываемых файлов
OpenDialog1.Filter := 'Текст|*.txt';
Memo1.Clear;
End;
Для кнопки Button1 («Открыть») следует прописать обработчик события OnClick.
procedure TForm1.Button1Click(Sender: TObject);
Var
FName: String;
Begin
if (OpenDialog1.Execute) and
(FileExists(OpenDialog1.FileName)) then
Begin
FName := OpenDialog1.FileName;
Form1.Caption := FName;
Memo1.Lines.LoadFromFile(FName)
Label1.Caption:='Количество строк= '
+IntToStr(Memo1.Lines.Count);
End;
Для кнопки Button2 («Закрыть») следует прописать обработчик события OnClick.
procedure TForm1.Button2Click(Sender: TObject);
Begin
Form1.Close;
End;
Работа со строковыми таблицами
Строковыми считаются те таблицы, в ячейках которых располагаются произвольные слова или текстовые строки. Для создания таких таблиц предназначен компонент TStringGrid.
Компонент TStringGrid находится на вкладке Additional и выбирается щелчком мыши по кнопке .
Таблица делится на две части – фиксированную и рабочую. Фиксированная служит для показа заголовков столбцов/рядов и для ручного управления их размерами. Обычно фиксированная часть занимает крайний левый столбец и самый верхний ряд таблицы, однако с помощью свойств FixedCols и FixedRows можно задать другое количество фиксированных столбцов и рядов (если эти свойства имеют 0, таблица не содержит фиксированной зоны). Рабочая часть – эта остальная часть таблицы. Она может содержать произвольное количество столбцов и рядов, более того, эти величины могут изменяться программно. Рабочая часть может не умещаться целиком в пределах окна компонента, в этом случае в него автоматически помещаются нужные полосы прокрутки. При прокрутке рабочей области фиксированная область не исчезает, но меняется ее содержимое – заголовки строк и рядов.
Центральным свойством компонента является Cells – двумерный массив ячеек, каждая из которых может содержать произвольный текст. Конкретная ячейка определяется парой чисел – номером столбца и номером строки (именно в такой последовательности), на пересечении которых она находится (нумерация начинается с нуля). Свойство Cells имеет тип string, поэтому программа может легко прочитать или записать содержимое нужной ячейки. Напримep:
Cells [1,1] := 'Левая верхняя ячейка рабочей зоны';
Количество ячеек по каждому измерению хранит пара свойств ColCount (количество столбцов) и RowCount (количество рядов). Значения этих свойств и, следовательно, размеры таблицы могут меняться как на этапе разработки программы, так и в ходе ее работы, однако их значения должны быть как минимум на единицу больше соответственно значений в свойства FixedCols и FixedRows, определяющих размеры фиксированной зоны.
Основные свойства компонента приведены в табл. 11.
Таблица 11
Основные свойства компонента TStringGrid
Свойство | Описание |
property Cells[ACol, ARow: Integer]: String; | Определяет содержимое ячейки с табличными координатами (ACol, ARow) |
property Col: LongInt; | Содержит номер столбца ячейки, имеющей фокус ввода |
property ColCount: LongInt; | Содержит количество столбцов таблицы |
property ColWidths [Index: LongInt]: Integer; | Содержит ширину столбца с индексом Index |
Продолжение табл. 11
property FixedColor: TColor; | Определяет цвет фиксированной зоны |
property FixedCols: Integer; | Определяет количество столбцов фиксированной зоны |
property FixedRows: Integer; | Определяет количество строк фиксированной зоны |
property Row: LongInt; | Содержит номер ряда ячейки, имеющей фокус ввода |
property RowCount: LongInt; | Содержит количество рядов таблицы |
property RowHeights[Index: LongInt]: Integer; | Содержит высоту ряда с индексом Index |
Для компонента определен тип TGridOptions (в инспекторе объектов свойства этого множества сформированы в группу Options).
TGridOptions = set of TGridOptions;
Наиболее важные элементы множества TGridOptions имеют следующий смысл:
goRangeSelect – разрешено выделение нескольких ячеек;
goRowSizing –разрешено ручное (мышью) изменение высоты строк;
goColSizing – разрешено ручное изменение ширины рядов;
goEditing – разрешено редактирование ячейки (редактирование начинается после щелчка мыши или нажатия клавиши F2 и завершается при щелчке по другой ячейке или нажатию клавиши Enter);
goTabs – разрешено обходить ячейки клавишей Tab.
Рассмотрим пример работы с данным компонентом.
Предположим, что данный компонент будет использован для загрузки и сохранения информации в файл, состоящий из записей следующей структуры:
– ФИО;
– паспорт (серия и номер);
– дата рождения;
– адрес;
– телефон.
На экран должна выдаваться таблица примерно следующего вида (рис. 32).
Рис. 32. Пример компонента TStringGrid
Сначала программно зададим заголовки столбцов таблицы через обработчик события создания формы:
procedure TForm1.FormCreate(Sender: TObject);
Begin
{Создание шапки таблицы}
StringGrid1.Cells[0, 0] := '№ п/п';
StringGrid1.Cells[1, 0] := 'ФИО';
StringGrid1.Cells[2, 0]:= 'Паспорт';
StringGrid1.Cells[3, 0]:= 'Дата рождения';
StringGrid1.Cells[4, 0]:= 'Адрес';
StringGrid1.Cells[5, 0]:= 'Телефон';
{Задание ширины столбцов таблицы}
StringGrid1.ColWidths[0] := 50;
StringGrid1.ColWidths[1] := 120;
StringGrid1.ColWidths[2] := 100;
StringGrid1.ColWidths[3] := 90;
StringGrid1.ColWidths[4] := 120;
StringGrid1.ColWidths[5] := 60;
End;
Следует предусмотреть возможность добавления новой пустой строки по нажатию кнопки Button3 («Добавить» на рис. 32):
procedure TForm1.Button3Click(Sender: TObject);
Begin
StringGrid1.RowCount := StringGrid1.RowCount + 1;
StringGrid1.Cells[0, StringGrid1.RowCount - 1] :=
IntToStr(StringGrid1.RowCount - 1);
End;
Кнопка Button1 («Сохранить» на рис. 32) служит для записи содержимого таблицы в файл:
procedure TForm1.Button1Click(Sender: TObject);
Begin
AssignFile(F, 'file.dat');
Rewrite(F);
for i:=1 to StringGrid1.RowCount - 1 do
Begin
with StringGrid1 do
Begin
z.FIO := Cells[1, i];
z.pasp := Cells[2, i];
z.data := Cells[3, i];
z.adress := Cells[4, i];
z.tel := StrToInt(Cells[5, i]);
End;
Write(F, z);
End;
CloseFile(F);
End;
Кнопка Button2 («Загрузить» на рис. 32) служит для вывода в таблице содержимого файла:
procedure TForm1.Button2Click(Sender: TObject);
Begin
{Удаление старых данных из таблицы}
for i:=1 to StringGrid1.RowCount - 1 do
Begin
StringGrid1.Cells[1, i] := '';
StringGrid1.Cells[2, i] := '';
StringGrid1.Cells[3, i] := '';
StringGrid1.Cells[4, i] := '';
StringGrid1.Cells[5, i] := '';
end;
{Удаление лишних пустых строк из таблицы}
StringGrid1.RowCount := 2;
{Открытие файла}
AssignFile(F, 'file.dat');
Reset(F);
i := 1;
{Добавление записей в таблицу}
while not EOF(F) do
Begin
Read(F, z);
StringGrid1.Cells[0, i] := IntToStr(i);
StringGrid1.Cells[1, i] := z.FIO;
StringGrid1.Cells[2, i] := z.pasp;
StringGrid1.Cells[3, i] := z.data;
StringGrid1.Cells[4, i] := z.adress;
StringGrid1.Cells[5, i] := IntToStr(z.tel);
if not EOF(F) then
Begin
i := i+1;
StringGrid1.RowCount :=
StringGrid1.RowCount + 1;
End;
End;
End;
Замечание: оператор
StringGrid1.RowCount := StringGrid1.RowCount + 1;
служит для добавления в таблицу новой пустой строки, в которую будут записана следующая запись.
Деревья и списки
Компонент TTreeView – дерево иерархии
Компонент TTreeView служит для показа ветвящихся иерархических структур, таких как дерево наследования объектов или файловая структура диска. Он содержит связанные узлы, каждый из которых может содержать пиктограмму, текст и произвольный объект. Любой узел может иметь собственный рисок подузлов, которые можно раскрывать или закрывать щелчком мыши на пиктограмме узла.
Компонент TTreeView находится на вкладке Win32 и выбирается щелчком мыши по кнопке .
Узлы дерева могут добавляться двумя способами: на этапе конструирования с помощью инспектора объектов и в ходе выполнения программного кода.
Для наполнения списка на этапе конструирования программы нужно щелкнуть по компоненту правой кнопкой мыши и выбрать Items Editor, либо щелкнуть по нему дважды, либо, наконец, щелкнуть по кнопке в свойстве Items – во всех случаях на экране появится окно редактора компонента (рис. 33).
Чтобы начать наполнение, следует щелкнуть мышью по кнопке New Item и ввести связанный с узлом текст в поле Text. Для ввода подузла любого уровня сначала нужно щелкнуть в окошке Items по узлу, который должен стать родительским, и лишь затем по кнопке New Subltem.
Для ввода списка в режиме прогона программы следует широко использовать центральное свойство компонента – Items типа TTreeNodes, открывающее индексированный доступ ко всем узлам списка.
Рис. 33. Окно редактора компонента TTreeView
Пример внешнего вида компонента после запуска программы приведен на рис. 34.
Рис. 34. Пример компонента TTreeView
Каждый узел описывается классом TTreeNode, имеющим свои собственные методы и свойства. В частности, его свойство Item содержит список всех подузлов данного узла; с помощью многочисленных методов свойства ТТгееView.Items к этому списку можно добавить новый подузел, а с помощью метода TTreeNode.MoveTo – переместить узел в любую позицию дерева иерархии.
Пример.
Пусть при создании формы будет сформировано дерево, содержащее корневой узел, который содержит еще 10 уровней иерархии по одному узлу в каждом уровне.
procedure TForml.FormCreate(Sender: TObject);
Var
k: Integer;
Begin
with TreeViewl do
Begin
{Добавление корневого узла}
Items.Add(NIL, 'Корень') ;
{Добавление 10 вложенных узлов}
for k := 1 to 10 do
Items.AddChild(Items[k-1], IntToStr(k))
End;
End;
Основные свойства и методы компонента TTreeView приведены в таблице 12.
Таблица 12
Основные свойства и методы компонента TTreeView
Свойство или метод | Описание |
property Items: TTreeNodes; | Открывает доступ к любому узлу по его индексу. Индексация начинается с нуля и соответствует просмотру всех узлов полностью раскрытого списка. |
Продолжение табл. 12
property Selected: TTreeNode; | Содержит список всех выбранных узлов или NIL, если таких нет |
property ShowButtons: Boolean; | Разрешает/запрещает показ стандартных кнопок раскрытия подузлов. |
functionAlphaSort | Сортирует узлы по тексту и возвращает значение true, если сортировка прошла успешно |
procedure FullCollapse; | Прячет все узлы, кроме узлов самого верхнего уровня иерархии |
procedure FullExpand; | Показывает все узлы дерева иерархии |
При программном заполнении списка следует пользоваться свойством TTreeView.Items класса TTreeNodes.
Основные свойства и методы класса TTreeNodes приведены в табл. 13.
Таблица 13
Основные свойства и методы компонента TTreeView
Свойство или метод | Описание |
propertyCount: Integer; | Количество узлов входящих в дерево (Items) |
propertyItem[Index: Integer]: TTreeNode; | Открывает индексированный доступ к узлам |
function Add (Node: TTreeNode; const S: String): TTreeNode; | Добавляет узел в конец того дерева, в котором зарегистрирован узел Node. Если Node = NIL, добавляется корневой узел для всего компонента. |
function AddChild (Node: TTreeNode; const S: String): TTreeNode; | Добавляет узел в конец ветви Item дочерних узлов узла Node. |
Продолжение табл. 13
function AddChildFirst (Node: TTreeNode; const S: String): TTreeNode; | Добавляет узел в начало ветви Item дочерних узлов узла Node. |
function AddFirst (Node: TTreeNode; const S: string): TTreeNode; | Добавляет узел в начало той ветви, в которой зарегистрирован узел Node. |
procedure Clear; | Очищает список всех узлов и подузлов компонента |
procedure Delete (Node: TTreeNode) | Удаляет узел Node |
Компонент TListView – список просмотра
Компонент TListView предназначен для показа и выбора нескольких элементов. Каждый элемент может содержать пиктограмму и текст и подобно компоненту TTreeView иметь список связанных с ним подэлементов. В отличие от TTreeView в TListView допускается не более одного уровня вложенности подэлементов. TListView показывает свои элементы в одной или нескольких колонках, с крупными или мелкими пиктограммами, а также в виде «отчетов», представляющих элементы в двумерной таблице: по вертикали изображаются элементы верхнего уровня, по горизонтали – вложенные подэлементы. Рядом с элементами могут показываться независимые переключатели, упрощающие множественный выбор элементов.
Компонент TTreeView находится на вкладке Win32 и выбирается щелчком мыши по кнопке .
Компонент может наполняться как на этапе конструирования, так и на этапе прогона программы.
Свойство компонента Items содержит список всех элементов.
property Items: TListItems;
Свойство ViewStyle определяет стиль показа элементов.
propertyViewStyle: TViewStyle;
Может принимать следующие значения:
vsIcon – крупные пиктограммы;
vsSmalllcon – мелкие пиктограммы;
vsList – список пиктограмм;
vsReport – таблица пиктограмм.
Замечание: чтобы компонент работал в режиме vsReport, необходимо создать хотя бы одну колонку. На этапе конструирования программы колонки создаются и изменяются с помощью редактора колонок, окно которого открывается после щелчка по компоненту правой кнопкой и выборе в локальном меню опции Column Editor.
Вид редактора колонок приведен на рис. 35.
Рис. 35. Редактор колонок компонента TListView
При программном заполнении компонента важную роль играет свойство Items класса TListItems. Свойства и методы данного класса приведены в табл. 14.
Таблица 14
Основные свойства и методы класса TListItems
Свойство или метод | Описание |
property Count: Integer; | Количество элементов списка (Items) |
property Item[Index: Integer]: TTreeNode; | Открывает индексированный доступ к элементам списка |
Продолжение табл. 14
function Add: TListItem; | Добавляет очередной элемент к списку |
procedure Clear; | Очищает список |
procedure Delete (Index: Integer); | Удаляет элемент списка с индексом Index |
procedure Insert (Index: Integer): TListItem; | Вставляет новый элемент после элемента, заданного индексом Index |
Пример. Создать список из записей следующей структуры (почти аналогична примеру из пункта 3.9):
– ФИО;
– дата рождения;
– паспорт (серия и номер);
– адрес;
– телефон.
После заполнения список должен иметь следующий вид (рис. 36).
Рис. 36. Пример компонента TListView
Решение. Разместить на главной форме компонент ListView1, выбрав ему свойство ViewStyle=vsReport.
При создании формы следует программно задать заголовки столбцов для списка, а также ширину для каждого (можно это сделать в редакторе колонок, но здесь будет продемонстрирован альтернативный вариант – программное задание шапки списка).
procedure TForm2.FormCreate(Sender: TObject);
Begin
with ListView1 do
Begin
{Добавление новых колонок, задание их заголовка
и ширины}
Columns.Add;
Columns[0].Caption := '№ п/п';
Columns[0].Width := 60;
Columns.Add;
Columns[1].Caption := 'ФИО';
Columns[1].Width := 120;
Columns.Add;
Columns[2].Caption := 'Дата рождения';
Columns[2].Width := 80;
Columns.Add;
Columns[3].Caption := 'Паспорт';
Columns[3].Width := 100;
Columns.Add;
Columns[4].Caption := 'Адрес';
Columns[4].Width := 150;
Columns.Add;
Columns[5].Caption := 'Телефон';
Columns[5].Width := 80;
End;
End;
Для кнопки Button1 («Заполнить») следует создать обработчик события OnClick, в котором происходит заполнение списка элементами, которые берутся из файла с записями.
Для работы со списком весьма полезно создать новую переменную типа TListItem, через которую можно передавать в список содержимое нового элемента. В данном примере подобная переменная будет называться ListItem. Также следует заметить, что в списке в первом столбце находится элемент верхнего уровня (в данном случае это порядковый номер), а в остальных – подэлементы (в данном примере – ФИО, дата рождения, паспорт, адрес и телефон).
procedure TForm2.Button1Click(Sender: TObject);
Var
n: integer;
ListItem: TListItem;
F: file of zap;
z: zap;
Begin
{Открытие файла с записями}
AssignFile(F, 'file.dat');
Reset(F);
{Инициализация счетчика для формирования
порядкового номера записи}
n:=1;
while not eof(F) do
Begin
Read(F, z);
{Добавление элемента верхнего уровня в список}
ListItem := ListView1.Items.Add;
ListItem.Caption := IntToStr(n);
{Добавление подэлементов в список}
ListItem.SubItems.Add(z.FIO);
ListItem.SubItems.Add(z.data);
ListItem.SubItems.Add(z.pasp);
ListItem.SubItems.Add(z.adress);
ListItem.SubItems.Add(IntToStr(z.tel));
{Увеличение счетчика элементов в списке}
if not EOF(F) then n := n+1;
End;
CloseFile(F);
End;
Дата добавления: 2017-01-29; просмотров: 948;