Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Cross AssembleR (статус: Посетитель)
Вопрос отправлен: 30 ноября 2009, 00:00
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 10; последнее сообщение — 30 ноября 2009, 21:51; участников в обсуждении: 3.
Cross AssembleR

Cross AssembleR (статус: Посетитель), 30 ноября 2009, 00:09 [#1]:

Прошу прощения за неформатированный вопрос
Компилирую динамически подключаемые библиотеки, в которые интегрированы локальные переменные ассемблера с помощью перекрёстного алгоритма Рапида-Терьштрассе, с учетом того, что центральный процессор подвергся воздействию эффекта Паули!
min@y™

min@y™ (статус: Доктор наук), 30 ноября 2009, 08:24 [#2]:

Цитата:


MyNode.Text:=Memo1.Lines;//не нравится мне это


И правильно не нравится.

А мне вот не нравится то, что свойство Text и метод его изменения SetText() уже есть в классе TTreeNode.
А ещё мне не нравится глобальная переменная MyNode.

Что конкретно ты хочешь от нового класса в данной задаче?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Cross AssembleR

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™

min@y™ (статус: Доктор наук), 30 ноября 2009, 09:46 [#4]:

Цитата (Cross AssembleR):

свойство у TreeNode есть, но другого типа же, string

Да, типа другого, но ИМЕНЕМ-то тем же!

Цитата (Cross AssembleR):

Я её кинул, чтобы создавать новые разделы и подразделы

Для этого и без неё можно обойтись.

Цитата (Cross AssembleR):

Или есть более хитрые методы решения проблемы?

Написать класс-потомок - это и есть хитрое и правильное решение проблемы. Просто надо понимать, что делаешь.

Я написал мощный текстовый редактор с поддержкой проектов. Дерево проектов содержит в себе 3 типа классов-потомков TTreeNode: проекты, папки и файлы, у которых свои свойства, методы и даже события. Очень удобно. Если хочешь, могу прислать посмотреть этот модуль.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Cross AssembleR

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

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™

min@y™ (статус: Доктор наук), 30 ноября 2009, 21:39 [#9]:

Цитата (Cross AssembleR):

а вот возможно бы взглянуть на кусочек кода, где в узлах дерева хранятся какие-то данные? Очень интересна реализация данного способа.


Куды выслать?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Cross AssembleR

Cross AssembleR (статус: Посетитель), 30 ноября 2009, 21:51 [#10]:

<<Куды выслать?
crossassembler@mail.ru
Компилирую динамически подключаемые библиотеки, в которые интегрированы локальные переменные ассемблера с помощью перекрёстного алгоритма Рапида-Терьштрассе, с учетом того, что центральный процессор подвергся воздействию эффекта Паули!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:40
Выполнено за 0.03 сек.