Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.07.23;
Скачать: CL | DM;

Вниз

Тормозим :)   Найти похожие ветки 

 
PSPF2003 ©   (2006-07-02 11:57) [0]

День добрый. Помогите разобраться с логикой.
В приложении есть TreeView, каждый элемент указывает на структуру с данными. Их необходимо сохранить, с этим вроде разобрался. И при запуске восстановить, как все было. Вот тут и сложности. Либо не восстанавливается, либо не в том порядке как сохранял. Есть идей как это осуществить?


 
Ivolg ©   (2006-07-02 12:58) [1]

>PSPF2003

Как я понял, тебе надо просто сохранить и востановить содержимое ListView"а ?


 
PSPF2003 ©   (2006-07-02 13:06) [2]

Нет. Не только содержимое. Но и ту структуру с данными на которую указывает каждый элемент.


 
Ivolg ©   (2006-07-02 13:17) [3]

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, Buttons, ExtCtrls, jpeg, ComCtrls, ImgList;

type
 TForm1 = class(TForm)
   lv: TListView;
   procedure SaveToFile(Dir:string);
   function LoadFromFile(Dir:string):boolean;
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 Signature,FileName:string;
implementation

uses Unit1, Unit5;

{$R *.dfm}
{------------------------------------Сохранение----------------------------}
procedure TForm1.SaveToFile(Dir:string);
var
 idxItem, idxSub, IdxImage: Integer;
 F: TFileStream;
 pText: PChar;
 sText: string;
 W, ItemCount, SubCount: Word;
 MySignature: array [0..7] of Char;
begin
 FileName:=dir;
 StrPCopy(MySignature, Signature);
 F := TFileStream.Create(FileName, fmCreate or fmOpenWrite);
 F.Write(MySignature, SizeOf(MySignature));
 ItemCount := lv.Items.Count;
 F.Write(ItemCount, SizeOf(ItemCount));
 if lv.Items.Count > 0 then
   for idxItem := 1 to ItemCount do
      with lv.Items[idxItem - 1] do
         begin
           SubCount := Subitems.Count;
           F.Write(SubCount, SizeOf(SubCount));
           IdxImage := ImageIndex;
           F.Write(IdxImage, SizeOf(IdxImage));
           sText := Caption;
           w := Length(sText);
           pText := StrAlloc(Length(sText) + 1);
           StrPLCopy(pText, sText, Length(sText));
           F.Write(w, SizeOf(w));
           F.Write(pText^, w);
           StrDispose(pText);
           if SubCount > 0 then
             for idxSub := 0 to SubItems.Count - 1 do
               begin
                 sText := SubItems[idxSub];
                 w := Length(sText);
                 pText := StrAlloc(Length(sText) + 1);
                 StrPLCopy(pText, sText, Length(sText));
                 F.Write(w, SizeOf(w));
                 F.Write(pText^, w);
                 StrDispose(pText);
               end;
         end;
 F.Free;
end;
{------------------------------------------Загрузка-------------------------}
function TForm1.LoadFromFile(Dir:string):boolean;
var
 F: TFileStream;
 IdxItem, IdxSubItem, IdxImage: Integer;
 W, ItemCount, SubCount: Word;
 pText: PChar;
 PTemp: PChar;
 MySignature: array [0..7] of Char;
begin
 FileName:=Dir;
 Result:=True;
 if not FileExists(FileName) then
   begin
     Result:=False;
     Exit;
   end;
 lv.Items.BeginUpdate;
 F := TFileStream.Create(FileName, fmOpenRead);
 F.Read(MySignature, SizeOf(MySignature));
 if MySignature <> Signature then
   begin
     F.Free;
     Result:=False;
     Exit;
   end;
 F.Read(ItemCount, SizeOf(ItemCount));
 lv.Items.Clear;
 for idxItem := 1 to ItemCount do
   with lv.Items.Add do
     begin
       F.Read(SubCount, SizeOf(SubCount));
       F.Read(IdxImage, SizeOf(IdxImage));
       ImageIndex := IdxImage;
       F.Read(w, SizeOf(w));
       pText := StrAlloc(w + 1);
       pTemp := StrAlloc(w + 1);
       F.Read(pTemp^, W);
       StrLCopy(pText, pTemp, W);
       Caption := StrPas(pText);
       StrDispose(pTemp);
       StrDispose(pText);
       if SubCount > 0 then
         for idxSubItem := 1 to SubCount do
           begin
             F.Read(w, SizeOf(w));
             pText := StrAlloc(w + 1);
             pTemp := StrAlloc(w + 1);
             F.Read(pTemp^, W);
             StrLCopy(pText, pTemp, W);
             lv.Items[idxItem - 1].SubItems.Add(StrPas(pText));
             StrDispose(pTemp);
             StrDispose(pText);
           end;
     end;
 F.Free;
 lv.Items.EndUpdate;
end;


 
PSPF2003 ©   (2006-07-02 13:30) [4]

Ага сейчас попробую. Спасибо.


 
Ivolg ©   (2006-07-02 13:44) [5]

>PSPF2003
Пожайлуста :)


 
PSPF2003 ©   (2006-07-04 09:38) [6]

При добавлении или удалении приходится создавать новый файл с данными. И вот я подумал может лучше сохранять структуру в XML. Компоненты по сериализации не подходят. Ни кто не посоветует хорошую статью по XML?



Страницы: 1 вся ветка

Текущий архив: 2006.07.23;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.035 c
2-1151913621
ZZZ_ZZZ
2006-07-03 12:00
2006.07.23
Алгоритм работы архиваторов


2-1151954606
Ivolg
2006-07-03 23:23
2006.07.23
Окна


15-1151392880
Ega23
2006-06-27 11:21
2006.07.23
Посоветуйте ToolBar


2-1151943426
Ivolg
2006-07-03 20:17
2006.07.23
Размер


2-1152008547
Dyakon_Frost
2006-07-04 14:22
2006.07.23
Вывести список файлов в директории!