Ver Mensaje Individual
  #2  
Antiguo 22-06-2015
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 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
    // guardar firma
    aux    := Length(Signature);
    Stream.Write(aux, SizeOf(aux));
    Stream.Write(PChar(Signature)^, aux);
    // guardar nro items
    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
        // Caption
        str := LV.Items[i].Caption;
        aux := Length(str);
        Stream.Write(aux, SizeOf(aux));
        Stream.Write(PChar(str)^, aux);
        // ImageIndex
        aux := LV.Items[i].ImageIndex;
        Stream.Write(aux, SizeOf(aux));
        // SubItems
        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
            // Caption
            str := LV.Items[i].SubItems[j];
            aux := Length(str);
            Stream.Write(aux, SizeOf(aux));
            Stream.Write(PChar(str)^, aux);
            // ImageIndex
            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
  // verificar existencia
  if not FileExists(aFileName) then
    raise Exception.Create(Format('No se encuentra el archivo %s',[aFileName]));
  Stream := TFileStream.Create(aFileName, fmOpenRead);
  try
    // leer firma
    Stream.Read(aux, SizeOf(aux));
    SetLength(str, aux);
    Stream.Read(PChar(str)^, aux);
    // verificar firma
    if str <> Signature then
      raise Exception.Create(Format('%s no es el archivo correcto',[aFileName]));
    // leer nro items
    Stream.Read(ItemCount, SizeOf(ItemCount));
    LV.Items.Clear;
    for i := 0 to ItemCount-1 do
    begin
      it:= LV.Items.Add;
      // Caption
      Stream.Read(aux, SizeOf(aux));
      SetLength(str, aux);
      Stream.Read(PChar(str)^, aux);
      it.Caption:= str;
      // ImageIndex
      Stream.Read(aux, SizeOf(aux));
      it.ImageIndex := aux;
      // SubItems
      Stream.Read(SubCount, SizeOf(SubCount));
      if SubCount > 0 then
      begin
        for j := 0 to SubCount-1 do
        begin
          // Caption
          Stream.Read(aux, SizeOf(aux));
          SetLength(str, aux);
          Stream.Read(PChar(str)^, aux);
          it.SubItems.Add(str);
          // ImageIndex
          Stream.Read(aux, SizeOf(aux));
          it.SubItemImages[j]:= aux;
        end;
      end;
    end;
  finally
    Stream.Free;
  end;
end;

Ejemplo de uso:
Código Delphi [-]
// Guardar
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;

// Cargar
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
__________________
Daniel Didriksen

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