-

C#DA RUN-TİME NESNE-KONTROL OLUŞTURMA

Diyelim ki c#da  bir sinema otomasyonu yapmanız gerekiyor.Formu dizayn ederken yapmanız gereken koltukları temsilen herhangi bir kontrol eklemektir.Bir sinema salonu 50 kişilik ve 4 tane de salon varsa toplamda formlarınız için 200 tane kontrol eklemeniz gerekmektedir.Oldukça uğraştırıcı ve zaman kaybettiren bir dizayn işlemi olacaktır sizin için.Programlama bilgisi çok iyi olmayan birinin yapacağı kontrolleri tek tek eklemek olacaktır,oysa ki object oriented programming(nesne yönelimli programlama)  dan ve nimetlerinden haberdar olan programcı ise kontrolleri tek tek eklemez onları kodu çalıştırırken yapabileceğini bilir.Benim bahsedeceğim de 2. seçenek,yani kontrolleri elle, tek tek değil de kod içerisinde oluşturup çalıştırmaktır, yani Run-Time(çalışma anında) nesne oluşturmak olacaktır.
Run-Time kontrol oluşturabilmek için o kontrolden bir nesne yaratmanız gerekecektir.
Button btn = new Button();  diye tek bir nesne oluşturup döngüler yardımıyla istediğiniz kadar buton görüntüleyebilirsiniz.
Bu konuyla ilgili BilgeAdamda staj yaparken derste yazdığımız  şu  kodu beraber inceleyelim:

int x = 40; //başlangıç x koordinatı

int y = 40;//başlangıç y koordinatı
int b = 1; //yerleştirilen buton numarasının tutar
private void Form3_Load(object sender, EventArgs e) //işlemleri form yüklenirken yapsın
{
for (int i = 0; i < 10; i++)                          //matrix mantığı ile 100 tane buton oluşturacaz
{
for (int j = 0; j < 10; j++)
{
Button btn = new Button();
//butondan bir nesne oluşturmamız gerekecek
btn.Name = “btnNo” + b;
//her birinin adı oluşum sıralarının adını alacaktır
btn.Text = b.ToString();
btn.Size = new Size(40, 40);              //size her defasında 40-40 olacaktır
btn.Left = x;
x += 40;                                //x koordinatı tek bir satır için her defasında 40 yana kaymalı
btn.Top = y;                         //y koordinatı aynı satır aynı kalır alt satıra geçildiğinde 40 artar
b++;                             //butonun numarası her defasında bir artacaktır
btn.Click += new EventHandler(btn_Click);    //hatta isterrsek o butona event bile yazarız
//butona basılma eventini tutar
//event olduğunu += gösterir
//bu formun kontrollerine oluşturduğun btn nesnesini eklemen gerek
this.Controls.Add(btn);                  //btn kontrolünün nereye ait olduğunu belirtmeiz gerekir,formun kontrolü
}
x = 40;                     //ilk 10 taneyi oluşturduktan sonra alt satıra geç ama lefti değişmeyecek
y += 40;                    //top üstten bir satır uzaklaştığı için +40 olmalı
}    }
void btn_Click(object sender, EventArgs e)
{
Button btn = sender as Button;
//sender içinde thisin verilerini tutar
MessageBox.Show(“Merhaba ” + btn.Text + ” im..”);
}

işte çıkan sonuç:

Butona tıkladığımızda da şöyle bir görüntü oluşur:

DERYA GÜNDÜZ

ADO.NET’TE CONNECTED DİSCONNECTED MİMARİLER

ADO.NET  teknolojisi ile veritabanından veri çekmenin 2 yolu vardır.

  • Connected Mimari
  • Disconnected Mimari

Connected Mimari:
Bu mimaride veri tabanından veri çekme süresi boyunca uygulama veritabanına bağlı kalır ve bilgiler bağlı kalma süresi boyunca çekilebilir.Veri çekmek için veritabanına sürekli bağlı olması zorunluluğundan dolayı sql server sürekli meşgul olur,bu bir dezavantajdır.Connected ile veri çekebilmek için SqlCommand ile ConnectionString yazılır ve veriler SqlDataReader ile okunur.SqlDataReader ile veriler tek tek okunur,bu da bir dezavantaj sayılabilir.Connected mimarinin güzel yönlerinden bir tanesi sqlden alınan verilerin daima en güncel veriler olmasıdır,yapılan  bütün değişikler direk veritabanına yansıdığı için veri alınacağı zaman da en güncel veriler gelir.Connected yapıda disconnected yapıya göre veriler daha  hızlı çekilir(datareaderden dolayı)

Disconnected Mimari:
Bu mimaride uygulama sqle bağlı olmaz,bağlı olmadan veriler çekilir.Peki nasıl oluyor da bağlı olmadığı halde veritabanından veri çekebiliyor?Uygulamanın veritabanına bağlı olmadan veri çekmesini sağlayan yapı SqlDataAdapterdır.Disconnected mimaride  SqlDataAdapter nesnesi oluşturulur ve bu aracı nesne sayesinde veri tabanından veri çekilir,bütün bağlantılar bunun üzerinden yapılır.Uygulama veritabanına hiç bağlanmadığı için de buna  disconnected yapı denilmiş.Disconnected mimaride bağlantı açılıp kapanmaz,SqlDataAdapter bağlantıyı kendisi açar kapatır.DataAdaptör üzerindeki sql verileri datatable ve datasetlere doldurulur(fill).Böylece sqldeki veriler kullanıma hazırdır.
DataTable—->bellek üzerindeki tablodur
DataSet——>bellek üzerindeki datatablelardır(oluşturulan datatablelar datasete atılır)
Disconnected yapıda uygulama veritabanına bağlı olmadığı için veritabanını meşgul etmek anlamında connected yapıdan daha iyidir.Ama disconnected yapı connected yapıya göre daha eski bilgiyi getirir,veritabanı üzerindeki değişiklikler direk veritabanına yansımadığı için en güncel veriye ulaşamıyor.Databasede yapılan değişikler biz istediğimiz zaman veritababnına yansır.

DERYA GÜNDÜZ

C#’DA SQLDEN VERİ ÇEKME-LİSTVİEW’E YAZDIRMA

Ado.net teknolojisi sayesinde .net applicationdan database ulaşıp orada veri çekebiliyoruz.Bu vereceğim örnekte de C# veri tabanından sql veri tabanına bağlanıp ordaki Northwind veri tabanında bilgi alıp listviewe yazdıracaz.Bu yayınlayacağım örnek kod BilgeAdam’da staj yaparken girdiğim derslerde gördüğümüz örneklerden.
Önce form disaynını yapmalıyız,
-listview eklemeliyiz
-listviewın view propetysini “details” yapmalıyız,
-”edit colonms” seçeneğinden iki kolon ekleyip bu kolanlara “ürün adi” “fiyat”  adlarını vermeliyiz,
-kodlama kısmına geçebiliriz
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;            //sql ile bağlantı kurmak için gerekli kütüphane
namespace AdoConnected1
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }
        private void Form2_Load(object sender, EventArgs e)
        {
//server=server name   database=database name
//integrated security=true     //windows authenticationda çalışıldığını gösterir
            SqlConnection conn = new SqlConnection(“server=DERYA-PC\SQLEXPRESS;database=Northwind;integrated security=true”);
            //komut nesnesi
            SqlCommand cmd = new SqlCommand(“select ProductName,UnitPrice from Products”,conn);
            SqlDataReader dr;
            conn.Open();
            dr = cmd.ExecuteReader();//komudu çalıştır execute okusun
            string urunAdi;
            decimal fiyat;
            while (dr.Read())
            {
                urunAdi = dr.GetString(0);//0. kolon
                fiyat = dr.GetDecimal(1);//2. kolon
                ListViewItem Ivi = new ListViewItem();
                //ListView e ekleme yapmak için itemından nesne oluşturup ona ekliyoruz
                Ivi.Text = urunAdi;     //text ilk kolon
                Ivi.SubItems.Add(fiyat.ToString());  //ondan sonraki bütün kolonlar subitem oluyor
                listView1.Items.Add(Ivi);
            }
        }
    }
}
DERYA GÜNDÜZ

C#’DA OTOMATİK PROPERTY EKLEMEK

BilgeAdam kursunda Çağlar Hoca ile Sql dersinde bugün yeni birşey daha öğrendim,çok kısa ama bence güzel bir ayrıntı,ya da güzellik diyeyim.
C#’da oluşturulan class elemanları için property yazmamız gerektiği zaman,yeni framework ile gelen özelliklerden birtanesi olarak,property’i taslak olarak kısa yoldan ekleyebiliriz.Uzun uzun yazmak yerine kısa yoldan eklemiş oluruz,ya da bazen yapının nasıl olduğunu hatırlamayabiliriz.
string productName
tanımlamasını yaptıktan sonra,productName ‘in propertysini yazmamız gerkiyorsa:
–productName  üstünü ters tıkla/refactor/encapsulate field tıklanır

–açılan pencerelerde ok/apply dedikten sonra property otomatik olarak projemize eklenmiş olur

–ilk harf küçük harf ise property adını kendisi büyük harf verir,ilk harf büyükse kendisi ad+1 gibi isimler verir.

DERYA GÜNDÜZ

STAJ GÜNLERİM…..

Yaklaşık 2 hafta önce BilgeAdam’da yazılım departmanında staja başladım.Yoğunluktan yazmaya pek fırsatım olmadı.Haftaiçleri Çağlar Hoca’nın Sql derslerine giriyorum.Okulun bitip stajın başlaması süresi arasında sqle biraz başlamıştım ama sqli kurup servera bağlanana kadar bile çok zorlanmıştım:)Temel sql komutlarına falan bakmıştım biraz,bişeyler öğrendiğimi sanmıştım ama kursa başlayınca aslında pek bişey öğrenmediğimi gördüm,meğer sql ne derinmiş arkadaş:)”select * from”dan ibaret değilmiş.Sql dersleri çok verimli geçiyor benim için,staj bitiminde sql de bayağı yol katedecem sanıyorum.Öğleden sonra da burda ders çalışıyorum ya da Sedat Hoca’nın yapmamı istedikleri olursa onları yapmaya çalışıyorum,araştırmalar ya da rapor falan yazmamı istiyor bazen.Ders çalışırken de takıldığım yerler olursa  hocalara soruyorum,hepsi çok yardımcı oluyor.Haftasonları Şevket Hoca’nın yeni başlayan grubu ile c# derslerine giriyorum.C#pı 1. dönem görmüştük okulda, ben de uğraşmıştım biraz ama unutmuşum gibi ve bilmediğim çokşey varmış.Burda bildiğimi sandığım birçok şeyi bilmediğimi gördüm,eksikler çok,çok çalışmak gerek:)Bir de staj oyunca biraz asp.net  öğrensem süper olacak,çalışmaya başladım,Ali Rıza Hoca’nın videoları var ordan takip edecem,ne kadar öğrensem kar benim için.

Burda şunu da gördüm,yazılım işini yapanların çok azı Bilgisayar Mühendisliği’nden mezun,hocalara ve öğrenci arakadaşlara baktığımda çok farklı bölümlerden mezun olduklarını görüyorum  ve bu işi çok iyi yapıyorlar.Yani işimiz zor biraz:)
Kısacası BilgeAdam günlerim şuan için iyi gidiyor.Her geçen gün bişeyler öğrendiğimi hissedebiliyorum.
DERYA GÜNDÜZ

SQL C# BAĞLANTISI-C#DAN VERİTABANINA BİLGi EKLEME-SİLME

Sqlde tablolarımızı oluşturduktan sonra c#da  kodlar yardımıyla veritabanına bilgi ekleme ya da silme işlemlerini gerçekleştirebiliriz.
Bununla ilgili c#da yazılmış örnek kodu inceleyelim:
Öncelikle projede gerekli form dizaynını yapmalıyız,bir tane datagridview ve gerekli button textbox ve labelları eklememiz gerekir

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;                                 //sql bağlantısı için gerekli kütüphane
namespace Sql_komutları_deneme
{
public partial class Form1 : Form
{   //tanımlamaları public yapıyoruz ki hepsi için geçerli olsun
SqlConnection baglantim;
SqlDataReader reader;
SqlCommand komut;
SqlDataAdapter adaptör;
DataSet dataset;

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{

baglantim = new SqlConnection();    //sql ile bağlantı kurulmasını sağlar
baglantim.ConnectionString = “Integrated Security=True;  Initial Catalog=csaharptanbaglanma;  Data Source=DERYA-PC\SQLEXPRESS;”;     //database ve serverisimlerinin verilmesi gereken connectionstring
baglantim.Open();                      //bağlantıyı açmak gerekir

dataset = new DataSet();
SqlDataAdapter adaptör = new SqlDataAdapter(“select* from  Bilgiler    “, baglantim);   //bağlanılacak tablo belirlendi

adaptör.Fill(dataset, “Bilgiler”);          //dataadapterdaki bilgiler datasete aktarıldı

dataGridView1.DataSource = dataset.Tables[0];           //tablo datagridviewde görüntüleniyor

komut = new SqlCommand();
komut.Connection = baglantim;            //sql cümlelerinin yazıldığı yer

}

private void button_sil_Click(object sender, EventArgs e)
//silme  butonu,seçili olan satırın silinmesini sağlıyor
{

try
{

//komut.CommandText = “delete from Bilgiler where Ad=’abc’”;     //adı abc olanı siler
//seçili olanın silinmesi olayı
komut.CommandText = “delete from Bilgiler where Id=’” + dataGridView1.CurrentRow.Cells["Id"].Value.ToString() + ”  ‘  “;//seçili olanı siliyor
reader = komut.ExecuteReader();
reader.Close();
}
catch
{
MessageBox.Show(“secili alan yok!!!!!”);
}
finally
{
Form1_Load(sender, e);     //silme işlemini yaptıktan sonra formun güncellenmesini sağlıyor

}

}
//textboxlara yazılanların veri tabanına eklenemesini sağlıyor
private void button_ekle_Click(object sender, EventArgs e)
{
try
{

komut.CommandText = “insert into Bilgiler values(‘” + textBox1.Text + “‘,’” + textBox2.Text + “‘,’” + textBox3.Text + “‘,’” + textBox4.Text + “‘,’” + textBox5.Text + “‘)”;
reader = komut.ExecuteReader();   /

}
catch
{
MessageBox.Show(“ekleme islemi gecersiz!!!bosalan veya farklı id de eleman eklenmeli”);
}
finally
{
Form1_Load(sender, e);     //silme işlemini yaptıktan sonra formun güncellenmesini sağlıyor

}
}

}
}

     Yapmış olduğumuz bütün değişiklikler veritaanına da yansımış oluyor…………..

DERYA GÜNDÜZ

C++ da Function Template-Class Template

  Templatein kelime anlamı taslaktır,c++ daki  kullanım şekli de kelime anlamına çok yakın bir kullanımdır. Fonksiyonu taslak olarak yazıyorsunuz ve  bu  fonksiyon farklı kullanım şekilleri  için esnek bir yapıya  sahip oluyor.

          C++ daki Function Template için  farklı tiplerde  kullanım esnekliği vardır.Bir  fonksiyonu farklı farklı tipler için ayrı ayrı yazmak yerine,tek bir  fonksiyon taslağı yazıp  bunu farklı tipler için kullanabilirsiniz.
          örneğin bir mutlak değer  fonksiyonun int veri tipi için şu şekilde yazarız:
        int mutlakdeger(int a){
      if(a<0)    return a;
       else return -a;
        }
      double veri  tipi için olanını şu şekilde yazarız:
        double  mutlakdeger(double  a){
      if(a<0)    return a;
       else return -a;
        }
     long olan için ;
            long  mutlakdeger(long  a){
      if(a<0)    return a;
       else return -a;
        }
               yani bütün tipler için ayrı ayrı yazardık.Bunu  taslak şeklinde yazıp  bütün veri tipleri için kullanabilmek istediğimiz   zaman yapmamız gereken şey fonksiyonu template  şeklinde tanımlamak.

  Template kulllanımı şu şekilde: 


template            //fonksiyonun başına yazılması gereken
T mulakdeger (T a)                    //yukarda tanımladığımız template Tyi  veri tipi olarak  kullandık

{

 if(a<0)    return a;
       else return -a;

}
int  main(){
cout<<”int veri tipi için mutlak deger alma”<
cout<<”double veri tipi için mutlak deger alma”<
}
bu şekilde kullanarak her veri tipi için ayrı yazma  gerekliliğinden kurtuluruz,kodlar kısalır fazla zaman  harcamak zorunda kalmayız.

 Template çeşitleri:

  •  template     //fonksiyonlar için kullanılır
  •  template                //classı template şekilde kullanabilmek için,daha çok data                storage classlarda(container)  kullanılır
  •  template       //birden fazla  tip tanımlayabiliriz
       Class Template:
            templateler ayrıca classlar için de kullanılabilir,işlev olarak  functşon template gibidir
           template
class  deneme{
                    //  classın diğer  elemanlarının prototypeları  yazılır
……………
       public int  denemefonk(T  ){}
………..
            };
            implementasyonlar:
         template
          deneme::denemefonk(T  a){………..}
           int main(){
         denemenesne;
          ………..
       }
  şeklinde kullanılır…………

DERYA GÜNDÜZ

c++ hata yakalama(try-catch)

c++daki hata yakalama olayı program içindeki istisnai durumları ayrı bir blok içinde tutup,programın çalışmasını engellemelesizi önlüyor.
bunu sağlayan en temel yapı da “throw”‘dur,throw ile hatalı ya da istisnai durumda ne yapması gerektiğini bildiyoruz ve main içinden try-catch yardımıyla hatalı durum zamanında çağırıyoruz.
örneğin bölme işlemi yapan bir program düşünelim, =a bölmek normalde hata verir ,0a bölme yapıldığında programın hata verip  durmasını engellemek için,kendimiz 0a  bölme yapması durumunda istediğimiz  durumu çalıştırıyoruz,
divide(int x,int y){
if(y==0) throw “0a bölme yapılamaz!”
return x/y;
}
int main(){
try{
divide(x,y)//bir problem yoksa normal bölme yapar
}
catch(string s){

cout<< s;//0a  bölme yapılmışsa üstte throw ilw yazılanı ekrana basar
}
}

kodun tamamına  burdan bakabilirsiniz
DERYA GÜNDÜZ

c++da polymorphism kavramı

polymorhism nedir?
polymorphism’in  türkçesi çokbiçimliliktir,
çok biçimlilik  sözcüğünü duyduğımuzda aklımıza  tek bir  şeyin farklı kullanımlara farklı yanıtlar vermesi  gelebilir.bunu sınıf kullanımına indirgediğimizde ise birbiriyle kalıtımla ilişkisi olan farklı sınıfların nesnelerinin aynı üye   fonksiyon çağrısına farklı yanıt vermesi  şeklinde açıklayabiliriz.
polymorphism nasıl kullanılır?
bunun için bir base classımız olmalı(temel sınıf),ve ondan kalıtımla oluşan derived classlar(türetilmiş sınıflar).
base classda oluşturulan bir  fonksiyon diğer sınıflarından hepsinde de kullanılacak ama bu  fonksiyonların herbirinin içeriği  farklı olacak.
base classda tanımladığımız ve bütün classlr için ortak kullanmak istediğimiz fonksiyonu base classda tanımlarken bunu “virtual”  olarak tanımlayıp,kullanmalıyız.diğer classlara  tanımlama  yaparken ise  normal tanımlama yapılmalıdır.
base classdaki tanımlama:
public  virtual string speak() const
kalıtılmış  sınıftaki tanımlama:
public string speak() const
mainde  bunu kullanacakken de alt sınıflardan nesne oluşturup bunu base classın pointerına ya  adresine eklemek  gerekir.
dog kucik  //dog derived class,pet  base class
pet *p1=&kucik
ya da
pet &p2=kucik
şeklinde kullanılır
polymorphismin ne fayda sağlar?
aynı fonksiyonu kullanacak yeni bir alt class eklendiğinde de  fonksiyonun içeriğini tekrardan yazmak zorunda kalmacağız.
bu  söylediğimiz  durum tabiki büyük projelerde avantaj sağlayacaktır,temel bir  içeriğie  sahip  fonksiyon var ve  buna herbir  oluşturulan classda yeni özellikler ekleniyor.

burda açıkladığım örnek kod var     tıklayıp   inceleyebilirsiniz.

DERYA GÜNDÜZ

c#’da hata oluşturup bi yerde çağırmak(catch’de olduğu gib)

bilindiği gibi c#da try-catch olayı vardır;hata olmadığı durumlarda try,hata olduğu zaman  catch çalışır.
peki kendimiz bir hata oluşturmak istersek?????:

  • 1. yol:

//exception sınıfından oluşturulan hata

Exception hata = new Exception(“Bu benim hatam”);

//oluşan hatayı nesnenin hata mimarisi içine fırlatma.

throw hata;//burda hata verir
//program throw kısmına gelince hata verir ve hata ekranında “bu benim hatam”,yazar

  • 2.yol:class kullanarak yapalım

class KendiHatamiz : Exception

{
public KendiHatamiz()

: base(“derya’nın hatası”)

{}
}
int main()
{
KendiHatamiz kndHata = new KendiHatamiz();

throw kndHata;//burda da hata verir
//throw’a geldiğinde program durur ve hata alanında “derya’nın hatası “,yazar.
}

DERYA GÜNDÜZ