Copyright © 2010 Promsite. All Rights Reserved.
стр. 4


Изучение компонента TTreeView, часть II

Автор Билл Уитни                                                                     перевод Виктор Алексеев aka prom

       Код в секции 19 определяет, может ли перетаскиваемый дивизион быть вставлен в нужное место в дереве.        Метод GetNodeAt  возвращает узел, который окажется под курсором во время вставки (TTreeNode *target = TreeView1->GetNodeAt(X, Y);). В зависимости от уровня узла определяется возможность вставки (if ( (target != NULL) && (target->Level == ev_league) )). Кроме этого, проверяется параметр Source на предмет, что его значение равно DivisionShape.  Посколько, в  случае если уровеь имеет значение ev_leaque, то можно говорить, что перетакиваемый улел вставится в нужное место. Если все проверяемые условия выполняются, то вызывается функция AddDivision, которую мы рассматривали ранее.


Drag and drop в пределах TtreeView

       Вы также можете перетаскивать объекты в пределах дерева. Например, можно переместить игрока из одной команды в другую. (По обработчикам событий onDragDrop и DragOver читайте в русских справках Архангельского). Снова посмотрим код в секции 18 и 19. В обработчике onDragOver  проверяется готовность дерева принять перетаскиваемый объект. Если источник-объект имеет тип TShape и цель-объект тип TtreeView, то это означает, что дерево готово к приему перетаскиваемого объекта. В частности, если определено, что источником является игрок и цель - категория, то можно с помощью функции MovePlayer перенести игрока из одной команды в другую.

Удаление узлов

       Приложение также позволяет удалить узел. Опять же, выполняя проверку уровня узла, можно определить допустимость удаления этого узла. Например, невозможно позволить пользователю удалить список категорий расположенных ниже узла-команды, поскольку список категорий жестко зашит в коде приложения. Код в секции 16 содержит процедуру, которая позволяет удалять все узлы, за исключением узлов категорий игроков.

Сохранение и восстановление TtreeView (перезагрузка)

       TTreeView поставляется с методами для сохранения узлов в файл (SaveToFile) и восстановлением обратно (LoadFromFile). Каждый метод принимает параметр типа AnsiString с именем файла.  Ниже показан основной код:

       void __fastcall TForm1::SaveClick(TObject *Sender)
       {
       TreeView1->SaveToFile("saved.ttv");
       }

       void __fastcall TForm1::LoadClick(TObject *Sender)
       {
         TreeView1->LoadFromFile("saved.ttv");
       }

       При перезагрузке дерева есть одна проблема, которая заключается в том, что кроме структуры дерева и имени узлов ничего больше и не сохраняется. В том случае, если узел связан с объектом, то при перезагрузке информация об этом теряется.  К сожалению, нет единого решения этой проблемы. Запись и чтение объектов требует специального рассмотрения и выходит за рамки статьи. Один из вариантов использовать структуры. Т.е. если возникает необходимость использовать объекты, связанные с узлами, то надо скопировать в структуру значения атрибутов объекта и затем сохранить структуру на диске.

       В нашем примере реализован этот вариант. При записи TtreeView, сохраняется информация об узлах, такая как уровень и имя.  Для более подробного изучения посмотрим код в секциях 21 и 22 листинга А.

       В секции 21 при записи дерева на диск вы проходите все узлы в абсолютном порядке.  Здесь вы копируете имя и уровень (уровень хранится в переменной type) и установленный флаг hasStruct для атрибутов типа *void в структуру SaveNode. (Напомним, что такой тип имеют только игроки. Поэтому флаг hasStruct будут иметь именно эти узлы).  Затем структура со скопированными данными записывается на диск. Естественно, что цикл заканчивается при проходе последнего узла.

       Чтение узлов из файла в дерево немного сложнее, т.к. надо узлы четко вставить на нужный уровень. Кроме того, надо проверить флаг hasStruct, для того чтобы игрок попал в нужный узел. Смотрите код в секции 22 (функция LoadFromFile). 

P  R  O  M  S  I  T  E
Статьи по С++Builder 6
страницы: 1   2   3   4   5   6
страницы: 1   2   3   4   5   6

Для отображения Облака ссылок
необходим
Adobe Flash Player 9
или выше.