Hola wolfran_hack.
De este modo me funciona correctamente.
Código Delphi
[-]
procedure SaveListView(LV: TListView; const aFileName, Signature: string);
var
i, j, aux: Integer;
Stream: TStream;
str: string;
tmp: Word;
begin
Stream := TFileStream.Create(aFileName, fmCreate or fmOpenWrite);
try
aux := Length(Signature);
Stream.Write(aux, SizeOf(aux));
Stream.Write(PChar(Signature)^, aux);
tmp := LV.Items.Count;
Stream.Write(tmp, SizeOf(tmp));
if LV.Items.Count > 0 then
begin
for i := 0 to LV.Items.Count-1 do
begin
str := LV.Items[i].Caption;
aux := Length(str);
Stream.Write(aux, SizeOf(aux));
Stream.Write(PChar(str)^, aux);
aux := LV.Items[i].ImageIndex;
Stream.Write(aux, SizeOf(aux));
if LV.Items[i].Subitems.Count > 0 then
begin
tmp := LV.Items[i].Subitems.Count;
Stream.Write(tmp, SizeOf(tmp));
for j := 0 to LV.Items[i].Subitems.Count - 1 do
begin
str := LV.Items[i].SubItems[j];
aux := Length(str);
Stream.Write(aux, SizeOf(aux));
Stream.Write(PChar(str)^, aux);
aux := LV.Items[i].SubItemImages[j];
Stream.Write(aux, SizeOf(aux));
end;
end;
end;
end;
finally
Stream.Free;
end;
end;
procedure LoadListView(LV: TListView; const aFileName, Signature: string);
var
Stream: TFileStream;
i, j, aux: Integer;
ItemCount, SubCount: Word;
str : string;
it: TListItem;
begin
if not FileExists(aFileName) then
raise Exception.Create(Format('No se encuentra el archivo %s',[aFileName]));
Stream := TFileStream.Create(aFileName, fmOpenRead);
try
Stream.Read(aux, SizeOf(aux));
SetLength(str, aux);
Stream.Read(PChar(str)^, aux);
if str <> Signature then
raise Exception.Create(Format('%s no es el archivo correcto',[aFileName]));
Stream.Read(ItemCount, SizeOf(ItemCount));
LV.Items.Clear;
for i := 0 to ItemCount-1 do
begin
it:= LV.Items.Add;
Stream.Read(aux, SizeOf(aux));
SetLength(str, aux);
Stream.Read(PChar(str)^, aux);
it.Caption:= str;
Stream.Read(aux, SizeOf(aux));
it.ImageIndex := aux;
Stream.Read(SubCount, SizeOf(SubCount));
if SubCount > 0 then
begin
for j := 0 to SubCount-1 do
begin
Stream.Read(aux, SizeOf(aux));
SetLength(str, aux);
Stream.Read(PChar(str)^, aux);
it.SubItems.Add(str);
Stream.Read(aux, SizeOf(aux));
it.SubItemImages[j]:= aux;
end;
end;
end;
finally
Stream.Free;
end;
end;
Ejemplo de uso:
Código Delphi
[-]
procedure TForm1.btnSaveClick(Sender: TObject);
const
MSG = '¿ Desea sobreescribir el archivo %s ?';
begin
with SaveDialog1 do
begin
Title := 'Guarda su ListView como archivo CSV';
InitialDir := GetCurrentDir;
Filter := 'CSV file|*.CSV';
DefaultExt := 'CSV';
FilterIndex := 1;
if Execute then
begin
if FileExists(FileName) then
if MessageDlg(Format(MSG,[FileName]), mtConfirmation,[mbYes,mbNo],0) = mrNo then
Abort;
SaveListView(ListView1, FileName, ListView1.Name);
ShowMessage('Guardado con éxito');
end;
end;
end;
procedure TForm1.btnLoadClick(Sender: TObject);
begin
with OpenDialog1 do
begin
Initialdir := GetCurrentDir;
Options := [ofFileMustExist];
Filter := 'CSV file|*.CSV';
DefaultExt := 'CSV';
FilterIndex := 1;
if Execute then
LoadListView(ListView1, FileName, ListView1.Name);
end;
end;
Saludos