Форум: "Основная";
Текущий архив: 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.04 c