![](/user_photo/_userpic.png)
Мансуров. Основы программирования в среде Lazarus. 2010
.pdfГлава 6 Программирование приложений с графическим интерфейсом
____________________________________________________________________
Cut: boolean – помечает узел статусом "вырезанный";
Expanded: boolean – равен true, если узел раскрыт;
Focused: boolean – равен true, если на узле установлен фокус;
HasChildren: boolean – true, если узел имеет дочерние узлы;
ImageIndex: TImageIndex – равен индексу связанной с узлом пикто-
граммы;
Index: Longint – содержит индекс узла в списке дочерних узлов его ро-
дительского узла;
IsVisible: boolean – равен true, если узел виден;
Level: integer – содержит иерархический уровень узла;
Owner: TTreeNodes – содержит ссылку на владельца данного узла;
Parent: TTreeNode – содержит ссылку на родительский узел;
Selected: boolean – равен true, если узел выделен;
SelectedIndex: integer – номер пиктограммы для выделенного узла;
Text: Strings – содержит текст узла;
function AlphaSort: boolean - сортирует узлы по алфавиту свойств Text и возвращает true в случае успеха;
procedure Collapse(Recurse: boolean) – закрывает все узлы
(Recurse = true) или только раскрытые (Recurse = false);
procedure Delete - удаляет текущий узел;
procedure DeleteChildren – удаляет дочерние узлы;
function EditText: boolean – переводит текст узла в режим редак-
тирования;
procedure EndEdit(Cancel: boolean) – заканчивает редактиро-
вание текста и сохраняет изменения, если Cancel= false;
procedure Expand(Recurse: boolean) – открывает узел (и все по-
дузлы, если Recurse= true);
651
![](/html/66936/286/html_e6jHPkGZZp.5LuV/htmlconvd-udfP_F652x1.jpg)
6.3 Визуальное программирование в среде Lazarus
____________________________________________________________________
function GetFirstChild: TTreeNode – возвращает ссылку на пер-
вый подузел или nil, если нет подузлов;
function GetLastChild: TTreeNode - возвращает ссылку на по-
следний подузел или nil, если нет подузлов;
function GetNext: TTreeNode – возвращает ссылку на очередной
подузел;
function HasAsParent(Value: TTreeNode): boolean – возвра-
щает true, если Value – родительский узел;
function IndexOf(Value: TTreeNode): integer – возвращает индекс узла Value.
Давайте теперь завершим процесс ввода в TReeView1 структуру типич-
ного университета, рис. 6.74.
Рис. 6.74. Пример ввода элементов с помощью редактора TTreeView
Поместите на форму компонент TStatusBar и напишите следующие об-
работчики:
652
Глава 6 Программирование приложений с графическим интерфейсом
____________________________________________________________________
procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
if Node.Selected then
StatusBar1.SimpleText:= 'Выбран узел: ' + Node.Text; end;
procedure TForm1.FormCreate(Sender: TObject); begin
TreeView1.Images:= ImageList1;
TreeView1.ExpandSignType:= tvestPlusMinus;
end;
Вобработчике OnCreate формы мы связали изображения, содержащиеся
вImageList1 с TreeView1, а также указали вид кнопки раскрытия узла. В
обработчик OnChange передается узел Node, состояние которого изменилось
(например, при щелчке пользователя на узел, он будет выделен). Узнать, выде-
лен (выбран) узел или нет, можно по свойству Selected. Текст этого узла со-
держится в свойстве Text.
Теперь создадим это же дерево программным путем. Кроме вывода в
TStatusBar информации о выбранном пользователем узле, выполним какие-
то еще действия. Например, выведем список групп студентов при нажатии узла
"Группы". Создайте новый проект, поместите на форму компоненты
TTreeView, TComboBox, TListBox, TStatusBar, TImageList и три компонента TLabel, так как показано на рисунке 6.75.
Поначалу компоненты TComboBox, TListBox и два TLabel будут неви-
димы. Только при выборе узла " Группы " мы сделаем их видимыми, а при вы-
боре другого узла, снова сделаем их невидимыми.
Подготовьте три текстовых файла со списками студентов или возьмите файлы из примера, где мы рассматривали компонент TComboBox.
653
![](/html/66936/286/html_e6jHPkGZZp.5LuV/htmlconvd-udfP_F654x1.jpg)
6.3 Визуальное программирование в среде Lazarus
____________________________________________________________________
Рис. 6.75. Форма приложения
unit Unit1; interface uses
Classes, SysUtils, FileUtil, LResources, Forms,
Controls, Graphics, Dialogs, ComCtrls, StdCtrls;
type
TForm1 = class(TForm)
ComboBox1: TComboBox;
ImageList1: TImageList;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
ListBox1: TListBox;
StatusBar1: TStatusBar;
TreeView1: TTreeView;
procedure ComboBox1KeyPress(Sender: TObject; var Key: char);
654
Глава 6 Программирование приложений с графическим интерфейсом
____________________________________________________________________
procedure ComboBox1Select(Sender: TObject); procedure FormCreate(Sender: TObject); procedure TreeView1Change(Sender: TObject;
Node: TTreeNode); procedure LoadListGroup(namefile: string);
private
{private declarations } public
{public declarations } end;
var
Form1: TForm1; implementation { TForm1 }
procedure TForm1.FormCreate(Sender: TObject); var
i: integer; begin
with TreeView1 do begin
Images:= ImageList1;
ExpandSignType:= tvestPlusMinus;
Items.Clear;
Items.Add(nil, 'Ректор');
Items.AddChild(Items.Item[0],
'Проректор по учебной работе');
Items.AddChild(Items.Item[1], 'Учебная часть');
Items.AddChild(Items.Item[1], 'Факультеты');
Items.AddChild(Items.Item[3], 'Кафедры');
655
6.3 Визуальное программирование в среде Lazarus
____________________________________________________________________
Items.AddChild(Items.Item[4], 'Преподаватели'); Items.AddChild(Items.Item[3], 'Студенты'); Items.AddChild(Items.Item[6], 'Группы'); Items.AddChild(Items.Item[0], 'Проректор по науке');
Items.AddChild(Items.Item[8],
'Институт прикладных исследований'); Items.AddChild(Items.Item[8], 'Отдел аспирантуры'); Items.AddChild(Items.Item[0], 'Проректор по экономике'); Items.AddChild(Items.Item[11], 'Отдел внешних связей'); Items.AddChild(Items.Item[0], 'Проректор по АХЧ');
for i:= 0 to Items.Count - 1 do begin
Items.Item[i].ImageIndex:= 0;
Items.Item[i].SelectedIndex:= 1;
end;
FullExpand;
end;
Label1.Caption:= 'Выберите группу';
Label2.Caption:= '';
Label3.Caption:= 'Структура университета';
Label1.Visible:= false;
Label2.Visible:= false;
ComboBox1.Visible:= false;
ListBox1.Visible:= false;
end;
procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
StatusBar1.SimpleText:= 'Выбран: ' + Node.Text;
656
Глава 6 Программирование приложений с графическим интерфейсом
____________________________________________________________________
if Node.AbsoluteIndex = 7 then begin
Label1.Visible:= true;
ComboBox1.Visible:= true;
ComboBox1.SetFocus;
ComboBox1.ItemIndex:= 0;
end else begin
Label1.Visible:= false;
Label2.Visible:= false;
ComboBox1.Visible:= false;
ListBox1.Visible:= false;
end;
end;
procedure TForm1.ComboBox1Select(Sender: TObject); begin
with ComboBox1 do begin
Label2.Visible:= true;
Label2.Caption:='Список группы ' + Text;
ListBox1.Visible:= true;
case ItemIndex of
0:LoadListGroup('List1.txt');
1:LoadListGroup('List2.txt');
2:LoadListGroup('List3.txt'); else
ShowMessage('Группа не выбрана');
end;
657
6.3 Визуальное программирование в среде Lazarus
____________________________________________________________________
end;
end;
procedure TForm1.LoadListGroup(namefile: string); var
tfile: TStringList; str: string;
begin
tfile:= TStringList.Create; tfile.LoadFromFile(namefile); str:= tfile.Text;
{$IFDEF WINDOWS}
str:= SysToUTF8(str); // преобразование в кодировку UTF-8
{$ENDIF}
with ListBox1 do begin
Items.Text:= str; end;
tfile.Free; ListBox1.Sorted:= true;
end;
procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: char);
begin
if Key = #13 then begin
ComboBox1Select(Sender);
Key:=#0;
end;
end;
658
Глава 6 Программирование приложений с графическим интерфейсом
____________________________________________________________________
initialization
{$I unit1.lrs}
end.
Обратите внимание узлы, находящиеся на первом уровне, имеют одинако-
вые индексы. Например, у всех проректоров Items.Item[0]. Поскольку на-
ше дерево фиксировано, добавление новых узлов и подузлов в программе не предусмотрено и, следовательно, индекс узла "Группы" нам известен, для опре-
деления выбора узла "Группы" мы воспользовались свойством
AbsoluteIndex:
if Node.AbsoluteIndex = 7 then
Но можно было поступить и по-другому:
if Node.Text = 'Группы' then
Компонент TTreeView можно применить для отображения дерева папок дисков, например как в левом окне Проводника Windows. Попробуем и мы реа-
лизовать эту задачу. Скажу сразу, в панели компонентов во вкладке "Misc"
имеется специализированный компонент TShellTreeView предназначенный именно для этого. Но мы попытаемся сделать это сами, так сказать "ручками",
ведь "не боги горшки обжигают"!
Сначала нам необходимо познакомиться с некоторыми функциями, кото-
рые будут нам нужны для работы.
659
![](/html/66936/286/html_e6jHPkGZZp.5LuV/htmlconvd-udfP_F660x1.jpg)
6.3 Визуальное программирование в среде Lazarus
____________________________________________________________________
Функции поиска файлов
Для поиска файлов обычно применяются следующие функции:
FindFirst - определяется следующим образом:
function FindFirst (Const Path: String; Attr: Longint; out Rslt : TSearchRec): Longint;
Параметр Path – задает путь к каталогу, а также маску поиска файлов.
Маска может содержать символы – шаблоны:
? – любой одиночный символ;
* - сколько угодно символов или даже отсутствие символов.
Например, маска *.* означает любые файлы с любым расширением, а мас-
ка *.pas означает любые файлы, с расширением pas.
Параметр Attr – атрибуты файла. Определяет, какие типы файлов следует
искать. Может принимать следующие значения:
faReadOnly – файлы только для чтения;
faHidden – скрытые файлы;
faSysFile – системные файлы;
faDirectory – папки и каталоги;
faArchive – архивные файлы;
faAnyFile – любые файлы.
Можно применять любые их комбинации, например, для поиска скрытых и
системных файлов можно задать faHidden + faSysFile.
Переменная Rslt представляет собой тип данных запись
TSearchRec, определяется следующим образом (привожу только те поля, ко-
торые представляют для нас интерес):
660