Biraz düzenlenmiş fonksiyonu aşağıdaki gibi yazabilirsiniz. Bu örnekte dinamik olarak oluşturulan nesnelerin hafıza kaçağı vermemesi için doğru kullanımı gösterilmiştir.
// parametreler değiştirilmeyecek ise "const" olarak tanımlanması çalışma zamanında bir miktar performans artışı sağlayacaktır.
function DosyaAl(const FileName, Dosya: string): Boolean;
var
Listeler: TStringList;
Dosyam: string;
C, Zip: TMemoryStream;
NewP: String;
begin
Result := False;
Listeler := TStringList.Create();
try // Bu noktadan sonra hata oluşsa dahi "Listeler" mutlaka hafızadan silinecektir.
C := TMemoryStream.Create();
try // Bu noktadan sonra hata oluşsa dahi "C" mutlaka hafızadan silinecektir.
Zip:= TMemoryStream.Create();
try // Bu noktadan sonra hata oluşsa dahi "Zip" mutlaka hafızadan silinecektir.
Result := MoveFile(PChar(FileName), PChar(Yedekler + dosyam));
// "if Result then" ile "if Result = True then" ifadesi anlam açısından tamamen aynıdır.
// İkincisi iki değişken kontrolü içerdiği için bir miktar daha fazla işlemci zamanı harcayacaktır
if Result then
begin
Listeler.Add(FileName);
// Formata dikkat edin. hh:mm şeklinde değil hh:nn şeklinde olmalı
Listeler.Add(FormatDateTime('hh:nn dd.mm.yy', Now));
end
else // Bu kontrol yapılmadığı takdirde ileride anlaşılması zor hatalar ile karşılaşabilirsiniz
Exit();
Listeler.SaveToFile(Yedekler + 'Yedek.ini');
// Yedekler değişkeni en azından Form genelinde tanımlanmış bir değişken. Veri türünün ne olduğunu bilmiyoruz.
// Ancak eğer string tipinde tanımlanmış ise (Listeler.SaveToFile() fonksiyonu string parametre ister)
// aşağıdaki PChar() dönüşümüne gerek yoktur.
NewP := PChar(Yedekler + dosyam);
C.LoadFromFile(NewP);
Paketle(C, Zip); // Bu işlemin başarılı olup olmadığının da kontrolü gereklidir
finally
Zip.Free();
end;
finally
C.Free();
end;
finally
Listeler.Free();
end;
Result := True;
end;