Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 18.02.2009, 21:06
Artfulcat Artfulcat вне форума
Прохожий
 
Регистрация: 10.01.2009
Сообщения: 6
Репутация: 10
По умолчанию Нужна помощь про сериализацию

Здравствуйте!

Стоит задача реализовать механизм сохранения для приложеньица. Что надо сохранить: дерево из TreeView, несколько StringList'ов.
Сохраняется и читается вот такими процедурами:

Код:
procedure SaveToFile(RootObject: TComponent; const FileName: TFileName);
var
  FileStream: TFileStream;
  MemStream: TMemoryStream;
begin
  FileStream := TFileStream.Create(FileName, fmCreate);
  MemStream := TMemoryStream.Create;
  try
    MemStream.WriteComponent(RootObject);
    MemStream.Position := 0;
    ObjectBinaryToText(MemStream, FileStream);
    finally
    MemStream.Free;
    FileStream.Free;
  end;
end;

procedure LoadFromFile(RootObject: TComponent; const FileName: TFileName);
var
  FileStream: TFileStream;
  MemStream: TMemoryStream;
begin
  FileStream := TFileStream.Create(FileName, 0);
  MemStream := TMemoryStream.Create;
  try
    ObjectTextToBinary(FileStream, MemStream);
    MemStream.Position := 0;
    MemStream.ReadComponent(RootObject);
  finally
    MemStream.Free;
    FileStream.Free;
  end;
end;

Суть проблемы: такими процедурами я легко сохраняю и восстанавливаю TreeView отдельно, просто скармливая его этим функциям SaveToFile(TreeView1, 'saveTR.txt');. Если открыть полученный файл, то видно, что все недефолтовые свойства TreeView туда записались типа object TreeView1: TTreeView ... Но надо сохранять и мои StringList, соответсвенно я создаю свой класс (код ниже).

Код:
ProjectData=class(TComponent)
    private
    //Tree:TTreeNodes;  //другой вариант
    Tree:TTreeView;
    LMeasures:TStringList;
    MeasuresCount:Integer;
    public
      constructor Create(ProjectData: TComponent); override;
      destructor Destroy; override;
    published
    //property PartsTree : TTreeNodes read Tree write Tree; //Другой вариант
    property PartsTree : TTreeView read Tree write Tree;
    property Measures: TStringList read LMeasures write LMeasures;
    property MCount:Integer read MeasuresCount write MeasuresCount;
    end;

Потом присваиваю значения и сохраняю:
Код:
ProjectData:=TProjectData.Create(self);
ProjectData.PartsTree:=TreeView1;
ProjectData.MCount:=Form5.ListBox1.Items.Count;
for I := 0 to Form5.ListBox1.Items.Count - 1 do
    ProjectData.Measures.Insert(I, Form5.ListBox1.Items[i]);
SaveToFile(ProjectData, 'save.txt');
После чего сохраняю. StringList сохраняется со всей нужной информацией, а вот TreeView сохраняется коряво, без информации:

Код:
object TProjectData
  PartsTree = Form1.TreeView1 
...

А вот если PartsTree присвоить тип TTreeNodes, то информация о структурое моего дерева PartsTree.NodeData=... сохраняется как надо, но читаться обратно она уже не хочет.

Таким образом, либо как заставить сохраняться TreeView целиком, либо как заставить читаться TTreeNodes?

Спасибо!
Ответить с цитированием
  #2  
Старый 18.02.2009, 21:21
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,034
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А я бы просто сохранял в поток руками только данные. Все-таки, WriteComponent больше сделан для самой среды, а не для программистов.
Ответить с цитированием
  #3  
Старый 18.02.2009, 21:23
Artfulcat Artfulcat вне форума
Прохожий
 
Регистрация: 10.01.2009
Сообщения: 6
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
А я бы просто сохранял в поток руками только данные. Все-таки, WriteComponent больше сделан для самой среды, а не для программистов.

К сожалению задача именно с помощью WriteComponent ((.
Ответить с цитированием
  #4  
Старый 18.02.2009, 23:04
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

А свое написать - влом чтоль?
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #5  
Старый 19.02.2009, 07:17
Artfulcat Artfulcat вне форума
Прохожий
 
Регистрация: 10.01.2009
Сообщения: 6
Репутация: 10
По умолчанию

Цитата:
Сообщение от Aristarh Dark
А свое написать - влом чтоль?

Тут дело такое: с одной стороны не я выдал себе такое задание, а с другой стороны моих знаний мало, чтобы даже понять что значит "своё написать" Но делать нужно блин...
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:29.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter