Re: работа с Dbf
Добавлено: 28 май 2007, 14:49
скажите что не так и где поправть .. Плиззз...
Это приводит к открытию excel в процессах и подвисагию программы....


Код: Выделить всё
procedure ExportDBGrid(toExcel: Boolean);
var
bm: TBookmark;
col, row: Integer;
sline: string;
mem: TMemo;
ExcelApp: Variant;
MainForm: Tmemo;
begin
Screen.Cursor := crHourglass;
Form1.DBGrid1.DataSource.DataSet.DisableControls;
bm := Form1.DBGrid1.DataSource.DataSet.GetBookmark;
Form1.DBGrid1.DataSource.DataSet.First;
// ñîçäà¸ì îáúåêò Excel
if toExcel then
begin
ExcelApp := CreateOleObject('Excel.Application');
ExcelApp.WorkBooks.Add(xlWBatWorkSheet);
ExcelApp.WorkBooks[1].WorkSheets[1].name := 'Grid Data';
end;
// Ñïåðâà îòïðàâëÿåì äàííûå â memo
// ðàáîòàåò áûñòðåå, ÷åì îòïðàâëÿòü èõ íàïðÿìóþ â Excel
// mem := TMemo.Create(Self);
mem.Visible := false;
mem.Parent := MainForm;
mem.Clear;
sline := '';
// äîáàâëÿåì èíôîðìàöèþ äëÿ èì¸í êîëîíîê
for col := 0 to Form1.DBGrid1.FieldCount-1 do
sline := sline + Form1.DBGrid1.Fields[col].DisplayLabel + #9;
mem.Lines.Add(sline);
// ïîëó÷àåì äàííûå èç memo
for row := 0 to Form1.DBGrid1.DataSource.DataSet.RecordCount-1 do
begin
sline := '';
for col := 0 to Form1.DBGrid1.FieldCount-1 do
sline := sline + Form1.DBGrid1.Fields[col].AsString + #9;
mem.Lines.Add(sline);
Form1.DBGrid1.DataSource.DataSet.Next;
end;
// êîïèðóåì äàííûå â clipboard
mem.SelectAll;
mem.CopyToClipboard;
// åñëè íåîáõîäèìî, òî îòïðàâëÿåì èõ â Excel
// åñëè íåò, òî îíè óæå â áóôåðå îáìåíà
if toExcel then
begin
ExcelApp.Workbooks[1].WorkSheets['Grid Data'].Paste;
ExcelApp.Visible := true;
end;
FreeAndNil(ExcelApp);
Form1.DBGrid1.DataSource.DataSet.GotoBookmark(bm);
Form1.DBGrid1.DataSource.DataSet.FreeBookmark(bm);
Form1.DBGrid1.DataSource.DataSet.EnableControls;
Screen.Cursor := crDefault;
end;
//***************************************************
procedure TForm1.BtoExcelBClick(Sender: TObject);
begin
SaveDialog1.FileName := FName;
if SaveDialog1.Execute then
begin
FName := SaveDialog1.FileName;
ExportDBGrid(ExcelApplication1.GetSaveAsFilename(FName));
end;
end;