Merhaba,
Öncelikle bazılarında kati kural olarak, kural olmayanlarda da her bir programlama dili için genel kabul görmüş kod yazma formatı vardır. Paylaştığınız kodlarda blok kısımlarını ayırd etmek mümkün olmuyor. Bütün kod 1 numaralı kolondan başlıyor ve kodu okuması daha zor oluyor. begin..end arası, try..finally arası vb blok içinde kalan kodları minimum iki karakter boşluk vererek daha içeriden yazmanızda fayda var.
Ayrıca, kod örneklerinizi benim aşağıda yaptığım gibi code ve /code blokları içine yazmanız halinde okunması daha da kolay olan sabit genişlikli font ile ekranda gösterilecektir.
Paylaştığınız kod ile ilgili olarak. Neden yaklaşık 244MiB hafıza ayırdığınızı anlamadım. TFileStream kullanmanın amacı büyük boyutlu dosyalarda yüksek hafıza ihtiyacını ortadan kaldırmaya yöneliktir.
Bunun dışında nesneleri oluşturduktan sonra hafıza kaçağını engellemeye yönelik olarak try..finally bloğu içinde güvene almamışsınız. Arada yaptığınız işlemerlde bir hata oluşması durumunda bu hafıza kaçağına sebep olacaktır. Aynı konu StrAlloc() için de geçerli.
Sorunuzla ilgili emin olmamakla birlikte XML dosyasını UTF-8 olarak yazmak için bu şekilde bir kod yazdığınızı düşünüyorum. Kodunuzu daha pratik hale getirmek için Delphi 7 içindeki klasik string veri türünü ve ek bir prosedürü kullanarak yine istediğinizi daha basit şekilde elde etmeniz mümkün olabilir.
Kod: Tümünü seç
procedure ConvertANSIFileToUTF8File(AInputFileName, AOutputFileName: string);
var
Strings: TStrings;
begin
Strings := TStringList.Create;
try
Strings.LoadFromFile(AInputFileName);
Strings.Text := UTF8Encode(Strings.Text);
Strings.SaveToFile(AOutputFileName);
finally
Strings.Free;
end;
end;
procedure DatasetToXML(Dataset: TDataSet; FileName: string);
var
F: TextFile;
bkmark: TBookmark;
i: Integer;
begin
try
AssignFile(F, Filename, CP_UTF8);
except
// Ne yapılması gerekiyor ise
Exit;
end;
try
ReWrite(F);
except
// Ne yapılması gerekiyor ise
Exit;
end;
try
WriteFileBegin(F, Dataset);
with Dataset do
begin
DisableControls;
bkmark := GetBookmark;
First;
{ write a title row }
WriteRowStart(F, True);
for i := 0 to FieldCount - 1 do
WriteData(F, nil, Fields.DisplayLabel);
{ write the end of row }
WriteRowEnd(F, True);
while (not EOF) do
begin
WriteRowStart(F, False);
for i := 0 to FieldCount - 1 do
WriteData(F, Fields, GetFieldStr(Fields));
{ write the end of row }
WriteRowEnd(F, False);
Next;
end;
end;
finally
WriteFileEnd(F);
GotoBookmark(bkmark);
EnableControls;
CloseFile(F);
ConvertANSIFileToUTF8File(Filename, Filename);
end;
end;
Mevcut kod olmadığı için yeniden düzenlenmesi gereken aşağıdaki prosedürleriniz için örnek kod hazırlayamadım
WriteFileBegin()
WriteRowStart()
WriteData()
WriteRowEnd()
WriteFileEnd()