Ver Mensaje Individual
  #7  
Antiguo 29-11-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Reputación: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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

(* Guarda el contenido del ListView en un archivo *)
procedure TListView.SaveToFile(const FileName: TFileName);
var
  i, j, aux: Integer;
  Stream: TStream;
  str,signat: string;
  ItemCount, SubCount: Word;
begin
  // Crear archivo
  Stream := TFileStream.Create(FileName, fmCreate);
  // guardar firma
  signat := Name;
  aux:= Length(signat);
  Stream.Write(aux, SizeOf(aux));
  Stream.Write(PChar(signat)^, aux);

  // guardar nro items
  ItemCount:= Items.Count;
  Stream.Write(ItemCount, SizeOf(ItemCount));

  if Items.Count > 0 then
  begin
    for i:= 0 to ItemCount-1 do
    begin
      // guardar ImageIndex
      aux:= Items[i].ImageIndex;
      Stream.Write(aux, SizeOf(aux));
      // guardar Caption
      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
        // guardar nro subitems
        Stream.Write(SubCount, SizeOf(SubCount));
        for j:= 0 to SubCount - 1 do
        begin
          // guardar Caption
          str:= Items[i].SubItems[j];
          aux:= Length(str);
          Stream.Write(aux, SizeOf(aux));
          Stream.Write(PChar(str)^, aux);
          // guardar ImageIndex
          aux:= Items[i].SubItemImages[j];
          Stream.Write(aux, SizeOf(aux));
        end;
      end;
    end;
  end;
  Stream.Free;
end;

(* Carga el contenido, previamente guardado, en el ListView *)
procedure TListView.LoadFromFile(const FileName: TFileName);
var
  Stream: TStream;
  i, j, aux: Integer;
  ItemCount, SubCount: Word;
  str, signat: string;
  it: TListItem;
begin
  // verificar existencia
  if not FileExists(FileName) then
    raise Exception.Create(Format('No se encuentra el archivo %s',[FileName]));
  // Abrir archivo
  Stream := TFileStream.Create(FileName, fmOpenRead);
  // leer firma
  Stream.Read(aux, SizeOf(aux));
  SetLength(signat, aux);
  Stream.Read(PChar(signat)^, aux);
  // verificar firma
  if signat <> Name then
  begin
    Stream.Free;
    raise Exception.Create(Format('%s no es el archivo correcto',[FileName]));
  end;
  Items.Clear;
  // leer nro items
  Stream.Read(ItemCount, SizeOf(ItemCount));
  for i := 0 to ItemCount-1 do
  begin
    it:= Items.Add;
    //leer ImageIndex
    Stream.Read(aux, SizeOf(aux));
    it.ImageIndex := aux;
    //leer caption
    Stream.Read(aux, SizeOf(aux));
    SetLength(str, aux);
    Stream.Read(PChar(str)^, aux);
    it.Caption:= str;
    //leer nro subitems
    Stream.Read(SubCount, SizeOf(SubCount)); 
    if SubCount > 0 then
    begin    
      for j := 0 to SubCount-1 do
      begin
        // leer Caption
        Stream.Read(aux, SizeOf(aux));
        SetLength(str, aux);
        Stream.Read(PChar(str)^, aux);
        it.SubItems.Add(str);
        // leer ImageIndex
        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; // <<== Aqui
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 22-10-2016 a las 17:34:40. Razón: ortografía
Responder Con Cita