Panel Üzerindeki Buton'a Tıkladığında Panel Nesnesini Yok Et

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
secgin
Üye
Mesajlar: 30
Kayıt: 12 May 2009 05:01

Panel Üzerindeki Buton'a Tıkladığında Panel Nesnesini Yok Et

Mesaj gönderen secgin »

merhaba.

çalışma anında groupbox nesnesi üzerine panel ve panelin üzerinde bir tane buton oluşturuyorum. Bu işlem her butona basıldığında üzerinde bir buton olacak şekilde panel oluşturuyor. Panel üzerindeki butonun onclick olayına "panelsil" ismindeki prosedürü atıyorum.

Kod: Tümünü seç

procedure panelsil(Sender : TObject);
begin
   (Sender as TSpeedButton).parent.free;
end;
panel üzerindeki butona tıkladığımda "Access violation ar address..". hatası veriyor. Silme işlemini panel üzerindeki buton dan değilde form üzerindeki başka bir butondan yaptığımda hata vermiyor. Parenti yok edilecek buton üzerinden silme işlemi yapmak için ne yapmalıyım.

İyi çalışmalar.
secgin
Üye
Mesajlar: 30
Kayıt: 12 May 2009 05:01

Re: Panel Üzerindeki Buton'a Tıkladığında Panel Nesnesini Yo

Mesaj gönderen secgin »

"TPanel" den türettiğim yeni bir "Panel" nesnesi yaptım. Bu panel nesnesinin

Kod: Tümünü seç

constructor Create(AOwner: TComponent) ; override;
Create olayını ezerek panel oluşumunda panel üzerine buton oluşturacak kodları yazdım. Bu oluşturduğum butonun onclick olayına

Kod: Tümünü seç

Self.Free
kodunu yazdım ve butona basıldığında başarı panel yok ediliyor. Fakat projeye "XPManifest" nesnesini eklediğimde panel üzerindeki butona tıkladığımda paneli yok ederken

"Access violation at address 77632239 in module ntdll.dll"


hatasını alıyorum.

Panel üzerindeki butona basıldığında panelin yok edilmesi işlemi bu kadar sıkıntı olacağı aklıma gelmezdi.
Şimdiden yorumlarınız için tş ederim. İyi çalışmalar
Kullanıcı avatarı
csunguray
Üye
Mesajlar: 855
Kayıt: 09 Ara 2006 05:08
Konum: Adana
İletişim:

Re: Panel Üzerindeki Buton'a Tıkladığında Panel Nesnesini Yo

Mesaj gönderen csunguray »

Self.Free; yerine sadece Release; yazın.
C. Sunguray
csunguray at netbilisim.kom
Net Bilişim Hizmetleri

Sıradan her programcı bilgisayarın anlayabileceği kodlar yazabilir.
Sadece iyi programcılar insanların da anlayabileceği kodlar yazarlar.
Martin Fowler (http://martinfowler.com/)
secgin
Üye
Mesajlar: 30
Kayıt: 12 May 2009 05:01

Re: Panel Üzerindeki Buton'a Tıkladığında Panel Nesnesini Yo

Mesaj gönderen secgin »

merhaba

Self.Free yerine Release; yazdığımda.

Invalit Pointer Operation hatası veriyor. Paneli yok etmek için Free yazman grekli değilmi Release neden yazmamız gerek ve Release tam olarak ne işe yarıyor.
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: Panel Üzerindeki Buton'a Tıkladığında Panel Nesnesini Yo

Mesaj gönderen emin_as »

Bir de aşagıdaki kodu dene, yine sorun çıkıyorsa, bazı kodlar click sonrası buton a veya panele ulaşmaya çalışıyordur.

FreeAndNil(Sender as TSpeedButton).parent);

Üstteki kod olmazsa, onidle veya timer üzerinden silmeye çalış. Silme kısmına gelince 100 veya 200 ms lik bir timer açarsın, timer silmeyi yapıp, kendini durdurur.
ikra
Üye
Mesajlar: 900
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: Panel Üzerindeki Buton'a Tıkladığında Panel Nesnesini Yo

Mesaj gönderen ikra »

Kod: Tümünü seç

var: ParentPanel: TPanel;
begin
ParentPanel := TPanel(TSpeedButton(Sender).Parent);
TSpeedButton(Sender).Parent := Form1;
ParentPanel.Free;
end;
kıdemsiz üye
secgin
Üye
Mesajlar: 30
Kayıt: 12 May 2009 05:01

Re: Panel Üzerindeki Buton'a Tıkladığında Panel Nesnesini Yo

Mesaj gönderen secgin »

arkadaşlar yönlendirmeleriniz üzerine kodları defalarca düzenledim son aşamada panel üzerindeki butona tıkladığımızda silme işleminde bazen "İnvalid Pointer Operation" hatası veriyor. Kodları aşağıda veriyorum. Hatayı sıklıkla vermiyor bazen hiç hata vermiyor o yüzden nerde sorun olabilir takıldım. Müsait olduğunuz zaman kodları incelerseniz sevinirim iyi çalışmalar.

Kod: Tümünü seç

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Buttons, XPMan;

type
  TSPanel = class(TPanel)
  private
    FRemoveButton : TSpeedButton;
    procedure RemoveButtonClick(Sender : TObject);
  public
    constructor Create(AOwner: TComponent) ; override;
  published
end;

type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    Button1: TButton;
    XPManifest1: TXPManifest;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    Panel : array[1..100] of TSPanel;
    Sayac : Integer;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TSPanel }

constructor TSPanel.Create(AOwner: TComponent);
begin
  inherited Create(AOwner) ;
  Self.Align:=alTop;

  FRemoveButton:=TSpeedButton.Create(Self);
  FRemoveButton.Parent:=Self;
  FRemoveButton.Width:=22;
  FRemoveButton.Height:=22;
  FRemoveButton.Left:=Self.Width-25;
  FRemoveButton.Anchors:=[akTop,akRight];
  FRemoveButton.OnClick:=RemoveButtonClick;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Sayac:=Sayac+1;
  Panel[Sayac]:=TSPanel.Create(GroupBox1);
  Panel[Sayac].Parent:=GroupBox1;
  Panel[Sayac].Name:='pnl'+IntToStr(Sayac);
end;

procedure TSPanel.RemoveButtonClick(Sender: TObject);
begin
  Self.Free;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Sayac:=0;
end;

end.


Form1.dfm

Kod: Tümünü seç

object Form1: TForm1
  Left = 213
  Top = 176
  Width = 870
  Height = 500
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  DesignSize = (
    854
    462)
  PixelsPerInch = 96
  TextHeight = 13
  object GroupBox1: TGroupBox
    Left = 8
    Top = 8
    Width = 313
    Height = 441
    Anchors = [akLeft, akTop, akBottom]
    Caption = 'GroupBox1'
    TabOrder = 0
  end
  object Button1: TButton
    Left = 352
    Top = 16
    Width = 81
    Height = 41
    Caption = 'Panel Oluştur'
    TabOrder = 1
    OnClick = Button1Click
  end
  object XPManifest1: TXPManifest
    Left = 352
    Top = 88
  end
end
Bu arada Delphi7 + Window 7 kullanıyorum hatayla ilgili olabilir belki düşüncesiyle yazdım.
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Re: Panel Üzerindeki Buton'a Tıkladığında Panel Nesnesini Yo

Mesaj gönderen gkimirti »

verdiğiniz kodları biraz değiştirerek denedim

Kod: Tümünü seç

TSPanel.Create(GroupBox1);
yerine

Kod: Tümünü seç

TSPanel.Create(nil);
yapın , burada create içindeki nesne oluşturduğunuz nesnenin owner i oluyor, eğer yok etme işlemini kendiniz yapacaksanız bunu nil atayabilirsiniz.
Parent özelliğine görünür wincontrol bileşenlerinden birisini atayın, ben kendi denemem de form üzerine koyduğum bir tpanel bileşenini atadım.

global değişken olarak

Kod: Tümünü seç

pnl : TSPanel;
ve paneli olusturan kodlar da

Kod: Tümünü seç

  pnl := TSPanel.Create(nil);
  pnl.Parent := pnDovizVeLme;
  pnl.Align := alClient;
geri kalan kısımlar (constrctor içi) sizinki ile aynı.
ÜŞENME,ERTELEME,VAZGEÇME
secgin
Üye
Mesajlar: 30
Kayıt: 12 May 2009 05:01

Re: Panel Üzerindeki Buton'a Tıkladığında Panel Nesnesini Yo

Mesaj gönderen secgin »

kod ile oluşturduğum panellerin parent ini "GroupBox" yaptım. Dediğiniz gibi kendim silmemek için oluşturduğum panellerin sahibi olarak "GroupBox" yaptım. Dizi kullanmışdım oluşturduğum paneller için, sizin verdiğiniz örnekteki gibi değişken tanımlayarak yaptım. Programı çalıştırdığımda butona tıkladığımda arada da olsa "Access volitation..." yada bir önceki kodlarla yaptığımda "Invalid Pointer Operation" hatalarını vermesi. Arada sırada yapması biraz kafa karıştırıcı çıkmadım işin içinden.
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Re: Panel Üzerindeki Buton'a Tıkladığında Panel Nesnesini Yo

Mesaj gönderen gkimirti »

Owner atamasını groupbox yapıyorsun ama sen speedbutton a basınca paneli yok ediyorsun
burda bir tezat yok mu?
Eğer olusturulan panel açık kalacaksa tamam
o durumda da formun close olayında yok edersin.
Eğer imkanın var ise bir örnek hazırlayıp windows xp yüklü bir makinada dene.
ÜŞENME,ERTELEME,VAZGEÇME
secgin
Üye
Mesajlar: 30
Kayıt: 12 May 2009 05:01

Re: Panel Üzerindeki Buton'a Tıkladığında Panel Nesnesini Yo

Mesaj gönderen secgin »

owner atamasını groupbox üzerinde silmediğim paneller var ise form kapatıldığında onlarında otomatik yok edilmesiydi. Belki ben owner mantığını kavrayamamış olabilirim bu şekilde düşündüğüm için panelin owner değerini groupbox yaptım. Xp de neden denememi istediniz.

İyi çalışamalar.
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Re: Panel Üzerindeki Buton'a Tıkladığında Panel Nesnesini Yo

Mesaj gönderen gkimirti »

Ben aynı kodlar ile yaptığım denemelerde hiçbir zaman AV hatası almadım, acaba win7 bellek yönetiminde bir değişiklik mi var diye XP de denemenizi önermiştim.
Değişken olarak sabit yada dizi kullanmak bir şey fark etmemeli.
ÜŞENME,ERTELEME,VAZGEÇME
akdatilla
Üye
Mesajlar: 292
Kayıt: 02 Nis 2006 06:04
Konum: Antalya

Re: Panel Üzerindeki Buton'a Tıkladığında Panel Nesnesini Yo

Mesaj gönderen akdatilla »

secgin yazdı:merhaba.

çalışma anında groupbox nesnesi üzerine panel ve panelin üzerinde bir tane buton oluşturuyorum. Bu işlem her butona basıldığında üzerinde bir buton olacak şekilde panel oluşturuyor. Panel üzerindeki butonun onclick olayına "panelsil" ismindeki prosedürü atıyorum.

Kod: Tümünü seç

procedure panelsil(Sender : TObject);
begin
   (Sender as TSpeedButton).parent.free;
end;
panel üzerindeki butona tıkladığımda "Access violation ar address..". hatası veriyor. Silme işlemini panel üzerindeki buton dan değilde form üzerindeki başka bir butondan yaptığımda hata vermiyor. Parenti yok edilecek buton üzerinden silme işlemi yapmak için ne yapmalıyım.

İyi çalışmalar.
Merhaba
Kodu şu şekilde yaparsan hatayı giderebilirsin.

Kod: Tümünü seç

procedure panelsil(Sender : TObject);
begin
   (Sender as TSpeedButton).parent.free;
   abort;
end;
burada abort komutu programın abort komutundan sonra yapmak istediği diğer işlemleri kesmeyi sağlıyor. Abort komutundan sonra zaten end ile prosedür bitiyor başka bir komut yok ki diye düşünebilirsin. Ancak malesef programımız sadece bizim yazdığımız kodların dışında, kullandığımız bileşenlerin bazı işlevleri yerine getirmesini sağlayan diğer kodlarıda çalıştırmaktadır.
Kullandığınız butona tıklanıldığında butonun onclick olayı gerçekleşir. Bu esnada sizin panelsil prosedürünüz çalışıyor. Bu prosedür hem paneli hem de üzerindeki butonu siliyor. Daha sonra butonun onMouseUp olayı veya daha başka bir olay mesela butona basılıp bırakılma efektini veren bir boyama isteği çalıştırılmak isteniyor. Tam bu esnada butonun olmadığı fark ediliyor ve var olmayan bir nesneye ulaşılamadığını belirten acces violation hatası karşımıza çıkıyor.
secgin
Üye
Mesajlar: 30
Kayıt: 12 May 2009 05:01

Re: Panel Üzerindeki Buton'a Tıkladığında Panel Nesnesini Yo

Mesaj gönderen secgin »

dediğiniz gibi "Abort" işe yaradı.

Teşekkür Ederim yardım için zaman ayıran tüm arkadaşlara bu vesiyle bu sorunla karşılaşan diğer arkadaşlarada yardımcı olur bu mesajlar inş.

İyi çalışmalar.
Cevapla