Понадобилось тут для собственных нужд сделать прогу для вывода отчетов в excel файл. Использовал для этого FPSpreadsheet. для удобства обернул все это в простой класс.
- Код: Выделить всё
unit exlrep;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, fpspreadsheet, fpsTypes, xlsbiff8, fpsutils, ZDataset, zbase, fpsSearch, DB;
type
{ XlReport }
XlReport = class(TObject)
private
fxlfile: string;
XLBook: TsWorkBook;
XLWorksheet: TsWorksheet;
public
constructor Create(xlfile: string);
destructor Destroy;
procedure WriteDate(SHname: string; mesyac: string; rmove: integer; cmove: integer; ZQ: TZQuery);
procedure SaveReport();
function GetSheetName(): string;
end;
implementation
{ XlReport }
constructor XlReport.Create(xlfile: string);
begin
XLBook := TsWorkBook.Create;
fxlfile := xlfile;
xlbook.ReadFromFile(xlfile, sfExcel8);
end;
destructor XlReport.Destroy; // есть подозрение что тут не освобождается ничего
begin
XLWorksheet.Free;
xlbook.Free;
end;
procedure XlReport.WriteDate(SHname: string; mesyac: string; rmove: integer; cmove: integer; ZQ: TZQuery);
var
xcol: cardinal; // столбец
xrow: cardinal;// строка
XLSearchParams: TsSearchParams;
XLSearch: TsSearchEngine;
zy: integer; // проход по строке
zx: integer; // проход по столбцу
begin
xcol:=0;
// тут код работы с данными
XLSearch.Free;
end;
procedure XlReport.SaveReport;
begin
xlbook.WriteToFile(fxlfile, sfExcel8, True);
end;
function XlReport.GetSheetName: string;
begin
XLWorksheet := XLBook.GetFirstWorksheet;
Result := XLWorksheet.Name;
end;
end.
собственно после работы данного кода видно в диспетчере задач , что не освобождается память , запускал выполнение несколько раз и каждый раз обьем занимаемой памяти становился еще больше.
код работы
- Код: Выделить всё
var
myrep: XlReport;
begin
myrep := XlReport.Create(report_path + PathDelim + report_name);
myrep.WriteDate('вк1','январь' , 3, 0, dm.N_old);
myrep.savefile;
myrep.free;
end;
Вроде ничего не упустил, но при обработке данного кода память съедается. Подскажите что поправить.