Mdi application kullanmıyorum.
action:=cafree; komutu ile kapattığımda access violation exception alıyorum.
Kod: Tümünü seç
var
childMK:TMKFrm;
begin
childMK:=TMKFrm.Create(Application);
childMK.Show;
Kod: Tümünü seç
var
childMK:TMKFrm;
begin
childMK:=TMKFrm.Create(Application);
childMK.Show;
Kod: Tümünü seç
Action := caFree;
childMK := nil;
"opener"dan kasıt nedir anlayamadım?aliplane yazdı:childMK := nil; kullanamam çünkü bu komutu openerda yazabilirim.
childMK değişkenini de zaten göremem ki.
showmodal bir form olsaydı formun show edildikten sonra finaly bloğunda yazabilirdim.
Kod: Tümünü seç
procedure TForm1.Button5Click(Sender: TObject);
var
childMK: TMKFrm;
begin
childMK := TMKFrm.Create(Application);
childMK.Show;
end;
Kod: Tümünü seç
procedure TMKFrm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
Self:= nil;
end;
OnClose'da Self := nil; çalışır ve hatta ikinci formu global tanımladıysanız ve birden çok kez Create kullandıysanız Self := nil'i kullanmalısınız.Lost Soul yazdı:yanlış hatırlamıyorsam self := nil yemiyordu onclosede
SimaWB yazdı:OnClose'da Self := nil; çalışır ve hatta ikinci formu global tanımladıysanız ve birden çok kez Create kullandıysanız Self := nil'i kullanmalısınız.Lost Soul yazdı:yanlış hatırlamıyorsam self := nil yemiyordu onclosede
Detaylı bilgi için buraya bakılabilir.
Not: bir önceki verdiğim cevapta ikinci form locak tanımlandığı için buna gerek olmayabilir ama yine de emin olmak için memory leak kontrolü yapılabilir.
Kod: Tümünü seç
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
Self := nil;
end;
Kod: Tümünü seç
procedure TForm1.Button1Click(Sender: TObject);
var
f : TForm2;
begin
f := nil;
ShowMessage(VarToStr(Assigned(f)));
f := TForm2.Create(Application);
ShowMessage(VarToStr(Assigned(f)));
f.ShowModal;
ShowMessage(VarToStr(Assigned(f)));
f := nil;
ShowMessage(VarToStr(Assigned(f)));
end;
Kod: Tümünü seç
False
True
True <- Buraya dikkat
False
Benim de şuanda vaktim yok, müsait olduğumda kontrol edeceğim ama sizin oluşturduğunuz 2. form lokal tanımlanmış. Bense cevabımda özellikle belirtmiştim: "ikinci formu global tanımladıysanız" şeklinde.Lost Soul yazdı:SimaWB yazdı:OnClose'da Self := nil; çalışır ve hatta ikinci formu global tanımladıysanız ve birden çok kez Create kullandıysanız Self := nil'i kullanmalısınız.Lost Soul yazdı:yanlış hatırlamıyorsam self := nil yemiyordu onclosede
Detaylı bilgi için buraya bakılabilir.
Not: bir önceki verdiğim cevapta ikinci form locak tanımlandığı için buna gerek olmayabilir ama yine de emin olmak için memory leak kontrolü yapılabilir.
Bu konuyla ilgili bir başlık zamanında açılmıştı. Mesele de assigned ile ilgili bişeydi ve yanlış hatırlamıyorsam soruyu soran da bendim
Bir proje oluşturdum proje içinde Form1 ve Form2 var form1 de bir button var ve form2nin onclosesinde işe şu ibare var
form2 button clickte ise aşağıdaki kod var.Kod: Tümünü seç
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); begin Action := caFree; Self := nil; end;
SonuçKod: Tümünü seç
procedure TForm1.Button1Click(Sender: TObject); var f : TForm2; begin f := nil; ShowMessage(VarToStr(Assigned(f))); f := TForm2.Create(Application); ShowMessage(VarToStr(Assigned(f))); f.ShowModal; ShowMessage(VarToStr(Assigned(f))); f := nil; ShowMessage(VarToStr(Assigned(f))); end;
eğer self := nil işini görüyor olsaydı 3. showmessage de false olmalıydı.Kod: Tümünü seç
False True True <- Buraya dikkat False
yani; evet action cafree formu free edip memory leakin önüne geçiyor.
fakat self := nil bir anlam ifade etmiyor.
şimdi vaktim kısıtlı geniş bi zamanda bu assigned meselesi ile ilgili bahsettiğim başığı da bulursam koyarım buraya inşallah.
Kod: Tümünü seç
implementation
uses unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2 := nil;
ShowMessage(VarToStr(Assigned(Form2)));
Form2 := TForm2.Create(Application);
ShowMessage(VarToStr(Assigned(Form2)));
Form2.ShowModal;
ShowMessage(VarToStr(Assigned(Form2)));
Form2 := nil;
ShowMessage(VarToStr(Assigned(Form2)));
end;
Kod: Tümünü seç
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
Form2 := Nil;//-<-----------
end;
Kod: Tümünü seç
False
True
False<- Buraya dikkat
False
Kod: Tümünü seç
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
Self := nil; //-<-----------
end;
Kod: Tümünü seç
False
True
True<- Buraya dikkat
False