ufb1453 yazdı:Merhaba
Burada hatalı olan durum nedir acaba ini dosyasını kaydetmiyor hata da vermiyor, teşekkürler,
Kod: Tümünü seç
procedure TForm32.FormClose(Sender: TObject; var Action: TCloseAction);
var
x:integer;
begin
x:=StrToInt(label7.Caption);
INIDosya := TINIFile.Create( ExtractFilePath(Application.ExeName)+'SETTINGS.INI');
INIDosya.WriteInteger(Section, Key, x);
INIDosya.Free;
end;
procedure TForm32.FormCreate(Sender: TObject);
var
x : integer;
begin
INIDosya:= TINIFile.Create( ExtractFilePath(Application.ExeName)+'SETTINGS.INI');
x := INIDosya.ReadInteger('ayar','sondeger',0);
label7.Caption:=IntToStr(x);
INIDosya.Free;
edit5.Text:=label5.Caption+'-'+label6.Caption+'-'+(IntToStr(StrToInt(Label7.Caption)+1));
end;
- Aynı prosedür/fonksiyon içinde Free() edilecek bir bileşeni prosedür/fonksiyon değişkeni olarak tanımlamakta fayda var. Örnek uygulama Form zçık olduğu sürece INI dosyası içine veri yazacağı için FormCreate() olayında oluşturulup FormDestroy() olayında Free() ediliyordu. Yazmak için her defasında tekrar tekrar dosya açma işlemini yapmamak için böyle bir kullanım var.
Sizin örnek gönderdiğiniz kod için böyle bir durum yok. Dolayısı ile prosedür/fonksiyon değişkeni tanımlayarak işlem yapmanız daha güzel olacaktır.
- Create() edilen bileşenleri aynı prosedür/fonksiyon içinde Free() edeceğimiz zaman hafıza kaçağını engellemek adına try..finally bloğu içinde kullanmalıyız. Böylece Free() edilene kadar bir hata oluşması durumunda bileşen Free() edilmiş olacak ve hafıza kaçağı olmayacaktır.
- "Form kapatıldığı zaman" bazı işlemler yapmak istiyorsanız FormDestroy() olayını kullanmak daha doğru olacaktır. FormClose() genellikle formun kapatılıp kapatılmamasına karar vermek için kullanılır. Dikkat ederseniz bu olayda sizin değiştirebileceğiniz TCloseAction tipinde bir Action değişkeni sunuluyor.
- Basit imla hatalarını engellemek adına INI dosya adı, Inı dosyası bölüm adı gibi bilgiler sabit değişkenler içinde saklanabilir.
Yukarıdaki maddelere uygun şekilde aşağıdaki gibi bir kod yazılabilir.
Form tip tanımı kısmı:
Kod: Tümünü seç
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
const
SECTION = 'AYAR';
KEY = 'SonDeger';
ININAME = 'SETTINGS.INI';
var
IniFileName: string;
public
{ Public declarations }
end;
FormCreate() olayı:
Kod: Tümünü seç
procedure TForm32.FormCreate(Sender: TObject);
var
TempInteger: Integer;
Ini: TIniFile;
begin
IniFileName := ExtractFilePath(Application.ExeName) + ININAME;
Ini := TINIFile.Create(IniFileName);
try
TempInteger := Ini.ReadInteger(Section, Key, 0);
finally
Ini.Free();
end;
Label7.Caption := IntToStr(TempInteger);
Edit5.Text := Label5.Caption + '-' + Label6.Caption + '-' + (IntToStr(TempInteger + 1));
end;
FormDestroy() olayı:
Kod: Tümünü seç
procedure TForm32.FormDestroy(Sender: TObject);
var
TempInteger: Integer;
Ini: TIniFile;
begin
if not TryStrToInt(Label7.Caption, TempInteger) then
begin
ShowMessage('Label7 bir tamsayı değil. Değeri saklanamıyor');
Exit();
end;
Ini := TIniFile.Create(IniFileName);
try
Ini.WriteInteger(Section, Key, TempInteger);
finally
Ini.Free();
end;
end;
Bu kod düzeltmeleri dışında dikkat etmeniz gereken nokta Form32'nin ne zaman Create() edilip ne zaman Free() (Destroy) edildiğidir. Zira siz formu otomatik oluşturuyor ve daha sonra Form32.Show() ve Form32.Hide() kullanarak ekranda gösteriyor iseniz bu durumda kodları OnShow() ve OnHide() olaylarına yazmanız gerekecektir.
Ancak her durumda aşağıdaki satır OnCreate() olayı içinde kalmalıdır.
Kod: Tümünü seç
IniFileName := ExtractFilePath(Application.ExeName) + ININAME;