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

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

Сохранение содержимого TListView [D7, WinXP]


.ruslan ©   (2006-05-24 10:42:00) 

Добрый день, уважаемые!
В общем у меня стоит компонент TListView, его содержимое я сохранить смог, да и загружается всё нормально, всё работает, но: не сохраняются checkbox’ы а итемах, как быть, подскажите, если не сложно.

Вот код сохранения который я использую:

…

var
 Writer : TWriter;
 FileStream : TFileStream;
begin
       FileStream:=TFileStream.Create(extractfilepath(application.ExeName)+ '\base.ini',fmOpenWrite or fmCreate);
       Writer := TWriter.Create(FileStream, SizeOf(ListView1));
       Writer.WriteRootComponent(ListView1);
       Writer.Free;
       FileStream.Free;

…


.ruslan   (2006-05-24 12:04:00) [1]

ВСЁ РАБОТАЕТ!

Огромное спасибо, Сергей!


Сергей М.   (2006-05-24 11:51:00) [2]


> чтение:
> procedure TMAIN.FormCreate(Sender: TObject);
> var
>  FileStream:TFileStream;
>  Flag:Boolean;
>  i:integer;
> begin
> FileStream:=TFileStream.Create(extractfilepath(application.
> ExeName)+ '\data.dat', fmOpenRead); // or fmCreate - это не нужно
> try
>  FileStream.ReadComponent(ListView1);
>  for i := 0 to ListView1.Items.Count - 1 do begin
>    FileStream.ReadBuffer(Flag, SizeOf(Flag));
>    ListView1.Items[i].Checked := Flag;
>  end;
> finally
>  FileStream.Free;
>  end;
> end;
>


И на какой строчке теперь "ругается" ?


.ruslan   (2006-05-24 11:45:00) [3]

запись:
procedure TMAIN.FormClose(Sender: TObject; var Action: TCloseAction);
var
 FileStream:TFileStream;
 Flag:Boolean;
 i:integer;
begin
FileStream:=TFileStream.Create(extractfilepath(application.ExeName)+ '\data.dat',fmOpenWrite or fmCreate);
try
 FileStream.WriteComponent(ListView1);
 for i := 0 to ListView1.Items.Count - 1 do begin
   Flag := ListView1.Items[i].Checked;
    FileStream.WriteBuffer(Flag, SizeOf(Flag));
 end;
finally
 FileStream.Free;
end;
end;


чтение:
procedure TMAIN.FormCreate(Sender: TObject);
var
 FileStream:TFileStream;
 Flag:Boolean;
 i:integer;
begin
FileStream:=TFileStream.Create(extractfilepath(application.ExeName)+ '\data.dat',fmOpenRead or fmCreate);
try
 FileStream.ReadComponent(ListView1);
 for i := 0 to ListView1.Items.Count - 1 do begin
   FileStream.ReadBuffer(Flag, SizeOf(Flag));
   ListView1.Items[i].Checked := Flag;
 end;
finally
 FileStream.Free;
 end;
end;


Сергей М.   (2006-05-24 11:43:00) [4]

Приводи полныйкод - код записи комонента и код считывания, с учетом добавленных из моего примера циклов


.ruslan   (2006-05-24 11:39:00) [5]

всё равно ругается :(


Сергей М.   (2006-05-24 11:37:00) [6]


> .ruslan ©   (24.05.06 11:32) [11]


var
FileStream : TFileStream;
Flag: Boolean;

//этот код для записи компонента в поток
FileStream:=TFileStream.Create(...);
try
  FileStream. WriteComponent(ListView1);
  for i := 0 to ListView1.Items.Count - 1 do begin
    Flag := ListView1.Items[i].Checked;
     FileStream. WriteBuffer(Flag, SizeOfFlag);
  end;
finally
  FileStream.Free;
end;
..

//а этот код для последующего чтения компонента из потока
FileStream:=TFileStream.Create(...);
try
  FileStream. ReadComponent(ListView1);
  for i := 0 to ListView1.Items.Count - 1 do begin
    FileStream. ReadBuffer(Flag, SizeOfFlag);
    ListView1.Items[i].Checked := Flag;
  end;
finally
  FileStream.Free;
end;


.ruslan   (2006-05-24 11:32:00) [7]

procedure TMAIN.FormCreate(Sender: TObject);
var
 FileStream:TFileStream;
 Flag:Boolean;
 i:integer;
begin
FileStream:=TFileStream.Create(extractfilepath(application.ExeName)+ '\base.ini',fmOpenRead or fmCreate);
try
  FileStream.ReadComponent(ListView1);
  for i:=0 to ListView1.Items.Count-1 do
   begin
   FileStream.ReadBuffer(Flag, SizeOf(Flag));
   ListView1.Items[i].Checked:=Flag;
  end;
finally
  FileStream.Free;
end;
end;


Сергей М.   (2006-05-24 11:30:00) [8]

Приводи свой вариант кода ..


.ruslan   (2006-05-24 11:27:00) [9]

Сергей, извините, но что-то ругается на цикле "Stream read error"


Сергей М.   (2006-05-24 11:15:00) [10]

SizeOf (Flag )

неужто так сложно домыслить ?


.ruslan   (2006-05-24 11:13:00) [11]

[Error] Unit1.pas(192): Undeclared identifier: 'SizeOfFlag'


Сергей М.   (2006-05-24 11:03:00) [12]


>  FileStream:=TFileStream.Create(...);
>  try
>    FileStream. ReadComponent(ListView1);
>    for i := 0 to ListView1.Items.Count - 1 do begin
>      FileStream. ReadBuffer(Flag, SizeOfFlag);
>      ListView1.Items[i].Checked := Flag;
>    end;
>  finally
>    FileStream.Free;
>  end;


Сергей М.   (2006-05-24 11:02:00) [13]

А вот это - к делу:

var
FileStream : TFileStream;
Flag: Boolean;
begin
 FileStream:=TFileStream.Create(...);
 try
   FileStream.WriteComponent(ListView1);
   for i := 0 to ListView1.Items.Count - 1 do begin
     Flag := ListView1.Items[i].Checked;
      FileStream.WriteBuffer(Flag, SizeOfFlag);
   end;
 finally
   FileStream.Free;
 end;
..
 FileStream:=TFileStream.Create(...);
 try
   FileStream.WriteComponent(ListView1);
   for i := 0 to ListView1.Items.Count - 1 do begin
     FileStream.ReadBuffer(Flag, SizeOfFlag);
     ListView1.Items[i].Checked := Flag;
   end;
 finally
   FileStream.Free;
 end;


.ruslan   (2006-05-24 10:56:00) [14]


> в самом что ни на есть простом : ListView1 - это указатель,
>  а размер указателя равен четырем байтам.

Ну реально ли сделать сохранение чекбоксов?


Сергей М.   (2006-05-24 10:55:00) [15]

в самом что ни на есть простом : ListView1 - это указатель, а размер указателя равен четырем байтам.


.ruslan   (2006-05-24 10:50:00) [16]

в каком смысле, можно подробнее?


Сергей М.   (2006-05-24 10:48:00) [17]


> SizeOf(ListView1)


всегда = 4, хоть это к делу и не относится


Наверх

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