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

Вниз

Древовидная структура   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.048 c
3-1126086628
DelphiN!
2005-09-07 13:50
2005.10.23
Загрузка процессора на 100% после select запроса


14-1128012098
TG
2005-09-29 20:41
2005.10.23
Flash


3-1126247046
kreyl
2005-09-09 10:24
2005.10.23
Как остановить выполнение длинного запроса?


2-1128003182
hooky-mars
2005-09-29 18:13
2005.10.23
Непонятка с var в dll`ай


14-1127473162
Igorek
2005-09-23 14:59
2005.10.23
Задача про приборы





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский