Okej - przerobiłem procedurę w ten sposób:
procedure Tfrm_Glowne.DatabaseSpaceOptimalization(AAuto: Boolean);
var Zipfile: TZipFile;
Directory : TDirectory;
DPath,XMLFileName,ZIPFileName : string;
MS : TMemoryStream;
begin
DPath:=ExtractFilePath(ParamStr(0))+'\Tokens';
ZipFile := TZipFile.Create;
ZipFile.UTF8Support:=TRUE;
if not Directory.Exists(DPath) then begin
Directory.CreateDirectory(DPath);
end;
MS := TMemoryStream.Create;
if Directory.Exists(DPath) then begin
pgExecute.SQL.Clear;
pgExecute.SQL.Add('SELECT pe.odp_xml,pe.id_oper ');
pgExecute.SQL.Add('FROM tabelka pe ');
pgExecute.Active:=TRUE;
if not pgExecute.Eof then begin
try
ZIPFileName:=DPath+'\TokensPackage.kpz';
if not ZipFile.IsValid(ZIPFileName) then begin
DeleteFile(ZIPFileName);
end;
ZipFile.Open(ZIPFileName,zmWrite);
pgExecute.First;
while not pgExecute.Eof do begin
XMLFileName:=pgExecute.FieldByName('id_oper').AsString+'.xml';
MS.Write(PAnsiChar(pgExecute.FieldByName('odp_xml').AsString)^, Length(pgExecute.FieldByName('odp_xml').AsString));
MS.Position := 0;
ZipFile.Add(MS,XMLFileName);
pgExecute.Next;
MS.Clear;
end;
ZipFile.Close;
finally
ZipFile.Free;
MS.Free;
end;
end;
pgExecute.SQL.Clear;
end;
end;
A wywołanie w trybie ręcznym wygląda tak:
procedure Tfrm_Glowne.Button19Click(Sender: TObject);
begin
try
try
DatabaseSpaceOptimalization(FALSE);
Application.MessageBox(PChar('Zakończono proces porządkowania bazy danych'),'Informacja',MB_OK+MB_ICONINFORMATION);
except
on E : Exception do begin
Application.MessageBox('Błąd na wysokim poziomie','Błąd aplikacji',MB_ICONERROR+MB_OK);
end;
end;
finally
frm_Glowne.Enabled:=TRUE;
end;
end;
Wg debuggera (po wymuszeniu błędu wewnątrz pętli while) - najpierw wykonuje się sekcja finally wewnątrz procedury, a następnie except w procedurze wywołującej.
ReportMemoryLeaksOnShutdown aktualnie pokazuje jakieś dwa małe wycieki na kilkadziesiąt bajtów, ale to w innym obszarze.
Oczywiście - będę jeszcze musiał posprzątać i blok try ... finally ... except zrobić tak jak pokazał abrakadaber kilka postów wyżej.
Pytanie czy poza tym widzicie jeszcze jakieś znaczące błędy ?