Ir al contenido


Foto

Guardar un TStringGrid en formato .dif


  • Por favor identifícate para responder
4 respuestas en este tema

#1 seoane

seoane

    Advanced Member

  • Administrador
  • 1.257 mensajes
  • LocationEspaña

Escrito 11 marzo 2009 - 04:13

Data Interchange Format (.dif) is a text file format used to import/export single spreadsheets between spreadsheet programs (OpenOffice.org Calc, Excel, Gnumeric, StarCalc, Lotus 1-2-3, FileMaker, dBase, Framework, Multiplan, etc.). It is also known as "Navy DIF". One limitation is that DIF format cannot handle multiple spreadsheets in a single workbook.




delphi
  1. procedure GuardarComoDif(StringGrid: TStringGrid; Filename: String);
  2. var
  3.   i,j: Integer;
  4. begin
  5.   if ExtractFileExt(Filename) = EmptyStr then
  6.     Filename:= Filename + '.dif';
  7.   with TStringList.Create do
  8.   try
  9.     Add('TABLE');
  10.     Add('0,1');
  11.     Add('"SqlGrid"');
  12.     Add('VECTORS');
  13.     Add(Format('0,%d',[StringGrid.ColCount]));
  14.     Add('""');
  15.     Add('TUPLES');
  16.     Add(Format('0,%d',[StringGrid.RowCount]));
  17.     Add('""');
  18.     Add('DATA');
  19.     Add('0,0');
  20.     Add('""');
  21.     for j:= 0 to StringGrid.RowCount - 1 do
  22.     begin
  23.       Add('-1,0');
  24.       Add('BOT');
  25.       for i:= 0 to StringGrid.ColCount - 1 do
  26.       begin
  27.         Add('1,0');
  28.         Add(Format('"%s"',[StringGrid.Cells[i,j]]));
  29.       end;
  30.     end;
  31.     Add('-1,0');
  32.     Add('EOD');
  33.     SaveToFile(Filename);
  34.   finally
  35.     Free;
  36.   end;
  37. end;
  38.  
  39. // Por ejemplo
  40. GuardarComoDif(StringGrid1,'f:\1.dif');


  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.187 mensajes
  • LocationMéxico

Escrito 11 marzo 2009 - 04:18

Que bien amigo seoane,

Un formato mas como opción de guardar archivo como....

Una cuestion, esto mismo se podrí­a usar con un DBGrid???? digo la respuesta en teorí­a deberí­a ser SI, pero ya sabes que no me las cargo todas conmigo :D, mejor pregunto. :)

Salud OS
  • 0

#3 seoane

seoane

    Advanced Member

  • Administrador
  • 1.257 mensajes
  • LocationEspaña

Escrito 12 marzo 2009 - 07:45

Una cuestion, esto mismo se podrí­a usar con un DBGrid????


Pues ya que lo preguntas, yo para un dbgrid uso lo siguiente:


delphi
  1. procedure GuardarComoTexto(Filename: String; Delimiter: Char);
  2. var
  3.   i: Integer;
  4.   Dst, Aux: TStringList;
  5. begin
  6.   if ExtractFileExt(Filename) = EmptyStr then
  7.     Filename:= Filename + '.txt';
  8.   if qryMain.Active then
  9.   begin
  10.     Dst:= TStringList.Create;
  11.     try
  12.       Aux:= TStringList.Create;
  13.       try
  14.         Aux.Delimiter:= Delimiter;
  15.         Aux.QuoteChar:= '"';
  16.         // Resultado
  17.         for i:= 0 to qryMain.Fields.Count - 1 do
  18.           Aux.Add(qryMain.Fields[i].DisplayName);
  19.         Dst.Add(Aux.DelimitedText);
  20.         qryMain.First;
  21.         while not qryMain.Eof do
  22.         begin
  23.           Aux.Clear;
  24.           for i:= 0 to qryMain.Fields.Count - 1 do
  25.             Aux.Add(qryMain.Fields[i].DisplayText);
  26.           Dst.Add(Aux.DelimitedText);
  27.           qryMain.Next;
  28.         end;
  29.       finally
  30.         Aux.Free;
  31.       end;
  32.       Dst.SaveToFile(Filename);
  33.     finally
  34.       Dst.Free;
  35.     end;
  36.   end;
  37. end;
  38.  
  39. procedure GuardarComoCsv(Filename: String);
  40. begin
  41.   if ExtractFileExt(Filename) = EmptyStr then
  42.     Filename:= Filename + '.csv';
  43.   GuardarComoTexto(Filename,';');
  44. end;
  45.  
  46. procedure GuardarComoTextoSeparadoPorTabuladores(Filename: String);
  47. begin
  48.   if ExtractFileExt(Filename) = EmptyStr then
  49.     Filename:= Filename + '.txt';
  50.   GuardarComoTexto(Filename,#9);
  51. end;
  52.  
  53. procedure GuardarComoDif(Filename: String);
  54. var
  55.   i: Integer;
  56. begin
  57.   if ExtractFileExt(Filename) = EmptyStr then
  58.     Filename:= Filename + '.dif';
  59.   if qryMain.Active then
  60.   begin
  61.     with TStringList.Create do
  62.     try
  63.       Add('TABLE');
  64.       Add('0,1');
  65.       Add('"SqlGrid"');
  66.       Add('VECTORS');
  67.       Add(Format('0,%d',[qryMain.FieldCount]));
  68.       Add('""');
  69.       Add('TUPLES');
  70.       Add(Format('0,%d',[qryMain.RecordCount + 1]));
  71.       Add('""');
  72.       Add('DATA');
  73.       Add('0,0');
  74.       Add('""');
  75.       Add('-1,0');
  76.       Add('BOT');
  77.       for i:= 0 to qryMain.Fields.Count - 1 do
  78.       begin
  79.         Add('1,0');
  80.         Add(Format('"%s"',[qryMain.Fields[i].DisplayName]));
  81.       end;
  82.       qryMain.First;
  83.       while not qryMain.Eof do
  84.       begin
  85.         Add('-1,0');
  86.         Add('BOT');
  87.         for i:= 0 to qryMain.FieldCount - 1 do
  88.         begin
  89.           Add('1,0');
  90.           Add(Format('"%s"',[qryMain.Fields[i].DisplayText]));
  91.         end;
  92.         qryMain.Next;
  93.       end;
  94.       Add('-1,0');
  95.       Add('EOD');
  96.       SaveToFile(Filename);
  97.     finally
  98.       Free;
  99.     end;
  100.   end;
  101. end;



Donde qryMain es la consulta que esta enlazada con el DBGrid (en mi caso un TADOQuery). Y para que sea mas rápido podemos hacer algo como esto:


delphi
  1. dtsMain.DatSet:= nil;
  2. try
  3.   GuardarComoDiff('c:\1.diff');
  4. finally
  5.   dtsMain.DataSet:= qryMain;
  6. end;


Donde dstMain es el DataSource que enlaza el DBGrig y la consulta.

PD: He corregido un pequeño error en el código de mi primer mensaje
  • 0

#4 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 12 marzo 2009 - 08:53

muy bueno Seoane, pero una duda, que diferencia habria entre romper el enlaze del datasource y utilizar:

qryMain.Disablecontrols;
  • 0

#5 seoane

seoane

    Advanced Member

  • Administrador
  • 1.257 mensajes
  • LocationEspaña

Escrito 12 marzo 2009 - 03:11

muy bueno Seoane, pero una duda, que diferencia habria entre romper el enlaze del datasource y utilizar:

qryMain.Disablecontrols;

Pues la diferencia amigo eduarcol es que yo no conocí­a el método Disablecontrols  :$
  • 0