Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сохранение TreeView и Data [D7, WinXP]


N!tro ©   (2005-07-23 08:09:00) 

Сохраняю TreeView в ini-файл. Подскажите как можно сохранить свойство дата (запись), чтобы при загрузке программы всё восстанавливалось.]
Вот так сохраняю:
procedure TForm1.Button1Click(Sender: TObject);
var
 ini: TIniFile;
 s: TMemoryStream;
begin
 S := TMemoryStream.Create;
 Ini := TiniFile.Create('c:\temp\demo.ini');
 TreeView.SaveToStream(S);
 s.Seek(0, soFromBeginning);
 ini.WriteBinaryStream('1', '1', S);
 ini.Free;
 s.Free;
end;


N!tro   (2005-07-23 16:26:00) [1]


> tvArticle.FullExpand;

Это дерево разворачивает. Такая задумка


Vir   (2005-07-23 16:16:00) [2]

Ну вбощем верно, тока так у тебя получиться два файла в одном ветви в дугом data к ним - если тебе так удобно...
Кстати tvArticle.FullExpand;можешь не делать, от этого порядок ветвей не меняться.


N!tro   (2005-07-23 16:01:00) [3]

type
 PMyRec = ^TMyRec;
 TMyRec = record
   Path: string;
   id: Integer;
 end;


N!tro   (2005-07-23 15:52:00) [4]


> обязательно нужно сохранять еще и данные о том какая ветвь
> владеет этой ветвью

Что-то не понял.
Делаю так:
procedure TfmMain.FormCreate(Sender: TObject);
var
 p: PMyRec;
 f: TStringList;
 i: Integer;
begin
 tvArticle.FullExpand;
 f := TStringList.Create();
//здесь хранятся строки
 f.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'Path.txt');
 for i := 0 to tvArticle.Items.Count - 1 do
 begin
   New(p);
   P^.path := f.Strings[i];
   P^.id := i; //абсолютный номер элемента
   tvArticle.Items.Item[i].Data := p;
 end;
 f.Free;
end;

Просто светить 'Path.txt' не хочется (он пока в незашифрованном виде хранится)


Vir   (2005-07-23 15:42:00) [5]

Ну тут ничего стандартного не выйдет, дело в том что TTreeNode.Data   это pointer и соответсвенно TreeView.SaveToStream максимум что может это сохранить в поток адрес этого указателя, что тебе при новой загрузке приложения совершенно ничего не даст.

Потому выход следующий - писать процедуру сохранения и загрузки самому. Кусков вода приводить не буду но общие принципы расскажу.
Придеться обходить все ветви последовательно и сохранять их параметры, причем по мимо нужных лично тебе (текст, данные, может еще что) обязательно нужно сохранять еще и данные о том какая ветвь владеет этой ветвью.

самы удобным считаю сохранять данные в табличном виде, что-то типа:
номер ветви| номер ее владельца| текст | Data.Sting| Data.Int |

Благо при использовании TreeView не обязателен рекурсивный обход ветвей можно взять так:

For i:=0 to TreeView.Items.Count-1 do
begin
//Save TreeView.Items[i]
....
end;


Ну загрузка по аналогии.


N!tro   (2005-07-23 14:48:00) [6]

TTreeNode.Data (в вопросе же указал: свойство дата (запись))
Запись состоит из 2 полей: String, Integer


Vir   (2005-07-23 14:01:00) [7]

А что ты имеешь в виду под свойством Дата?
Текущию дату или TTreeNode.Data?


Наверх

Титульная страница Поиск, карта сайта Написать письмо