Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 15-11-2014
Avatar de danielmj
danielmj danielmj is offline
Miembro
 
Registrado: jun 2011
Posts: 383
Poder: 13
danielmj Va por buen camino
Guardar ListView como Texto Plano

Hola,

Sigo con la lista de otro post anterior a este, solo que esta vez el problema es otro. Intento guardar el contenido de la lista en un archivo de texto plano, buscando información por internet, encontre este código, que imagino ya habreis visto antes:

Código Delphi [-]
procedure guardarListViewFichero (AListView: TListView; sFileName: string);
var
  idxItem, idxSub, IdxImage: Integer;
  F: TFileStream;
  pText: PChar;
  sText: string;
  W, ItemCount, SubCount: Word;
  MySignature: array [0..2] of Char;

begin
  // Inicio
  with rForm.Lista do
  if rForm.saveDialog1.Execute then
  begin
    ItemCount := 0;
    SubCount  := 0;
    //****
    MySignature := 'txt';
    //  ListViewFile
    F := TFileStream.Create(rForm.saveDialog1.FileName, fmCreate or fmOpenWrite);
    F.Write(MySignature, SizeOf(MySignature));

    if Items.Count = 0 then
      // List is empty
      ItemCount := 0
    else
      ItemCount := Items.Count;
      F.Write(ItemCount, SizeOf(ItemCount));

    if Items.Count > 0 then
    begin
      for idxItem := 1 to ItemCount do
      begin
        with Items[idxItem - 1] do
        begin
          // Guardamos los SubItems
          if SubItems.Count = 0 then
            SubCount := 0
          else
          begin
          SubCount := Subitems.Count;
          F.Write(SubCount, SizeOf(SubCount));
          // Guardamos el Index
          IdxImage := ImageIndex;
          F.Write(IdxImage, SizeOf(IdxImage));
          // Guardamos la Caption
          sText := Caption;
          w     := Length(sText);
          pText := StrAlloc(Length(sText) + 1);
          StrPLCopy(pText, sText, Length(sText));
          F.Write(w, SizeOf(w));
          F.Write(pText^, w);
          StrDispose(pText);
          end;
          if SubCount > 0 then
          begin
            for idxSub := 0 to SubItems.Count - 1 do
            begin
              // Guardamos los Items y SubItems
              sText := SubItems[idxSub];
              w     := Length(sText);
              pText := StrAlloc(Length(sText) + 1);
              StrPLCopy(pText, sText, Length(sText));
              F.Write(w, SizeOf(w));
              F.Write(pText^, w);
              StrDispose(pText);
            end;
          end;
        end;
      end;
    end;
    F.Free;
  end;

end;

En la opcion "crear informe" del popup menú tengo esto:
Código Delphi [-]
procedure TrForm.Crearinforme1Click(Sender: TObject);
begin
    guardarListViewFichero(Lista, SaveDialog1.FileName);
end;

Aparentemente todo va bien, quiero decir que no da error en tiempo de compilación, pero cuando intento crear el informe, me tira un error de "stack overflow" como si hubiera desbordamiento de pila, y la verdad, no sé donde está el error (me refiero en el código)

¿alguna idea? Gracias y un saludo.
__________________
La juventud pasa, la inmadurez se supera, la ignorancia se cura con la educación, y la embriaguez con la sobriedad, pero la estupidez dura para siempre. Aristofanes.
Responder Con Cita
  #2  
Antiguo 15-11-2014
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
danielmj,

Cita:
Empezado por danielmj
...Guardar ListView como Texto Plano...


Revisa este código:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, ImgList;

type
  TForm1 = class(TForm)
    ListView1: TListView;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

// Crea un ListView
procedure TForm1.FormCreate(Sender: TObject);
var
   i : Integer;

begin

   // Crea 4 columnas en el ListView
   ListView1.ViewStyle := vsReport;
   for i := 0 to 3 do
   begin
      ListView1.Columns.Add;
      ListView1.Columns[i].Caption := 'Col-' + IntToStr(i);
      ListView1.Columns[i].Width := 150;
   end;

   // Adiciona las Filas al ListView
   for i := 0 to 9 do
      with ListView1.Items.Add do
      begin
         Caption := 'Caption Row-' + IntToStr(i);
         Subitems.Add('SubItem-0');
         Subitems.Add('SubItem-1');
         Subitems.Add('SubItem-2');
      end;

end;

// Salva el ListView en un Archivo TXT
procedure TForm1.Button1Click(Sender: TObject);
var
   i, j : Integer;
   F : TFileStream;
   Buffer : String;

begin

   SetCurrentDir(ExtractFilePath(Application.ExeName));

   F := TFileStream.Create('FileListView.txt', fmCreate);

   for i := 0 to ListView1.Items.Count - 1 do
   begin

      Buffer := Buffer + ListView1.Items.Item[i].Caption + ',';

      for j := 0 to ListView1.Items.Item[i].SubItems.Count - 1 do
         Buffer := Buffer + ListView1.Items.Item[i].SubItems.Strings[j] + ',';

      Delete(Buffer, Length(Buffer), 1);
      Buffer := Buffer + #13 + #10;
      F.Write(Buffer[1], Length(Buffer));
      Buffer := EmptyStr;

   end;

   F.Free;

end;

end.
El código anterior en Delphi 7 sobre Windows 7 Professional x32, crea un TListView y salva su contenido en un Archivo TXT, como se muestra en la siguiente imagen:



Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 15-11-2014 a las 16:07:38.
Responder Con Cita
  #3  
Antiguo 15-11-2014
Avatar de danielmj
danielmj danielmj is offline
Miembro
 
Registrado: jun 2011
Posts: 383
Poder: 13
danielmj Va por buen camino
Hola nelson,

gracias por tu ayuda pero me surgen dos problemas, a saber:

1º Tu código me guarda el contenido de la lista así:


Es decir, no guarda todo el contenido, todas las columnas.

El código que me pusiste yo lo tengo de esta manera:
Código Delphi [-]
procedure TrForm.Button4Click(Sender: TObject);
var
  i,j: integer;
  fTxt: TextFile;
  F : TFileStream;
  Buffer : String;

begin
...
   SetCurrentDir(ExtractFilePath(Application.ExeName));

   F := TFileStream.Create('factura.txt', fmCreate);

   for i := 0 to Lista.Items.Count - 1 do
   begin

      Buffer := Buffer + Lista.Items.Item[i].Caption + ', ';

      for j := 0 to Lista.Items.Item[i].SubItems.Count - 1 do
         Buffer := Buffer + Lista.Items.Item[i].SubItems.Strings[j] + ', ';
         Delete(Buffer, Length(Buffer), 1);
         Buffer := Buffer + #13 + #10;
         F.Write(Buffer[1], Length(Buffer));
         Buffer := EmptyStr;
   end;

   F.Free;


end;
end;

2º Aunque consiga que me guarde todo el contenido de la lista, como realmente quiero que lo guarde sería de este modo:


No sé si es posible guardar así el contenido de una lista. Si no fuera posible ¿que otra alternativa me sugeris?

Por otra parte tengo también este código aunque lo tenía entre {}
Código Delphi [-]
procedure TrForm.Crearinforme1Click(Sender: TObject);
var
  i : Integer;

begin
  with TStringList.Create do
  try
    for i := 0 to Lista.Items.Count-1 do
      Add(Lista.Items[i].Caption +','+
          Lista.Items[i].SubItems.CommaText);
          SaveToFile((ExtractFilePath(Application.ExeName) + 'factura.txt'));
  finally
    Free
  end
end;

Me devuelve todo el contenido de la lista pero sigue sin incluirse de forma ordenada el caption de cada columna, me refiero al nombre de cada columna.

Un saludo y gracias.
__________________
La juventud pasa, la inmadurez se supera, la ignorancia se cura con la educación, y la embriaguez con la sobriedad, pero la estupidez dura para siempre. Aristofanes.

Última edición por danielmj fecha: 15-11-2014 a las 22:16:26.
Responder Con Cita
  #4  
Antiguo 16-11-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 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:
Empezado por danielmj Ver Mensaje
...como realmente quiero que lo guarde sería de este modo:
Para que se guarde con ese formato:
Código Delphi [-]
procedure SaveListView(LV: TListView; const aFileName: TFileName; const Title: string);
var
  r, c: Integer;
begin
  with TStringList.Create do
  try
    Add('['+Title+']');
    for r:= 0 to LV.Items.Count-1 do
    begin
      for c:= 1 to LV.Columns.Count-1 do
        Add(Format('%s: %s',[LV.Columns[c].Caption, LV.Items[r].SubItems[c-1]]));
      Add('');
    end;
    SaveToFile(aFileName);
  finally
    Free;
  end;
end;

Ejemplo de uso:
Código Delphi [-]
procedure TForm1.btnSaveClick(Sender: TObject);
begin
  SaveListView(ListView1, 'ListView.txt', 'DATOS CLIENTES');
end;

Datos de ejemplo:


Archivo resultante:


Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 16-11-2014
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
danielmj,

Cita:
Empezado por danielmj
...Tu código...no guarda todo el contenido, todas las columnas...Aunque consiga que me guarde todo el contenido de la lista, como realmente quiero que lo guarde sería de este modo...


Te comento:

1- El código del Msg #2 funciona según lo esperado, como se puede ver en la imagen anexa y su propósito es de servir de guía a tu requerimiento, las adaptaciones necesarias debes hacerlas en función de tu aplicación y su datos.

2- Efectivamente, puedes formatear la salida del archivo como mejor se adapte a tu requerimiento.

3- El código del Msg #4 se adapta al formato de salida que comentas en el Msg #3, solo debes hacer unos pequeños ajustes relacionados a la columna Caption (Dado que no la usas) y al Monto Total requerido.

Pregunto : ¿Este proyecto es de índole académica, comercial o personal?

Espero sea útil

Nelson.
Responder Con Cita
  #6  
Antiguo 16-11-2014
Avatar de danielmj
danielmj danielmj is offline
Miembro
 
Registrado: jun 2011
Posts: 383
Poder: 13
danielmj Va por buen camino
Hola nelson buenos dias,

Ahora me pondre a mirar tu respuesta, gracias.

En cuanto a tu pregunta, en principio es personal con vistas a ser comercial para mi, quiero decir que aprovechando esta nueva moda de llevar pulseras de supervivencia, pensé en hacer una aplicacion que me permita su venta. La idea es subirla a la web que haga para tal fin, que la gente la descargue y pueda diseñar su propia pulsera en casa, eligiendo los elementos que la formaran (hebilla, tamaño, si llevara pedernal... etc). Sé que esta forma tiene mas contras que pros, también sé que todo esto podria hacerlo en la misma web, pero el hecho de hacerlo en delphi y de este modo, tiene su parte de reto ademas que no tengo ni idea de php ni nada de eso, y solo con html y CSS no conseguiria nada decente, así que de las dos opciones esta me pareció la mas factible. Ahora solo falta que el asunto tenga exito

Por otra parte, llevaba bastante tiempo (meses) sin hacer nada de codigo, llevo un tiempo dandole caña a blender (programa 3d), y lo cierto es que de vez en cuando necesito un "chute" de delphi, empiezo a darle vueltas a la cabeza hasta que pasado unos dias me pongo frente a esta "maquina infernal" llamada pc y empiezo a diseñar formularios, escribir sintaxis etc... es una necesidad que tengo de tanto en tanto. En resumen, es un proyecto personal/comercial (espero).

Saludos.
__________________
La juventud pasa, la inmadurez se supera, la ignorancia se cura con la educación, y la embriaguez con la sobriedad, pero la estupidez dura para siempre. Aristofanes.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
TDbGrid con un campo RTF. ¿Se puede visualizar como texto plano? TiammatMX OOP 20 01-03-2012 02:29:47
¿como guardar un archivo de texto como ANSI? JXJ Varios 2 09-09-2011 21:26:29
Cargar exe como texto plano _cero_ C++ Builder 4 14-12-2010 08:39:14
como agregar texto a un listview kurono Varios 4 10-11-2009 04:23:23
Guardar Archivo de Texto como en Excel BlueSteel Varios 4 26-09-2007 17:11:38


La franja horaria es GMT +2. Ahora son las 22:28:47.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi