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

5. Перетягування і вбудовування об'єктів — Drag&Doc. Плаваючі вікна

Починаючи з C++Builder4 реалізована технологія перетягання і вбудовування віконних об'єктів — Drag&Doc. Ви можете познайомиться з результатами цієї технології, працюючи з Інтегрованим Середовищем Розробки C++Builder. Вона надає користувачу повну свободу в перебудові інтерфейсу. Окремі вікна можуть об'єднуватися разом, створювати багатосторінкове вікно із закладками, потім знову відокремлюватися і т.д. Подивимося, як подібний підхід можна реалізувати у своїй програмі.

У деяких віконних компонентів введено властивість DockSite, яка за умовчанням дорівнює false, але якщо її встановити в true, то компонент стає контейнером: приймачем, здатним приймати інші компоненти — клієнти. Ще одна властивість приймача — UseDockManager. Якщо вона дорівнює true (це прийнято за умовчанням), то процесом вбудовування клієнта автоматично управляє диспетчер вбудовування, відповідний тому компоненту, який є приймачем. Якщо ж задати UseDockManager рівним false, то вбудовування клієнтів «лягає на плечі» програміста.

У компонентах — потенційних клієнтах треба встановити властивість DragKind в dkDock. Крім того, якщо ви хочете, щоб процес перетягання починався автоматично, то, так само, як і в технології Drag&Drop, треба встановити властивість DragMode в dmAutomatic. Якщо залишити значення DragMode рівним dmManual за умовчанням, то управління процесом Drag&Doc здійснюється так само, як описувалося раніше для процесу Drag&Drop.

Подивимося, до чого все це може привести. Давайте побудуємо тестове застосування, в якому здійснимо Drag&Doc, не написавши жодного рядка коду.

Почніть новий проект. Перенесіть на форму 6 панелей, розташувавши їх приблизно так, як показано на мал. 14.1 У панелі Panel1 встановите властивість DockSite в true.

Мал. 14.1

Ця панель зможе служити у вас приймачем. У панелях Panel2 Panel6 встановіть DragKind в dkDock і DragMode в dmAutomatic. Запустіть застосування. Спробуйте перетягувати мишею панелі Panel2 Panel6, ви побачите, що панель Panel1 може приймати інші панелі, розміщуючи їх усередині себе, причому спосіб вбудовування залежить від того, в якій частині приймача ви завершуєте буксирування клієнта. Між розміщеними клієнтами є роздільники, які дозволяють вам переміщати буксируванням межі між клієнтами, змінюючи їх відносні розміри. Ви можете також бачити, що навіть незалежно від наявності або відсутності в застосуванні приймача, при клацанні на компонентах-клієнтах вони перетворюються на самостійні плаваючі, які можна переміщати, виходячи навіть за межі батьківської форми, можна змінювати їх розміри, можна закривати їх, після чого відповідні компоненти зникають.

Приймачем може бути і сама форма. Вкажіть для форми вашого проекту DockSite рівним true і запустіть його знову. Поведінка панелей дещо зміниться. При клацанні на компонентах - клієнтах вони як і раніше перетворюються на плаваючі вікна, які можна переміщати, змінювати їх розміри і т.п. Але при повторному клацанні вони знову стають звичайними панелями, зберігаючи при цьому змінене місцеположення і розміри. Пояснюється це тим, що повторне клацання сприймається в цьому випадку як вбудовування клієнта в приймач — форму.

Давайте побудуємо багатовіконий редактор текстів, що має сховище, в яке можна поміщати документи на зберігання і потім витягувати з нього потрібні документи.

Почніть новий проект і виконайте наступні пункти.

  • назвіть форму (властивість Name) Fmain.

  • розмістіть на формі компонент MainMenu і задайте в ньому всього один пункт — Новий, маючи на увазі під цим створення нового документа.

  • помістіть на форму панель, задайте її властивість Caption рівним Сховище документів і задайте Align = alTop.

  • помістіть на форму компонент PageControl і задайте Align = alClient, щоб він займав всю площу вікна, окрім смуги, зайнятою панеллю Сховище документів Задайте в ньому властивість DockSite рівним true. Цей компонент служитиме приймачем документів.

  • додайте в проект ще одну форму, виконавши команду Fiie/NewForm. Назвіть її FDoc (властивість Name). Задайте її властивість Visible рівним true. Встановіть її властивість DragKind рівним dkDock, а властивість DragMode рівним dmAutomatic. Ця форма служитиме клієнтом компоненту TPageControl на формі Fmain.

  • помістіть на форму FDoc компонент Memo, задавши для нього Align = alClient, щоб він зайняв всю форму. Зітріть в ньому текст (властивість Lines).

  • виконайте команду Project/Options і перенесіть форму FDoc з вікна Autocreate forms у вікно Available forms, оскільки вона повинна створюватися не автоматично, а при виборі користувачем розділу меню Новий.

  • збережіть проект, назвавши модуль з першою формою Umain, а з другою —UDoc.

Ми створили необхідні нам форми. Залишилося написати декілька операторів, щоб це все працювало.

  • виконайте для модуля Umain команду File/Include Unit Hdr і підключіть з її допомогою заголовний файл UDoc.h, щоб можна було посилатися на модуль UDoc.

  • введіть глобальну змінну LDoc типу TList. Вона є списком, в якому зберігатимуться покажчики на створювані користувачем форми документів: TList * LDoc;

  • у обробник події OnCreate форми Fmain запишіть оператор:

LDoc = new TList(); Цей оператор створює список LDoc.

  • у обробник події OnDestroy форми Fmain запишіть оператор:

delete Ldoc; Цей оператор звільняє пам'ять при закритті програми.

Залишилося написати обробник клацання на розділі меню Новий. Він може мати наступний вигляд:

TFDoc * New = new TFDoc(this);

LDoc->Add(New);

New->Caption = "Документ " + IntToStr(LDoc->Count);

У цьому обробнику вводиться змінна New типу TFDoc, відповідного типу форми FDoc. Перший оператор обробника динамічно розміщує нову форму FDoc і привласнює покажчик на неї змінною New. Наступний оператор додає покажчик на цю форму в список LDoc. А останній оператор задає заголовок вікна форми FDoc - «Документ ...», де багатокрапка замінюється на номер, відповідний числу рядків в списку LDoc.

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

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