Una cuestion, esto mismo se podría usar con un DBGrid????
Pues ya que lo preguntas, yo para un dbgrid uso lo siguiente:
procedure GuardarComoTexto(Filename: String; Delimiter: Char);
var
i: Integer;
Dst, Aux: TStringList;
begin
if ExtractFileExt(Filename) = EmptyStr then
Filename:= Filename + '.txt';
if qryMain.Active then
begin
Dst:= TStringList.Create;
try
Aux:= TStringList.Create;
try
Aux.Delimiter:= Delimiter;
Aux.QuoteChar:= '"';
// Resultado
for i:= 0 to qryMain.Fields.Count - 1 do
Aux.Add(qryMain.Fields[i].DisplayName);
Dst.Add(Aux.DelimitedText);
qryMain.First;
while not qryMain.Eof do
begin
Aux.Clear;
for i:= 0 to qryMain.Fields.Count - 1 do
Aux.Add(qryMain.Fields[i].DisplayText);
Dst.Add(Aux.DelimitedText);
qryMain.Next;
end;
finally
Aux.Free;
end;
Dst.SaveToFile(Filename);
finally
Dst.Free;
end;
end;
end;
procedure GuardarComoCsv(Filename: String);
begin
if ExtractFileExt(Filename) = EmptyStr then
Filename:= Filename + '.csv';
GuardarComoTexto(Filename,';');
end;
procedure GuardarComoTextoSeparadoPorTabuladores(Filename: String);
begin
if ExtractFileExt(Filename) = EmptyStr then
Filename:= Filename + '.txt';
GuardarComoTexto(Filename,#9);
end;
procedure GuardarComoDif(Filename: String);
var
i: Integer;
begin
if ExtractFileExt(Filename) = EmptyStr then
Filename:= Filename + '.dif';
if qryMain.Active then
begin
with TStringList.Create do
try
Add('TABLE');
Add('0,1');
Add('"SqlGrid"');
Add('VECTORS');
Add(Format('0,%d',[qryMain.FieldCount]));
Add('""');
Add('TUPLES');
Add(Format('0,%d',[qryMain.RecordCount + 1]));
Add('""');
Add('DATA');
Add('0,0');
Add('""');
Add('-1,0');
Add('BOT');
for i:= 0 to qryMain.Fields.Count - 1 do
begin
Add('1,0');
Add(Format('"%s"',[qryMain.Fields[i].DisplayName]));
end;
qryMain.First;
while not qryMain.Eof do
begin
Add('-1,0');
Add('BOT');
for i:= 0 to qryMain.FieldCount - 1 do
begin
Add('1,0');
Add(Format('"%s"',[qryMain.Fields[i].DisplayText]));
end;
qryMain.Next;
end;
Add('-1,0');
Add('EOD');
SaveToFile(Filename);
finally
Free;
end;
end;
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:
dtsMain.DatSet:= nil;
try
GuardarComoDiff('c:\1.diff');
finally
dtsMain.DataSet:= qryMain;
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