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

Мансуров. Основы программирования в среде Lazarus. 2010

.pdf
Скачиваний:
45
Добавлен:
27.04.2021
Размер:
6.3 Mб
Скачать

Глава 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

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

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

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