Memik YANIK'ın Günlüğü

7/11/2009 - Her Gün Bir Yanlış(1. Yanlış): #undef Deyimi

Kategori: CSharp
 

Daha önce yazmıştım; her kitapta teknik veya dil yanlışları olabilir. Önemli olan bu yanlışların sayısı ve önemidir. Yanlışsız kitap yazmak neredeyse imkânsız olduğu için hedefim hep az yanlışa sahip kitaplar yazmak oldu. Ne zaman okurun birisi kitabımdaki bir yanlışı ilettiğinde kendisine teşekkür edip söz konusu yanlışı ilk fırsatta düzeltme yoluna gittim.

 

Bir programcılık kitabının yanlışlarından söz edilecek bu yazı dizisini hazırlarken kendimi yazar Memik Yanık olarak değil okur yerine koydum. Yani adını burada anmadığım yazara diyorum ki “ey yazar arkadaş kitabında şu şu yanlışlar var, bir zahmet yeni baskıda bu yanlışları düzelt”. Bakalım yazar arkadaş iyi niyetli bu çalışmaya ne tepki verecek?

 

Bu yazı dizisinde yaklaşık 550 sayfalık bir C# kitabının yanlışlarını ortaya koyacağım. Bunu yaparken her gün kitabın bir sayfasını rastgele açıp o sayfadaki hatayı ve doğrusunu yazacağım. Bu hataların sayısı kaç olur şimdiden bilemem. Ancak bu sayının en az 25 olacağını şimdiden söyleyebilirim. Çünkü test amaçlı olarak yaptığım denemelerde her 5-10 sayfada bir yanlışa rastadım. Tabi söz konusu kitabın yanlışlarını ortaya koyarken yanlış yapmam ihtimal dahilindedir. Bu nedenle olası yanlışlarım için kitabın yazarından simdiden özür dilerim ve yanlışlardan söz ederken yapacağım yanlışlarımı düzeltmek için bir uyarının, bir mail'in yeterli olduğunu bilmenizi isterim. Burada sözünü ettiğim hatanın incelediğim kitabın hangi sayfasında olduğunu yazmayacağım. İşte söz konusu kitaptan alınıp anlamı korunup biraz değiştirilmiş bir cümle. 

"demirspor isimli değişken "#undef" komutu sayesinde deklare edilmiştir."

Bu cümlede yazarımız undef adlı önişlemci deyimiyle değişken deklare edildiğini yazmış. Gerçekte C# programlama dilinde #define önişlemci deyimi ile kodun başında veya derleme satırında parametreler kullanılarak sembol veya sabit tanımı yapılmaktadır. #undef deyimi ise bu sabitleri tanımsız duruma getirebilmektedir. Yani yazarımız yanılıyor:Çünkü undef deyimi ile deklarasyon yapılmıyor.

 

Diğer yandan #undef deyimi ile olmayan veya #define deyimi ile tanımlanmayan bir sabiti tanımsız duruma düşürmek istediğinizde C# derleyicisi "dur arkadaş bu sabit tanımlı değil ki tanımsız yapayım, sen olmayan bir şeyi bana yok et diyorsun" demiyor. Yazar arkadaşımız C# derleyicisinin azizliğine uğramış yukarıda verilen cümleyi kitabına almıştır.

0 YorumYorum yaz!Bağlantı

2/11/2009 - C# 3.0 Kitabının İlk 120 Sayfası Yayınlandı..

Kategori: CSharp
En kapsamlı ve en kolay okunan C# 3.0 kitabının ilk 120 sayfasının kişisel sitemde yayınlanması tamamlandı. Yakın bir zamanda kimse para ödeyerek Türkçe C# kitabı almayı denemeyecektir. Çünkü en iyisi, en kolay okunanı ellerinin altında. Tabi bazı arkadaşlar diyecekler ki ben Türkçe kitaplar yerine İngilizce olanları tercih ediyorum diyeceklerdir. Bu arkadaşlara söyleyeceğim şudur: Bir kitap kötü kaleme alınmışsa ve zor okunuyorsa hangi dilde yazıldığının ne önemi var?

http://www.memikyanik.net/csharp-30-kitabi-makaleleri/24.aspx

Hele hele 2005 yılında yayınlanıp ve şişirildiği için tuğla kalınlığında olup yanlışlarda dolu olup farkında olmadan C# 2005 adını verdikleri C# 2.0 kitapları depolarda çürümeye devam edeceklerdir.
0 YorumYorum yaz!Bağlantı

4/10/2009 - WindowsFormsApplicationBase Sınıfı

Kategori: CSharp

C# uygulamaları hakkında değişik kaynkalarda yazılanlara bakılacak olunursa projenin başlangıç formunun örneği alınıp Application sınıfının Run() metoduna parametre olarak verilmektedir. Bu işlem yani projenin başlangıç formunu hazırlama işlemi Main() metodunun bulunduğu Program.cs dosyasında yapılmaktadır. Microsoft.VisualBasic.ApplicationServices’deki WindowsFormsApplicationBase sınıfından yararlanarak C# uygulamasının başlangıç ve açılış formuyla ilgili bazı işlemleri kolayca yapmak mümkündür. Daha çok Visual Basic programcılarının kullandığı bu sınıftan C# uygulaması dahilinde yararlanmak istiyorsanız Add Reference diyalog kutusundan yararlanıp Microsoft.VisualBasic adlı referansı Solution Explorer penceresinde listelemelisiniz. 

Devamında kod satırlarının kısa olmasını sağlamak için using deyimiyle
Microsoft.VisualBasic.ApplicationServices’deki sınıflardan yararlanmak istediğinizi belirtmeniz önerilir. Bu sınıf hakkında adım adım bilgi verebilmek içinProgram.cs dosyasında aşağıdaki gibi  WindowsFormsApplicationBase sınıfının mirasçısı bir sınıf hazırladık. “App_sinifi” adı verilen bu sınıf bu hali ile herhangi bir işleve sahip değildir. Daha önce herhangi bir C# kitabında bu sınıf hakkında bilgi verilmediği için değişken adı çalmaktan suçlanma ihtimali düşük olduğu için bu sınıfa argo bir isim vermeye gerek duymadım. 

namespace
WindowsFormsApplication1

 static class Program 
 
    static voidMain()
    
      Application.Run(new Form1()); 
   
 
 public classApp_sinifi : WindowsFormsApplicationBase 
 
  }
} 

WindowsFormsApplicationBase sınıfının mirasçısı bu sınıfın nasıl kullanıldığına örnek olması için ilk olarak OnCreateMainForm() metodunu ezdik. Bu metodun içinde projedeki ilk formun yani Form1 sınıfının örneğini alıp WindowsFormsApplicationBase tipindeki nesnenin MainForm özelliğine aktardık. 

public
class App_sinifi: WindowsFormsApplicationBase 
 
    protected override voidOnCreateMainForm() 
    
        Form1F1 = new Form1(); 
        this.MainForm = F1; 
    
 } 

Bu şartlarda Run() metodu içinde bu sınıfın
WindowsFormsApplicationBase mirasçısı sınıfınınörneği alınıp bu sınıfın Run() metoduna parametre olarak verilirse “F1” nesnesi uygulamanın başlangıç formu olur. Aşağıda verilen haliyle Program.cs dosyası ile Visual Studio tarafından hazırlanan hali işlev bakımından birbirinden farklı değildir. 

using
Microsoft.VisualBasic.ApplicationServices;
usingSystem.Windows.Forms; 
 namespaceWindowsFormsApplication1

    static class Program 
   
      static voidMain(string[] parametre) 
       
            App_sinifibaslangic; 
            baslangic = new App_sinifi(); 
            baslangic.Run(parametre); 
       
   
  public class App_sinifi: WindowsFormsApplicationBase 
   
        protected override voidOnCreateMainForm() 
       
            Form1F1 = new Form1(); 
            this.MainForm = F1; 
       
    }
}

Hangi formun uygulamanın başlangıç formu olmasını istiyorsanız bu formun adını WindowsFormsApplicationBase sınıfının mirasçısı sınıfın MainForm özelliğine aktarmalısınız.
Her ne kadar WindowsFormsApplicationBase sınıfının mirasçısı bu sınıfı Progam.cs dosyası içinde hazırlamış olsak bile başka bir kod dosyasında kodlayabilirdik. Başlangıç formu olarak Visual Studio’nun projeye dahil ettiği ilk formu kullanmak istediğimiz için böyle bir düzenleme yaptık. Bu sınıfın override edilecek başka metotları ve kendisi için metot hazırlanabilinecek birkaç olayı olsa bile şimdilik bu kadarıyla yetindik. 

Şimdi WindowsFormsApplicationBase sınıfının mirasçısı sınıftan yararlanıp mevcut bir formu Splash form olarak ekrana getireceğim. Bu amaçla üzerinde çalıştığım projeye 2. bir form dahil ettim ve bu forma “splash_form” adını verdim. Ardından “Program.cs” dosyasındaki WindowsFormsApplicationBase sınıfının mirasçısı sınıfta OnCreateSplashScreen metodunu aşağıdaki gibi ezdim(override) ettim. 

using
Microsoft.VisualBasic.ApplicationServices; 
namespaceWindowsFormsApplication1

    static class Program 
   
      static voidMain(string[] parametre) 
       
            App_sinifibaslangic; 
            baslangic = new App_sinifi(); 
            baslangic.Run(parametre); 
       
   
  public class App_sinifi: WindowsFormsApplicationBase 
   
        protected override voidOnCreateMainForm() 
       
            Form1F1 = new Form1(); 
            this.MainForm = F1; 
       
        protected override voidOnCreateSplashScreen() 
       
           splash_formf_splash = new  splash_form(); 
           this.SplashScreen = f_splash;  
       
    }


Bu hazırlıktan sonra proje çalıştırılırsa öncelikle adı WindowsFormsApplicationBase sınıfının mirasçısı sınıfın SplashScreen özelliğine aktarılan form ekrana getirilir. Bu form ekranda kısa bir süre durduktan sonra adı MainForm özelliğine aktarılan form ekrana gelir. 

Şimdi ise WindowsFormsApplicationBase sınıfı kaynaklı OnRun() metodunu override edeceğim. Bu amaçla yukarıda verdiğim sınıfı aşağıdaki gibi düzenledim. Bu şartlarda bu sınıfın örneği alınıp Run() metodu işletildiğinde önce OnRun, ardından OnCreateMainForm metodu işletilir. 

public
class App_sinifi: WindowsFormsApplicationBase 
   
        protected override voidOnCreateMainForm() 
       
            Form1F1 = new Form1(); 
            this.MainForm = F1; 
        
        protected override voidOnCreateSplashScreen() 
       
            splash_formf_splash = new splash_form(); 
            this.SplashScreen = f_splash; 
       

       
protected override voidOnRun() 
        
            base.OnRun(); 
       
    }

Bu şartlarda OnRun metodunun varlığı ile yokluğu birdir. Çünkü bu metodun orijinali zaten böyledir. Şimdi konu üzerinde düşünmenizi sağlamak için bu metoda bir satır ekleyeceğim. 

public
class App_sinifi: WindowsFormsApplicationBase 
   
        protected override voidOnCreateMainForm() 
       
           
Form1F1 = new Form1(); 
            this.MainForm = F1; 
      
        protected override voidOnCreateSplashScreen() 
       
            splash_formf_splash = new splash_form(); 
            this.SplashScreen = f_splash; 
       
       protected override voidOnRun() 
       
            base.OnRun(); 
            MessageBox.Show("Uygulama çalışmaya başladı"); 
        }
 }

OnRun() metodunu bu şekilde değiştirip proje çalıştırılırsa doğal olarak base.OnRun() satırı sayesinde uygulama başlatılır. Tabii sıranın MessageBox sınıfının kullanıldığı satıra gelmesi için uygulamanın çalışmasının sona erdirilmesi gerekir. Tahmin edeceğiniz gibi bu metottaki base.OnRun() satırı silinirse uygulama çalışmaz. WindowsFormsApplicationBase sınıfı kaynaklı OnRun() metodu uygulama çalışmaya başladıktan sonra işletilmektedir. Bu sınıfın ayrıca OnStartUp adında bir metodu var. Kendi hazırladığım sınıfta bu metodu aşağıdaki gibi Override ettim. 

public
class App_sinifi: WindowsFormsApplicationBase 
 
   protected override voidOnCreateMainForm() 
   
      Form1F1 = new Form1(); 
      this.MainForm = F1; 

0 YorumYorum yaz!Bağlantı

4/10/2009 - ArrayList Sınıfının FixedSize ve ReadOnly Metotları

Kategori: CSharp

ArrayList nesnesinin eleman sayısı gerektiği zaman dinamik olarak artmakta veya iki katına çıkmaktadır. Eleman sayısı sabit ArrayList nesnesi hazırlamak istiyorsanız ArrayList sınıfının FixedSize() metodundan yararlanabilirsiniz. Bu metot sayesinde sabit elemanlı ArrayList nesnesi hazırlayabilmek için öncelikle kapasitesini belirlediğiniz normal bir ArrayList nesnesi hazırlayıp bunu FixedSize() metoduna parametre olarak vermelisiniz. Bu metodun nasıl kullanıldığını aşağıda görebilirsiniz. 

 private
voidForm1_Click(objectsender, EventArgse)
 {
    ArrayListiller = new ArrayList(4);
    iller.Add("adana");
    iller.Add("Ankara");
    iller.Add("istanbul");
    iller.Add("İzmir");
    ArrayListil_dizi = ArrayList.FixedSize(iller);
 }

Bu kodda önce bildik şekilde “iller” adını verdiğim ve başlangıçta kapasitesi 4 olan bir ArrayList nesnesi hazırlayıp 4 ilin adını elaman olarak aktardım. Devamında bu 4 elemana sahip ArrayList nesnesinden yola çıkıp FixesSize() metodu ile sabit elemanlı bir ArrayList nesnesi hazırladım. 

Bu şartlarda her iki ArrayList nesnesi de aynı elemanlara sahiptir. Şimdi bu koda ekleme yapıp eleman sayısı sabit olan ArrayList nesnesinin elemanlarını değiştirip içeriklerini bir ListBox’a aktaracağım. 

private void Form1_Click(object sender, EventArgs e)
  {
     ArrayList iller = new ArrayList(4);
     iller.Add("Adana");
     iller.Add("Ankara");
     iller.Add("istanbul");
     iller.Add("İzmir");
     ArrayList il_dizi = ArrayList.FixedSize(iller);
     il_dizi[0] = "Bursa";
     il_dizi[1] = "Denizli";
     il_dizi[2] = "Konya";
     il_dizi[3] = "Trabzon";
     foreach (object il in il_dizi)
         listBox1.Items.Add(il);    
  }

İlgilendiğiniz ArrayList nesnesinin eleman sayısının sabitlenip sabitlenmediğini öğrenmek istiyorsanız IsFixedSize() metodundan yararlanabilirsiniz. İlgili ArrayList’in eleman sayısı sabitlenmiş ise bu metot geriye True göndermektedir. Bu metot aşağıdaki gibi kullanılabilir.

private void ekle_Click(object sender, EventArgs e)
  {
      bool sonuc = il_dizi.IsFixedSize;
       if (sonuc)
           MessageBox.Show("Bu arrayList'e eleman eklenemez");
       else
           il_dizi.Add("Mersin");  
    }

ArrayList sınıfı FixedSize() metodundan başka ReadOnly() adında bir metoda sahiptir. Bu metottan yararlanarak mevcut bir ArrayList nesnesinden yola çıkıp içeriği değiştirilemeyen yeni bir ArrayList nesnesi hazırlamak mümkündür. Bu metodun nasıl kullanıldığını aşağıda görebilirsiniz.

private void Form1_Click(object sender, EventArgs e)
    {
        ArrayList iller = new ArrayList(4);
        ArrayList il_dizi;
        iller.Add("Adana");
        iller.Add("Ankara");
        iller.Add("istanbul");
        iller.Add("İzmir");
        il_dizi = ArrayList.ReadOnly(iller);
   } 

Bu kodu incelerseniz kullanım tekniği bakımından ReadOnly() metodunun FixedSize() metoduna çok benzediğini görürsünüz. Bu andan itibaren il_dizi adını verdiğim ArrayList nesnesinin elemanlarının içerikleri değiştirilemez, yeni eleman eklenmez. İlgilendiğiniz ArrayList nesnesinin ReadOnly olup olmadığını öğrenmek istiyorsanız IsReadOnly() özelliğine bakabilirsiniz. 

    
bool durum = il_dizi.IsReadOnly;
   if (durum)
       MessageBox.Show("bu arraylist readonly");
    else
      il_dizi.Add("Mersin");   

0 YorumYorum yaz!Bağlantı

7/7/2009 - C#'a Başlangıç Kitabının Genişletilmiş 2. Edisyonu Hazır

Kategori: CSharp
Bildiğiniz gibi C# ve programcılığa henüz başlayanlar için şimdiye kadar toplam 7 makale hazırlayıp kişisel sitemde yayınladım. Sonra bu makaleleri bir PFD'de bir araya getirdim. Aradan geçen 6 aylık sürede gelen talepler doğrultusunda PDF'yi elden geçip eklemeler yaptım. Bu PDF'nni yeni halini buradan indirebilirsiniz.
0 YorumYorum yaz!Bağlantı

<- Son Sayfa • Sonraki Sayfa ->

Hakkımda

Bu blog'da bilgisayar ve programcılık üzerine yazdıklarımın arka planını bulacaksınız

Kategoriler

  • ASP.NET
  • CSharp
  • Delphi
  • Guncel Yazilar
  • Programcilik
  • Visual Basic
  • Arkadaşlarım

    sewimsizce