Archive for July, 2007

Oyun firması Ubisoft tarafından yapılmasına başlanan Lost oyununun ilk görüntüleri yayınlandı. Yaklaşık bir dakika süren görüntülerden oyunun First Person Action (FPA) türünde dizayn edildiğini anlıyoruz. Dizi ile aynı mantığa sahip oyunda bir adaya düşen oyuncular bu adada hayatta kalmak için savaşacakmış. Dizideki ana karakterlerle diyalog içinde, bilinmezlikleri çözerek ilerlemeyi gerektiren oyun dizinin geçtiği mekanları da içeriyor. Oyunun çıkış tarihi ise Lost’un dördüncü sezonunun da başlangıcı olan 2008 Şubat ayı olarak belirlenmiş.

Kaynak: www.teknoajan.com 

.NET ortamından windows bileşenlerine ulaşmak ve windowsun hali hazırda yaptığı işlemlere ulaşmak, kullandığı fonksiyonları bizim de kullanabilmemiz için windows API lerden yararlanırız. Bu anlamda kullanacağımız API listesine Platform Invoke (P/Invoke) sitesinden ulaşabiliriz.

Görev çubuğundaki (taskbar)  uygulamalara ulaşabilmek için de user32.dll API’sinden yararlanıyoruz.  C# uygulamarında API tanımlarını DllImport attribute’u ile yapıyoruz:

[DllImport("user32.dll")]
private static extern int GetWindowText(int hWnd, StringBuilder title, int size);

Burada user32.dll API’si içinde yeralan GetWindowText fonksiyonunu projemizde kullanacağımızı bildiriyoruz. 

Örnek uygulamamızda yer alan EnumWindows fonksiyonu ile windowsta açık olan pencerelerin listesini elde ediyoruz.  EnumWindowsProc ile de bu ekranlarda tek tek dolaşarak başlığını GetWindowText fonksiyonu ile alıyoruz. Ve bu değerleri bir listboxa yazdırıyoruz.

Örnek Uygulamayı İndir

Büyütmek için resme tıklayınız.

Geçenlerde maille ile ulaşan bu resmi görünce çok etkilendim. İçin de bulunduğumuz dönem itibariyle çok anlam içeriyordu benim için. (siyasi değil, Temmuz ayı yani yaz) Halbuki şimdi o muhteşem güneşin altında ay ve yıldız arasında denize girmek hiç de fena olmazdı yani. Ama maalesef işyeri politikasından ötürü bu yaz tatile çıkamıyorum. :(

Ayrıca bu resmi bana göndererek beni ne kadar mutlu(!)  eden sevgili dostum Atakan ÖZTÜRK’e teşekkürler… :)
Düzeltme: İşyerim politikasını değiştirdi :) 

LOST 6. sezonun ne zaman başlayacağını mı merak ediyorsunuz? Kaç gün kaldı diye sabırsızlanıyor musunuz? O zaman bu merakınızı gidermek için yapılmış olan geri sayım sayacını sitenize buradan ekleyebilirsiniz. Yan tarafta bir örneğini görebileceğiniz sayaçın 3 farklı boyutu bulunuyor ve kaç gün – saat kaldığını gösteriyor.

Yazılım devi Microsoft, veritabanı yönetim sistemi olan SQL Server’ın en yeni versiyonu olan SQL Server 2008′e özel bir isim atadı ve çıkış zamanını açıkladı.  SQL Server 2008′in çıkış zamanı olarak 2008′in ikinci çeyreği gösterildi. Resmi olarak kullanılma zamanı ise 27 Şubat 2008. Denver’da gerçekleştirilen Worldwide Partner Conference’da, beklenen zamandan ileride bir tarihin açıklanmasının nedeni olarak; bazı stratejik değişiklikler öne sürüldü. Bunun yanı sıra, SQL Server 2008, “Katmai” özel ismiyle bilinecek. 

Kaynak: http://shiftdelete.net

Artık gitar çalmaya başlayanlara ilk olarak bunu çalmaları öğretilsin!! :)

YouTube Preview Image

WordPress ile blog olayına girdikten sonra eklentileri incelemeye başladım. Çok okuyan birisi olarak okuduğum kitaplar hakkında görüşlerimi paylaşmak istiyordum. Now Reading eklentisi bu iş için mükemmel oldu.  Eklentiyi Türkçe’leştiren Umut Doğan’a da buradan ayrıca teşekkürler. Kullanımını sağ taraftaki barda “Ne Okuyorum” başlığı altında görebilirsiniz. Kitapları eklerken ISBN numarasından Amazon’dan aratıyor ve girmenize kolaylık sağlıyor. Tabi çeviri kitaplarda sorun olmazken Türkçe kitaplarda zorluk yaşanıyor ve manuel girilmek zorunda kalınıyor.

Web blog olayına blogcu ile giriş yaptıktan sonra, an itibariyle kendi domain adresimle buradan devam edeceğimi bildirmekten zevk duyarım. Bugüne kadar kullandığım blogcu’daki sayfam yaşamaya devam edecektir; ancak bundan sonra güncellenmeyecektir. Ayrıca, blogcuda yer alan yazılarımı aynı kronolojide buradan da takip edebilirsiniz.

Windows projelerini oluştururken genellikle bir MDI form (parent) ve onun içinde açılan çocuk (child) formlar şeklinde yapmaya çalışırız. Bu makalede bu şekilde bir uygulamada inheritance ve singleton patternin nasıl uygulanacağını göreceğiz.
Öncelikle yapmaya çalıştığımız projedeki ana formda (MDI) solda bir ağaç (tree), üstte bir menü ve altta da durum çubuğu (statusbar) olsun. Ağaç yapımızda şöyle olsun:
anamenu.jpg

Buradaki her alt düğüm (node) bir ekranı (formu) temsil etmektedir ve bu küçük uygulamamızda 6 child fom bulunmaktadır. Tabi ki bu tip projelerde child form sayısı çok daha fazla olmaktadır. Ayrıca bu child formlar birbirlerine benzediklerinden (örneğin her child formda üstte menu olması, altta statusbar olması, ekranı kaplamış bir groupbox olması, zemin renginin yeşil olması gibi bir takım ayarlar…) her formu tek tek projemize ekleyip bu ayarları hepsinde tek tek yapmak hem zaman kaybı olacaktır hem de ileride bakımını ve yönetimini zorlaştıracaktır. Bu sebeple projemizde interitance kullanacağız. Inheritance temel olarak bir sınıfın özelliklerini kalıtsal olarak başka bir sınıfa aktarmaktan ibarettir. (Detaylı bilgi için bakınız.) Bunun için bir tane temel form yaratıp, bu forma her ekranda olmasını istediğimiz özellikleri vereceğiz ve diğer tüm formları bu temel formdan inherit edeceğiz. Bunun için projemize yeni bir form ekliyoruz istediğimiz özellikleri veriyoruz.frmbase.jpg

Yeni yaratacağımız formları ise Project > Add New Item > Inherited Form şeklinde oluşturacağız. Standart form eklemeden farklı olarak eklediğimiz formun hangi formdan türediğini soracak ve listeden temel formumuzu seçeceğiz. Peki ya formlarınız daha önceden eklenmişse ve siz sonradan bu şekilde bir yapıya geçiyorsanız ne olacak? O zaman da formunuzu tanımladığınız yerin hemen altında inherit kodunu yazmanız yeterli olacaktır:

Public Class FrmKategoriTanim  Inherits FrmBase

Buraya kadar yaptığımız girişten sonra asıl makale konumuza geçelim. Ana ekranda gördüğümüz gibi her alt nodeda child formumuzu çağırıyoruz

Dim frm As New FrmUrunTanim 

frm.MdiParent = Me

frm.Show()

Örneğin ürün tanım ekranı açıkken, tekrar aynı ekranı açmak istediğimizde yeni bir ürün tanım ekranı açılacaktır. Bu şekilde her tıklamada yeni bir ekran açılacaktır, ancak biz istiyoruz ki child form hiç açılmamışsa bir kez açılsın, eğer açıksa bize açık ekranı getirsin. Bunu aslında mdi formun ActiveMdiChild propertysi (çağrıldığı andaki açık olan child formları verir) içinde basit bir for..next döngüsü kurup açmak istediğimiz form zaten açık mı değil mi diye bakarak anlayabiliriz. Ancak biz burada farklı bir yöntem uygulayacağız ve singleton design pattern ile inheritance karışımı bir çözüm üreteceğiz. Singleton’da genel prensip bir instance’nın (burada, “New FrmUrunTanim”)  daha önceden oluşturulup oluşturulmaıdığını tespit etmek, instance yoksa yenisini yaratmak varsa, eskisini döndürmek şeklindedir. Temel formumuz olan FrmBase üzerinde yaptığımız işlemlerin diğer tüm formları da etkilediğini söyledik. Bu anlamda örneğin her formun load eventi altında standart bir işlem yapıyorsak bunu sadece FrmBase formunun load eventina yazmamız yeterli olacaktır. Bu sebeple bizde singleton ile ilgili kodlarımızı her forma yazmaktansa FrmBase altına yazacağız: 

Private _FormLoaded As Boolean

Private _instance As Form

Public Function GetInstance(ByVal willLoadedForm As Type) As Form   

 If _FormLoaded = False Then     

   _instance = CType(Activator.CreateInstance(willLoadedForm), Form)       

   AddHandler Me._instance.Closed, AddressOf Me.WhenFormClosed       

   _FormLoaded = True   

 End If

 _instance.Focus()

Return _instance

End Function

Private Sub WhenFormClosed(ByVal sender As Object, ByVal e As EventArgs)    

 Dim closingForm As Form = CType(sender, Form) 

 RemoveHandler closingForm.Closed, AddressOf Me.WhenFormClosed     _FormLoaded = False

End Sub

Ana formda ise kodlarımızı şu şekilde düzenliyoruz:

Private Sub mainTree_DoubleClick(ByVal sender As Object,ByVal e As EventArgs)

    Dim nd As TreeNode = Me.mainTree.SelectedNode

    If ((Not nd Is Nothing) AndAlso (nd.Nodes.Count = 0)) Then

      Dim frm As Form = Nothing  

      Select Case nd.Name      

       Case “kisi”     

        frm = FrmKisiTanim.GetInstance(GetType(FrmKisiTanim))    

       Case “kategori”      

        frm = FrmKategoriTanim.GetInstance(GetType(FrmKategoriTanim))

       Case “urun”

         frm = FrmUrunTanim.GetInstance(GetType(FrmUrunTanim))

       Case “satis”

         frm = FrmUrunSatis.GetInstance(GetType(FrmUrunSatis))

       Case “stok”

         frm = FrmStokDurumu.GetInstance(GetType(FrmStokDurumu))

       Case “satis_raporu”

         frm = FrmSatisRaporu.GetInstance(GetType(FrmSatisRaporu))  

    End Select 

    If (Not frm Is Nothing) Then  

      frm.MdiParent = Me

      frm.Show()

    End If 

 End If

End Sub

FrmBase altında yazdığımız kodlarda _FormLoaded ile formumuzun yüklenip yüklenmediği bilgisini, _instance ile de yüklenen form bilgisini tutuyoruz. Formlarımızın yeni bir instancenı almak için Activator sınıfından yararlandık. CreateInstance metodu ile Type cinsinden verilen bir nesnenin instance alınabilmektedir. Burada tüm formlarımızın ilave constructorı olmadığını varsaydık. Eğer parametre ile formlarımızı açmamız gerekiyorsa CreateInstace metoduna ikinci parametre olarak bu constructor parametrelerini array olarak geçebiliyoruz. Formumuzun kapatıldığını anlamak için de _instance’ın FormClosed eventini yakalayıp _FormLoaded = false yapmamız gerekmektedir. (Bu kodu doğrudan FrmBase’in FormClosed eventine yazamıyoruz, çünkü aynı formu tekrar açmak istediğimizde dispose edilmiş bir forma ulaşmaya çalıştığımıza dair bir hata alırız.)  Formlarımızı ana formdan çağırırken FrmBase yerine ilgili formdan çağırdık, sanki kodları oraya yazmışız gibi :)  

Örnek Uygulamayı İndir