|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Нужна помощь про сериализацию
Здравствуйте!
Стоит задача реализовать механизм сохранения для приложеньица. Что надо сохранить: дерево из 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'); Код:
object TProjectData PartsTree = Form1.TreeView1 ... А вот если PartsTree присвоить тип TTreeNodes, то информация о структурое моего дерева PartsTree.NodeData=... сохраняется как надо, но читаться обратно она уже не хочет. Таким образом, либо как заставить сохраняться TreeView целиком, либо как заставить читаться TTreeNodes? Спасибо! |
#2
|
|||
|
|||
А я бы просто сохранял в поток руками только данные. Все-таки, WriteComponent больше сделан для самой среды, а не для программистов.
|
#3
|
|||
|
|||
Цитата:
К сожалению задача именно с помощью WriteComponent ((. |
#4
|
||||
|
||||
А свое написать - влом чтоль?
Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#5
|
|||
|
|||
Цитата:
Тут дело такое: с одной стороны не я выдал себе такое задание, а с другой стороны моих знаний мало, чтобы даже понять что значит "своё написать" Но делать нужно блин... |