"Bileşen free edilmiş mi?" kontrolünü nasıl yaparı

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
YeniCevizci
Üye
Mesajlar: 35
Kayıt: 24 Tem 2004 09:49

"Bileşen free edilmiş mi?" kontrolünü nasıl yaparı

Mesaj gönderen YeniCevizci »

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.
Kullanıcı avatarı
Asri
Kıdemli Üye
Mesajlar: 767
Kayıt: 16 Eyl 2003 09:54
Konum: istanbul

Mesaj gönderen Asri »

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.

Kod: Tümünü seç

 If (TempComp<>nil) then 
bence bu kod ile nesnenin var olup olmadığı değil içinin dolu olup olmadığı kontrol ediliyor.

kolay gelsin.
Öğrenmek ve öğretmek, akıntıya karşı yüzmek gibidir ilerleyemediğiniz taktirde gerilersiniz.
Kullanıcı avatarı
Fatih!
Kıdemli Üye
Mesajlar: 1172
Kayıt: 26 Kas 2004 10:46
Konum: Malatya
İletişim:

Mesaj gönderen Fatih! »

bir olayın olup olmadığını kontrol için genelde değişkenlere atama yaparım.
YeniCevizci
Üye
Mesajlar: 35
Kayıt: 24 Tem 2004 09:49

Mesaj gönderen YeniCevizci »

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.

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.
Kullanıcı avatarı
Asri
Kıdemli Üye
Mesajlar: 767
Kayıt: 16 Eyl 2003 09:54
Konum: istanbul

Mesaj gönderen Asri »

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.

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.
YeniCevizci
Üye
Mesajlar: 35
Kayıt: 24 Tem 2004 09:49

Mesaj gönderen YeniCevizci »

Çok teşekkürler! :D

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; 
yerine

Kod: Tümünü seç

 if AParent.Components[n].Name=name then AParent.Components[n].free;
olmalı gibi geldi bana.
Kullanıcı avatarı
Asri
Kıdemli Üye
Mesajlar: 767
Kayıt: 16 Eyl 2003 09:54
Konum: istanbul

Mesaj gönderen Asri »

açıklaması burda


viewtopic.php?p=32296#32296
Öğrenmek ve öğretmek, akıntıya karşı yüzmek gibidir ilerleyemediğiniz taktirde gerilersiniz.
YeniCevizci
Üye
Mesajlar: 35
Kayıt: 24 Tem 2004 09:49

Mesaj gönderen YeniCevizci »

Tekrar teşekkürler :D
Cevapla