BilgiTeknoloji.net    
b i l g i   t e k n o l o j i   y a z ı l ı m

Ana Sayfa

Marjinal XML Access Pratik Uygulamalar Projeler Ekonometri Dilimiz Çetrefil İletişim
 

Delphi İpuçları


Delphi hakkında yazı bekleyen okurlarımız için bu ay Marjinal'de faydalı ipuçlarına yer verdik.

• Hareketli fare işaretçisi yüklemek
• Enter tuşunu tab gibi kullanmak
• Güncellenmeyen resimler
• Resim nesnelerinde boyama anındaki titreşimi önlemek
• İşlem kanallarında kritik bölgeler (Thread - CriticalSection)


HAREKETLİ FARE İŞARETÇİSİ 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);
var
  h : THandle;
begin
  Screen.Cursor:=0;
  h:=LoadCursorFromFile(PChar(dosya));
  Screen.Cursors[999] := h;
  Screen.Cursor:=999;
end;

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 Declare Function SetClassLong Lib "user32" Alias "SetClassLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Const GCL_HCURSOR = (-12)

Private Sub Command1_Click()
  ‘İşaretçi yükle.
  Dim c As Long
  c = LoadCursorFromFile("c:\kuheylan.ani")
  SetClassLong hwnd, GCL_HCURSOR, c
End Sub

Private Sub Command2_Click()
  ‘Normale getir
  SetClassLong hwnd, GCL_HCURSOR, 0
End Sub


ENTER TUŞUNU TAB GİBİ KULLANMAK

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);
begin
  if Key=#13 then
  begin
    Key:=#0;
    Perform(WM_NEXTDLGCTL,0,0);
  end;
end;

Enter tuşu basıldığında tuş değeri sıfırlanıyor ve pencereye WM_NEXTDLGCTL mesajı gönderiliyor.


GÜNCELLENMEYEN RESİMLER

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);


RESİM ÇİZERKEN AŞIRI TİTREMEYİ ÖNLEMEK

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;


İŞLEM KANALLARINDA KRİTİK BÖLGELER

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
  cs:TRTLCriticalSection;

...

procedure TDenemeKanal.Execute;
var
  i:integer;
begin
  inherited;
  repeat
    EnterCriticalSection(cs);
    ...
    LeaveCriticalSection(cs);
  until terminated;
end;

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.

GEÇMİŞTEN

Yakın geçmişte, piyasaya sürülmeden önce Delphi 6'nın deneme sürümü dağıtılmıştı ve geliştirilen uygulamalar için tüm özellikler kullanılabiliyordu. Fakat derleme işleminin sonrasındaki 60. günün ertesinde, aşağıdaki ileti kurulum koşul ve özelliklerini iyice okumayanlar için kötü bir sürpriz olmuştu. Delphi oluşturduğu uygulamalara 60 gün sınırı koyuyordu.

  
 


DOSYALAR:
fare_isaretcisi.exe
.rar, 201 kb.)
fare_isaretcisi_kod.rar
kritik_bolge.exe .rar, 194 kb.)
kritik_bolge_kod.rar


Serkan ŞAHİNOĞLU
(Chip Dergisi, Şubat 2003)


http://BilgiTeknoloji.net