|
Вопрос # 3 459/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты по программированию!
В вопросе # 934 я ознакомился со способом создания наследника класса TTreeNode. Этот хороший способ может помочь хранить разные данные в конкретно выбранном узле дерева. Метод Data отпадает. Да и смысл, если можно это реализовать только лишь добавив дополнительные методы и свойства в свой нод. Класс создаю, обрабатываю его в OnCreateNodeClass. Но в каждом конкретном узле задавать значение, и потом оттуда их возвращать не получается. Ув. эксперты, помогите с реализацией.
TMyNode = class(TTreeNode)// обьявляем класс-наследник TTreeNode
private
FText: TStrings;
procedure SetText(const Value: TStrings);
public
property Text: TStrings read FText write SetText;
end;
Сделано.
Переменную объявил.
var
MyNode:TMyNode;
Обработка нода в CreateNodeClass
procedure TForm1.TreeView1CreateNodeClass(Sender: TCustomTreeView;
var NodeClass: TTreeNodeClass);
begin
NodeClass := TMyNode;
end;
Создал новый узел и задал ему (ему ли, или всему ноду?) данные:
procedure TForm1.Button6Click(Sender: TObject);
begin
if TreeView1.Items.Count = 0 then //добавление нового раздела
MyNode:=TreeView1.Items.Add(nil, 'text') as TMyNode
else
MyNode:=TreeView1.Items.Add(MyNode, 'text') as TMyNode;
MyNode.Text:=Memo1.Lines;//не нравится мне это
procedure TForm1.Button5Click(Sender: TObject);
begin
ShowMessage(MyNode.Text[0]);//банальный пример восстановления данных
end;
 |
Вопрос задал: Cross AssembleR (статус: Посетитель)
Вопрос отправлен: 30 ноября 2009, 00:00
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 10; последнее сообщение — 30 ноября 2009, 21:51; участников в обсуждении: 3.
|
Cross AssembleR (статус: Посетитель), 30 ноября 2009, 00:09 [#1]:
Прошу прощения за неформатированный вопрос
Компилирую динамически подключаемые библиотеки, в которые интегрированы локальные переменные ассемблера с помощью перекрёстного алгоритма Рапида-Терьштрассе, с учетом того, что центральный процессор подвергся воздействию эффекта Паули!
|
|
min@y™ (статус: Доктор наук), 30 ноября 2009, 08:24 [#2]:
Цитата:
MyNode.Text:=Memo1.Lines;//не нравится мне это
И правильно не нравится.
А мне вот не нравится то, что свойство Text и метод его изменения SetText() уже есть в классе TTreeNode.
А ещё мне не нравится глобальная переменная MyNode.
Что конкретно ты хочешь от нового класса в данной задаче?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Cross AssembleR (статус: Посетитель), 30 ноября 2009, 09:01 [#3]:
min@y™ ,
1. <<А мне вот не нравится то, что свойство Text и метод его изменения SetText() уже есть в классе TTreeNode.
Согласен, ну это переделается, свойство у TreeNode есть, но другого типа же, string.
2. <<А ещё мне не нравится глобальная переменная MyNode.
Я её заюзал, чтобы создавать новые разделы и подразделы прежде всего, а там просто пристыковал.
А от данного класса хочу получить возможность хранить определенный набор данных в каждом элементе дерева.
Компилирую динамически подключаемые библиотеки, в которые интегрированы локальные переменные ассемблера с помощью перекрёстного алгоритма Рапида-Терьштрассе, с учетом того, что центральный процессор подвергся воздействию эффекта Паули!
|
30 ноября 2009, 09:31: Вопрос перемещён из тематического раздела Delphi » Общие вопросы по программированию в раздел Delphi » Работа с компонентами и библиотеками модератором Ерёмин А.А.
|
min@y™ (статус: Доктор наук), 30 ноября 2009, 09:46 [#4]:
Цитата (Cross AssembleR):
свойство у TreeNode есть, но другого типа же, string
Да, типа другого, но ИМЕНЕМ-то тем же!
Цитата (Cross AssembleR):
Я её кинул, чтобы создавать новые разделы и подразделы
Для этого и без неё можно обойтись.
Цитата (Cross AssembleR):
Или есть более хитрые методы решения проблемы?
Написать класс-потомок - это и есть хитрое и правильное решение проблемы. Просто надо понимать, что делаешь.
Я написал мощный текстовый редактор с поддержкой проектов. Дерево проектов содержит в себе 3 типа классов-потомков TTreeNode: проекты, папки и файлы, у которых свои свойства, методы и даже события. Очень удобно. Если хочешь, могу прислать посмотреть этот модуль.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Cross AssembleR (статус: Посетитель), 30 ноября 2009, 17:25 [#5]:
<<Да, типа другого, но ИМЕНЕМ-то тем же!.
Конфликт имен? Ок, понял.
<<Для этого и без неё можно обойтись.
Эт да, но с этим разберусь, не критично.
<<Написать класс-потомок - это и есть хитрое и правильное решение проблемы. Просто надо понимать, что делаешь.
Ну тогда нормально, следуем правильным путём, товарищи.
<<Дерево проектов содержит в себе 3 типа классов-потомков TTreeNode: проекты, папки и файлы, у которых свои свойства, методы и даже события. Очень удобно. Если хочешь, могу прислать посмотреть этот модуль.
Ну исходники вещь интимная, тем более я так понимаю проект объемный. Если есть возможность - то я бы взглянул. Правда, описание класса-потомка еще куда ни шло, матчасть как говорится, а вот возможно бы взглянуть на кусочек кода, где в узлах дерева хранятся какие-то данные? Очень интересна реализация данного способа.
Компилирую динамически подключаемые библиотеки, в которые интегрированы локальные переменные ассемблера с помощью перекрёстного алгоритма Рапида-Терьштрассе, с учетом того, что центральный процессор подвергся воздействию эффекта Паули!
|
|
Вадим К (статус: Академик), 30 ноября 2009, 17:37 [#6]:
Посмотрел код.
Присваивание MyNode.Text:=Memo1.Lines действительно очень плохое. Хотя если метод SetText написан правильно, то всё хорошо. Но он не предоставлен.
Если его реализация написана как по умолчанию, то есть просто FText := value; то это даст веселый эффект. Эта строка копирует ссылку на Memo1.Lines. А дальше будет побочный эффект. Объект будет доступен, но будет равен содержимому мемо. если оно поменяется, то и все ноды поменяются. не то, не то мы ждали .
Поэтому для данного класса ноды я бы написал ещё конструктор/деструктор (там будет создание TStringlist) и метод SetText написал бы так
FText.clear;
FText.AddString(memo1.lines);
Я в свое время делал чуточку по другому. я использовал метод Data, но хранил там указатель на свой собственный класс. Правда приходилось обращаться к нодам как
TMyNode(noda.data).свойство, зато простор для воображения широк. можно хранить не однотипные объекты, а разнотипные. В примере указанном выше это тоже возможно, но телодвижений больше.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Cross AssembleR (статус: Посетитель), 30 ноября 2009, 18:01 [#7]:
<<Хотя если метод SetText написан правильно, то всё хорошо. Но он не предоставлен.
Если его реализация написана как по умолчанию, то есть просто FText := value;
Вы абсолютно правы, всё так и есть. Метод реализован по умолчанию. Спасибо за наводку. Включение TStringlist было в задумке. А как тогда правильнее будет присваивать и загружать с конкретного нода, через свойство Index, например?
Компилирую динамически подключаемые библиотеки, в которые интегрированы локальные переменные ассемблера с помощью перекрёстного алгоритма Рапида-Терьштрассе, с учетом того, что центральный процессор подвергся воздействию эффекта Паули!
|
|
Вадим К (статус: Академик), 30 ноября 2009, 18:20 [#8]:
никто не мешает сделать так (более того, будет хорошо работать)
свойство обявить как TStrings
а в конструкторе написать
FText:=TStringList.create;
И такая реализация даже лучше. (метод AddString принимает параметром именно TStrings. И благодаря этому можно будет и с листбокса брать, и с мемо).
Если реализацию написать так, как я предложил выше, то можно будет просто делать присваивание.
То есть легко можно будет написать mynode.text := Listbox1.items; - всё скопируется автоматом.
Но вот что бы сделать
Memo1.lines := MyNode.text
придется подумать хорошо. так лучше не писать.
Также можно будет писать код вида
MyNode.text[1] //если такая строка есть
MyNode.add('test');
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 30 ноября 2009, 21:39 [#9]:
Цитата (Cross AssembleR):
а вот возможно бы взглянуть на кусочек кода, где в узлах дерева хранятся какие-то данные? Очень интересна реализация данного способа.
Куды выслать?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Cross AssembleR (статус: Посетитель), 30 ноября 2009, 21:51 [#10]:
<<Куды выслать?
crossassembler@mail.ru
Компилирую динамически подключаемые библиотеки, в которые интегрированы локальные переменные ассемблера с помощью перекрёстного алгоритма Рапида-Терьштрассе, с учетом того, что центральный процессор подвергся воздействию эффекта Паули!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|