Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.11.07;
Скачать: [xml.tar.bz2];

Вниз

ООП можно ли это сделать?   Найти похожие ветки 

 
Grrey   (2004-10-12 21:12) [0]

В TTreeView нужно добавить свойство ID:integer для каждого нода.
Можно ли это сделать не переписывая vcl исходников?
Единственный вариант - это обявить массив рядом, связать свойство Data с нужным нодом и при добавлении, удалении, изменении добавлять, удалять и изменять элементы масивчика. Но это же повторная работа. Этот код уже прописан в TTreeNodes. Вообще есть способ как-нибудь объявить потомки TTreeNode, TTreeNodes и TTreeView в соответствии с требованиями?


 
Гаврила ©   (2004-10-12 21:16) [1]

Можно. Для этого надо объявить потомка TTreeNode, и указать его класс в событии TTreeVew
как называется событие, не помню, что-то типа OnGetNodeClass (нет delphi под рукой)
Посмотри, событие Published и есть в инспекторе


 
Defunct ©   (2004-10-12 21:17) [2]

> Можно ли это сделать не переписывая vcl исходников? .
Да, можно назначать не только ID, но и большие структуры, смотреть AddObject

> Единственный вариант - это обявить массив рядом, связать свойство Data с нужным нодом и при добавлении, удалении, изменении добавлять, удалять и изменять элементы масивчика.

Зачем? прямо менять поле Data
Integer[...Data] := Id;


 
Grrey   (2004-10-13 16:02) [3]

Огромное спасибо, Гаврила. Это то, что нужно было. Не могу поверить, что я на этом форуме задал правильно вопрос и получил необходимый ответ.


 
Pentium133 ©   (2004-10-13 16:28) [4]


> Grrey   (13.10.04 16:02) [3]

Повезло. Могли и послать куда.... Были уже такие вопросы :)


 
Amoeba ©   (2004-10-13 16:40) [5]

Совет

> Гаврила ©   (12.10.04 21:16) [1]

следует признать плохим. Незачем создавать новый класс, если есть стандартное решение, предложенное в
Defunct ©   (12.10.04 21:17) [2]

Integer(Node.Data) := IntValue;
или
Node.Data := Pointer(IntValue);

Простое преобразование типов и никакого жульничества.


 
Ega23 ©   (2004-10-13 16:45) [6]

Э-э-э. А у TTreeNode свойство Tag уже отменили?


 
Pentium133 ©   (2004-10-13 16:46) [7]

Amoeba ©   (13.10.04 16:40) [5]
В данном случае возможен и такой вариант. Но если нужно добавить не одно а несколько полей да еще и методов, то однозначно [1]
Иначе зачем это событие существует? :)


 
Amoeba ©   (2004-10-13 16:53) [8]


> Pentium133 ©   (13.10.04 16:46) [7]

Это мне хорошо известно. Но в вопросе не говорится, что Св-во дата уже задействовано.

> Ega23 ©   (13.10.04 16:45) [6]
> Э-э-э. А у TTreeNode свойство Tag уже отменили?

А его и не надо было отменять по причине его изначального отсутствия у TTreeNode.


 
Ega23 ©   (2004-10-13 16:56) [9]

А его и не надо было отменять по причине его изначального отсутствия у TTreeNode.

Смотри-ка, действительно нет...
Ну тогда  Defunct ©   (12.10.04 21:17) [2]


 
Grrey   (2004-10-13 17:27) [10]

Amoeba ©   (13.10.04 16:53) [8]

> Pentium133 ©   (13.10.04 16:46) [7]

Это мне хорошо известно. Но в вопросе не говорится, что Св-во дата уже задействовано.//

Вот из-за таких подсказок я в этот форум обращаюсь крайне редко.
Да ответ правильный и будет работать, но я действительно должен добавить не только ID. А данный пример привел только для упрощения примера.
Но все равно спасибо. В основном, что не послали.


 
Pentium133 ©   (2004-10-13 17:38) [11]


> Вот из-за таких подсказок я в этот форум обращаюсь
> крайне редко.

:)))
Здесь приятнее отвечать чем спрашивать.


 
Grrey   (2004-10-13 17:43) [12]

Спасибо что воспринял именно так.
Постепенно начинаю убеждаться в том, что ты прав. Начинаю отвечать на вопросы.


 
Гаврила ©   (2004-10-13 17:48) [13]


> [8] Amoeba ©  


Минусом использования свойства Data в случае необходимости хранения нескольких полей является необходимость следить за выделениями - освобождениям памяти.
А вот если например текст или иконка узла зависят от содержания дополнительных данных, то однозначно наследование, это просто удобнее


 
Defunct ©   (2004-10-13 18:45) [14]

> Гаврила ©   (13.10.04 17:48) [13]
Да ну?

TreeView.Items.AddObject(Nil, Container.Name, Container)

На месте Container - любой класс, с любой структурой. И освобождается просто вызовом Free.


 
Defunct ©   (2004-10-13 18:47) [15]

[14]
Оговорился, но думаю вы поняли, что я имел в виду.

> На месте Container - любой класс ...
На месте Container - экземпляр любого класса ...


 
Гаврила ©   (2004-10-13 18:47) [16]


>  [14] Defunct ©


ну так Free то вызвать надо, а в случае наследования все вызовется автоматом


 
Defunct ©   (2004-10-13 19:04) [17]

> ну так Free то вызвать надо, а в случае наследования все вызовется автоматом

Зачем вызывать Free?
Правильно спроектированная структура данных должна быть независимой от визуальных компонент. А вдруг я захочу те же элементы отобразить в ListView, зачем для этого при разрушении TreeView вызывать Free созданных объектов и создавать объекты заново? Можно просто отделить структуру данных от визуальных компонент и заботиться о разрушении структуры данных в самой структуре или при выходе из программы.


 
Гаврила ©   (2004-10-13 19:07) [18]


>  [17] Defunct


Я про тот случай, когда за время жизни объектов отвечает дерево. Структура данных может быть привязана к визуальному представлению, а может быть не привязана. Если она не привязана, нам придется то же "дерево" (невизуальное) дублировать в данных, а так оно у нас одно.
В общем для разных случаев можно сделать по разному


 
and   (2004-10-13 20:30) [19]

dxDBTreeList из QuantumGrid - какие хотите поля. с какими хотите свойствами. намного удобнее TreeView, да и красивше смотрится.


 
Amoeba ©   (2004-10-14 11:13) [20]


> Гаврила ©   (13.10.04 17:48) [13]

Использование Data мной предлагалось исключительно для случая одного поля, поскольку автор вопроса сразу не указал обратного (оставил догадываться объ этом телепатам). Классический пример того, что бывает, когда вопрошающий не выкладывает достаточного объема информации, чтобы можно было ответить однозначно.


 
Суслик ©   (2004-10-14 11:22) [21]

у-у-у-у демагоги :(


 
Гаврила ©   (2004-10-14 14:03) [22]

ДЕМАГОГИЯ, демагогии, ж. (греч. demagogia) (книжн.). Потворство инстинктам и страстям малосознательных масс для достижения своих целей.


> [21] Суслик ©  


ГДЕ ??? :-)


 
Mishenka   (2004-10-22 09:24) [23]


> Гаврила ©   (12.10.04 21:16) [1]

Насколько я понял речь идёт о событии OnCreateNodeClass. Можно ли поподробнее, что писать в этом событии и как потом новый класс добавить???


 
Pentium133 ©   (2004-10-22 10:38) [24]


type
  MyNodeClass = class(TTreeNode)
  public
    id: integer;
    name: string;
  end;

procedure TForm1.TreeView1CreateNodeClass(Sender: TCustomTreeView;
 var NodeClass: TTreeNodeClass);
begin
 NodeClass:= MyNodeClass;
end;

обращение:
 
MyNodeClass(TreeView1.Items[1]).id:= 24;


 
Mishenka   (2004-10-22 22:05) [25]

А можно ли тоже самое сделать с TMenuItem и MainMenu ???



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.11.07;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.039 c
3-1097189230
Black
2004-10-08 02:47
2004.11.07
Как добавлять новые столбцы в таблицу ADO?


6-1093957135
calmterror
2004-08-31 16:58
2004.11.07
idHTTP - отсоединение от сервера


1-1098265555
Анатолий
2004-10-20 13:45
2004.11.07
Установить курсор перед выделенным текстом


1-1098331590
klyg
2004-10-21 08:06
2004.11.07
Поиск слова среди HTML-документов


1-1098447124
Wolffgang
2004-10-22 16:12
2004.11.07
Assigned?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский