Witam, znalazłem poniższy kod, który w prosty sposób zapisuje dbGrid-a do pliku CSV lub XLS (czytane przez Excella). Kod działa bez problemów.
Moja aplikacja posiada wiele form, w nich znajdują się różne tabele dbGrid.
W jaki sposób zrobić jedną procedurę, która wywołana z dowolnej formy zapisywała by wskazany dbGrid do csv lub xls? Póki co przychodzi mi na myśl jedynie, aby w każdym unicie wbudować tą procedurę, używaną tylko dla jednego dbGrida. Pomysł delikatnie mówiąc "na piechotę".
procedure TZaqvkiForm.CreateXLSFile(filename: String; Sender: TDBGrid);
const
Delim = CHR(9);
var
S: String;
I: Integer;
Stream: TFileStream;
begin
savedialog1.FileName:=filename;
if savedialog1.Execute then
begin
filename:=savedialog1.FileName;
Stream := TFileStream.Create(filename, fmCreate);
S := '';
for I := 0 to Sender.Columns.Count - 1 do
if Sender.Columns[I].Visible=true then S := S + TColumn(Sender.Columns[I]).Title.Caption + Delim;
S := S + CHR(13);
Stream.Write(PChar(S)^, Length(S));
while not sender.DataSource.DataSet.Eof do
begin
S := '';
for I := 0 to Sender.Columns.Count - 1 do
if Sender.Columns[I].Visible=true then S := S + TColumn(Sender.Columns[I]).Field.AsString + Delim;
S := S + CHR(13);
Stream.Write(PChar(S)^, Length(S));
sender.DataSource.DataSet.Next();
end;
Stream.Free();
if FileExists(filename) then ShellExecute(Self.Handle, 'Open', pchar(filename), '', '', SW_SHOW);
end;
end;