"Bileşen free edilmiş mi?" kontrolünü nasıl yaparı
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
-
- Üye
- Mesajlar: 35
- Kayıt: 24 Tem 2004 09:49
"Bileşen free edilmiş mi?" kontrolünü nasıl yaparı
Merhaba,
Benzer sorular sorulmuştur diye forumda aradım ama bulamadım.
Yapmak istediğim şu: Programda, mesela bir düğmeye basılınca bir TImage nesnesi oluşturuyorum. Bunu çıkarken free etmem gerekiyor.
Ancak bazen, kullanıcının yaptıklarına göre, bu TImage, önceden free edilmiş olabiliyor.
Program çıkışında olmayan bileşeni free etmeye çalışınca hata alıyorum.
Bu dinamik olarak oluşturulan bileşenin var olup olmadığını nasıl kontrol edebilirim?
TempComp := FindComponent('isim');
If (TempComp<>nil) then
begin
isim.free
end;
gibi birşeyler denedim ama olmadı.
Teşekkürler.
Benzer sorular sorulmuştur diye forumda aradım ama bulamadım.
Yapmak istediğim şu: Programda, mesela bir düğmeye basılınca bir TImage nesnesi oluşturuyorum. Bunu çıkarken free etmem gerekiyor.
Ancak bazen, kullanıcının yaptıklarına göre, bu TImage, önceden free edilmiş olabiliyor.
Program çıkışında olmayan bileşeni free etmeye çalışınca hata alıyorum.
Bu dinamik olarak oluşturulan bileşenin var olup olmadığını nasıl kontrol edebilirim?
TempComp := FindComponent('isim');
If (TempComp<>nil) then
begin
isim.free
end;
gibi birşeyler denedim ama olmadı.
Teşekkürler.
selam,
Delphi 7 de boş bir form'a bir tane .bmp yüklenmiş bir image1, bir tanede buton koydum. butonun click ine image1.free ekledim. İlk tıklamamda resim yüklü image1 nesnesi formdan silindi. ikinci ve daha sınraki tıklamalarda da hata vermediği gibi herhangi bir işlemde yapmadı.
Sendeki problem farklı bişey olsa gerek.
bence bu kod ile nesnenin var olup olmadığı değil içinin dolu olup olmadığı kontrol ediliyor.
kolay gelsin.
Delphi 7 de boş bir form'a bir tane .bmp yüklenmiş bir image1, bir tanede buton koydum. butonun click ine image1.free ekledim. İlk tıklamamda resim yüklü image1 nesnesi formdan silindi. ikinci ve daha sınraki tıklamalarda da hata vermediği gibi herhangi bir işlemde yapmadı.
Sendeki problem farklı bişey olsa gerek.
Kod: Tümünü seç
If (TempComp<>nil) then
kolay gelsin.
Öğrenmek ve öğretmek, akıntıya karşı yüzmek gibidir ilerleyemediğiniz taktirde gerilersiniz.
-
- Üye
- Mesajlar: 35
- Kayıt: 24 Tem 2004 09:49
Teşekkürler. Sizin dediğiniz gibi yapıldığında sorun olmuyor, evet. Ancak dinamik olarak oluşturulan TImage bileşenini iki kere free etmek istersek Acces Violation hatası veriyor.
Verdiğiniz örneğe benzer bir deneme yaptım. TImage bileşenini form açılışında oluşturmasını söyledim. Button1 de free yapsın dedim. Bir kere basınca sorun yok. İkinci basışta hata veriyor.
Bu arada, Delphi 6 kullanıyorum.
Verdiğiniz örneğe benzer bir deneme yaptım. TImage bileşenini form açılışında oluşturmasını söyledim. Button1 de free yapsın dedim. Bir kere basınca sorun yok. İkinci basışta hata veriyor.
Bu arada, Delphi 6 kullanıyorum.
Kod: Tümünü seç
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
img1:TImage;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
img1.Free;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
img1.Free;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
img1:=TImage.Create(form1);
img1.Parent:=form1;
img1.Height:=50;
img1.Width:=50;
img1.Top:=100;
img1.Left:=100;
end;
end.
Saat 22:00 ve ben sorunu ancak çözebildim 
oluşturduğun image e isim ve resim ekledim. silcomponent function'nunda formdaki komponenetlerin isimlerini senin image in ismiyle karşılatırıp bulursa formdan siliyor.
iyi çalışmalar.

oluşturduğun image e isim ve resim ekledim. silcomponent function'nunda formdaki komponenetlerin isimlerini senin image in ismiyle karşılatırıp bulursa formdan siliyor.
iyi çalışmalar.
Kod: Tümünü seç
function tform1.silComponent(AParent: TComponent; Name: string): TComponent;
var
n: integer;
begin
Result:=nil;
if AParent.ComponentCount=0 then Exit;
for n:=0 to AParent.ComponentCount-1 do
begin
if AParent.Components[n].Name=name then img1.free;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
silComponent(Self,'image3');
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
img1:=TImage.Create(form1);
img1.Name:='image3';
img1.Parent:=form1;
img1.Height:=50;
img1.Width:=50;
img1.Top:=100;
img1.Left:=100;
img1.Picture.LoadFromFile('c:\resim.bmp');
end;
Öğrenmek ve öğretmek, akıntıya karşı yüzmek gibidir ilerleyemediğiniz taktirde gerilersiniz.
-
- Üye
- Mesajlar: 35
- Kayıt: 24 Tem 2004 09:49
Çok teşekkürler! 
Ellerinize sağlık.
Ufak bir hata var gibi, img1.free yazmışsınız:
yerine
olmalı gibi geldi bana.

Ellerinize sağlık.
Ufak bir hata var gibi, img1.free yazmışsınız:
Kod: Tümünü seç
if AParent.Components[n].Name=name then img1.free;
Kod: Tümünü seç
if AParent.Components[n].Name=name then AParent.Components[n].free;