Formun çağırdı fonksiyon formu kapattığında hata oluşuyor

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Formun çağırdı fonksiyon formu kapattığında hata oluşuyor

Mesaj gönderen mkysoft »

Biraz karışık oldu sanırım. Bir form var. Bu formun üstünde bir button var. Burada başka bir form üzerinde yer alan fonksiyonu çağırıyorum. Çağrılan bu fonksiyon tüm formları kapatıyor (bende kapanmasını istiyorum zaten). Doğal olarak fonksiyonu çağıran formda, çağrılan fonksiyonun işi bittiğinde end; bloğunu okumak istiyor. form kapandığı için end; bloğuna geri dönemiyor ve acsess voladition hatası veriyor. Hatadan nasıl kurtulabilirim?

Teşekkürler.
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Çağırdığın fonksiyon bir şarta bağlı olarak mı kapatıyor? Öyle ise bir değişken döndürüp fonksiyonu çağırdığın yerin altında bir değişken veya parametreyi kontrol edip kapatmayı buradan yap. Doğrudan kapatıyorsa da yine aynı şekilde çağırdığın satırın altında kapattır.
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
drony
Üye
Mesajlar: 48
Kayıt: 10 Tem 2004 04:41
Konum: Istanbul
İletişim:

Mesaj gönderen drony »

lütfen kodalrı buraya eklermisn.
ziya acces violation genelde hatalı kodlama sonucu oluşur. yineleyen yada karasız çağrılar buna neden olur.
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Mesaj gönderen mkysoft »

Çağırılan fonksiyon

Kod: Tümünü seç

procedure Tfr_anaform.mn_kullanici_degistirClick(Sender: TObject);
var
i:integer;
begin
  for i:= 0 to fr_anaform.MDIChildCount-1 do
    fr_anaform.MDIChildren[i].Close;
  veriler.data_base.Disconnect;
  FormShow(fr_anaform);
end;
Çağıran fonksiyon;

Kod: Tümünü seç

procedure Tfr_ayarlar.bt_durumClick(Sender: TObject);
begin
  tablo_oku.Params[0].Text := 'Evet';
  tablo_oku.ExecSQL;
  Self.Close;
  fr_anaform.mn_kullanici_degistir.Click;
end;
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Test

Mesaj gönderen sabanakman »

Kod sıralamasına göre bir sorun yok gibi ama formların onCloseQuery, onClose ve hatta çalışıyorsa onDestroy olaylarından kaynaklanıyor olabilir. Görünen kod üzerinden düşünürsek te;

Kod: Tümünü seç

FormShow(fr_anaform); 
satırının çağırdığı prosedür ne yapıyor bilmek lazım. Kodları satır satır inceleyip analiz (trace) edemiyorsan bu prosedürün ilk satırına ve son satırına bir showmessage ile mesaj yaz ('başladı' ve 'bitti' gibi). Muhtemelen hata buradan geliyordur.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
White Rose
Üye
Mesajlar: 726
Kayıt: 06 Tem 2005 09:41
Konum: Güneyden
İletişim:

Mesaj gönderen White Rose »

s.a.

KUllandığınız formu run time anında create ediyorsanız ondan olabilir,
create etmeden normal yollardan kullanın.
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

Kod: Tümünü seç

procedure Tfr_anaform.mn_kullanici_degistirClick(Sender: TObject); 
var 
i:integer; 
begin 
  for i:= 0 to fr_anaform.MDIChildCount-1 do 
    fr_anaform.MDIChildren[i].Close; 
  veriler.data_base.Disconnect; 
  FormShow(fr_anaform); 
end;
hatırladım şimdi. For döngüsü değerleri bir kere yükler ve o değerler üzerinden çalışır. Mesela

Kod: Tümünü seç

for i:=0 to Memo1.Lines.Count-1 do
 if Memo1.Lines[i]='' then Memo1.Lines.Delete(i);
şeklinde bir kod ile de aynı hataya düşülür.(Delete çalışırsa). Çünkü Delete işleminden sonra Memo1.Lines.Count bir azalmıştır fakat for dögüsü her döngüde bu değeri tekrar yüklemediği için hataya sebep olur. Bunun yerine döngüyü tersine çevirirsen çalışır.

Kod: Tümünü seç

for i:=Memo1.Lines.Count-1 downto 0 do
 if Memo1.Lines[i]='' then Memo1.Lines.Delete(i);
istersen verdiğim örneği test edebilirsin. Formların close anında free oluyorlarsa fr_anaform.MDIChildCount değeri azalacak ve örnekteki gibi hataya sebebiyet verecektir. Yine belirttiğim gibi döngüyü ters yönde çevirirsen hata düzelebilir. (Kapanma anında Free olan form varsa tabi.)

Kod: Tümünü seç

procedure Tfr_anaform.mn_kullanici_degistirClick(Sender: TObject); 
var 
i:integer; 
begin 
  for i:=fr_anaform.MDIChildCount-1 downto 0 do 
    fr_anaform.MDIChildren[i].Close; 
  veriler.data_base.Disconnect; 
  FormShow(fr_anaform); 
end;
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Mesaj gönderen mkysoft »

Denemedim ama deneyeceğim. Böyle bir hatanın olduğunu biliyorum ama mdichildcount'da olacağı aklıma gelmemişti. daha doğrusu zaten mdichildları kapatan kısım düzgün çalışıyordu. ben sadece yeni bir özellik ekledim ve bu özellik programın yeniden açılıyormuş gibi davranmasını gerektirdi. bu nedenle acık tüm programları kapatıp formshow olayında yüklenen parametreleri çağırmam gerekti.

Eski bir versiyonu vardı yanımda onu denedim şimdi onda hata vermiyor. Benim düşünceme göre sorun şu;

begin
diğer fonksiyona git
end; //buraya dönmesi gerekecek

diğerfonsiyon
begin
end; // buradan çağıran fonksiyonun end komutuna gitmek isteyecek
ama geri döneceği end artık yok çünkü kapandı.

teşekküler.
Cevapla