В Дельфи есть встроенный редактор деревьев, как программно организовать тоже самое?
Кто поможет с кодом? Надо именно так, как в редакторе....
Возникают куча вопросов, например:
1. Если дерева нет, то добавляем узел так
TreeView1.Items.Add(nil, Edit1.Text),
а если нужно добавить на этом же уровне еще один узел, то также добавлять или нет? В смысле для второго узла тоже nil писать или нужно писать другую ссылку на следующий узел? Если да, то как это программно осуществить?
А второй узел на этом же уровне какой имеет индекс?
И как вообще узнать какой узел в дальнейшем выбран и его индекс?
Код:
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;
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;
Спасибо..лаконично..А все-таки как реализован код встроенного редактора TreeView Items Editor , реализованный в Дельфи? Вот тоже самое в нем у меня не получается реализовать программно....Если поможете, буду очень признателен....
Писать редактор TreeView желания нет никакого. Хотя я этих TreeView понаделал уже тыщу, и не только в Delphi.
Надо понимать, что каждый TreeView и ListView - индивидуальны для каждой задачи. Поэтому существующее - абстракция, из которой нужно лепить конкретику.
Надо в их исходниках посмотреть, возможно, где-то там он есть.
Хорошая идея...Но я не знаю, создаются ли при установке Дельфи исходники? А если да, то где их посмотреть?
TTreeView.Items - это обычная коллекция, соответственно свойства и методы у неё все такие же. Индексы в каждом узле все такие же: 0..N Вот там в коде, который я привёл, текст узлов собирается как раз из индексов.
Я просто хотел посмотреть, как в исходниках реализовано то, что я вижу в этом редакторе....
Например, опишу как действует редактори мои действия в нем:
1. Открываю редактор, я могу выбрать определенное действие, допустим, я хочу создать узел, кликаю по кнопке "добавить узел", фокус переносится на Edit1 и там мигает курсор, а в это время в окне дерева выделяется место, где потом будет вставляться текст - название узла - в редакторе это отлично реализовано, а вот у меня такое не получается, вернее получается, но немного не так...И так можно добавлять узлов на этот уровень сколько угодно...ПРичем, что для меня важно, так это то, что по мере ввода названия узла, синхронно в окне дерева пишется это название....Я такое тоже организовал, а вот с последним узлом в списке проблема....
2. Допустим, я хочу создать подузел какого то узла....Что я делаю, я кликаю на узле, в котором хочу создать детей...Узел при этом выделяется, а фокус ввода названия подузла переносится опять в Edit1...Пишу название, оно синхронно отображается в окне дерева....И так далее, хочу создать детей, выделяю узел и создаю....
3. С удалением конкретного узла все получается нормально....
В принципе вот такой алгоритм создания дерева мне и нужен....
Ну и еще....Для развития....Я хотел бы (я пытался это сделать, но у меня не получилось) сделать так:
При создании любого узла, подузла сначале в окне дерева появлялся бы знак вопроса красного цвета, а по мере ввода названия узла, вместо него писалось бы это название....
И последнее...Наверное это никак нельзя осуществить - вот это: Сначала при создании узлов названия пишутся допустим красным цветом и размером 12, а потом мне нужно к этому красному названию добавить текст черног цвета и размером 8?
Я пытался это сделать, но как передать в Text узла строку, где символы будут разного размера и цвета - не получилось...
Конечно, представленный Вами код отличный, изящный...Я тоже самое осуществил намного сложнее....Поэтому и обратился за помощью к гуру....вы профессионал, помогите мне, если сможете....
Этот редактор называется TClxTreeViewItems, текст можно посмотреть в ClxNodeEdit.pas (путь примерно ..\Borland\Delphi7\Source\Property Editors\ClxNodeEdit.pas)
Ну гигант! Спасибочки! То, что надо...Если не возражаете, по мере проблем буду к вам обращаться? У меня и сейчас есть вопросы...Но пока буду осваивать код...