|
|
||||||||||||
|
|
Delphi İpuçları
• Hareketli fare işaretçisi yüklemek
Windows hareketli fare işaretçileri yüklemek için çeşitli API işlevleri sunar. Bunlardan biri LoadCursorFromFile’dir. procedure isaretci_yukle(dosya:string); Yukarıdaki yordamı kod sayfanızın baş taraflarına yerleştirip bunu, aşağıdaki gibi ani dosyasının yolunu belirterek çağırabilirsiniz. isaretci_yukle(‘c:\isaretci.ani’) Ekteki fare işaretçisi örneğimizde bu işlev kullanılarak çeşitli işaretçiler yükleniyor.
Bu işlemin VB’de nasıl yapıldığını merak edenler için de gerekli kodu verelim. Bir form penceresine iki düğme yerleştirip aşağıdaki metni kod sayfasına yapıştırın ve düğmelerle koddaki Click olay yordamlarını eşleyin. Option Explicit Private Declare Function LoadCursorFromFile Lib "user32"
Alias "LoadCursorFromFileA" (ByVal lpFileName As String) As Long Private Sub Command1_Click() Private Sub Command2_Click()
Bazı uygulamalarda enter tuşuna basıldığında tab basılmış gibi kutular arasında hareket edilebiliyor. Bu, tuşun basıldığı olay yordamında iken enter basıldığında tab kodu gönderilerek yapılabilir. Gerçekte ise tab durağı aktif olduğu bilinen pencereye doğrudan odaklanmak daha işlevseldir. Aşağıdaki kodu form penceresinin KeyPress olay yordamına eklemeden önce formun KeyPreview özelliğini True olarak ayarlayın. procedure TForm1.FormKeyPress(Sender: TObject; var Key:
Char); Enter tuşu basıldığında tuş değeri sıfırlanıyor ve pencereye WM_NEXTDLGCTL mesajı gönderiliyor.
Delphi’de TImage nesnesi ile çalışırken bazı yüklemeler sonrasında resim yenilenmiyor. Bunun sebebi resmin sahibi olan pencerenin boyama işlemini çoğunlukla uygun zamanda başlatmamasıdır. Bu durumda sahip pencereye WM_NCPAINT mesajı göndermek sorunu giderecektir. SendMessage (image1.parent.handle, WM_NCPAINT, 0, 0);
Delphi’de TImage üzerinde fare ile resim çizdirmek mümkündür. Fakat geçerli ayarlar bırakıldığında bu yapılırken resim üzerinde aşırı titreme olur. Bileşeni boyama işleminin daha kontrollü olmasını sağlamak için resmin sahibi olan pencerenin DoubleBuffered özelliğini True olarak ayarlayın. Bu işlem hafızaya biraz ek yük getirir fakat titremeyi önleyecektir. Resim nesnesi doğrudan form1 üzerinde ise aşağıdaki kodu deneyin. Form1.DoubleBuffered:=True;
Windows'un çalışma sisteminin önemli öğelerinden biri işlem kanallarıdır (thread). İşlem kanallarının tümü Windows tarafından paralel olarak işletilir. Düşüncede, ne kadar çok işlem kanalı varsa sistem o kadar yavaş çalışır. İşlem kanallarının bütünü Windows tarafından yönetilir. Herbir kanal için belli bir önemlilik seviyesi vardır. Bu seviyeye göre işlem kanalı çok yavaş ya da çok yoğun bir şekilde yürürlüğe koyulabilir. Windows ayrıca bu kanallara dışarıdan ulaşmamıza olanak sağlar. Windows'ta bir andaki işlem kanalı sayısı görev yöneticisinin (task manager) performance (başarım) sayfasındaki Threads değerinden öğrenilebilir.
Çok kanallılık tekniği, farklı tekniklerin de doğmasına neden olmuştur. Kritik bölgeler (CriticalSection) bunlardan biridir. Kritik bölgeler aynı anda çalışmaması gereken kod bloklarına bir çeşit kilit koyarlar. Aynı sıraya gelen her işlem parçası bu kiliti gördüğünde bekler ve işlem orada donar. İşlemin devam etmesi ancak kilidin diğer tarafta açılması ile mümkündür. Bunun güncel bir örneği ASP’deki Application.Lock komutudur. ASP’de Application.Lock ile Application.Unlock arasında kalan kısımlar Application nesnesinin türevleri için aynı anda birden çok kez çalıştırılamaz. Bu, önemli bilgilerin bu aralık içerisinde iken güvenle işlenebileceği anlamına gelir. Özellikle genel sayaç bilgileri değiştirilirken bu yöntem çokça kullanılmaktadır. Sonraki yazılarımızda ayrıntılı işleyeceğimiz kanallara aşina olanlar için aşağıdaki kod örneği kritik bölgelerin anlaşılması için yeterli olabilir. var ... procedure TDenemeKanal.Execute; TDenemeKanal kanalı aynı işi çoğaltıp paralel olarak yürütmek için tasarlanmış olsa da EnterCriticalSection ve LeaveCriticalSection arasında kalan kısım paralel çalışmayı engelleyecektir. Her bir kanal EnterCriticalSection satırına geldiğinde sıraya girerek, içeride bulunan kanalın LeaveCriticalSection satırından sonra dışarı çıkmasını bekler.
Resimde aynı anda paralel çalışan 4 kanal kendi sayacını ekrana yazdırıyor. Herbiri kendi sırası geldiğinde 10 adet ilerledikten sonra sıradan çıkıyor ve sıradaki diğer kanal devreye giriyor. Ekteki örnek kritik bölge uygulamasını inceleyebilirsiniz. Uygulamayı çalıştırırken düğmeye basmadan önce görev yöneticisini açıp Threads değerini kontrol edin.
Serkan ŞAHİNOĞLU |
||