Текущий архив: 2005.10.23;
Скачать: CL | DM;
ВнизДревовидная структура Найти похожие ветки
← →
LordOfRock © (2005-09-30 13:17) [0]Подскажите, как можно скинуть в файл все элементы TTreeView...+Связянные с каждым элементом TTreeItem компоненты TListView. или ссылочку pls
← →
ZeroDivide © (2005-09-30 13:30) [1]По разному можно скинуть. В какой файл?
← →
LordOfRock © (2005-09-30 13:39) [2]Мне всё равно в какой. Самое главное: что бы после сохранения, всё это можно было бы прочитать без потерь. А то я как ни делал, всё время после этого прочитать не удавалось.
← →
ZeroDivide © (2005-09-30 13:46) [3]А как ты делал?
← →
LordOfRock © (2005-09-30 13:58) [4]Я делал структуры (record), в которых содержались записи примерно такие:
1 файл -папки
-Index - порядковый номер папки
-ParentIndex - если папка вложенная, то здесь порядковый номер родительской папки, если в корне, то 0
-Name - имя
... другая дополнительная инфа
2 файл - элементы TListView
-Name - имя
-Subitem1 - Первый подэлемент
...
-SubitemN - N-й подэлемент
-FolderIndex - Индекс папки
Вроде всё нормально работает, когда вложенных папок нет совсесм, но когда они появляются, то ачинается лажа: элементы летают из папки в папку, папки тоже себя так ведут. Надо пересчитывать индексы при каждом добавлении подпапки...
может можно проще?
← →
LordOfRock © (2005-09-30 14:19) [5]Ну неужели попроще нельзя?
← →
ZeroDivide © (2005-09-30 14:55) [6]Любая деревяха окучивается:
ID, Parent_ID, AnyRecordData.
Если ты код реализуешь правильно, то все должно работать. Если ты так и делал, то ошибка где нибудь в коде.
← →
easy © (2005-09-30 15:08) [7]http://216.101.185.148/scripts/isapi.dll/article?id=1107A536&article=2629444
← →
Иванов__ (2005-09-30 16:51) [8]Я такое делал. Дерево скидываю в текстовый файл. Там просто одна команда. А данные в типизированный файл. Считываю в обычном цикле for. Все очень просто.
← →
LordOfRock © (2005-10-01 00:26) [9]Ссылочка-то битая, однако. :((((
← →
easy © (2005-10-01 00:37) [10]In article <3b1bae6e$1_1@dnews>, Vinnie Schoenfelder wrote:
> I have an instance of TreeView, and need to assign an object to each tree
> node.
>
> I read the docs, and see that the Data property is the way to go - but this
> is a pointer. How do I point to an object.
treenode.data := someObject;
This works because objects in Delphi are accessed via references only. A
reference is a pointer to the objects memory on the heap. So the assignment
above works directly. The way back requires a typecast, though:
someObject := TSomeObject( treenode.data );
> Also, I need to store the entire tree structure for future use. In JBuilder
> I would just use a serialized object - how can I do this in Delphi?
> StreamToFile? Will this preserve all objects as well?
No, the standard TTreeview.StreamToFile method will only stream the treenode
captions, not the data associated to the nodes. It cannot do that since it has
no idea whatsoever what kind of data you may have associated with the nodes.
An object reference is only one possibility of many. And there is no generic
way to stream an object anyway, whatever class it may belong to.
You have to write your own streaming code for the treeview.
Type
{: Callback procedure to save the data for a node into a stream
via the passed writer. }
TNodeSaveDataProc =
Procedure( writer: TWriter; data: Pointer );
{: Callback function to load the data for a node from a stream
via the passed reader. }
TNodeLoadDataProc =
Function( reader: TReader ): Pointer;
Procedure SaveTreeviewToStream( tv: TTreeview; S: TStream;
saveProc: TNodeSaveDataProc );
Var
writer: TWriter;
node: TTreeNode;
Begin
Assert( Assigned( tv ));
Assert( Assigned( S ));
Assert( Assigned( saveProc ));
writer:= TWriter.Create( S, 4096 );
try
node:= tv.Items[0];
writer.WriteListBegin;
While node <> nil Do Begin
writer.WriteInteger( node.level );
writer.WriteString( node.Text );
writer.WriteInteger( node.Imageindex );
saveProc( writer, node.data );
node:= node.GetNext;
End; { While }
writer.WriteListEnd;
writer.FlushBuffer;
finally
writer.Free;
end;
End; { SaveTreeviewToStream }
Procedure LoadTreeviewFromStream( tv: TTreeview; S: TStream;
loadProc: TNodeLoadDataProc );
Var
reader: TReader;
node: TTreenode;
level: Integer;
Begin
Assert( Assigned( tv ));
Assert( Assigned( S ));
Assert( Assigned( loadProc ));
tv.Items.BeginUpdate;
try
tv.Items.Clear;
reader:= TReader.Create( S, 4096 );
try
node:= nil;
reader.ReadListBegin;
While not Reader.EndOfList Do Begin
level := reader.ReadInteger;
If node = nil Then
// create root node, ignore its level
node:= tv.Items.Add( nil, "" )
Else Begin
If level = node.level Then
node := tv.Items.Add( node, "" )
Else If level > node.level Then
node := tv.Items.AddChild( node, "" )
Else Begin
While Assigned(node) and (level < node.level) Do
node := node.Parent;
node := tv.Items.Add( node, "" );
End; { Else }
End; { Else }
node.Text := Reader.ReadString;
node.ImageIndex := Reader.ReadInteger;
node.Data := loadProc( Reader );
End; { While }
reader.ReadListEnd;
finally
reader.Free;
end;
finally
tv.items.Endupdate;
end;
End; { LoadTreeviewFromStream }
The complete logic for saving/loading the data (e.g. objects) associated
to the nodes is external to the two routines above and implemented
by two callback routines you have to write and pass to the save/load
routines. These callbacks encapsulate the knowledge specific to the
object or data you need to save. If you want to save objects of a
particular class, and if the class has been designed well, the routines
may look like this:
Procedure SaveMyObject( writer: TWriter; data: Pointer );
Begin
writer.Writeboolean( Assigned(data));
If Assigned(data) Then Begin
Assert( TObject(data) Is TMyObject );
TMyObject(data).Save( writer );
End;
End;
Function LoadMyObject( reader: TReader ): Pointer;
Var
obj: TMyObject;
Begin
If reader.Readboolean Then Begin
obj:= TMyObject.Create;
obj.Load( reader );
Result := obj;
End { If }
Else
Result := nil;
End;
This way the eventual work of storing or loading the objects data
ends up where it belongs: with the object itself. The Save and Load
methods are ones you have to write yourself, of course.
Peter Below (TeamB) 100113.1101@compuserve.com)
No e-mail responses, please, unless explicitly requested!
Note: I"m unable to visit the newsgroups every day at the moment,
so be patient if you don"t get a reply immediately.
← →
LordOfRock © (2005-10-01 01:05) [11]> [10] easy © (01.10.05 00:37)
Спасибо огроменное. Будем осваивать (блин, где у меня англо-русский словарь:)
Страницы: 1 вся ветка
Текущий архив: 2005.10.23;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.04 c