Callback Kullanımı

Bir integrated mapping programında bazen MapInfo tarafında oluşan bazı olayları uygulamamıza (mesela Visual Basic tarafına) bildirmemiz gerekebilir. Buna örnek olarak bir harita katmanının eklenmesini veya çıkarılmasını gösterebiliriz. Yani kullanıcı haritaya bir katman eklediği veya haritadan katman çıkardığı zaman bundan haberdar olmak ve programımızın akışını buna göre yönlendirmek isteyebiliriz. Bir MapBasic programı yazarken bu bizim için önemli bir problem olmayacaktır çünkü MapBasic’in WinChangedHandler adlı özel prosedürünü kullanarak haritadaki değişikliklerden haberdar olabiliriz. Peki MapInfo tarafında cereyan eden katman ekleme/çıkarma gibi olaylardan biz Visual Basic tarafında nasıl haberdar olabiliriz?

İşte böyle bir durumda callback yapıları devreye girer. Pratikte callback kullanım alanlarına aşağıdakileri örnek gösterebiliriz. Bu örneklerdeki durumların tümünde MapInfo, uygulama programımıza bazı bilgiler gönderir ve biz de bu bilgileri kullanarak gerekli işlemleri yapabiliriz:

  • Bir harita penceresinde yeni bir katmanın eklenmesi/çıkarılması veya haritanın büyütme, küçültme, kaydırma gibi işlemlerle değiştirilmesi.
  • MapInfo’nun alt tarafında bulunan durum çubuğunda (status bar) gösterilen bazı bilgilerin (imleç koordinatları gibi) değişmesi. Integrated mapping uygulamalarında MapInfo’nun durum çubuğunu doğrudan kendi uygulamamızda gösterme şansımız yoktur. Eğer buradaki bilgileri kendi uygulamamızda göstermek istiyorsak callback yapısını kullanmamız gerekir.
  • Bir menünün tıklanması. Mesela uygulamamızda MapInfo’nun sağ tuş menüsünü özelleştirerek kendi menülerimizi koyduk diyelim. Kullanıcı bu özel menülerden birine tıkladığında bundan uygulamamızın haberdar olabilmesi için yine callback yapısını kullanmamız gerekir.
  • Kullanıcının özel bir araç (custom tool) kullanarak haritayla herhangi bir etkileşime geçmesi. Örneğin kullanıcı, kendisine sunduğumuz özel amaçlı bir butona tıkladıktan sonra haritaya tıkladığında, tıklanan noktanın koordinatlarını alabiliriz.

Aslında callback yapısını şöyle özetleyebiliriz: Integrated mapping uygulamamızda kullanıcı MapInfo haritası üzerinde -yukarıda saydığımız- bazı işlemleri yapar ve bu işlemlerin (bunları tetikleyici olaylar olarak da düşünebiliriz) meydana geldiğini MapInfo bizim uygulamamıza bildirir. Bu bildirim özel bir mesaj formatıyla yapılır. Örneğin MapInfo’nun durum çubuğunun değişmesiyle tetiklenen bir callback olayında Visual Basic programımıza aşağıdakine benzer bir mesaj gelir:

36.79°, 40.85°\tEditing: None\tSelecting: None\t\t\t\t

Uygulamamıza MapInfo tarafından böyle bir string değeri geldikten sonra bize düşen bu bilgiyi \t yani TAB karakterine göre parse etmek yani parçalara ayırarak gerekli bilgileri almak ve Visual Basic ile oluşturduğumuz bir durum çubuğunda (status bar) göstermektir.

Şimdi de kullanıcıya

Create Buttonpad ... Calling OLE ...

komutlarını kullanarak sunduğumuz özel butonların kullanılması sırasında gelen callback mesajının nasıl olduğuna bakalım. Örnek bir mesaj aşağıdaki gibi olabilir:

MI:33.0045,39.5528,F,F,,,2010

Bu sefer MapInfo’dan biraz farklı bir mesaj geldi. Dikkat edilirse ilk 3 karakteri “MI:”. Bu bilgi uygulamamıza gelen callback mesajının MapInfo tarafından geldiğini göstermek içindir. Bize asıl gerekli olan bilgiler bu ilk 3 karakterden sonra gelen ve virgül ile ayrılmış değerlerdir. Bu değerlerin anlamları şöyledir:

1. slot: 33.0045 (Tıklanan noktanın X değeri)

2. slot: 39.5528 (Tıklanan noktanın Y değeri)

3. slot: F (Haritaya tıklarken Shift tuşuna basılıp basılmadığı)

4. slot: F (Haritaya tıklarken Ctrl tuşuna basılıp basılmadığı)

5. slot:   (Kullanıcın fareyi bıraktığı noktanın X değeri)

6. slot:   (Kullanıcın fareyi bıraktığı noktanın Y değeri)

7. slot: 2010 (OLE command butonun Create Buttonpad komutunda tanımlanan Id değeri)

Eğer daha önce MapBasic’in CommandInfo fonksiyonunu kullandıysanız bu değerler size tanıdık gelecektir.

Örnek projede gerekli yerlerde açıklayıcı kod yorumları (comment) olduğu için burada detaya girmek istemiyorum. Bu kodları inceleyebilirsiniz.

Örnek projede kullanılan sınıfların tanımları şöyledir:

FrmMap.cs: Haritanın, araç çubuğunun ve durum çubuğunun gösterildiği formdur.

MapInfoCallback.cs: Gerekli WindowContentsChanged, SetStatusText ve MenuItemHandler metotlarının implement edildiği sınıftır.

StatusBarCallbackString.cs: MapInfo’nun OnStatusBarTextChanged olayında gelen callback string ini parse eden sınıftır.

OLECallbackString.cs: MapInfo’nun OLE callback olayında gelen callback string ini parse eden sınıftır.

Örnek projeye ait sınıf diyagramı aşağıda gösterilmiştir: (Daha büyük resim için resme tıklayın.)

CallbackProjectClassDiagram

Örnek C# projesini aşağıdaki linkten indirebilirsiniz:

https://dl.dropbox.com/u/54151940/GIS/MapInfo/IntegratedMapping/CS_MI_Callback.rar

  1. No comments yet.
  1. No trackbacks yet.

Leave a comment