Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Л7.doc
Скачиваний:
4
Добавлен:
08.07.2019
Размер:
120.32 Кб
Скачать

Лекція №7

Тема 3. Компоненти бібліотеки C++Builder (продовження)

План

  1. Перелік компонентів для відображення ієрархічних даних.

  2. Компоненти відображення дерева даних — TreeView.

  3. Компоненти відображення дерева даних — Outline.

  4. Відображення інформації в стилі папок Windows — компонент ListView.

  1. Перелік компонентів для відображення ієрархічних даних

Нижче будуть розглянуті компоненти відображення ієрархічних даних довільного вигляду. Це може бути структура деякої установи, структура складного проекту, склад документації і т.п. Перелік компонентів, здатних відображати подібну інформацію, приведений нижче.

  • .

TreeView (Win32) - перегляд структури ієрархічних даних у вигляді дерева в стилі ОС Windows.

Outline (Win3.1) - перегляд структури ієрархічних даних у вигляді дерева в стилі оболонки Windows 3.x.

ListView (Win32) - відображення списків у вигляді колонок або піктограмм в стилі папок Win­dows.

Компоненти даного типу реалізують декілька переваг при реалізації візуального інтерфейсу:

  • наочно відображують зв’язок між різними елементами даних у вигляді ієрархічної схеми;

  • дозволяють впорядковувати дані і об’єкти за визначеними правилами;

  • дозволяють вводити дані шляхом безпосереднього вибору із структури, або співставляти цьому вибору інші дані та процедури

2. Компоненти відображення дерева даних — TreeView

Компоненти TreeView і Outline служать для відображення ієрархічних даних у вигляді дерева, в якому користувач може вибрати потрібний йому вузол або вузли. Ієрархічна інформація може бути самою різною: структура деякого підприємства, структура документації установи, структура звіту і т.п. З кожним вузлом дерева можуть бути пов'язані деякі дані.

Можливості компоненту TreeView дещо ширші, ніж компоненту Outline. До того ж TreeView — 32-розрядний компонент, а Outline — 16-розрядний. Тому Outline доцільно використовувати тільки в застосуваннях, призначених для роботи в будь-яких версіях Windows, включаючи Windows 3.x.

Основною властивістю TreeView, що містить інформацію про вузли дерева, є Items. Доступ до інформації про окремі вузли здійснюється через властивість Items[int Index]. Наприклад:

TreeView1—>Items—>Item[0] — це вузол дерева з індексом 0 (перший вузол дерева). Кожен вузол є об'єктом типу TTreeNodes, що володіє своїми властивостями і методами.

Під час проектування, формування дерева здійснюється у вікні редактора вузлів дерева (мал. 7.1.) Це вікно викликається подвійним клацанням на компоненті TreeView або натисненням кнопки з багатокрапкою біля властивості Items у вікні Інспектора Об'єктів.

Кнопка NewItem (новий вузол) дозволяє додати в дерево новий вузол. Він буде розташований на тому ж рівні, на якому розташований вузол, виділений курсором у момент клацання на кнопці NewItem.

Мал. 7.1.

Кнопка NewSubItem (новий дочірній вузол) дозволяє додати в дерево дочірній вузол. Він буде розташований на рівень нижче за рівень того вузла, який виділений курсором у момент клацання на кнопці NewSubItem.

Кнопка Delete (видалити) видаляє виділений вузол дерева. Кнопка Load дозволяє завантажити структуру дерева з файлу. Файл, що зберігає структуру дерева — це звичайний текстовий файл, що містить тексти вузлів. Рівні вузлів позначаються відступами. Наприклад, файл дерева, може мати вигляд:

Виробництво

цех 1

цех 2

цех 3

Управління

адміністрація

бухгалтерія

Для кожного нового вузла дерева можна вказати ряд властивостей в панелі ItemProperties. Це перш за все властивість Text - напис, що з'являється в дереві біля даного вузла. Властивості ImageIndex і SelectedIndex визначають індекс піктограми, що відображається для вузла, який відповідно не виділений і виділений користувачем в даний момент. Ці індекси відповідають списку зображень, що зберігаються в окремому компоненті ImageList. Вказівку на цей компонент ви можете задати у властивості Images компоненту TreeView. Індекси починаються з 0. Якщо ви вкажете індекс -1 (значення за умовчанням), піктограми зображатися не будуть. Остання властивість — StateIndex в панелі ItemProperties дозволяє додати другу піктограму в даний вузол, не залежну від стану вузла. Подібна піктограма може просто служити додатковою характеристикою вузла. Індекс, що указується як StateIndex, відповідає списку зображень, що зберігаються в окремому компоненті ImageList, вказаному у властивості StateImages компоненту TreeView.

Ми розглянули формування дерева в процесі проектування. Проте дерево можна формувати або перебудовувати і під час виконання програми. Для цього служить ряд методів об'єктів типу TTreeNodes. Наступні методи дозволяють вставляти в дерево нові вузли:

Add (TTreeNode* Node, const System::AnsiString S) – додає новий вузол з текстом S, як останній вузол рівня, на якому розташований Node.

AddFirst (TTreeNode* Node, const Syatem::AnsiString S) - вставляє новий вузол з текстом S, як перший з вузлів рівня, на якому знаходиться Node. Індекси наступних вузлів збільшуються на 1.

Insert (TTreeNode* Node, const Syatem::AnsiString S) - вставляє новий вузол з текстом S відразу після вузла Node на той же рівень. Індекси наступних вуз­лів збільшуються на 1.

AddChild(TTreeNode* Node, const System::AnsiString S) - додає вузол з текстом S як останній дочірній вузол Node.

AddChildFirst(TTreeNode* Node, const System;:AnsiString S) - вставляє новий вузол з текстом S як перший із дочірніх вузлів вузла Node. Індекси наступних вузлів збільшуються на 1.

Кожний з цих методів повертає вставлений вузол.

Нижче, як приклад, приведений код, що формує те ж дерево, яке ви можете бачити на мал. 7.1.

// очищення списку

TreeView1->Items->Clear();

//додавання кореневого вузла "Виробництво" (індекс 0)

TreeView1->Items->Add(NULL,"Виробництво");

// додавання дочірніх вузлів "цех 1-цех 3" (індекси 1-3)

TreeView1->Items->AddChild(TreeView1->Items->Item[0],"цех 1"); TreeView1->Items->AddChild(TreeView1->Items->Item[0],"цех 2"); TreeView1->Items->AddChild(TreeView1->Items->Item[0],"цех 3");

//додавання кореневого вузла "Управління" після вузла "Виробництво" (індекс 4) TreeView1->Items->Add(TreeView1->Items->Item[0], "Управління");

//додавання дочірніх вузлів ''адміністрація" і "бухгалтерія" вузла "Управління"

TreeView1->Items->AddChild(TreeView1->Items>Item[4],"адміністрація");

TreeView1->Items->AddChild(TreeView1->Items->Item[4],"бухгалтерия");

Дерево може бути скільки завгодно розгалуженим. Наприклад, наступні оператори додають дочірні вузли «бригада 1» і «бригада 2» в сформований раніше вузол «цех 1»:

TreeView1->Items->AddChild(TreeView1->Items->Item[1],"бригада 1");

TreeView1->Items->AddChild(TreeView1->Items->Item[1],"бригада 2");

Текст, пов'язаний з деяким вузлом, можна визначаэться за допомогою його властивості Text. Наприклад TreeView1->Items->Item[1]->Text — це напис «цех 1».

З кожним вузлом може бути пов'язаний деякий об'єкт. Додавання таких вузлів здійснюється методами AddObject, AddObjectFirst, InsertObject AddChildObject, AddChildObjectFirst, аналогічними приведеним вище, але що містять як параметр покажчик на об'єкт. Наприклад:

AddObject(TTreeNode* Node, const System::AnsiString S, void * Ptr)

Додає новий вузол з текстом S та об’єктом Ptr, як останні вузол рівня, на якому розташований Node.

Об'єкт, пов'язаний з деяким вузлом, можна знайти за допомогою його властивості Data. Наприклад: TreeView1->Items->Item[1]->Data.

Для видалення вузлів є два методи: Clear(void), що очищає все дерево, і Delete(TTreeNode* Node), що видаляє вказаний вузол Node і всі його дочірні вузли. Наприклад, оператор

TreeView1->Items->Clear()- видалить в нашому прикладі всі вузли,

а оператор

TreeView1->Items->Delete(TreeView1->Items->Іtem[1]);

видалить вузол «цех 1» і його дочірні вузли (якщо вони є).

При видаленні вузлів, пов'язаних з об'єктами, самі ці об'єкти не віддаляються.

Реорганізація дерева, пов'язана із створенням або видаленням багатьох вузлів, може викликати неприємне мерехтіння зображення. Уникнути цього можна за допомогою методів BeginUpdate і EndUpdate. Перший з них забороняє перемальовування дерева, а другий — дозволяє. Таким чином, зміна структури дерева може здійснюватися по наступній схемі:

TreeView1->Items->BeginUpdate();

TreeView1->Items->EndUpdate();

Якщо метод BeginUpdate застосований підряд кілька разів, то перемальовування дерева відбудеться тільки після того, як стільки ж разів буде застосований метод EndUpdate.

Серед властивостей вузлів слід зазначити Count — число вузлів, керованих даним, тобто дочірніх вузлів, їх дочірніх вузлів і т.п. Якщо значення Count вузла рівне нулю, означає у нього немає дочірніх вузлів, тобто він є листом дерева.

Повернемося до властивостей компоненту TreeView. Важливою властивістю компоненту TreeView є Selected. Ця властивість указує вузол, який виділений користувачем. Користуючись цією властивістю можна запрограмувати операції, які треба виконати для вибраного користувачем вузла. Якщо жоден вузол не вибраний, значення Selected рівне NULL. При виділенні користувачем нового вузла відбуваються події OnChanging (перед зміною виділення) і OnChanged — після виділення. У обробник події OnChanging передаються параметри TTreeNode *Node — вузол, який виділений в даний момент, і bool &AllowChange — дозвіл на перенесення виділення. Якщо в обробнику задати AllowChange = false, тобто перемикання виділення не відбудеться. У обробник події OnChanged передається тільки параметр TTreeNode *Node — виділений вузол. У цьому обробнику можна передбачити дії, які повинні проводиться при виділенні вузла.

У компоненту TreeView є властивість RightClickSelect, що вирішує (при значенні рівному true) виділення вузла клацанням як лівою, так і правою кнопкою миші. Але і в цьому випадку подія OnChanged наступає тільки при виділенні вузла лівою кнопкою миші.

Ряд подій компоненту TreeView пов'язаний з розгортанням і згортанням вузлів. При розгортанні вузла відбуваються події OnExpanding (перед розгортанням) і OnExpanded (після розгортання). У обробники обох подій передається параметр TTreeNode *Node — розгорнутий вузол. Крім того в обробник OnExpanding передається параметр bool&lAllowExpansion, який можна задати рівним false, якщо бажано заборонити розгортання. При згортанні вузла відбуваються події OnCollapsing (перед згортанням) і OnCollapsed (після згортання). Так само, як і в подіях, пов'язаних з розгортанням, в обробники передається параметр TTreeNode *Node — вузол, що згортається, а в обробник OnCollapsing додатково передається параметр bool&AllowCollapse, що дозволяє або забороняє згортання.

Властивість ReadOnly компоненту TreeView дозволяє заборонити користувачу редагувати дані, що відображаються. Якщо редагування дозволене, то при редагуванні виникають події OnEditing і OnEdited, аналогічні розглянутим раніше (у обробнику OnEditing параметр bool&AllowEdit дозволяє - забороняє редагування).

Ряд властивостей компоненту TreeView: ShowButtons, ShowLines, ShowRoot відповідають за зображення дерева і дозволяють відображати або прибирати з нього кнопки, що показують розкриття вузла, лінії, що зв'язують вузли, і кореневий вузол.

Властивість SortType дозволяє автоматично сортувати гілки і вузли дерева. За умовчанням ця властивість рівне stNone, що означає, що дерево не сортується. Якщо встановити SortType рівним stText, то вузли автоматично сортуватимуться за абеткою. Можливо також проводити сортування по пов'язаних з вузлами об'єктах Data (значення SortType рівне stData), одночасно по тексту і об'єктам Data (значення SortType рівне stBoth) або будь-яким іншим способом.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]