Formdaki nesneler güncellenmiyor...

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
serkan
Üye
Mesajlar: 666
Kayıt: 10 Tem 2003 12:08
Konum: bursa

Formdaki nesneler güncellenmiyor...

Mesaj gönderen serkan »

merhaba arkadaşlar hepinize hayırlı kodlar...
tuhaf bir problemim var benim .bir formda oldukça karışık bir döngü kuruyorum yaklaşık 4 tablo master-detaille bağlı bunların birbirine bağlı hesaplamalarını yaptırıyorumm tabi problem bu değil bu işleme başlamak için kullanıcı başlat butonuna basıyor...forma birtane label koyup başlat butonua tıklandığında caption'ının 'Lütfen işlem bitene kadar bekleyiniz' gibi bişey yapıyorum..ama döngü bitene kadar bunu göstermiyor yaklaşık 15 dk sürüyor işlem.düngü bittikten sonra label 'Lütfen işlem bitene kadar bekleyiniz' şeklinde gözüküyor.döngüye başlamadan önce labelin captionu 'Lütfen işlem bitene kadar bekleyiniz' şeklindemi diye kontrol edip öyle başlıyorum yine label döngü bittikten sonra gözüküyor.aynı işlemi editte ve paneldede yatım olmadı..problem nedir acep.
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

Bir Problem yok, sadece Windows işletim sistemi oluşan sistem mesajlarını öncelik vererek işleme tabi tutar. Program normal akışında iken ekran işlemlerini biraz geri planda tutar. Bu sebeple program işleyiş satırına o anda Label.Caption := 'Merhaba' gibi bir şey yazdınız ise bunu işletir ama ekrana yansıtmaz, ve işine devam eder. Sonraki satırları işletmeye devam eder, eğer sonraki satırlarda haa yoğun bir iş var ise, işi yükünü buraya doğru kullanır ve ekran işlemini geri plana iter. Örneğin sizin döngünüzdeki gibi. Aslında komut satırı olarak Label'da gerekli değişikliği yapmıştır ancak bunun gerçek ekrana yansımasını bekletmeye alır (kuyruklar).

Bunu önlemek için,

Application.Processmessages ;

Diye belirtmeniz lazım. Örneğin

Kod: Tümünü seç


  Label1.Caption := 'Yazı burada görülmeyecek' ;
  For intI := 1 To 10000000 do
    intJ := intJ + 1 ;

  Label1.Caption := 'Yazı artık görülür hale geçecek' ;
  Application.ProcessMessages ;
  For intI := 1 To 10000000 do
    intJ := intJ + 1 ;

Yukarıdaki kodda 2. caption atamasından sonra Application.ProcessMessages diyerek, kuyrukladığı ekran mesajlarını (veya ikincil derecedeki windows mesajlarını işlet) diyoruz ve windows oturup, ikinci plana attığı tüm mesajları işletiyor. Dolayısıyle sizin ekranınızdaki değişiklikler de Gerçekten Monitörünüze yansıyor.

Umarım izah edebilmişimdir.

Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
serkan
Üye
Mesajlar: 666
Kayıt: 10 Tem 2003 12:08
Konum: bursa

Mesaj gönderen serkan »

çok güzel izah etmişsiniz teşekkür ederim kodları daha denemedim ama döngüye ait kodları verdiğiniz örneğin altına yazcam değilmi?

Label1.Caption := 'Yazı burada görülmeyecek' ;
For intI := 1 To 10000000 do
intJ := intJ + 1 ;

Label1.Caption := 'Yazı artık görülür hale geçecek' ;
Application.ProcessMessages ;
For intI := 1 To 10000000 do
intJ := intJ + 1 ;
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Ne dediğini anlamadım ama,

Application.ProcessMessages ;

Komutunu, senin programında Label'a veya ekrandaki başka bir nesneye bir bilgi atadıktan sonra yazacaksın. Ancak Application.ProcessMessages'ı sadece uzun işlemler yaparken kullan diğer zamanlarda zaten Windows kendisi işletmekte. Yani gerek yok. Eğer ekran takılıyorsa o zaman kullanman kafi gelir.

Ayrıca örnek olsuın diye verdim ben sana o kod bloğunu :) O kod bloğunda senin kullanacağın satır sadece Application.ProcessMessages ; satırı

Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Cevapla