Вопрос № 35568: Здравствуйте, уважаемые.
В свете последних 2 лет не имею возможности посвящать время чтению рассылок/ответам на вопросы, к сожалению, поэтому перехожу из армии экспертов в армию читателей/любопытных.
Итак, дело в следующем. Так как ...
Вопрос № 35.568
Здравствуйте, уважаемые.
В свете последних 2 лет не имею возможности посвящать время чтению рассылок/ответам на вопросы, к сожалению, поэтому перехожу из армии экспертов в армию читателей/любопытных.
Итак, дело в следующем. Так как программирование на Delphi -- моё хобби, то пишу я не мало (хотя и не много). Но, видимо, из-за того, что я -- самоучка, я пропустил что-то важное в азах программирования. Конкретная проблема -- добавление свойства к имеющемуся компоненту.
Нужно к TTreeView.Item[]: TTreeNode добавить некое свойство FileData:TSearchRec, либо 3 свойства типа integer, и переписать 2 процедуры LoadFromFile и SaveToFile (дабы записывать свойства файла и использовать TReeView в качестве дерева файловой системы). Но Вся фишка в том, что TCustomTreeView.FTreeNodes: TTreeNodes находится в разделе private. Надо ли мне для осуществления задуманного переписывать сам модуль, или же есть другой способ добавить свойство ?
До этого экспериментировал с дублированием данных дерева в TListView, TStrings с записью уже туда всех свойств, но это несколько неудобно, хотя и облегчает навигацию и поиск.
Есть, конечно, альтернативный более простой способ, например, в свойство Item.Text дописывать через разделитель данные файла, а при выводе переписать процедуру OnCustomDraw "обрезав" вывод последних. Таким образом, кстати, решится проблема сохранения/загрузки дерева, но это не то, что я хочу получить.
И еще. Есть у этих Item[] свойство Data: Pointer. Так и не понял, к чему оно. Может через него можно всё это провернуть ?
Ещё можно конвертировать 3 целых числа (Size, Time, Attr из TSearchRec) в одно и присвоить его свойству StateImages, которым я не пользуюсь. Но это тоже беспонтово.
Вот такие вот дела. Ну, в общем, поможите, чем сумеете. Спешить некуда, меньше буду писать - больше курсовиков к зачёту сделаю.
Заранее благодарю.
Отвечает: Архангельский Андрей Германович
Здравствуйте, Полховский Александр Владимирович!
свойство Items.Data - это указатель на структуру данных, которую придумываете сами
Как с ней работать в приложении (выдержка из статьи)
Однако я стараюсь этим не пользоваться
Учитывая то что картинки замедляют вывод дерева, то я выключаю отображение картинок и использую Node.ImageIndex, Node.OverleyIndex, Node.StatusIndex как параметры типа Integer своему усмотрению
Приложение:
Ответ отправил: Архангельский Андрей Германович (статус: Студент)
Отправлен: 16.02.2006, 19:03 Оценка за ответ: 5 Комментарий оценки: Спасибо за объяснение о .Data и за статью. Действительно, я совсем забыл об .OverlayIndex, таким образом, в моём распоряжении уже 2 переменные integer. Думаю, проблем конвертации 2 переменых integer в одну у меня не будет. Ещё раз благодарю. В том числе и за оперативность.
Отвечает: sir henry
Здравствуйте, Полховский Александр Владимирович!
Все что начинается в компоненте на букву F трогать нельзя. Эти поля не зря находятся в секции Private. Дело в том, что занесение данных в эти поля зачастую связаны с дополнительными действиями. Поэтому Вы можете видеть, что свойство, которое связано с полем Fxxxxx, имеет отдельную функцию read и отдельную write.
Если Вам нужно добавить не заморачиваясь какие-то дополнительные свойства, Вы можете создать объект-потомок от TTreeView и добавить к нему нужные Вам свойства.
Можно действительно воспользоваться свойством Data. Поскольку это Pointer, то Вы можете создать свою дополнительную структуру FileData и присвоить указатель на него этому свойству Data.
Type
PSearchRec = ^TSearchRec;
var
FileData: PSearchRec;
Begin
...
New(FileData); {Выделяем память}
TreeView1.Items[1].Date:=FileData; {Присваиваем выделеную память указателю Data}
TreeView1.Items[1].Date^.Size:=11;
TreeView1.Items[1].Date^.Time:=10;
TreeView1.Items[1].Date^.Attr:=8;
...
End;
Ответ отправил: sir henry (статус: Академик)
Отправлен: 17.02.2006, 20:19