Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

В Дельфи есть встроенный редактор деревьев, как программно организовать тоже самое?

88K
17 февраля 2013 года
SecretBob
5 / / 17.02.2013
Не особо силен в Дельфи...Попробовал написать код такого же редактора деревьев как в Дельфи - TreeView Items Editor...Но не тут то было...
Кто поможет с кодом? Надо именно так, как в редакторе....
Возникают куча вопросов, например:
1. Если дерева нет, то добавляем узел так

TreeView1.Items.Add(nil, Edit1.Text),

а если нужно добавить на этом же уровне еще один узел, то также добавлять или нет? В смысле для второго узла тоже nil писать или нужно писать другую ссылку на следующий узел? Если да, то как это программно осуществить?
А второй узел на этом же уровне какой имеет индекс?
И как вообще узнать какой узел в дальнейшем выбран и его индекс?
8
19 февраля 2013 года
mfender
3.5K / / 15.06.2005
Код:
procedure TForm1.Button1Click(Sender: TObject);
  procedure GetIndexesString(const Node: TTreeNode; var Str: string);
  begin
    Str := Format('%d.%s', [Node.Index, Str]);
    if Node.Parent <> nil then
      GetIndexesString(Node.Parent, Str);
  end;

var
  Node: TTreeNode;
  SN: string;
begin
  if TreeView1.Selected <> nil then
  begin
    Node := TreeView1.Items.AddChild(TreeView1.Selected, '');
    GetIndexesString(Node, SN);
    Delete(SN, Length(SN), 1);
    Node.Text := Format('Node %s', [SN]);
    Node.Parent.Expand(True);
  end
  else
  begin
    Node := TreeView1.Items.Add(nil, '');
    Node.Text := Format('Node %d', [Node.Index]);
  end;
end;
88K
19 февраля 2013 года
SecretBob
5 / / 17.02.2013
Спасибо..лаконично..А все-таки как реализован код встроенного редактора TreeView Items Editor , реализованный в Дельфи? Вот тоже самое в нем у меня не получается реализовать программно....Если поможете, буду очень признателен....
8
19 февраля 2013 года
mfender
3.5K / / 15.06.2005
Вот на вопрос конкретный ответил: "как сделать субнод".
Писать редактор TreeView желания нет никакого. Хотя я этих TreeView понаделал уже тыщу, и не только в Delphi.
Надо понимать, что каждый TreeView и ListView - индивидуальны для каждой задачи. Поэтому существующее - абстракция, из которой нужно лепить конкретику.
20K
20 февраля 2013 года
ellor!
198 / / 24.05.2012
Надо в их исходниках посмотреть, возможно, где-то там он есть.
88K
20 февраля 2013 года
SecretBob
5 / / 17.02.2013
Error!

Хорошая идея...Но я не знаю, создаются ли при установке Дельфи исходники? А если да, то где их посмотреть?
8
21 февраля 2013 года
mfender
3.5K / / 15.06.2005
Не врублюсь, что там смотреть в исходниках? Если чо есть чертовски подробная справка по всему этому делу (F1).
TTreeView.Items - это обычная коллекция, соответственно свойства и методы у неё все такие же. Индексы в каждом узле все такие же: 0..N Вот там в коде, который я привёл, текст узлов собирается как раз из индексов.
88K
21 февраля 2013 года
SecretBob
5 / / 17.02.2013
mfender
Я просто хотел посмотреть, как в исходниках реализовано то, что я вижу в этом редакторе....
Например, опишу как действует редактори мои действия в нем:

1. Открываю редактор, я могу выбрать определенное действие, допустим, я хочу создать узел, кликаю по кнопке "добавить узел", фокус переносится на Edit1 и там мигает курсор, а в это время в окне дерева выделяется место, где потом будет вставляться текст - название узла - в редакторе это отлично реализовано, а вот у меня такое не получается, вернее получается, но немного не так...И так можно добавлять узлов на этот уровень сколько угодно...ПРичем, что для меня важно, так это то, что по мере ввода названия узла, синхронно в окне дерева пишется это название....Я такое тоже организовал, а вот с последним узлом в списке проблема....

2. Допустим, я хочу создать подузел какого то узла....Что я делаю, я кликаю на узле, в котором хочу создать детей...Узел при этом выделяется, а фокус ввода названия подузла переносится опять в Edit1...Пишу название, оно синхронно отображается в окне дерева....И так далее, хочу создать детей, выделяю узел и создаю....

3. С удалением конкретного узла все получается нормально....

В принципе вот такой алгоритм создания дерева мне и нужен....
Ну и еще....Для развития....Я хотел бы (я пытался это сделать, но у меня не получилось) сделать так:
При создании любого узла, подузла сначале в окне дерева появлялся бы знак вопроса красного цвета, а по мере ввода названия узла, вместо него писалось бы это название....
И последнее...Наверное это никак нельзя осуществить - вот это: Сначала при создании узлов названия пишутся допустим красным цветом и размером 12, а потом мне нужно к этому красному названию добавить текст черног цвета и размером 8?
Я пытался это сделать, но как передать в Text узла строку, где символы будут разного размера и цвета - не получилось...
Конечно, представленный Вами код отличный, изящный...Я тоже самое осуществил намного сложнее....Поэтому и обратился за помощью к гуру....вы профессионал, помогите мне, если сможете....
8
21 февраля 2013 года
mfender
3.5K / / 15.06.2005
Этот редактор называется TClxTreeViewItems, текст можно посмотреть в ClxNodeEdit.pas (путь примерно ..\Borland\Delphi7\Source\Property Editors\ClxNodeEdit.pas)
88K
21 февраля 2013 года
SecretBob
5 / / 17.02.2013
mfender

Ну гигант! Спасибочки! То, что надо...Если не возражаете, по мере проблем буду к вам обращаться? У меня и сейчас есть вопросы...Но пока буду осваивать код...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог