Посоветуйте, как лучше поступить. Возникла необходимость в компоненте Tree ( и как следствие List - не StrList).
Нужно формировать небольшие деревья в памяти - порядка 1000 шт. и более.
Конечно запись и чтение оных изв файл. - вопросов не возникает - обход дерева и т.д.
Глубина дерева меньше 10, в основном 3 - 8 подчинённых узлов - думаю, что это необязательный параметр.
Каждый узел обязательно хранит несколько данных (указателей на них), помимо указателей на узлы и названия.
Механика кортежей не удобна, во всяком случае для данной задачи. Всё меняется динамически.
Не хочется вводить лишние библиотеки, может и KOL подойдёт, или другие варианты посоветуйте.
Вопрос:
1. Как в KOL TTree приклеить данные к узлу (указатель на них)?
Приведите какой то пример - doAddData.
2 Как грамотно через TData передать pointer.
Допустим:
var tp:pointer;
t:integer;
...
t:=integer(tp); Так?
Собственно для чего - [url]http://geektimes.ru/post/79882/ [/url]
[url]http://habrahabr.ru/post/148124/ [/url]
[url] http://habrahabr.ru/post/229403/ [/url]
[url] http://www.solarix.ru/for_developers/docs/syntax_analyzer.shtml [/url]
Грамматический движок уже сделал (русский, английский), но на StrList подобных списках.
Но как говорил один из героев О.Генри "Вождь Краснокожих" - «Песок — плохая замена овсу!».
P.S.
Кому интересно, могу выложить, но там масса не стандартных компонентов. И вообще - это отдельная тема.
Этот топик читают: Гость
Ответов: 2059
Рейтинг: 132
|
|||
карма: 6 |
| ||
Голосовали: | Minkovsky |
Ответов: 964
Рейтинг: 12
|
|||
Что-то похожее я делал в Лазарусе на днях гляну есть ли там что-то полезное ...
Хотя если дерево нужно сугубо для данных я бы использовал самодельные связные списки .. (Кода-то на еще на турбо паскале делал "гиганские коллекции" именно на их основе ) Так? ... Вообще то так var tp:pointer; t:integer; ... А лучше например так t:^integer; ... var T:^Integer ; begin New(T);// выделить память T^:=1; ShowMessage(intToStr(T^)); Dispose (T); // освободить память .. end; Просто Т будет pointer, а T^ Integer ... .... var tp:pointer; t:integer; ... а тут действительно нужно приведение типов t:=integer(tp^) Но нужно позаботится о том что бы указатель не указывал в "мировое пространство " Но вообще лучше бы больше конкретики ... (Возможно я не понял контекст ) |
|||
карма: 0 |
|
Ответов: 2059
Рейтинг: 132
|
|||
AlexKir
(Возможно я не понял контекст ) Я плохо объяснил. Как через точку передать указатель с меньшем количеством преобразований в передающем и принимающем квадратике. Но вообще лучше бы больше конкретики Позже выложу 2 компонента для критики - List и Tree. Сейчас времени нет и зуб болит. |
|||
карма: 6 |
|
Ответов: 35
Рейтинг: -2
|
|||
не по зубам тебе
|
|||
карма: 0 |
|
Ответов: 964
Рейтинг: 12
|
|||
AlexKir
(Возможно я не понял контекст ) Я плохо объяснил. Как через точку передать указатель с меньшем количеством преобразований в передающем и принимающем квадратике. unit Share .... ##ToXXX function ToString(const Data:TData) :string; function ToInteger(const Data:TData) :THiInt; function ToReal(const Data:TData) : real; function ToStream(var Data:TData) : PStream; function ToBitmap(var Data:TData) : PBitmap; function ToIcon(var Data:TData) : PIcon; *function ToObject(var Data:TData) : pointer; function ToFont(var Data:TData) : PFontRec; function ToTypes(var Data:TData) : PType; // ##_DoData function _DoData(Value:THiInt): TData; overload; function _DoData(Value:real) : TData; overload; function _DoData(const Value:string) : TData; overload; function _DoData(const Value:TData): TData; overload; function _DoData(Value: PStream):TData; overload; function _DoData(Value: PBitmap):TData; overload; function _DoData(Value: PMatrix):TData; overload; *function _DoData(Value: PType):TData; overload; // ##CreateData procedure dtData(var Data:TData; const Value:TData); procedure dtNull(var Data:TData); procedure dtInteger(var Data:TData; Value:integer); procedure dtReal(var Data:TData; Value:real); procedure dtString(var Data:TData; const Value:string); procedure dtArray(var Data:TData; Value: PArray); procedure dtMatrix(var Data:TData; Value: PMatrix); procedure dtBitmap(var Data:TData; Value: PBitmap); procedure dtStream(var Data:TData; Value: PStream); procedure dtObject(var Data: TData; id:integer; Value: pointer); procedure dtRect(var Data:TData; Value: pointer); procedure dtIcon(var Data:TData; Value: PIcon); procedure dtType(var Data:TData; Value: PType); function _IsStr(const Data:TData):boolean; function _IsInteger(const Data:TData):boolean; function _IsFont(const Data:TData):boolean; function _IsStream(const Data:TData):boolean; function _IsBitmap(const Data:TData):boolean; function _IsIcon(const Data:TData):boolean; function _IsObject(const Data:TData; id:integer):boolean; function _IsNull(const Data:TData):boolean; function _IsBreak(const Data:TData):boolean; function _IsTypes(const Data:TData):boolean; function _IsType(const Data:TData):integer; ... |
|||
карма: 0 |
|
Ответов: 2059
Рейтинг: 132
|
|||
Спасибо AlexKir.
Вечером займусь. |
|||
карма: 6 |
|
6