Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Добавление узлов в Treeview 
:(
    Опции темы
AndreyZ53
Дата 17.5.2010, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 22.8.2008

Репутация: нет
Всего: 2



Здравствуйте, помогите пожалуйста разобраться Treeview, как мне для выделенного узла добавить узел и сохранить эту структуру, чтобы при следующем запуске программы, он вылазил в такой же структуре. То есть отображались уже и те добавленные узлы в той же иерархии. Как-то не доводилось мне работать с этим компонентом, а вот сейчас стоит задача такая, что нужно добавить, удалить узел, а также при удалении узла если у него есть подузлы, то автоматом удалять и их, буду очень признателен, если поможете разобраться
--------------------
https://itbases.ru/
PM MAIL WWW Skype   Вверх
Norfonzor
Дата 17.5.2010, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 17.10.2008

Репутация: нет
Всего: нет



Читай Virtual Treeview там все есть, примеры: http://depositfiles.com/files/8dozcctig

добавление новой:

Код

procedure TfrmMain.N2Click(Sender: TObject);
var
  NewNode: PVirtualNode;
  NewPhone: PPhoneNode;

begin
 NewNode := FrmMain.VT.AddChild(FrmMain.VT.FocusedNode);
  NewPhone := FrmMain.VT.GetNodeData(NewNode);
  if Assigned(NewPhone) then
    with NewPhone^ do
    begin
      Name := Global_Fn; //здесь свои данные из записи
      doc:=Global_Fmht;
      ImageIndex:=findex;
    end;

VTsave.Click;//сохранение



сохранение
Код

procedure TfrmMain.VTsaveClick(Sender: TObject);
var
  XMLDocument: TXMLDocument;

  procedure SaveXML(ANode: PVirtualNode; const AParent: IXMLNode);
  var
    NewNode: IXMLNode;
    NextNode: PVirtualNode;
    NodeData: PPhoneNode;
  begin
    NextNode := ANode.FirstChild;
    if Assigned(NextNode) then
      repeat
        NodeData := VT.GetNodeData(NextNode);
        NewNode := AParent.AddChild('Node');
        with NewNode, NodeData^ do
        begin
          Attributes['Name'] := Name;
          Attributes['doc'] := doc;
          Attributes['ImageIndex'] := ImageIndex;
        end;
        SaveXML(NextNode, NewNode);
        NextNode := NextNode.NextSibling;
      until
        NextNode = nil;
  end;

begin
  XMLDocument := TXMLDocument.Create(Self);
  try
    with XMLDocument do
    begin
      Active := True;
      Encoding := 'UTF-16';
      AddChild('VirtualTreeview');
      Options := Options + [doNodeAutoIndent];
    end;
    SaveXML(VT.RootNode, XMLDocument.DocumentElement);
    XMLDocument.SaveToFile('vt.xml');
  finally
    FreeAndNil(XMLDocument);
  end;
end;


загрузка
Код

procedure TfrmMain.LoadGlavClick(Sender: TObject);
var
  XMLDocument: TXMLDocument;

  procedure LoadXML(const ANodeList: IXMLNodeList; AParent: PVirtualNode);
  var
    i: Integer;
    NewNode: PVirtualNode;
    NodeData: PPhoneNode;
  begin
    for i := 0 to ANodeList.Count - 1 do
    begin
      NewNode := VT.AddChild(AParent);
      NodeData := VT.GetNodeData(NewNode);
      with NodeData^ do
      begin
        Name := VarToWideStr(ANodeList[i].Attributes['Name']);
        doc := VarToWideStr(ANodeList[i].Attributes['doc']);
        ImageIndex:= StrToIntDef(
              VarToStr(
              ANodeList[i].Attributes['ImageIndex']), 0);
      end;
      LoadXML(ANodeList[i].ChildNodes, NewNode);
    end;
  end;

begin
  if not FileExists('vt.xml') then
  begin
    MessageBox(Handle, 'Файл vt.xml не найден.', PChar(Application.Title),
      MB_ICONINFORMATION + MB_OK);
    Exit;
  end;
  XMLDocument := TXMLDocument.Create(Self);
  try
    XMLDocument.LoadFromFile('vt.xml');
    // Для каждой ветки XML дерева создать узел в дереве и зарузить поля
    // для структуры данных из аттрибутов
    // Не забываем использовать блоки Begin/End Update.
    VT.BeginUpdate;
    try
      LoadXML(XMLDocument.DocumentElement.ChildNodes, nil);
    finally
      VT.EndUpdate;
    end;
  finally
    FreeAndNil(XMLDocument);
  end;
end;


удаление
Код

procedure TfrmMain.Del_allClick(Sender: TObject);
begin
  VT.DeleteNode(VT.FocusedNode);
  VTsave.Click;
end;


Это сообщение отредактировал(а) Norfonzor - 17.5.2010, 18:29
PM MAIL   Вверх
Dom
Дата 17.5.2010, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 7.8.2005

Репутация: 1
Всего: 4



А может вопрос по стандартному компоненту TTreeView?
PM MAIL   Вверх
kami
Дата 17.5.2010, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(AndreyZ53 @  17.5.2010,  18:17 Найти цитируемый пост)
 как мне для выделенного узла добавить узел

Код

var
  ti:TTreeNode;
begin
  if Assigned(tv1.Selected) then
    begin
      ti:=tv1.Items.AddChild(tv1.Selected, 'новый нод');
      // и дальше - делаем с ti все, что угодно - он добавлен, как "дитя" к выбранному ноду.
    end;


Цитата(AndreyZ53 @  17.5.2010,  18:17 Найти цитируемый пост)
и сохранить эту структуру,

Код

tv1.SaveToFile('мое супер-пупер-дерево.крутое_расширение');

Цитата(AndreyZ53 @  17.5.2010,  18:17 Найти цитируемый пост)
чтобы при следующем запуске программы, он вылазил в такой же структуре. 

В ходе загрузки приложения:
Код

vt1.LoadFromFile('мое супер-пупер-дерево.крутое_расширение');


Цитата(AndreyZ53 @  17.5.2010,  18:17 Найти цитируемый пост)
 при удалении узла если у него есть подузлы, то автоматом удалять и их, 

Они автоматом удалятся сами. Единственное что нужно - удалить "старший" среди нужного поддерева.

Цитата(AndreyZ53 @  17.5.2010,  18:17 Найти цитируемый пост)
удалить узел,

Код

NodeToDelete.Delete;


P.S. Хотя, если честно - "всё украдено до нас" и описано в F1.

Добавлено @ 21:45
Цитата(Norfonzor @  17.5.2010,  18:28 Найти цитируемый пост)
сохранение

Цитата(Norfonzor @  17.5.2010,  18:28 Найти цитируемый пост)
загрузка

Слишком сложно. (хотя, скорее всего, потому что я не работал с XML. И вроде в этом коде допускается только один элемент верхнего уровня...но это при беглом взгляде, не вникал).
Для сохранения/загрузки нодов в vt есть отличные события OnLoadNode|OnSaveNode. В них загружаем/сохраняем ассоциированные с нодом (ТОЛЬКО с тем, который передан в это событие!) данные (NodeData) из потока и не заморачиваемся - vt сам загрузит/сохранит полное состояние дерева (вплоть до развернут/свернут узел, высоту каждого нода и т.п.).

Это сообщение отредактировал(а) kami - 17.5.2010, 21:48
PM MAIL WWW   Вверх
AndreyZ53
Дата 17.5.2010, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 22.8.2008

Репутация: нет
Всего: 2



Спасибо всем, да мне нужен именно стандартный Treeview, вот еще что хотел спросить, как мне например для каждого узла, у которых нету дочерних узлов (то есть они конечные) например для него занести в БД (без разницы в какую) например какие-то данные, а потом чтобы я нажимал на этот узел и из БД брались эти данные, а жал на родительский узел и выводились полностью все данные дочерних узлов, то есть может како-то мне индекс записывать туда и по нажатию на узел считывать индекс и делать запрос к БД, или там как-то по-другому, а если не по-другому (я просто не работал с этим компонентом), и как мне например по нажатию на общий родительский узел сделать запрос к БД. Вот с этим бы еще разобраться мне. 

А так да, спасибо за VirtualTreeview, но как-то там все громостко, для моей задачи такого ненадо, в VirtualTreeview там типа можно красоту новодить? типа иконки вставлять еще, я правильно понимаю?
--------------------
https://itbases.ru/
PM MAIL WWW Skype   Вверх
kami
Дата 17.5.2010, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Многабукав. Ниасилил. smile
Чем обусловлена необходимость работы с БД?
Сколько нодов планируется иметь в дереве? Какие данные хранить в базе?
Какую планируется использовать СУБД? (какую-нибудь - это не ответ). Судя по вопросу с БД тоже не работал?

Добавлено через 2 минуты и 30 секунд
Цитата(AndreyZ53 @  17.5.2010,  22:57 Найти цитируемый пост)
но как-то там все громостко,

Это неверно. VT очень многое позволяет делать и менять, но это не значит, что она сама не справится с большинством задач.
Цитата(AndreyZ53 @  17.5.2010,  22:57 Найти цитируемый пост)
в VirtualTreeview там типа можно красоту новодить?

Типа красоту - малая часть огромных возможностей этого компонента.
PM MAIL WWW   Вверх
AndreyZ53
Дата 18.5.2010, 07:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 22.8.2008

Репутация: нет
Всего: 2



kami, нодов в дереве будет, столько сколько пользователь добавит, то есть фиксированного числа нету, он добавит и для него же добавит данные в БД, БД например буду использовать Access, ну а БД мне нужна для каталога, то есть для одного узла в БД может быть несколько данных, и чтобы на узел когда нажимаю отображались эти данные, мне только подсказать каким образом записывать в БД значения нодов, чтобы по им можно было сделать запрос в БД.
--------------------
https://itbases.ru/
PM MAIL WWW Skype   Вверх
kami
Дата 18.5.2010, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(AndreyZ53 @  18.5.2010,  07:53 Найти цитируемый пост)
нодов в дереве будет, столько сколько пользователь добавит, то есть фиксированного числа нету, 

Это понятно. Но есть предел (весьма размытый, кстати), после которого с программой в избранной конфигурации становится просто неудобно работать. Так сколько? сто, тысяча, миллион?

Цитата(AndreyZ53 @  18.5.2010,  07:53 Найти цитируемый пост)
БД например буду использовать Access,

Например Access входит в состав платного MSOffice. Ты уверен, что твой пользователь имеет его?

Цитата(AndreyZ53 @  18.5.2010,  07:53 Найти цитируемый пост)
ля одного узла в БД может быть несколько данных, 

Я спрашивал - каких данных? строки, числа, файлы - какие данные?

Пойми, я спрашиваю не просто так - вполне возможно, что для твоей задачи БД и не нужна, так как можно элементарно справиться и без нее. В конечном итоге это выйдет гораздо быстрее, меньше по размеру и лучше. Если же ориентироваться на БД, то нужно, чтобы она была установлена на компьютере пользователя. А это для пользователя не всегда возможно.
Ответь, пожалуйста, на поставленные вопросы полностью, не зацикливаясь на "мне бы добавить и забрать данные из БД".
PM MAIL WWW   Вверх
AndreyZ53
Дата 18.5.2010, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 22.8.2008

Репутация: нет
Всего: 2



Хорошо мне нужен обычный каталог, то есть например узел называется Кабеля, на него нажимаю и в ДБгриде выводится 2 строки (их может сколько угодно быть, в зависимости сколько админ добавит) в этих двух строках ДБгрида выводится пути к файлам, они в pdf формате ну и там кнопочка открыть, то есть по нажатию пользователю будет открываться этот файл. Вот это я все хотел реализовать через БД, ну нодов будет около 20 (но опять же админ может добавлять), ну БД можно взять и MySQL (если через БД будет быстрее сделать), ах да забыл, что сам файл с узлами и этими путями должен находится на сервере (возможно вот почему я тут буду использовать БД), то есть чтобы админ добавил пару узлов и в у всех в программах на рабочих местах обновилось это все, думаю суть понятно какой каталог
--------------------
https://itbases.ru/
PM MAIL WWW Skype   Вверх
neo7777
Дата 10.10.2011, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 30.6.2008

Репутация: нет
Всего: нет



Цитата(Norfonzor @ 17.5.2010,  18:28)
Читай Virtual Treeview там все есть, 

Не могу зайти по ссылке!
Выходит сообщение: Вы не имеете прав чтения этого форума. Если данный форум защищён паролем, то Вы должны авторизоваться в этом форуме, зайдя в него с главной страницы форума.

С главной вообще не смог найти.
Помогите пожалуйста, где можно найти это описание по virtual treeview?

СПАСИБО.
PM MAIL   Вверх
bems
Дата 11.10.2011, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Цитата(neo7777 @  10.10.2011,  12:55 Найти цитируемый пост)
Не могу зайти по ссылке!
Это потому что статья удалена



--------------------
Обижено школьников: 8
PM MAIL   Вверх
neo7777
Дата 11.10.2011, 06:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 30.6.2008

Репутация: нет
Всего: нет



Цитата(bems @ 11.10.2011,  01:03)
Это потому что статья удалена

А с чем связано удаление статьи, не подскажете, пожалуйста?

И где её можно всё таки найти в последней редакции?
PM MAIL   Вверх
bems
Дата 11.10.2011, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



не знаю - по обоим пунктам


--------------------
Обижено школьников: 8
PM MAIL   Вверх
ZBugz
Дата 11.10.2011, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



PM MAIL   Вверх
neo7777
Дата 11.10.2011, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 30.6.2008

Репутация: нет
Всего: нет



Цитата(ZBugz @ 11.10.2011,  13:45)
http://drkb3.narod.ru/virtualtreeview_faq_ii_eiiiiia.htm

Спасибо БОЛЬШОЕ!!! ))
Жалко, не могу поставить плюсик к вашей репутации, не хватает количество постов.... очень помогли...

Это сообщение отредактировал(а) neo7777 - 11.10.2011, 18:55
PM MAIL   Вверх
Закрытая темаСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1010 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.