Hola danielmj.
Cita:
Edito: Si mal no veo, el código que he puesto antes es igual que el de la web de torrys, salvando las diferencias en cuanto a nombre de archivo y extensión y un "if" dentro de la carga del archivo, por lo que sigo igual.
...
|
Estuve revisándolos a fondo y tenes razón, el código es casi igual y ambos no realizan bién su cometido.
Pero como me parecieron unas funciones que a varios resultarían útiles, me puse a teclear un poco
Código Delphi
[-]
unit ListViewExt;
interface
uses SysUtils, Classes, ComCtrls;
type
TListView = class(ComCtrls.TListView)
public
procedure SaveToFile(const FileName: TFileName);
procedure LoadFromFile(const FileName: TFileName);
end;
implementation
procedure TListView.SaveToFile(const FileName: TFileName);
var
i, j, aux: Integer;
Stream: TStream;
str,signat: string;
ItemCount, SubCount: Word;
begin
Stream := TFileStream.Create(FileName, fmCreate);
signat := Name;
aux:= Length(signat);
Stream.Write(aux, SizeOf(aux));
Stream.Write(PChar(signat)^, aux);
ItemCount:= Items.Count;
Stream.Write(ItemCount, SizeOf(ItemCount));
if Items.Count > 0 then
begin
for i:= 0 to ItemCount-1 do
begin
aux:= Items[i].ImageIndex;
Stream.Write(aux, SizeOf(aux));
str:= Items[i].Caption;
aux:= Length(str);
Stream.Write(aux, SizeOf(aux));
Stream.Write(PChar(str)^, aux);
SubCount:= Items[i].Subitems.Count;
if SubCount > 0 then
begin
Stream.Write(SubCount, SizeOf(SubCount));
for j:= 0 to SubCount - 1 do
begin
str:= Items[i].SubItems[j];
aux:= Length(str);
Stream.Write(aux, SizeOf(aux));
Stream.Write(PChar(str)^, aux);
aux:= Items[i].SubItemImages[j];
Stream.Write(aux, SizeOf(aux));
end;
end;
end;
end;
Stream.Free;
end;
procedure TListView.LoadFromFile(const FileName: TFileName);
var
Stream: TStream;
i, j, aux: Integer;
ItemCount, SubCount: Word;
str, signat: string;
it: TListItem;
begin
if not FileExists(FileName) then
raise Exception.Create(Format('No se encuentra el archivo %s',[FileName]));
Stream := TFileStream.Create(FileName, fmOpenRead);
Stream.Read(aux, SizeOf(aux));
SetLength(signat, aux);
Stream.Read(PChar(signat)^, aux);
if signat <> Name then
begin
Stream.Free;
raise Exception.Create(Format('%s no es el archivo correcto',[FileName]));
end;
Items.Clear;
Stream.Read(ItemCount, SizeOf(ItemCount));
for i := 0 to ItemCount-1 do
begin
it:= Items.Add;
Stream.Read(aux, SizeOf(aux));
it.ImageIndex := aux;
Stream.Read(aux, SizeOf(aux));
SetLength(str, aux);
Stream.Read(PChar(str)^, aux);
it.Caption:= str;
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;
Stream.Free;
end;
end.
Para usarlo en cualquier otra unidad, solo agrega la unidad
ListViewExt al final del
uses de la sección
interface:
Código Delphi
[-]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ImgList, ComCtrls, StdCtrls, ListViewExt; type
TForm1 = class(TForm)
ListView1: TListView;
ImageList1: TImageList;
btnSave: TButton;
btnLoad: TButton;
procedure btnSaveClick(Sender: TObject);
procedure btnLoadClick(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation {$R *.dfm}
procedure TForm1.btnSaveClick(Sender: TObject);
begin
ListView1.SaveToFile(ListView1.Name + '.DAT');
end;
procedure TForm1.btnLoadClick(Sender: TObject);
begin
ListView1.LoadFromFile(ListView1.Name + '.DAT');
end;
end.
Saludos