![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() ![]() |
![]() |
18192123 |
![]()
Сообщение
#21
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Снова вопрос по Drag&Drop..теперь в пределах TreeView..т.е. перемещение узлов.
Нашла в DRKB пример по этому вопросу...
Узлы перемещаются..Но проблема в том, чтобы переместить ещё и связанный с узлом объект... Объясните пожалуйста, как это нужно делать? |
volvo |
![]()
Сообщение
#22
|
Гость ![]() |
nodeTmp := Items.AddChild(TargetNode, SourceNode.Text); попробуй заменить на nodeTmp := Items.AddChildObject(TargetNode, SourceNode.Text, SourceNode.Data); Должно сработать... |
18192123 |
![]()
Сообщение
#23
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
nodeTmp := Items.AddChild(TargetNode, SourceNode.Text); попробуй заменить на nodeTmp := Items.AddChildObject(TargetNode, SourceNode.Text, SourceNode.Data); Должно сработать... Да, получилось!! Спасибо! И теперь момент, который мне не ясен..И это реализация сохранения (того, что получили на TreeViewNew)/считывания (занесение данных в TreeViewNew) в формате XML...Как это реализуется? Какие-нибудь специальные компоненты? Объясните пожалуйста, как это должно выглядеть?? |
volvo |
![]()
Сообщение
#24
|
Гость ![]() |
Цитата как это должно выглядеть?? Вот тут есть описание (правда по-английски): Exporting a TreeView to XML. Populating a TreeView from XMLПравда приведенные там процедуры чтения/записи XML потребуют небольшой доработки, поскольку кроме самих названий узлов у тебя должны сохраняться еще и связанные с ними данные (это придется добавить несколько атрибутов в ProcessTreeItem), и потом они должны восстанавливаться из файла (это в ProcessNode, чтение этих атрибутов, создание экземпляра класса TBPeriod и использование AddChildObject вместо AddChild)... |
Гость |
![]()
Сообщение
#25
|
Гость ![]() |
А скажите пожалуйста, где будет лежать создаваемый таким образом файлик *.XML?
|
18192123 |
![]()
Сообщение
#26
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
|
volvo |
![]()
Сообщение
#27
|
Гость ![]() |
Судя по строке
XMLDoc.SaveToFile(ChangeFileExt(ParamStr(0),'.XML'));, там же, где и EXE-шник. |
18192123 |
![]()
Сообщение
#28
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Вот тут есть описание (правда по-английски): Exporting a TreeView to XML. Populating a TreeView from XML Правда приведенные там процедуры чтения/записи XML потребуют небольшой доработки, поскольку кроме самих названий узлов у тебя должны сохраняться еще и связанные с ними данные (это придется добавить несколько атрибутов в ProcessTreeItem)... А что это за атрибуты? |
volvo |
![]()
Сообщение
#29
|
Гость ![]() |
Твои атрибуты... Смотри, сохранять дерево (вместе с тем, что хранится в объектах, связанных с узлами), можно так:
procedure Tree2XML(tree: TTreeView);Чтобы восстановить из XML сохраненное таким образом дерево: procedure XML2Tree(tree: TTreeView; XMLDoc: TXMLDocument);(я для проверки сохранял из одного дерева, восстанавливал в другое... Из доп. информации сохраняется только строка Data, если у тебя есть еще что-то добавляй и в ProcessTreeItem, и в ProcessNode)... Сообщение отредактировано: volvo - 12.12.2008 0:35 |
Гость |
![]()
Сообщение
#30
|
Гость ![]() |
Мне вот ещё что не понятно...
Как быть при записи/чтении в/из *.XML в случае, если TBPeriod имеет наследника TRange, который в свою очередь - TGroup, для TGroup есть наследник TUnderGroup, и для последнего - наследник TElement (причём объекты верхних ступенек иерархии имееют одни и те же поля, а TElement - в дополнии к ним ещё и новые..как учесть это??) Объясните пожалуйста! |
18192123 |
![]()
Сообщение
#31
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Мне вот ещё что не понятно... Как быть при записи/чтении в/из *.XML в случае, если TBPeriod имеет наследника TRange, который в свою очередь - TGroup, для TGroup есть наследник TUnderGroup, и для последнего - наследник TElement (причём объекты верхних ступенек иерархии имееют одни и те же поля, а TElement - в дополнии к ним ещё и новые..как учесть это??) Объясните пожалуйста! |
volvo |
![]()
Сообщение
#32
|
Гость ![]() |
Цитата как учесть это?? Сохранять в XML вместе с данными еще и некоторый идентификатор, определяющий, объект какого именно типа надо будет создавать при восстановлении дерева... Скажем, при id="1", создаем TRange, если id="2", то TElement, и так далее...Я бы сделал виртуальную функцию GetID: string, которая будет возвращать идентификатор для каждого типа объекта, тогда при записи в этот самый атрибут ID достаточно будет вызвать: cNode.Attributes['ID'] := TBPeriod(tn.Data).GetID; |
18192123 |
![]()
Сообщение
#33
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Сохранять в XML вместе с данными еще и некоторый идентификатор...
Например, так? А для записи в XML наследников должен быть аналогичный код? |
volvo |
![]()
Сообщение
#34
|
Гость ![]() |
Цитата А для записи в XML наследников должен быть аналогичный код? Ты ж сказала, что у тебя почти у всех классов одинаковые поля, значит изменения (т.е. добавление еще нескольких строк кода) будет только при сохранении TElement... |
18192123 |
![]()
Сообщение
#35
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Ты ж сказала, что у тебя почти у всех классов одинаковые поля, значит изменения (т.е. добавление еще нескольких строк кода) будет только при сохранении TElement... Да, так и будет.. Но я так и не поняла, где указывать эти несколько строк кода? В фрагменте из предыдущего поста? |
volvo |
![]()
Сообщение
#36
|
Гость ![]() |
Ну, например, так:
if tn.Data <> nil then begin |
18192123 |
![]()
Сообщение
#37
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Вот такой вопрос возник..
Если я хочу создать очередной узел (по нажатию соответствующей кнопки), то сначала в TreeView мне нужно выделить узел-родитель..Хочу сделать контроль возможности неверного выделения.. Скажите пожалуйста, как в этом случае сообщить о нарушении иерархии, если вместо предполагаемого родительского узла выделен узел того же уровня, что и новый или выделен узел, стоящий выше предполагаемого родительского? |
volvo |
![]()
Сообщение
#38
|
Гость ![]() |
Цитата как в этом случае сообщить о нарушении иерархии, если вместо предполагаемого родительского узла выделен узел того же уровня, что и новый Где и как задается уровень НОВОГО узла? В предыдущей версии твоей программы новый узел добавлялся как дочерний к любому выделенному... Что теперь изменилось? Есть какие-то ограничения? |
18192123 |
![]()
Сообщение
#39
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
|
volvo |
![]()
Сообщение
#40
|
Гость ![]() |
Ну, если дерево будет именно таким, как было сказано в самом первом посте, то с этим проблем нет, можно в конце концов выделять римские числа в заголовках узлов и проверять, подходит ли потомок к выбранному предку... А вот если я в группу "Неметаллы" захочу внести Селен и Теллур - ты сама, не заглядывая в таблицу вряд ли сможешь определить (по смыслу) ошибся ли я, и какой именно элемент не подходит для данной группы. Так что только по смыслу здесь не пойдет. Нужна какая-то доп. информация.
|
![]() ![]() |
![]() |
Текстовая версия | 18.07.2025 15:11 |