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.
Formdaki nesneler güncellenmiyor...
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
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
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
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 ;
Umarım izah edebilmişimdir.
Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
ç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 ;
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 ;
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
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

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