Professional Documents
Culture Documents
{10.11.2007 Cumartesi}
Nesne yönelimli programlamada çeşitli işler, sınıflarla temsil edilip
basit bir biçim de kullanıma sunulmaktadır. Sınıfların ayrıntılarının
gizlenerek onların public fonksiyonlarla kullanılması işlemine kapsülleme
denilmektedir.
~A()
{
//...
}
class Sample
{
private FileStream m_fs;
public Sample()
{
m_fs = new FileStream(...);
1
//...
}
~Sample()
{
m_fsa.Close Dikkat soruna yol açabilir.
}
//...
}
interface IDisposable
{
void Dispose;
}
//...
HOCANIN ÖRNEĞİ
using System;
using System.IO;
using System.Collections;
namespace CSD
{
class App
{
public static void Main()
{
ArrayList al = new ArrayList();
//...
//...
2
foreach (IDisposable id in al)
id.Dispose();
}
}
class A : IDisposable
{
public void Dispose()
{
Console.WriteLine("A.Dispose");
}
//...
}
class B : IDisposable
{
public void Dispose()
{
Console.WriteLine("B.Dispose");
}
//...
}
class C : IDisposable
{
public void Dispose()
{
Console.WriteLine("C.Dispose");
}
//...
}
}
3
eden tarafından boşaltılmalıdır. CLR sistemi bu kaynağın tahsis edilmiş
olduğunu anlayamaz. Hâlbuki biz dosyayı, FileStream sınıfı ile açarsak,
bizim için FileStream nesnesi yönetilebilen bir kaynaktır. Çünkü biz bu
dosyayı kapatmasak bile çöp toplayıcı, bu nesneyi silerken dosyanın
kapatılması olasılığı vardır.
GC.SuppressFinalize(this);
}
// yönetilemeyen kaynakları boşalt
}
public void Dispose() //Arayüz fonksiyonu
{
Dispose(true);
}
~Sampe()
{
Dispose(false);
}
}
4
programcı tarafından çağrılırsa, çöp toplayıcı tarafından artık bitiş
fonksiyonu çağrılmamaktadır. Aksi takdirde yönetilemeyen kaynaklar iki
kez boşaltılacaktır.
IEnumerator
ICollection
IList IDirectory
interface IEnumerable
{
IEnumerator GetEnumerator
}
5
void CopyTo (Array array, int index)
HOCANIN ÖRNEĞİ
using System;
using System.IO;
using System.Collections;
namespace CSD
{
class App
{
public static void Main()
{
ArrayList al = new ArrayList();
al.Insert(5, 100);
6
int IndexOf (Object value)
Hocanın Örneği
using System;
using System.IO;
using System.Collections;
namespace CSD
{
class App
{
public static void Main()
{
ArrayList al = new ArrayList();
al.Clear();
Hocanın Örneği
using System;
using System.IO;
using System.Collections;
namespace CSD
{
class App
{
public static void Main()
{
ArrayList al = new ArrayList();
7
Console.WriteLine("Eleman Sayısı: {0}", al.Count);
foreach (int x in al)
Console.WriteLine(x);
Console.WriteLine(index);
}
}
}
c[index] = val;
ArrayList SINIFI
8
anahtar verildiğinde değer alınabilmektedir. Anahtar ve değer çifti, object
olarak saklanıp geri verilmektedir. Dolayısıyla anahtar ve değer herhangi
bir türden olabilir. Örneğin; bir şehrin plaka numarası anahtar, o şehrin
diğer bilgileri değer olabilir. En çok kullanılan sözlük tarzı sınıf Hashtable
sınıfıdır. Bu sınıfta anahtar ve değer, Add fonksiyonu ile girilebilir. Bilginin
geri alınması, indeksleyici ile yapılabilir. İndeksleyicide [] içerisine anahtar
girilmelidir. Örnek1:
using System;
using System.IO;
using System.Collections;
namespace CSD
{
class App
{
public static void Main()
{
Hashtable ht = new Hashtable();
Console.WriteLine(name);
}
}
}
Örnek2:
using System;
using System.IO;
using System.Collections;
namespace CSD
{
class App
{
public static void Main()
{
Hashtable ht = new Hashtable();
9
Console.WriteLine(no);
}
}
}
Pek çok uygulamanın yani prosesin, tek bir ana penceresi vardır.
Fakat bir program, birden fazla ana pencereye sahip olabilir. Görev
çubuğu, ana pencereleri gösterir. Çalışan programlar görev yöneticisinden
(task manager) görüntülenebilir.
10
modelinde, işletim sistemi daha birinci elden bir takım olayları izler ve
bunu programlara kendisi iletir. Örneğin; farenin program penceresinin
sınırları içerisinde bir tuşuna basılması ya da program aktifken klavyeden
bir tuşa basılması birer olaydır. Windows bu olayları sayısal bilgi olarak
paketleyip ilgili programa iletir.
Windows işletim sistemi her bir thread mesaj kuyruğu denilen bir kuyruk
sistemi oluşturur. Windows bir pencere üzerinde olay gerçekleştiğinde, bu
olayı bir mesaj biçiminde ifade ederek, o pencere hangi thread tarafından
yaratılmışsa, o threadın mesaj kuyruğuna iletmektedir. Görüldüğü gibi
Windows yalnızca olayları belirleyip kuyruğa yazmaktadır. Mesajların
kuyruktan alınması ve işlenmesi programın sorumluluğundadır. Bunu
programcı sağlamak zorundadır. O halde GUI programı oluşturan
programcı, sürekli bu kuyruğa bakmalı, kuyrukta sırada bulunan mesajı
almalı ve işlemelidir. Buna mesaj döngüsü(message loop) denmektedir.
Mesaj döngüsünün oluşturulması, mesajların alınarak işlenmesi
Application sınıfının, Run fonksiyonları tarafından yapılmaktadır. O halde
programcının Main fonksiyonunda, bu fonksiyonu çağırarak mesaj
döngüsüne girmelidir. Mesaj döngüsünden çıkıldığında Main sonlanır ve
dolayısıyla program da sonlanır. Mesaj döngüsünden çıkma, ana
pencerenin kapatılması ile olur. Yani kullanıcı programın ana penceresini
kapatır. Application.Run fonksiyonu sonlanır. Böylece Main fonksiyonu da
biter ve program sonlanmış olur.
using System;
using System.Windows.Forms;
namesapace CSD
{
class App
{
public static void Main()
{
/*MyForm mf = new MyForm
Application.Run(mf);bu şekilde de yapılabilir.*/
Application.Run(new MyForm());
}
}
class MyForm : Form
{
//...
11
}
}
Application.Run(mf2);
}
12
kullanılsaydı, pencereler kapatılsa bile Run fonksiyonu sonlanmazdı. Bu
durumda program çalışıyor durumda görev yöneticisinde görülmektedir.
Anahtar Notlar
Win32 sistemlerinde her threadın ayrı bir mesaj kuyruğu vardır. Bir
threadın açtığı tüm pencerelere ilişkin mesajlar aynı kuyruğa yazılır.
Application.Run fonksiyonu dolayısıyla tüm pencerelere ilişkin mesajları
işler. Fonksiyona geçtiğimiz parametre yalnızca hangi pencere
kapatıldığında programdan çıkılacağını belirtir.
-Point Yapısı
Bu yapı System.Drawing isim alanındadır. Point yapısı, yalnızca bir
noktanın x ve y bileşenlerini tutan ve bazı basit işlemleri yapan yardımcı
bir yapıdır. Yapının iki parametreli başlangıç fonksiyonu, yapının tutacağı
fonksiyonu set eder.
pt.X = 10;
pt.Y = 20;
Hocanın Örneği
using System;
using System.Collections;
using System.Drawing;
namespace CSD
{
class App
13
{
public static void Main()
{
Point pt = new Point();
pt.X = 10;
pt.Y = 20;
if (pt == pt2)
Console.WriteLine("Evet");
else
Console.WriteLine("Hayır");
}
}
}
using System;
using System.Collections;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Point pt = new Point(10, 20);
pt.Offset(1, 1);
-Size Yapısı
Size yapısı da System.Drawing isim alanındadır. Yapının başlangıç
fonksiyonlarıyla tutulacak yükseklik ve genişlik belirtilebilir.
14
Yapının Width, Height property elemanları, genişlik ve yükseklik
değerlerini get ve set etmede kullanılabilir. Örneğin:
Yapının iki Size değerinin toplayan ve iki Size değerini çıkaran operatör
fonksiyonları da vardır.
c = a + b;
Her ne kadar Point ile Size arasında mantıksal bir ilgi yoksa da, Size
değerini Point değerine dönüştüren, Point değerini de Size değerine
dönüştüren explicit tür dönüştürme operatör fonksiyonları vardır. Örneğin:
pt = (Point)sz;
-Rectangle Yapısı
Bu yapıda System.Drawing isim alanı içerisindedir. Dikdörtgensel bir alanı
tutmak için kullanılmaktadır. Yapının iki başlangıç fonksiyonu vardır.
Örneğin:
15
Sol üst köşe ve sağ alt köşe koordinatları ile Rectangle nesnesi
oluşturmak için Rectangle sınıfının static FromLTRB fonksiyonu
kullanılabilir. Örneğin:
{18.10.2007 Pazar}
Rectangle yapısının da ToString fonksiyonu, dikdörtgenin koordinatlarına
ilişkin bir yazı vermektedir.
using System;
using System.Collections;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Rectangle rect = new Rectangle(new Point(10, 20),
new Size(100, 100));
Console.WriteLine(rect.ToString());
}
}
}
Yapının Top, Left elemanları, sol üst köşe koordinatlarını veren read only
propertylerdir. Fakat X ve Y elemanları, sol üst köşe koordinatlarına ilişkin
read write property elemanlardır. Height ve Width property elemanlarda
read write elemanlardır.
using System;
using System.Collections;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Rectangle rect = new Rectangle(new Point(10, 20),
new Size(100, 100));
rect.Height = 500;
Console.WriteLine(rect.ToString());
16
}
}
}
Location property elemanı, sol üst köşe koordinatını Point olarak temsil
eder.
Hocanın örneği
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
g.DrawRectangle(Pens.Red, rect);
rect.Offset(10, 10);
g.DrawRectangle(Pens.Black, rect);
}
}
}
17
Yapının bir grup Inflate fonksiyonu vardır. Inflate fonksiyonu, yapının
tuttuğu dikdörtgeni sol üst ve sağ alt köşelerden açmak ya da büzmek için
kullanılır.
Hocanın Örneği
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
g.DrawRectangle(Pens.Red, rect);
Hocanın Örneği
using System;
using System.Windows.Forms;
18
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
g.DrawRectangle(Pens.Red, rect);
Hocanın Örneği
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
19
class MyForm : Form
{
public MyForm()
{
this.Paint += new
PaintEventHandler(MyForm_Paint);
this.ResizeRedraw = true;
}
g.DrawRectangle(Pens.Red, rect);
Hocanın Örneği
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
20
public MyForm()
{
this.Paint += new PaintEventHandler(MyForm_Paint);
this.MouseDown += new
MouseEventHandler(MyForm_MouseDown);
this.ResizeRedraw = true;
g.DrawRectangle(Pens.Red, m_rect);
}
}
}
Explicit
Implicit
Size SizeF
21
Rectangle RectangleF
Color YAPISI
public static Color FromArgb (int Red, int green, int blue)
Örneğin:
Kırmızı, yeşil ve mavi tonal bilgilerin dışında bir de Alpha faktörü de vardır.
Alpha faktörü de 0-255 arasında bir değer alır. Alpha faktörü, arka planın
gözükmesini ayarlamaktadır. Örneğin; Alpha faktörü 255 ise saydamsız, 0
ise tam saydamdır. Böylece aslında bir renk saydamlık derecesi ile birlikte
4 byte ile ifade edilir.
Hocanın Örneği
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
22
{
Rectangle m_rect;
public MyForm()
{
this.Paint += new PaintEventHandler(MyForm_Paint);
this.MouseDown += new
MouseEventHandler(MyForm_MouseDown);
this.ResizeRedraw = true;
try
{
image =
Image.FromFile(@"E:\WebApplicationSample\RoleSamples\App_Data\
triomph.jpg");
g.DrawImage(image, this.ClientRectangle);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
23
public static Color Red (get;)
Color c = Color.Turquoise;
Color c = Color.FromName(“Blue”)
Şüphesiz buradaki renk isimleri, static property ile belirtilen renk isimleri
ile uymalıdır.
Ayrıca Color yapısı ile ilgili KnownColor isimli bir enum türü de vardır. Bu
enum türü, bütün temel renkleri içermektedir. KnownColor değerini alarak
bir Color nesnesi veren, Color yapısının FromKnownColor isimli static
fonksiyonu vardır. Örneğin:
Color c = Color.FromKnownColor(KnownColor.Red);
Anahtar Notlar
24
bilgisini parametre olarak alır ve tüm enum sabit yazılarını bir dizi olarak
elde eder. Örneğin:
foreach (int x in a)
Console.WriteLine(x);
}
Anahtar Notlar
Programın ana penceresi, Form isimli bir sınıfla temsil edilmiştir. Form
sınıfı da dolaylı olarak Control sınıfından türetilmiştir.
Form
25
... Button Form ListBox ...
Anahtar Notlar
Anahtar Notlar
Taban sınıf elemanlarına base anahtar sözcüğü ile erişmek, this anahtar
sözcüğü ile erişmekten okunabilirlik açısından daha iyidir. Fakat
Microsoft kendi örneklerinde this anahtar sözcüğünü tercih etmektedir.
Bu tercih muhtemelen programcıları da yanlış etkilemiştir.
Text PROPERTYSİ: Her pencerede bir yazı kavramı vardır. Örneğin; ana
pencere için bu yazı, pencere başlığındaki yazı, düğme için bu yazı
düğmenin üzerindeki yazıdır.
Hocanın Örneği
26
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
Hocanın Örneği
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
27
}
}
base.BackColor = SystemColors.Window;
base.BackColor = SystemColors.ActiveCaption;
base.StartPosition = FormStartPosition.CenterScreen;
28
base.StartPosition =
FormStartPosition.WindowsDefaultLocation;
base.StartPosition = FormStartPosition.Manual;
base.Size = new Size(100, 200);
base.Location = new Point(0, 0);
base.StartPosition = FormStartPosition.Manual;
base.Left = 0;
base.Top = 0;
base.StartPosition = FormStartPosition.Manual;
base.Location = new Point(0, 0);
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
29
{
Application.Run(new MyForm());
}
}
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
class MyForm : Form
{
public MyForm()
{
base.StartPosition = FormStartPosition.Manual;
base.Bounds = new Rectangle(100, 100, 500, 500);
}
}
}
Top Width
Left Height
30
Bottom(Read only) Size
Right(Read only) Location
Bounds
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
MessageBox.Show(base.Size.ToString());
}
}
}
using System;
using System.Windows.Forms;
using System.Drawing;
31
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
using System;
using System.Windows.Forms;
32
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
public MyForm()
{
m_childWnd = new Control();
base.Controls.Add(m_childWnd);
}
}
}
Anahtar Notlar
Bir alt pencere Control sınıfı ile yaratıldığında zemin rengi, otomatik
olarak üst pencereden alınır. Yaratılmış alt pencerenin sınır çizgileri ile
başlık kısmı yoktur. Genişlik ve yükseklik değerleri 0’dır. Bu nedenle
programcının alt pencereyi yaratıktan sonra buna bir genişlik ve yükseklik
ataması ve duruma göre bir zemin rengi vermesi gerekir. Alt pencerenin
ayrıca görünür hale getirilmesine gerek yoktur. Çünkü üst pencereye
bağlama sırasında pencere zaten görünür yapılmaktadır.
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
33
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
public MyForm()
{
base.Text = "TestWindow";
base.Controls.Add(m_childWnd);
}
}
}
Örneğin:
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
34
private Control m_childWnd1;
private Control m_childWnd2;
public MyForm()
{
base.Text = "TestWindow";
base.Controls.AddRange(new Control[]
{ m_childWnd1, m_childWnd2 });
}
}
}
base.Controls.Add(m_childWnd); ile
Hocanın Örneği:
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
35
public MyForm()
{
base.Text = "TestWindow";
m_childWnd.Parent = this;
}
}
}
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
public MyForm()
{
36
base.Text = "TestWindow";
public MyControl1()
{
m_c = new MyControl2();
m_c.Bounds = new Rectangle(20, 20, 20, 20);
base.Controls.Add(m_c);
base.BackColor = Color.Red;
//...
}
}
Anahtar Notlar
Bir ana pencere için orjin noktası, masaüstünün sol üst köşesidir. Fakat
alt pencereler için orjin noktası, üst pencerenin çalışma alanının sol üst
köşesidir.
Form sınıfındaki elemanlar, yalnızca ana pencere için söz konusu olan
elemanlardır. Sınıfın MaximizeBox isimli bool türden property elemanı,
maximize kutucuğunu kaldırmak için kullanılabilir. Default durum true‘dur.
37
Sınıfın MinimizeBox isimli property elemanı da minimize kutucuğunu
kaldırmak için kullanılabilir. Örneğin:
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
public MyForm()
{
base.Text = "TestWindow";
base.MaximizeBox = false;
base.MinimizeBox = false;
public MyControl1()
{
m_c = new MyControl2();
m_c.Bounds = new Rectangle(20, 20, 20, 20);
base.Controls.Add(m_c);
base.BackColor = Color.Red;
//...
}
}
38
base.BackColor = Color.Blue;
}
}
}
Anahtar Notlar
Sınıfın bir elemanın ismi ile onun türünün ismi aynı olabilir. Bu durum
sorun yaratmaz. .Net sınıf sisteminde bir isim kalabalıklığı oluşturmamak
için bu yönteme başvurulmuştur. Bu durumda bu isim “.” operatörü ile
kullanılırsa tür ismi niteliksiz olarak kullanılırsa eleman ismi anlamına
gelir.
Hocanın Örneği:
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
public MyForm()
{
base.Text = "TestWindow";
base.MaximizeBox = false;
base.FormBorderStyle =
FormBorderStyle.FixedDialog;
39
}
}
public MyControl1()
{
m_c = new MyControl2();
m_c.Bounds = new Rectangle(20, 20, 20, 20);
base.Controls.Add(m_c);
base.BackColor = Color.Red;
//...
}
}
Hocanın Örneği:
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
public MyForm()
{
40
base.Text = "TestWindow";
base.MaximizeBox = false;
base.ControlBox = false;
public MyControl1()
{
m_c = new MyControl2();
m_c.Bounds = new Rectangle(20, 20, 20, 20);
base.Controls.Add(m_c);
base.BackColor = Color.Red;
//...
}
}
Hocanın Örneği:
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
41
Application.Run(new MyForm());
}
}
public MyForm()
{
base.Text = "TestWindow";
base.MaximizeBox = false;
base.ShowIcon = false;
base.TopMost = true;
public MyControl1()
{
m_c = new MyControl2();
m_c.Bounds = new Rectangle(20, 20, 20, 20);
base.Controls.Add(m_c);
base.BackColor = Color.Red;
//...
}
}
Hocanın Örneği:
using System;
42
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
public MyForm()
{
base.Text = "TestWindow";
base.MinimumSize = new Size(100, 100);
base.MaximumSize = new Size(400, 400);
public MyControl1()
{
m_c = new MyControl2();
m_c.Bounds = new Rectangle(20, 20, 20, 20);
base.Controls.Add(m_c);
base.BackColor = Color.Red;
//...
}
}
43
Form sınıfının double türden Opacity elemanı 0 ile 1 arasında
saydamlık belirten değer alır. 1 değeri tam saydamsız, 0 değeri tam
saydamlıdır.
Hocanın Örneği:
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
public MyForm()
{
base.Text = "TestWindow";
base.MinimumSize = new Size(100, 100);
base.MaximumSize = new Size(400, 400);
this.Opacity = 0.5;
public MyControl1()
{
m_c = new MyControl2();
m_c.Bounds = new Rectangle(20, 20, 20, 20);
base.Controls.Add(m_c);
base.BackColor = Color.Red;
//...
}
}
44
class MyControl2 : Control
{
public MyControl2()
{
base.BackColor = Color.Blue;
}
}
}
45
OnClick sanal fonksiyonunu override edersek bu durumda bizim
fonksiyonumuz çağrılır. Örneğin:
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
EventArgs
MouseEventArgs KeyEventArgs
46
Programcı şunları bilmelidir:
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
47
}
}
}
class Control
{
//...
protected virtual void OnMouseDown(MouseEventArgs mea)
{
MouseDown(this, mea);
}
//...
}
48
Özetle Application.Run fonksiyonu OnXXX fonksiyonunu
çağırmakta, Control sınıfının OnXXX fonksiyonu da XXX event elemanını
tetiklemektedir. Şüphesiz OnXXX fonksiyonunun parametresi Windows’un
kuyruğa bıraktığı mesajı alan Application.Run tarafından
oluşturulmaktadır.
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
TEMEL MESAJLAR
Fare Mesajları:
49
En temel fare mesajı Click mesajıdır. Çağrılan sanal fonksiyon
OnClick, ilgili event eleman Click ismindedir. Mesaj parametre sınıfı
EventArgs sınıfındandır. Click event elemanı EventHandler delege
türündendir. Click mesajı bize hangi noktaya click yapıldığı bilgisini
vermez. Farenin aktif tuşu etkilidir.
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
50
}
}
}
Resize Mesajı:
Sınıf Çalışması:
Control sınıfından bir sınıf türeterek alt pencere için bir sınıf oluşturunuz.
Ana pencerenin içerisinde, bu sınıfı kullanarak kırmızı zemin renkli bir alt
pencere yaratınız. Alt pencere için MouseDown mesajını hem OnMouseDown
mesajını override ederek hem de MouseDown event elemanına fonksiyon
girerek işleyiniz.
Çözüm:
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
51
{
Application.Run(new MyForm());
}
}
public MyForm()
{
Text = "Test Child Window";
Controls.Add(m_mc);
}
}
base.OnMouseDown(e);
}
}
}
Sınıf Çalışması:
Bir form içine 5 satır 5 sütun olmak üzere toplam 25 adet rasgele zemin
renklerinden oluşan alt pencere yaratınız. Alt pencerelerin hepsi Control
sınıfından türetilen MyControl isimli sınıftan yaratılacaktır. Sonra alt
pencerelerin her biri için text propertysine 1’den 25’e kadar sayı
52
yerleştiriniz. Daha sonra click mesajını işleyiniz. Click mesajı oluştuğunda
alt pencere text propertysini MessageBox ile yazdırınız.
Çözüm:
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
53
}
—Düğme Kontrolleri:
Düğmeler(push buttons), fare ile tıklandığında basılma hareketi
yapan, el fareden çekildiğinde çekilme hareketi yaparak bir olayı başlatan
en popüler kontrollerdendir. Genellikle bir hareketi başlatmak ya da
sonlandırma için kullanılır. .Nette düğme kontrolü Button sınıfı ile temsil
edilmektedir.
Control
ButtonBase
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
54
class MyForm : Form
{
private Button m_buttonOK;
private Button m_buttonCancel;
public MyForm()
{
base.Text = "Sample buttons";
base.Controls.AddRange(new Control[]
{ m_buttonOK, m_buttonCancel });
}
}
}
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
class MyForm : Form
{
private Button m_buttonOK;
private Button m_buttonCancel;
public MyForm()
{
base.Text = "Sample buttons";
55
m_buttonOK.Text = "&Ok";
m_buttonOK.Location = new Point(50, 100);
m_buttonOK.Click += new
EventHandler(buttonOkClickHandler);
base.Controls.AddRange(new Control[]
{ m_buttonOK, m_buttonCancel });
}
Anahtar Notlar
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
56
public static void Main()
{
Application.Run(new MyForm());
}
}
public MyForm()
{
base.Text = "Sample buttons";
Anahtar Notlar
57
Control sınıfının bool türden Enabled isimli propertry elemanı,
read/write elemandır. Bu propertynin default değeri true’dur. Yani
pencere aktif durumdadır. Bu propertye False değeri geçirilerek pencere
pasif duruma getirilebilir. Bir pencere pasif durumda iken, Windows
pencereye fare ve klavye mesajlarının yollamaz. Böylece örneğin düğme
kontrolü pasif hale getirilirse düğmeye tıklamak bir sonuca yol açmaz.
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
public MyForm()
{
base.Text = "Sample buttons";
58
private void buttonOkClickHandler(object o, EventArgs
e)
{
m_buttonOK.Enabled = false;
m_buttonCancel.Enabled = true;
}
Anahtar Notlar
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
public MyForm()
{
base.Text = "Sample buttons";
59
m_buttonOK.Click += new
EventHandler(buttonOkClickHandler);
m_buttonOK.Visible = true;
public MyForm()
{
base.Text = "Sample buttons";
60
m_buttonOK.Location = new Point(50, 100);
m_buttonOK.Size = new Size(100, 100);
m_buttonOK.Click += new
EventHandler(buttonOkClickHandler);
m_buttonOK.Visible = true;
m_buttonOK.TextAlign =
ContentAlignment.BottomCenter;
m_buttonOK.FlatStyle = FlatStyle.Flat;
base.Controls.AddRange(new Control[]
{ m_buttonOK, m_buttonCancel });
}
Anahtar Notlar
—TextBox Kontrolü
TextBox kontrolü, programcının kullanıcıdan yazısal bir giriş elde
etmesini sağlamaktadır. Kontrol bir alt pencere oluşturur. Kullanıcı bir edit
alanı olarak bu alt pencereye yazıyı girer sonra programcı girilen yazıyı
elde eder. TextBox kontrolü TextBox sınıfı ile temsil edilmektedir.
Control
TextBoxBase
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
public MyForm()
{
m_textBox = new TextBox();
m_textBox.Text = "Bu yazı kontrolde
görüntülenecek";
m_textBox.Location = new Point(50, 100);
m_textBox.Size = new Size(200, 30);
base.Controls.Add(m_textBox);
base.Controls.Add(m_buttonOK);
62
}
public MyForm()
{
m_textBox = new TextBox();
m_textBox.Text = "Bu yazı kontrolde
görüntülenecek";
m_textBox.Location = new Point(50, 100);
m_textBox.Size = new Size(200, 30);
m_textBox.TextAlign = HorizontalAlignment.Right;
base.Controls.Add(m_textBox);
base.Controls.Add(m_buttonOK);
}
public MyForm()
{
m_textBox = new TextBox();
m_textBox.Text = "Bu yazı kontrolde
görüntülenecek";
m_textBox.Location = new Point(50, 100);
m_textBox.Size = new Size(200, 30);
m_textBox.CharacterCasing =
CharacterCasing.Upper;
63
m_buttonOK = new Button();
m_buttonOK.Text = "&Ok";
m_buttonOK.Location = new Point(100, 150);
m_buttonOK.Click += new
EventHandler(buttonOkClickHandler);
base.Controls.Add(m_textBox);
base.Controls.Add(m_buttonOK);
}
public MyForm()
{
m_textBox = new TextBox();
m_textBox.Text = "Bu yazı kontrolde
görüntülenecek";
m_textBox.Location = new Point(50, 100);
m_textBox.Size = new Size(200, 30);
m_textBox.CharacterCasing =
CharacterCasing.Upper;
m_textBox.ReadOnly = true;
base.Controls.Add(m_textBox);
base.Controls.Add(m_buttonOK);
}
64
public MyForm()
{
m_textBox = new TextBox();
m_textBox.Location = new Point(20, 100);
m_textBox.Size = new Size(200, 100);
m_textBox.BackColor = Color.Blue;
m_textBox.ForeColor = Color.Yellow;
m_textBox.Multiline = true;
base.Controls.Add(m_textBox);
base.Controls.Add(m_buttonOK);
}
Anahtar Notlar
public MyForm()
{
base.Text = "Sample";
base.Resize += new EventHandler(resizeHandler);
base.Controls.Add(m_textBox);
65
TextBox sınıfının bool türden WordWrap isimli property elemanı,
sözcük sarma işlemini gerçekleştirir. Default durum true biçimindedir. Yani
sarma yapılmaktadır.
public MyForm()
{
base.Text = "Sample";
base.Resize += new EventHandler(resizeHandler);
base.Controls.Add(m_textBox);
}
public MyForm()
{
base.Text = "Sample";
base.Resize += new EventHandler(resizeHandler);
base.Click += new EventHandler(MyForm_Click);
base.Controls.Add(m_textBox);
66
void MyForm_Click(object sender, EventArgs e)
{
string[] lines = { "Kaan", "Ali", "Necati",
"Güray" };
m_textBox.Lines = lines;
}
{02.12.2007 Pazar }
public MyForm()
{
base.Text = "Sample";
base.Resize += new EventHandler(resizeHandler);
base.Controls.Add(m_textBox);
}
public MyForm()
{
base.Text = "Sample";
base.Resize += new EventHandler(resizeHandler);
base.Controls.Add(m_textBox);
}
67
TextBox sınıfının TextBoxBase sınıfından gelen SelectionLenght
isimli property elemanı, belirtilen indeksten itibaren kaç karakterin
seçilmiş olduğunu belirtir. SelectionStart ve SelectionLenght property
elemanlarına değer atayarak, programlama yoluyla seçme işlemi
yaptırabiliriz ya da seçilen bölgenin yerini ve uzunluğunu elde edebiliriz.
Seçilmiş olan yazıyı uzun bir yöntemle aşağıdaki gibi elde edebiliriz:
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
public MyForm()
{
base.Text = "Sample";
base.Resize += new EventHandler(resizeHandler);
base.Click += new EventHandler(MyForm_Click);
base.Controls.Add(m_textBox);
}
MessageBox.Show(str);
}
private void resizeHandler(object o, EventArgs e)
68
{
m_textBox.Bounds = base.ClientRectangle;
}
}
}
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
public MyForm()
{
base.Text = "Sample";
base.Resize += new EventHandler(resizeHandler);
base.Click += new EventHandler(MyForm_Click);
base.Controls.Add(m_textBox);
}
69
m_textBox.Bounds = base.ClientRectangle;
}
}
}
Eğer Start parametresine bir değer verilir, Lenght “0” da tutulursa, seçme
işlemi yapılmaz. Bunun yerine imleç belli bir indekse taşınır. Aynı işlem
yalnızca SelectionStart‘a değer verilerek de yapılabilir.
m_multiTextBox.Text = m_SingleTextBox.Text;
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
70
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
public MyForm()
{
base.Text = "Sample Chat";
base.Size = new Size(600, 350);
base.FormBorderStyle = FormBorderStyle.Fixed3D;
71
MessageBox SINIFI
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
public MyForm()
{
base.Text = "Sample";
base.Resize += new EventHandler(resizeHandler);
base.Click += new EventHandler(MyForm_Click);
72
base.Controls.Add(m_textBox);
}
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
class MyForm : Form
{
private TextBox m_textBox;
public MyForm()
{
base.Text = "Sample";
base.Resize += new EventHandler(resizeHandler);
base.Click += new EventHandler(MyForm_Click);
base.Controls.Add(m_textBox);
}
73
void MyForm_Click(object sender, EventArgs e)
{
DialogResult dr = MessageBox.Show("İç yazı",
"Caption", MessageBoxButtons.YesNo,
MessageBoxIcon.Exclamation);
if (dr == DialogResult.Yes)
MessageBox.Show("Yes");
else
MessageBox.Show("No");
}
ColorDialog PENCERESİ
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
class MyForm : Form
{
private Button m_buttonOK;
public MyForm()
74
{
base.Text = "Choose a color!";
if (cd.ShowDialog() == DialogResult.OK)
{
base.BackColor = cd.Color;
}
}
}
}
if (cd.ShowDialog() == DialogResult.OK)
{
base.BackColor = cd.Color;
}
}
75
cd.SolidColorOnly = true;
if (cd.ShowDialog() == DialogResult.OK)
{
base.BackColor = cd.Color;
}
}
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
public MyForm()
{
base.Text = "Choose a color!";
cd.CustomColors = m_custColors;
76
if (cd.ShowDialog() == DialogResult.OK)
{
base.BackColor = cd.Color;
m_custColors = cd.CustomColors;
}
}
}
}
Anahtar Notlar
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
public MyForm()
{
base.Text = "Choose a color!";
77
Color.White.ToArgb(), Color.White.ToArgb(),
Color.White.ToArgb(), Color.White.ToArgb(),
Color.White.ToArgb(), Color.White.ToArgb(),
Color.White.ToArgb(), Color.White.ToArgb(),
Color.White.ToArgb()
};
void buttonClickHandler(object sender, EventArgs e)
{
ColorDialog cd = new ColorDialog();
cd.CustomColors = m_custColors;
if (cd.ShowDialog() == DialogResult.OK)
{
base.BackColor = cd.Color;
m_custColors = cd.CustomColors;
}
}
}
}
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
class MyForm : Form
78
{
private CheckBox m_checkBox;
public MyForm()
{
m_checkBox = new CheckBox();
m_checkBox.Location = new Point(100, 100);
m_checkBox.Text = "Kabul mü?";
m_checkBox.Parent = this;
}
}
}
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
public MyForm()
{
m_checkBox = new CheckBox();
m_checkBox.Location = new Point(100, 100);
m_checkBox.Size = new Size(100, 100);
m_checkBox.Text = "Kabul mü?";
m_checkBox.TextAlign = ContentAlignment.TopLeft;
m_checkBox.Parent = this;
}
}
}
LABEL KONTROLÜ
79
Label kontrolü en basit alt penceredir. Label sınıfı ile temsil edilmiştir. Bu
alt pencerenin amacı bir yazıyı göstermektir. Label türünden bir nesne,
default başlangıç fonksiyonu ile yaratılır. Sonra Text propertysine değer
atanarak gösterilecek yazı belirlenir.
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
public MyForm()
{
m_checkBox = new CheckBox();
m_checkBox.Location = new Point(100, 100);
m_checkBox.Size = new Size(100, 100);
m_checkBox.Text = "Kabul mü?";
m_checkBox.TextAlign = ContentAlignment.TopLeft;
using System.IO;
namespace CSD
{
class App
{
public static void Main()
{
80
FileInfo fi = new
FileInfo(@"E:\CSCUPA\Sample\sample.cs");
Control
ButtonBase
Bir RadioButton
radyo düğmesi kontrolü, bir alt pencerenin
Button içerisinde bir
CheckBox
yuvarlakçık ve onun yanında bir yazı ile temsil edilmiştir. Tıpkı seçenek
kutusu kontrolünde olduğu gibi, otomatik versiyonları vardır. Default
durum otomatik olmasıdır. Otomatik radio düğmesi kontrolünde, bir radio
düğmesine tıklandığında daha önce tıklanmış olanın çarpısı otomatik
olarak kaldırılır. Tüm kardeş radio düğmesi pencereleri, kendi aralarında
bir grup oluşturmaktadır. Grup içerisindeki bir radio düğmesine
tıklandığında, daha önce çarpısı olanın çarpısı kaldırılır. Bu durumda aynı
form üzerinde iki farklı radio düğmesi grubu oluşturmak için, mecburen
sözde bir formun alt penceresi olacak bir pencere yaratmak gerekir. Grubu
oluşturacak radio düğmeleri, bu sözde alt pencere içerisinde yaratılır. Bu
amaçla kullanılan en yaygın alt pencere GroupBox isimli kontroldür.
81
hem de ilgili radio düğme kontrolünün çarpılanıp çarpılanmadığını
anlamak için kullanılır. Programcının tek tek tüm radyo düğmelerine
check sorgulaması yapması gerekir. Örneğin:
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
public MyForm()
{
m_buttonA = new RadioButton();
m_buttonA.Text = "&A";
m_buttonA.Location = new Point(0, 20);
82
m_buttonOK = new Button();
m_buttonOK.Text = "&Ok";
m_buttonOK.Location = new Point(120, 45);
m_buttonOK.Click += new
EventHandler(m_buttonOK_Click);
this.Controls.AddRange(new Control[]
{ m_buttonA, m_buttonB, m_buttonC,
m_buttonD, m_buttonE, m_buttonOK });
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
83
}
public MyForm()
{
m_buttonA = new RadioButton();
m_buttonA.Text = "&A";
m_buttonA.Location = new Point(0, 20);
this.Controls.AddRange(new Control[]
{ m_buttonA, m_buttonB, m_buttonC,
m_buttonD, m_buttonE, m_buttonOK });
84
{
rb = c as RadioButton;
if (rb != null && rb.Checked)
{
MessageBox.Show(rb.Text + " Checked");
break;
}
}
}
//...
}
}
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
85
private Button m_buttonOK;
public MyForm()
{
m_buttonA = new RadioButton();
m_buttonA.Text = "&A";
m_buttonA.Location = new Point(0, 20);
m_buttonA.CheckedChanged += new
EventHandler(checkedChangeHandler);
this.Controls.AddRange(new Control[]
{ m_buttonA, m_buttonB, m_buttonC,
m_buttonD, m_buttonE, m_buttonOK });
86
if (rb.Checked)
{
MessageBox.Show(rb.Text + " Checked");
}
}
GroupBox KONTROLÜ
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
87
}
}
public MyForm()
{
m_groupBox = new GroupBox();
m_groupBox.Text = "Answer";
m_groupBox.Location = new Point(0, 100);
m_groupBox.Size = new Size(200, 140);
88
m_buttonOK = new Button();
m_buttonOK.Text = "&Ok";
m_buttonOK.Location = new Point(120, 45);
m_buttonOK.Click += new
EventHandler(m_buttonOK_Click);
m_groupBox.Controls.AddRange(new Control[]
{m_buttonA, m_buttonB, m_buttonC, m_buttonD, m_buttonE});
if (rb.Checked)
{
MessageBox.Show(rb.Text + " Checked");
}
}
LİSTELEME KUTULARI
89
public ObjectCollection Items {get; }
Anahtar Notlar
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
public MyForm()
{
m_lb = new ListBox();
m_lb.Bounds = new Rectangle(100, 50, 100, 200);
m_lb.Items.Add("Ankara");
m_lb.Items.Add("İzmir");
m_lb.Items.Add("Eskişehir");
m_lb.Items.Add(123);
m_lb.Items.Add(new Point(100, 200));
90
m_lb.Parent = this;
}
}
}
Control
ListControl
ListBox ComboBox
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
public MyForm()
{
m_lb = new ListBox();
m_lb.Bounds = new Rectangle(100, 50, 100, 200);
91
for (int i = 1; i <= 100; ++i)
m_lb.Items.Add("Item No: " + i);
m_lb.Parent = this;
}
}
}
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
public MyForm()
{
m_lb = new ListBox();
m_lb.Bounds = new Rectangle(50, 50, 100, 200);
m_lb.Parent = this;
m_buttonOK.Parent = this;
92
}
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
public MyForm()
{
m_lb = new ListBox();
m_lb.Bounds = new Rectangle(50, 50, 100, 200);
m_lb.Parent = this;
m_buttonOK.Parent = this;
}
93
void m_buttonOK_Click(object sender, EventArgs e)
{
string str = (string)m_lb.SelectedItem;
MessageBox.Show(str);
}
}
}
Hocanın Örneği:
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
public MyForm()
{
m_lb = new ListBox();
m_lb.Bounds = new Rectangle(50, 50, 100, 200);
m_lb.Parent = this;
m_buttonOK.Parent = this;
}
94
{
Point pt = (Point)m_lb.SelectedItem;
MessageBox.Show(pt.ToString());
}
}
}
m_lb.SelectionMode = SelectionMode.None;
m_lb.SelectionMode = SelectionMode.MultiSimple;
m_lb.SelectionMode = SelectionMode.MultiExtended;
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
95
{
private ListBox m_lb;
private Button m_buttonOK;
public MyForm()
{
m_lb = new ListBox();
m_lb.Bounds = new Rectangle(50, 50, 100, 200);
m_lb.SelectionMode = SelectionMode.MultiExtended;
m_lb.Parent = this;
m_buttonOK.Parent = this;
}
MessageBox.Show(str);
}
}
}
96
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
public MyForm()
{
m_lb = new ListBox();
m_lb.Bounds = new Rectangle(50, 50, 100, 200);
m_lb.SelectionMode = SelectionMode.MultiExtended;
m_lb.DoubleClick += new
EventHandler(m_lb_DoubleClick);
m_lb.Parent = this;
m_buttonOK.Parent = this;
}
}
}
}
97
Diğer önemli bir event elemanı da SelectedIndexChange elemanıdır. Bu
event elemanı da EventHandler türündendir. Listeleme kutusundaki aktif
eleman fare, klavye ya da programlama yoluyla değiştirildiğinde tetiklenir.
Sınıf Çalışması: Yan yana iki tane listeleme kutusu oluşturunuz. Soldaki
listeleme kutusunda çeşitli şehir isimleri bulunsun. Sağdaki listeleme
kutusunda ise bu şehirlere ilişkin ilçeler görüntülensin. Sol şehir listesinde
herhangi bir şehir değiştiğinde soldaki elemanlar değişsin.
Çözüm:
using System;
using System.Drawing;
using System.Collections;
using System.Collections.Generic;
using System.Windows.Forms;
namespace Sehir
{
static class Program
{
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(fals
e);
Application.Run(new MyForm());
}
}
class MyForm : Form
{
private ListBox m_listBox_Sehir;
private ListBox m_listBox_Ilce;
private string[] Sehir = { "İstanbul", "İzmir",
"Giresun", "Ankara" };
private string[][] dizi = new string[4][];
public MyForm()
{
dizi[0] = new string[] { "beyoğlu", "Şişli",
"Tuzla", "Beşiktaş" };
dizi[1] = new string[] { "Tire", "Konak",
"Alsancak" };
dizi[2] = new string[] { "Görele", "Tirebolu",
"Keşap" };
dizi[3] = new string[] { "Kızılay", "Mamak" };
98
m_listBox_Sehir.Bounds = new Rectangle(10, 10,
150, 300);
m_listBox_Sehir.DoubleClick += new
EventHandler(double_Click);
m_listBox_Sehir.SelectedIndexChanged += new
EventHandler(double_Click);
m_listBox_Ilce = new ListBox();
m_listBox_Ilce.Bounds = new Rectangle(170, 10,
150, 300);
{09.12.2007 Pazar}
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
99
}
public MyForm()
{
base.Text = "Sample ListBox";
base.Size = new Size(500, 400);
m_lb.Parent = this;
m_buttonOK.Parent = this;
}
Seçimli listeleme kutuları, bir listeleme kutusu ile bir TextBox ve Label
kontrolünün birleşimi şeklindedir. ComboBox sınıfı ile temsil edilmiştir.
ComboBox sınıfının kullanımı da ListBox sınıfına çok benzemektedir.
Yalnızca seçilen eleman seçimli listeleme kutusunun edit kısmında
görüntülenir.
using System;
using System.Windows.Forms;
using System.Drawing;
100
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
public MyForm()
{
base.Text = "Sample ListBox";
base.Size = new Size(500, 400);
m_cb.Parent = this;
m_buttonOK.Parent = this;
}
}
}
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
101
{
public static void Main()
{
Application.Run(new MyForm());
}
}
public MyForm()
{
base.Text = "Sample ListBox";
base.Size = new Size(500, 400);
m_cb.Parent = this;
m_buttonOK.Parent = this;
}
MessageBox.Show(val.ToString());
}
}
}
Şüphesiz seçimli listeleme kutusunda çoklu seçim diye bir kavram yoktur.
Aynı zamanda çok sütunlu seçimli listeleme kutusu oluşturmakta mümkün
değildir.
102
değeri tek tek kontrollerin tuttuğu object elemanların üzerinde Equals
sanal fonksiyonu çağrılarak desteklenebilir.
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
public MyForm()
{
base.Text = "Sample ListBox";
base.Size = new Size(500, 400);
m_cb.SelectedItem = 10;
m_cb.Parent = this;
m_buttonOK.Parent = this;
}
MessageBox.Show(val.ToString());
103
}
}
}
KONTROLLERİN DEMİRLENMESİ
104
konumlandırma Control sınıfının OnResize fonksiyonunda yapılmaktadır.
Demirleme özelliği Control sınıfının Anchor propertysi ile belirlenir.
Anahtar Notlar
Bir enum türünün birden fazla elemanı tek çubuk(|) operatörü ile
birleştirilebilir. Bunun yapılabilmesi için ilgili enum türünün
FlagsAttibute ile özniteliklendirilmesi gerekir.
Çözüm:
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
105
Application.Run(new MyForm());
}
}
public MyForm()
{
m_buttonOK = new Button();
m_buttonOK.Text = "&Ok";
m_buttonOK.Size = new Size(70, 30);
m_buttonOK.Location = new
Point(base.ClientSize.Width / 2 -
35,base.ClientSize.Height/2-15); //çalışma alanına göre
ortalama
base.Resize += new
EventHandler(MyForm_ClientSizeChanged);
this.Controls.Add(m_buttonOK);
}
Sınıf Çalışması: Bir form penceresinin içerisine çok satırlı bir TextBox
kontrolü yerleştiriniz. Çok satırlı TextBox kontrolü, formun çalışma alanına
göre dörtkenardan eşit miktarda içerde olsun. Fakat form genişletip
daraltıldığında köşelere olan uzaklık korunsun.
PENCERELERDEKİ Z SIRASI
106
en sonda olan, en arkada gözükür. Şüphesiz kardeş pencereler birbirini
kesmedikten sonra z sırasının bir önemi yoktur.
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
public MyForm()
{
m_button1 = new Button();
m_button1.Location = new Point(100, 100);
m_button1.Text = "&Button 1";
m_button1.Click += new
EventHandler(m_button1_Click);
107
}
void m_button1_Click(object sender, EventArgs e)
{
this.Controls.Remove((Control)sender);
this.Controls.Add((Control) sender);
}
}
}
Bir şekli sürükleme oldukça basit bir mantığa dayanmaktadır. İlk tıklanan
nokta saklanır. Sonra fare kaydırıldığında o noktadan ne kadar delta x ve
delta y uzaklaştırıldığına bakılır. Tabi söz konusu olan bir kontrol ise
kontrolün fare mesajlarını işlemek gerekir. Kontrolden alınan fare
koordinatlarının, kontrolün çalışma alanı orijinine olduğu unutulmamalıdır.
Kontrol uygun miktarda hareket ettirildiğinde fare yine o kontrolde göreli
olarak aynı noktaya gelmiş olur. O halde şekli sürükleme şöyle yapılabilir:
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
108
}
public MyForm()
{
m_buttonOK = new Button();
m_buttonOK.Location = new Point(100, 100);
m_buttonOK.Text = "&Ok";
m_buttonOK.MouseDown += new
MouseEventHandler(m_buttonOK_MouseDown);
m_buttonOK.MouseMove += new
MouseEventHandler(m_buttonOK_MouseMove);
this.Controls.Add(m_buttonOK);
}
m_buttonOK.Location = new
Point(m_buttonOK.Left + deltaX, m_buttonOK.Top + deltaY);
}
}
{15.12.2007 Cumartesi}
109
Sınıf Çalışması: Boş bir form oluşturunuz. Fare ile sol tuşa tıklandığında
bir buton yaratınız. Fareyi hareket ettirdikçe düğmenin büyüklüğünü
değiştiriniz. El fareden çekilince düğmeyi belirlenen koordinatta yaratınız.
Çözüm:
using System;
using System.Drawing;
using System.Collections.Generic;
using System.Windows.Forms;
namespace NewControl
{
static class Program
{
static void Main()
{
Application.EnableVisualStyles();
Application.Run(new MyForm());
}
}
class MyForm : Form
{
private Button m_button;
private Button m_buttonClear;
private int deltaX, deltaY;
public MyForm()
{
m_buttonClear = new Button();
m_buttonClear.Text = "&Clear";
m_buttonClear.Click += new
EventHandler(m_buttonClear_Click);
m_buttonClear.Parent = this;
base.MouseDown += new
MouseEventHandler(MyForm_MouseDown);
base.MouseUp += new
MouseEventHandler(MyForm_MouseUp);
}
void m_buttonClear_Click(object sender, EventArgs e)
{
base.Controls.Clear();
m_buttonClear.Parent = this;
110
}
void MyForm_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
m_button = new Button();
m_button.Text = "&Ok";
m_button.Location = new Point(deltaX, deltaY);
m_button.Size = new Size(e.X - deltaX, e.Y -
deltaY);
//m_button.MouseMove += new
MouseEventHandler(m_button_MouseMove);
m_button.Parent = this;
}
}
void MyForm_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
deltaX = e.X;
deltaY = e.Y;
}
}
}
}
111
Menü çubuğu, MenuStrip sınıfı ile temsil edilmiştir. MenuStrip sınıfı,
ToolStrip sınıfından türetilmiştir. Üç önemli şerit kontrolünün türetme
biçimi şöyledir:
ToolStrip
MenuStrip StateStrip
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
public MyForm()
{
this.Text = "Sample Menu";
this.Controls.Add(m_mainMenu);
}
}
}
112
ToolStripItemCollection sınıfı, ismi üzerinde ToolStripItem türünden
nesneleri tutmaktadır. Yani kabaca ToolStrip sınıfının, ToolStripItem
nesnelerini tutuğu söylenebilir.
ToolStripItem
ToolStripDropDownItem
ToolStripMenuItem
File
113
Open
Fruit Apple
Close Orange
Banana
Anahtar Notlar
114
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
public MyForm()
{
this.Text = "Sample Menu";
115
m_fileFruitPopup.DropDownItems.AddRange(new
ToolStripItem[]
{ m_fileFruitAppleItem,
m_fileFruitOrangeItem, m_fileFruitBananaItem });
m_filePopup.DropDownItems.AddRange(new
ToolStripItem[] { m_fileOpenItem, m_fileFruitPopup,
m_fileCloseItem });
m_mainMenu.Items.Add(m_filePopup);
this.Controls.Add(m_mainMenu);
}
}
}
if (ofd.ShowDialog() == DialogResult.OK)
{
MessageBox.Show(ofd.FileName + " Seçildi");
}
}
ToolStripMenuItem sınıfının Enabled isimli bool türden property elemanı,
menü elemanını aktif yada pasif etmek için kullanılır. Pasif durumdaki
menü elemanları seçilemez ve sönük durumdadır. Default durum true
biçimindedir.
116
{
MessageBox.Show("Orange seçildi");
}
if (ofd.ShowDialog() == DialogResult.OK)
{
MessageBox.Show(ofd.FileName + " Seçildi");
m_fileOpenItem.Enabled = false;
m_fileCloseItem.Enabled = true;
}
}
{16.12.2007 Pazar}
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
117
private ToolStripMenuItem m_fileCloseItem;
private ToolStripMenuItem m_fileFruitAppleItem;
private ToolStripMenuItem m_fileFruitOrangeItem;
private ToolStripMenuItem m_fileFruitBananaItem;
public MyForm()
{
this.Text = "Sample Menu";
m_fileFruitPopup.DropDownItems.AddRange(new
ToolStripItem[]
{ m_fileFruitAppleItem,
m_fileFruitOrangeItem, m_fileFruitBananaItem });
m_filePopup.DropDownItems.AddRange(new
ToolStripItem[]
{ m_fileOpenItem, m_fileFruitPopup,
m_fileCloseItem });
118
m_mainMenu.Items.Add(m_filePopup);
this.Controls.Add(m_mainMenu);
}
mi.Checked = !mi.Checked;
}
if (ofd.ShowDialog() == DialogResult.OK)
{
MessageBox.Show(ofd.FileName + " Seçildi");
m_fileOpenItem.Enabled = false;
m_fileCloseItem.Enabled = true;
}
}
}
}
m_fileFruitBananaItem.CheckOnClick = true;
Fakat genellikle bir menüde ya da araç çubuğunda “n” tane eleman vardır.
Bu “n” tane elemandan bir seçim yapıldığında o eleman checked yapılır.
Daha önce checked yapılmış olan unchecked yapılır.
119
Sınıf Çalışması: Bir form yaratınız. Bir menü çubuğuna Numbers isimli bir
popup yerleştiriniz. Bu popup içerisine üzerinde Item1, Item2 yazıları
bulunan 30 menü elemanını hiç veri elemanı bulundurmadan programlama
yoluyla popupa ekleyiniz. Sonra menüden herhangi bir eleman checked
yapınız. Daha önce seçilmiş olanı unchecked yapınız.
Çözüm:
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
public MyForm()
{
m_main = new MenuStrip();
m_numbers = new ToolStripMenuItem();
m_numbers.Text = "Numbers";
m_main.Items.Add(m_numbers);
120
foreach(ToolStripMenuItem a in
m_numbers.DropDownItems)
{
a.Checked = false;
}
tsm.Checked = true;
}
}
}
m_filePopup.DropDownItems.Add(“&File”);
Her ne kadar tavsiye edilmese de tüm menü sistemi bir tek bir ifade ile
yaratılabilir.
m_fileOpenItem.BackColor = Color.Turquoise;
m_fileOpenItem.ForeColor = Color.Red;
121
türden AutoSize propertysi false değerine çekilmelidir. Bu propertynin
default değeri true‘dir ve menü elemanının genişlik ve yükseklik değerleri
Text, Font propertysi dikkate alınarak ayarlanmaktadır.
Kısayol tuşu(shorcut key), hiç menüyü açmadan klavyeden sanki bir menü
elemanı seçilmiş etkisi yaratan tuş kombinasyonudur. ToolStripMenuItem
sınıfının ShorcutKeys isimli property elemanı Keys isimli enum türündendir.
Birden fazla değer “|” operatörü ile birleştirilebilir. Örneğin:
122
AutoToolTip property elemanı eğer true ise ipucu yazısı menü
elemanının Text propertysindeki yazı olarak alınır. Özetle ToolTipText
propertysine değer atanırsa ipucu yazısı olarak bu yazı görüntülenir. Eğer
yazı atanmazsa bu durumda AutoToolTip propertysine bakılır. Eğer bu
property true ise Text propertysindeki yazı, ipucu yazısı olarak
görüntülenir. False ise görüntülenme yapılmaz.
Bir programda aslında birden fazla menü çubuğu olabilir. Bunun için tek
yapılacak şey birden fazla MenuStrip nesnesi yaratıp Controls’e
eklemektir. İleride anlatılacak olan Dock özelliğinden dolayı son eklenen
menü çubuğu daha yukarıda görüntülenir.
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
public MyForm()
{
this.Text = "Sample Menu";
123
m_filePopup = new ToolStripMenuItem();
m_filePopup.Text = "&File";
m_fileFruitPopup.DropDownItems.AddRange(new
ToolStripItem[]
{ m_fileFruitAppleItem,
m_fileFruitOrangeItem, m_fileFruitBananaItem });
m_filePopup.DropDownItems.AddRange(new
ToolStripItem[]
{ m_fileOpenItem, m_fileFruitPopup,
m_fileCloseItem });
m_mainMenu.Items.Add(m_filePopup);
124
m_otherMenu.Items.Add(new
ToolStripMenuItem("Other"));
this.Controls.Add(m_mainMenu);
this.Controls.Add(m_otherMenu);
}
//mi.Checked = !mi.Checked;
}
if (ofd.ShowDialog() == DialogResult.OK)
{
MessageBox.Show(ofd.FileName + " Seçildi");
m_fileOpenItem.Enabled = false;
m_fileCloseItem.Enabled = true;
}
}
}
}
125
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
public MyForm()
{
this.Text = "Sample Menu";
126
m_fileCloseItem = new ToolStripMenuItem();
m_fileCloseItem.Text = "&Close";
m_fileCloseItem.Click += new
EventHandler(m_fileCloseItem_Click);
m_fileCloseItem.Enabled = false;
m_fileFruitPopup.DropDownItems.AddRange(new
ToolStripItem[]
{ m_fileFruitAppleItem,
m_fileFruitOrangeItem, m_fileFruitBananaItem });
m_filePopup.DropDownItems.AddRange(new
ToolStripItem[]
{ m_fileOpenItem, m_fileFruitPopup,
m_fileCloseItem });
m_mainMenu.Items.Add(m_filePopup);
m_otherMenu.Items.Add(new
ToolStripMenuItem("Other"));
m_otherMenu.Visible = false;
this.Controls.Add(m_mainMenu);
this.Controls.Add(m_otherMenu);
}
127
m_fileCloseItem.Enabled = false;
}
//mi.Checked = !mi.Checked;
}
if (ofd.ShowDialog() == DialogResult.OK)
{
MessageBox.Show(ofd.FileName + " Seçildi");
m_fileOpenItem.Enabled = false;
m_fileCloseItem.Enabled = true;
m_mainMenu.Visible = false;
m_otherMenu.Visible = true;
}
}
}
}
CommonDialog
FileDialog
128
OpenFileDialog SaveFileDialog
Programcı OpenFileDialog türünden bir nesneyi default başlangıç
fonksiyonu ile yaratır ve sınıfın ShowDialog fonksiyonunu çağırır. Örneğin:
if (ofd.ShowDialog() == DialogResult.OK)
{
MessageBox.Show(ofd.FileName);
}
}
129
if (ofd.ShowDialog() == DialogResult.OK)
{
MessageBox.Show(ofd.FileName);
}
}
Eğer gerçek filtreleme birden fazla joker ifade içeriyorsa “;” ile devam
edilmelidir.
if (ofd.ShowDialog() == DialogResult.OK)
{
MessageBox.Show(ofd.FileName);
}
}
if (ofd.ShowDialog() == DialogResult.OK)
{
MessageBox.Show(ofd.FileName);
}
}
130
ofd.Filter = "Text Files|*.txt;*.doc|All Files (*.*)|
*.*";
ofd.FilterIndex = 2;
ofd.DefaultExt = ".doc";
if (ofd.ShowDialog() == DialogResult.OK)
{
MessageBox.Show(ofd.FileName);
}
}
if (ofd.ShowDialog() == DialogResult.OK)
{
MessageBox.Show(ofd.FileName);
}
}
131
ofd.ValidateNames = false;
if (ofd.ShowDialog() == DialogResult.OK)
{
MessageBox.Show(ofd.FileName);
}
}
if (ofd.ShowDialog() == DialogResult.OK)
{
MessageBox.Show(ofd.FileName);
}
}
132
if (ofd.ShowDialog() == DialogResult.OK)
{
foreach (string s in ofd.FileNames)
MessageBox.Show(s);
}
}
if (ofd.ShowDialog() == DialogResult.OK)
{
foreach (string s in ofd.FileNames)
MessageBox.Show(s);
}
}
RESİM İŞLEMLERİ
133
public Bitmap (string filename)
Biz bir resim dosyasını FileStream referansı ile açıp bu Stream referansını
veririz.
Bu başlangıç fonksiyonu ile biz, belirli bir genişlik ver yükseklikte bellekte
resim oluşturabiliriz. Bu resim daha sonra diske save edilebilir.
134
Zoom: Bu seçenekte resim kontrolde belirtilen Size dikkate alınarak zoom
edilir. Yani bu seçenekte büyütme ve küçültme genişlik ve yükseklik oranı
korunacak şekilde yapılmaktadır.
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
class MyForm : Form
{
private PictureBox m_pictureBox;
public MyForm()
{
this.Text = "Sample Picture";
this.Resize += new EventHandler(MyForm_Resize);
try
{
Bitmap bmp = new
Bitmap(@"E:\DotNetAppBasic\Picture1\Generic\Beatles2.jpg");
m_pictureBox.Image = bmp;
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
this.Controls.Add(m_pictureBox);
}
135
}
}
}
Anahtar Notlar
Programlama yoluyla sanki formun çarpı ikonuna klik yapma etkisi close
fonksiyonu ile sağlanabilir.
using System;
using System.Windows.Forms;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
public MyForm()
{
this.Text = "Sample Picture";
this.Resize += new EventHandler(MyForm_Resize);
this.BackColor = SystemColors.Window;
m_filePopup.DropDownItems.AddRange(new
ToolStripItem[] {m_fileOpenItem, m_fileExitItem});
m_mainMenu.Items.Add(m_filePopup);
m_fileOpenItem.Click += new
EventHandler(openFileHandler);
136
m_fileExitItem.Click += new
EventHandler(exitFileHandler);
this.Controls.Add(m_mainMenu);
this.Controls.Add(m_pictureBox);
}
if (ofd.ShowDialog() == DialogResult.OK)
{
try
{
Bitmap bmp = new Bitmap(ofd.FileName);
m_pictureBox.Image = bmp;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
137
Bitmap sınıfının Image sınıfından gelen int türden Width ve Height
propertyleri, resmin genişlik ve yükseklik değerlerini vermektedir.
Anahtar Notlar
using System;
using System.Windows.Forms;
using System.Drawing;
using System.IO;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
}
}
public MyForm()
{
this.Text = "Sample Picture";
this.Resize += new EventHandler(MyForm_Resize);
this.BackColor = SystemColors.Window;
138
m_fileOpenItem.ShortcutKeys = Keys.Control |
Keys.O;
m_fileExitItem.ShortcutKeys = Keys.Control |
Keys.X;
m_filePopup.DropDownItems.AddRange(new
ToolStripItem[] {m_fileOpenItem, m_fileExitItem});
m_mainMenu.Items.Add(m_filePopup);
m_fileOpenItem.Click += new
EventHandler(openFileHandler);
m_fileExitItem.Click += new
EventHandler(exitFileHandler);
this.Controls.Add(m_mainMenu);
this.Controls.Add(m_pictureBox);
}
if (ofd.ShowDialog() == DialogResult.OK)
{
try
{
Bitmap bmp = new Bitmap(ofd.FileName);
m_pictureBox.Image = bmp;
139
MessageBox.Show(ex.Message);
}
}
}
Anahtar Notlar
using System;
using System.Windows.Forms;
using System.Drawing;
using System.IO;
using System.Drawing.Imaging;
namespace CSD
{
class App
{
public static void Main()
{
Application.Run(new MyForm());
140
}
}
public MyForm()
{
this.Text = "Sample Picture";
this.Resize += new EventHandler(MyForm_Resize);
this.BackColor = SystemColors.Window;
m_fileOpenItem.ShortcutKeys = Keys.Control |
Keys.O;
m_fileSaveItem.ShortcutKeys = Keys.Control |
Keys.S;
m_fileExitItem.ShortcutKeys = Keys.Control |
Keys.X;
m_filePopup.DropDownItems.AddRange(new
ToolStripItem[] {m_fileOpenItem,
m_fileSaveItem, m_fileExitItem});
m_mainMenu.Items.Add(m_filePopup);
this.Controls.Add(m_mainMenu);
141
this.Controls.Add(m_pictureBox);
}
if (ofd.ShowDialog() == DialogResult.OK)
{
try
{
m_bmp = new Bitmap(ofd.FileName);
m_pictureBox.Image = m_bmp;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
142
if (sfd.ShowDialog() == DialogResult.OK)
{
ImageFormat ifo;
string ext = Path.GetExtension(sfd.FileName)
.ToLower();
try
{
switch (ext)
{
case ".bmp":
ifo = ImageFormat.Bmp;
break;
case ".jpg":
ifo = ImageFormat.Jpeg;
break;
case ".gif":
ifo = ImageFormat.Gif;
break;
case ".png":
ifo = ImageFormat.Png;
break;
default:
MessageBox.Show("Invalid
extension!");
return;
}
m_bmp.Save(sfd.FileName, ifo);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
143
Bitmap sınıfının Image sınıfından gelen PixelFormat isimli property
elemanı, PixelFormat isimli enum türündendir. Resmin pixel formatını
vermektedir.
partial class A
{
//...
}
//...
//...
partial class A
{
//...
}
using System;
using System.Collections;
using System.Drawing;
namespace CSD
{
class App
{
public static void Main()
{
Sample.Bar();
}
}
144
{
public static void Foo()
{
}
}
}
}
}
145
Dispose ve InitializeComponent fonksiyonları tanımlanmıştır. Microsoft
Form1.Designer.cs dosyasının programcı tarafından manual bir biçimde
değiştirilmesini tavsiye etmemektedir. Her ne kadar bu dosya üzerinde
bazı masum değişiklikler probleme yol açmıyorsa da prensip olarak
bunlardan kaçınmak gerekir.
Programcı daha sonra Form1 isimli sınıfın ismini anlamlı bir biçimde
değiştirmelidir. Dosyalar açık olmamak koşuluyla Form1.cs dosyasının ismi
değiştiğinde bu sınıfın ismi de değişmektedir.
Anahtar Notlar
146
taşındığında IDE bu kontrol için sınıfta bir private veri elemanı tanımlar
sonra InitializeComponent fonksiyonu içerisine nesneyi yaratan ve
propertylerini set eden kodları yerleştirir. IDE kontroller için otomatik
olarak deve notasyonunda, sırayla numaralandırma yaparak isimlendirme
uygular (Örneğin: listBox1, listBox2 gibi). Programcının bu isimleri
Properties menüsünden değiştirmesi tavsiye edilmektedir. IDE kontrolün
Name propertysini isimlendirme amacıyla kullanmaktadır. Yani programcı
Name propertysini değiştirerek kontrolün ismini değiştirebilir.
public TestWizardForm()
{
InitializeComponent()
//...
147
InitializeComponent fonksiyonu içerisine yerleştirir. Programcının menü
elemanlarının isimlerini de değiştirmesi tavsiye edilir. En çok kullanılan
event işlemleri double klik ile otomatize edilmiştir.
148
3- Dialog penceresini kapatmak için Form sınıfının DialogResult
propertysine atama yapmak yeterlidir. Bu property DialogResult
isimli enum türündendir. Propertynin set bölümde aynı zamanda
Close işlemi yapılmaktadır. Yani aslında dialog penceresi Close
fonksiyonu ile kapatılabilir. Fakat DialogResult propertysine atama
yapılırken zaten Close fonksiyonu çağrılmaktadır. Dialog penceresini
açmakta kullandığımız ShowDialog fonksiyonu da DialogResult geri
dönüş değerine sahiptir. Yani dialog penceresinde atadığımız değer,
ShowDialog fonksiyonunun geri dönüş değeri olmaktadır. Bu
durumda bir dialog penceresi şöyle kapatılabilir:
if(df.ShowDialog() == DialogResult.OK)
{
//...
}
149
{
get
{
return m_nameTextBox.Text;
}
set
{
m_nameTextBox.Text = value;
}
}
if(df.ShowDialog() == DialogResult.OK)
{
//...
}
150
Close fonksiyonu ile kapatılır. Zaten Show fonksiyonunun geri dönüş
değeri DialogResult türünden değil, void türdendir.
Anahtar Notlar
Bir form üç biçimde açılabilir.
Programcı Owner elemanı Form sınıfı türünden elde eder. Hâlbuki onu
arkada bulunan ana form olarak kullanmak isteyecektir. Bu durumda
aşağıya doğru bilinçli dönüştürme yapmak gerekmektedir. Örneğin:
MainForm mf = (MainForm)this.Owner;
151
set
{
m_mainForm = value;
}
}
df.ShowDialog();
Anahtar Notlar
Bir model dialog penceresi açıldığında kullanıcı bazı bilgiler girer. Peki
bazı alanları boş bırakırsa ya da bazı alanlara uygun olmayan değerler
girerse? Tipik olarak bu tür geçerlilik (validation) işlemleri “Ok” , “Cancel”
tuşlarına basıldığında toptan yapılabilir. Fakat .Net Framework 2.0 ile
beraber bu konuda bazı pratik yöntemlerde de önerilmiştir.
TextBoxName için;
152
if (m_nameTextBox.Text.Trim() == "")
{
MessageBox.Show("İsim girilmedi");
e.Cancel = true;
}
}
TextBoxNo için;
try
{
val = int.Parse(m_noTextBox.Text);
}
catch (Exception ex)
{
MessageBox.Show("Sayı yanlışgirildi!..");
e.Cancel = true;
return;
}
153
alınmayacağı anlamına gelir. Fakat Cancel tuşuna tıkladığımızda
kontrolden çıkmayı hedeflediğimizden dolayı yine geçerlilik sorunu ile
karşılaşırız. İşte bunu engellemek için birkaç yöntem önerilebilir. Birincisi
geçici süre AutoValidate işlemini Disable etmek olabilir. Bunun dışında
başka yöntemlerde önerilebilir.
ListView KONTROLÜ
154
chLength.Text = "Length";
m_lv.Columns.Add(“NAme”)
m_lv.Columns.Add(“Length”)
m_lv.Columns.Add(“Date”)
{06.01.2008 Pazar}
ile
155
aynı anlamdadır.
lvi1.SubItems.Add(lvsi1);
public ListViewSampleForm()
{
InitializeComponent();
m_lv.Columns.Add("Name");
m_lv.Columns.Add("Length");
m_lv.Columns.Add("Date");
156
ListViewItem.ListViewSubItem();
lvsi2.Text = "SubItem2";
lvi.SubItems.Add(lvsi1);
lvi.SubItems.Add(lvsi2);
m_lv.Items.Add(lvi);
this.Controls.Add(m_lv);
}
}
ile
m_lv.Items.Add(“Key”);
aynı anlamdadır.
lvi.SubItems.Add(lvsi1);
lvi.SubItems.Add(lvsi2);
ile
157
lvi.SubItems.AddRange(new string[] {"SubItem1", "SubItem2"});
aynı anlamdadır.
m_lv.Items.Add("Key").SubItems.AddRange(new string[]
{ "SubItem1", "SubItem2" });
public ListViewSampleForm()
{
InitializeComponent();
m_lv.Columns.Add("Name");
m_lv.Columns.Add("Length");
m_lv.Columns.Add("Date");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
m_lv.Items.Add(fi.Name).SubItems.AddRange(new
string[] { fi.Length.ToString(), onlyDate});
158
}
this.Controls.Add(m_lv);
}
}
m_lv.Columns[0].Width = 200;
m_lv.Columns[1].Width = 100;
m_lv.Columns[2].Width = 200;
m_lv.Columns[0].TextAlign = HorizontalAlignment.Center;
m_lv.Columns[1].TextAlign = HorizontalAlignment.Center;
m_lv.Columns[2].TextAlign = HorizontalAlignment.Center;
m_lv.Items[0].BackColor = Color.Red;
m_lv.Items[1].BackColor = Color.White;
m_lv.CheckBoxes = true;
//...
m_lv.Items[1].Checked = true;
m_lv.GridLines = true;
m_lv.AllowColumnReorder = true;
159
Normal olarak bir elemana tıklandığında yalnızca anahtar sütun elemanı
seçilir. ListView sınıfının bool türden FullRowSelect elemanı ile bu
durum değiştirilebilir.
m_lv.FullRowSelect = true;
m_lv.MultiSelect = false;
//...
160
ListView ELEMANLARININ SÜTUNA GÖRE SIRAYA DİZİLMESİ
Anahtar Notlar
Belirli bir sütuna göre ListView elemanlarını sıraya dizmek için şu adımlar
gerçekleştirilmelidir:
161
Birinci Yol(uzun olan):
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace CSD
{
public partial class ListViewSampleForm : Form
{
private ListView m_lv;
public ListViewSampleForm()
{
InitializeComponent();
m_lv.Columns.Add("Name");
m_lv.Columns.Add("Length");
m_lv.Columns.Add("Date");
m_lv.Columns[0].Width = 200;
m_lv.Columns[1].Width = 100;
m_lv.Columns[2].Width = 200;
m_lv.Columns[0].TextAlign =
HorizontalAlignment.Center;
m_lv.Columns[1].TextAlign =
HorizontalAlignment.Center;
m_lv.Columns[2].TextAlign =
HorizontalAlignment.Center;
162
files = Directory.GetFiles("c:\\windows");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
foreach (string file in files)
{
FileInfo fi = new FileInfo(file);
string onlyDate =
string.Format("{0:D2}/{1:D2}/{2:D4}",
fi.CreationTime.Day,
fi.CreationTime.Month, fi.CreationTime.Year);
m_lv.Items.Add(fi.Name).SubItems.AddRange(new
string[]
{ fi.Length.ToString(),
onlyDate});
}
m_lv.Items[0].BackColor = Color.Red;
m_lv.Items[1].BackColor = Color.White;
m_lv.Items[1].Checked = true;
this.Controls.Add(m_lv);
}
void m_lv_ColumnClick(object sender,
ColumnClickEventArgs e)
{
m_lv.ListViewItemSorter = new
MyComparer(e.Column);
m_lv.Sort();
}
163
class MyComparer : IComparer
{
private int m_cno;
switch (m_cno)
{
case 0:
return string.Compare(lv1.Text,
lv2.Text, true);
case 1:
try
{
long len1 =
long.Parse(lv1.SubItems[1].Text);
long len2 =
long.Parse(lv2.SubItems[1].Text);
return 0;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
break;
case 2:
DateTime dt1 =
DateTime.Parse(lv1.SubItems[2].Text);
DateTime dt2 =
DateTime.Parse(lv2.SubItems[2].Text);
164
}
}
}
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace CSD
{
public partial class ListViewSampleForm : Form
{
private ListView m_lv;
public ListViewSampleForm()
{
InitializeComponent();
m_lv.Columns.Add("Name");
m_lv.Columns.Add("Length");
m_lv.Columns.Add("Date");
m_lv.Columns[0].Width = 200;
m_lv.Columns[1].Width = 100;
m_lv.Columns[2].Width = 200;
m_lv.Columns[0].TextAlign =
HorizontalAlignment.Center;
m_lv.Columns[1].TextAlign =
HorizontalAlignment.Center;
165
m_lv.Columns[2].TextAlign =
HorizontalAlignment.Center;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
foreach (string file in files)
{
FileInfo fi = new FileInfo(file);
string onlyDate =
string.Format("{0:D2}/{1:D2}/{2:D4}",
fi.CreationTime.Day,
fi.CreationTime.Month, fi.CreationTime.Year);
lvi.SubItems.AddRange(new string[]
{ fi.Length.ToString(),
onlyDate});
lvi.Tag = fi;
}
m_lv.Items[0].BackColor = Color.Red;
m_lv.Items[1].BackColor = Color.White;
m_lv.Items[1].Checked = true;
this.Controls.Add(m_lv);
}
m_lv.Sort();
}
166
foreach (ListViewItem lvi in
m_lv.SelectedItems)
{
MessageBox.Show(lvi.Text);
}
}
}
switch (m_cno)
{
case 0:
return string.Compare(fi1.Name,
fi2.Name, false);
case 1:
try
{
if (fi1.Length > fi2.Length)
return 1;
if (fi1.Length < fi2.Length)
return -1;
return 0;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
break;
167
case 2:
return
DateTime.Compare(fi1.CreationTime, fi2.CreationTime);
return 0;
}
}
}
}
Anahtar Notlar
{12.01.2008 Cumartesi}
Anahtar Notlar
168
Bilgisayar sistemi yapay bir çizim ortamı sunmaktadır. Belirli
yoğunlukta piksel grubu vardır ve bunların teker teker aydınlatılmasıyla
görüntü oluşmaktadır. Bu nedenle klasik geometrik şekiller bile bilgisayar
ekranında bozulmuş görünebilirler. Çizim için orijin noktası, çalışma
alanının sol üst köşesidir ve default birim olarak piksel kullanılmaktadır.
Aslında bir pencerenin iç bölgesi, görünenden daha geniş ve daha derindir.
Görünmeyen alana da çizim yapılabilir. Görünmeyen alana yapılan bu
çizimler belki de çözünürlük yükseltildiğinde görünür hale gelecektir.
169
basmaktadır. Örneğin; menüler açıldığında (fakat windows’un GDI
menüleri) ya da fare oku hareket ettirildiğinde.
GRAPHİCS SINIFI
170
2. Programcı başka bir mesajda (Örneğin; fare mesajlarında ..) çizim
yapmak isteyebilir. İşte Control sınıfının CreateGraphics isimli
fonksiyonu, Graphics nesnesini kendi içinde yaratıp bize
vermektedir. Fakat biz Graphics nesnesini CreateGraphics
fonksiyonu ile almışsak işimiz bitince onu Dispose etmeliyiz.
Dispose etmemek her zaman soruna yol açmasa da kötü bir
tekniktir. Fakat Paint mesajı tarafından bize verilen Graphics
nesnesini, biz Dispose etmemeliyiz. Framework bunu kendisi
Dispose etmelidir.
171
public void Invalidate (bool invalidateChildren) : Parametre true
girilirse alt pencereler de geçersiz hale getirilir. false girilirse alt
pencereler geçersiz hale getirilmez yani onlar için Paint mesajı gelmez.
Anahtar Notlar
Framework 3.0 ile birlikte yani bir GUI kütüphanesi daha sisteme
eklenmiştir. Bu yeni GUI kütüphanesine WPF (Windows Presentation
Foundation) ‘dir. Fakat WPF’nın ortaya çıkması Framework 2.0 daki
kütüphanenin devre dışı kaldığı anlamına gelmemektedir.
{13.01.2008 Pazar}
KALEM(PEN) KAVRAMI
172
private void Form1_Paint(object sender PaintEventArgs e)
{
Graphics g = e.Graphics;
Örneğin:
Anahtar Notlar
Programın akışı using bloğundan normal olarak çıksa da, exception ile
çıksa da bildirilen değişken için Dispose fonksiyonu çağrılır. C#
standartları bu deyimin eşdeğerini şöyle vermiştir:
{
<tür> <değişken> = <ilk değer>
try
{
<deyim>
}
finally
{
<değişken>.Dispose();
}
173
using(T a=ifade1, b = ifade2,...)
{
//...
}
using (T a = ifade1)
{
using(T b = ifade2)
{
//...
}
}
174
Pen sınıfının diğer elemanları MSDN dokümanlarından incelenmelidir.
Pens isimli sınıf, çeşitli renkte, 1 kalınlıkta düz çizgili hazır kalem veren
çeşitli statik propertylere sahiptir. Bu durumda örneğin; programcı
kendisinden bir kalem istendiğinde Pens.Red gibi bir ifade ile hazır bir
kalemi verebilir. Hazır kalemlerin Dispose edilmemesi gerekir.
FIRÇA(BRUSH) KAVRAMI
Bir alan boyanacaksa, bu işlem bir fırça nesnesi ile yapılır (aslında
kalın bir kalem bir fırça gibi de kullanılabilir). Çeşitli fırçalar söz konusudur
ve bu fırçalar farklı sınıflarla temsil edilmiştir. Tüm bu fırça sınıflarının
ortak elemanları abstract bir Brush sınıfında toplanmıştır ve tüm fırça
sınıfları bu sınıftan türetilmiştir. SolidBrush düz renkli bir fırçadır.
HatchBrush desenli bir fırçayı belirtir.
Tıpkı Pens sınıfında olduğu gibi düz renkli fırça veren Brushes sınıfı
da vardır. Programcı bir brush istendiğinde pratik olarak Brushes.Red gibi
bir ifade ile fırçayı verebilir.
DrawLine isimli fonksiyonlar, bir kalem ve iki noktayı alarak doğru çizerler.
Yöntem:1
namespace CSD
175
{
public partial class ScratchPadForm : Form
{
private int m_prevX, m_prevY;
private Pen m_pen;
public ScratchPadForm()
{
InitializeComponent();
//this.ResizeRedraw = true;
Yöntem 1–1:
namespace CSD
{
public partial class ScratchPadForm : Form
{
private int m_prevX, m_prevY;
private Pen m_pen;
176
private ArrayList m_lines;
private ArrayList m_currentLine;
public ScratchPadForm()
{
InitializeComponent();
this.ResizeRedraw = true;
m_lines = new ArrayList();
m_prevX = e.X;
m_prevY = e.Y;
}
}
}
177
}
}
Yöntem 2 (tamamlanmamış):
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;
namespace CSD
{
public partial class ScratchPadForm : Form
{
private int m_prevX, m_prevY;
private Pen m_pen;
private ArrayList m_lines;
private ArrayList m_currentLine;
private bool m_flag;
public ScratchPadForm()
{
InitializeComponent();
//this.ResizeRedraw = true;
m_lines = new ArrayList();
178
private void ScratchPadForm_MouseDown(object sender,
MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
m_prevX = e.X;
m_prevY = e.Y;
m_prevX = e.X;
m_prevY = e.Y;
}
}
179
g.DrawLine(m_pen, (Point) line[i], (Point)
line[i + 1]);
}
if (m_currentLine != null)
for (int i = 0; i < m_currentLine.Count - 1;
++i)
{
g.DrawLine(m_pen, (Point)m_currentLine[i],
(Point)m_currentLine[i + 1]);
}
}
}
}
{19.01.2008 Cumartesi}
Örnek devamı
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;
namespace CSD
{
public partial class ScratchPadForm : Form
{
private int m_prevX, m_prevY;
private Pen m_pen;
private ArrayList m_lines;
private ArrayList m_currentLine;
private bool m_flag;
public ScratchPadForm()
{
InitializeComponent();
//this.ResizeRedraw = true;
m_lines = new ArrayList();
180
{
if (e.Button == MouseButtons.Left)
{
m_prevX = e.X;
m_prevY = e.Y;
m_prevX = e.X;
m_prevY = e.Y;
}
}
181
if (m_currentLine != null)
for (int i = 0; i < m_currentLine.Count - 1;
++i)
{
g.DrawLine(m_pen, (Point)m_currentLine[i],
(Point)m_currentLine[i + 1]);
}
return rect;
}
}
}
182
}
g.FillRectangle(Brushes.Blue, rect);
g.DrawRectangle(Pens.Red, 99, 99, 100, 100);
// tamamiyle gözüküyor
}
g.FillRectangle(Brushes.Blue, rect1);
g.DrawRectangle(Pens.Red, rect2);
}
1- İçten Hizalama
2- Dıştan Hizalama
3- Ortalayarak Hizalama
183
pen.Alignment =
System.Drawing.Drawing2D.PenAlignment.Center;
g.DrawRectangle(pen, rect1);
g.DrawRectangle(Pens.Blue, rect1);
}
g.DrawRectangle(pen, rect1);
g.DrawRectangle(Pens.Blue, rect1);
}
g.DrawRectangle(pen, rect1);
184
g.DrawEllipse(Pens.Blue, rect1);
}
Bir şekli taşımak için yine MouseMove mesajında eski nokta ile yeni nokta
arasındaki deltaX ve deltaY miktarları hesaplanır ve şekil o miktar kadar
ötelenir.
Anahtar Notlar
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace Drawing2
{
public partial class Form1 : Form
{
private Rectangle m_rect;
private int m_prevX, m_prevY;
private bool m_inside;
public Form1()
{
InitializeComponent();
185
Graphics g = e.Graphics;
g.DrawRectangle(Pens.Red, m_rect);
}
m_inside = true;
}
}
}
this.Invalidate(Rectangle.Inflate(m_rect, 1,
1));
m_rect.Offset(deltaX, deltaY);
this.Invalidate(Rectangle.Inflate(m_rect, 1,
1));
m_prevX = e.X;
m_prevY = e.Y;
}
}
186
Kapalı bir şekli (örneğin FillRectangle ile çizilmiş) taşımaya
çalıştığımızda bir titreme oluşur. Bu titremenin nedeni eski şekil ile yeni
şeklin kesişim bölgesinin önce silinip sonra boyanmasındandır.
Kesişim Bölgesi
public Form1()
{
InitializeComponent();
this.DoubleBuffered = true;
}
Bu fonksiyonlar bir Point dizisi alarak ilgili noktalara birleştirip, ilk nokta
ile son noktayı da birleştirerek kapalı düz bir şekli elde ederler.
using System;
using System.Collections.Generic;
using System.ComponentModel;
187
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;
namespace Polygon
{
public partial class Form1 : Form
{
private ArrayList m_al;
public Form1()
{
InitializeComponent();
m_al.CopyTo(pt);
g.DrawPolygon(Pens.Blue, pt);
}
}
m_al.Clear();
}
m_al.Add(e.Location);
}
}
}
}
188
FillRectangle ile yapılan örnek:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;
namespace Polygon
{
public partial class Form1 : Form
{
private ArrayList m_al;
public Form1()
{
InitializeComponent();
this.ResizeRedraw = true;
}
m_al.CopyTo(pt);
g.FillPolygon(Brushes.Blue, pt);
}
}
m_al.Clear();
}
189
{
g.FillEllipse(Brushes.Red, new Rectangle(e.X -
2, e.Y - 2, 4, 4));
m_al.Add(e.Location);
}
}
}
}
DrawLines FONKSİYONLARI
DrawLines fonksiyonları bir Point dizisi alarak yalnızca o noktaları çizgi ile
birleştirir.(son nokta ile ilk noktayı birleştirmez)
DrawImage FONKSİYONLARI
Örneğin:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace DrawImage
{
public partial class Form1 : Form
{
private Image m_image;
public Form1()
{
InitializeComponent();
try
190
{
m_image = new
Bitmap(@"E:\DotNetAppBasic\DrawImage\DrawImage\beatles2.jpg")
;
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}
Örneğin:
{20.01.2008 Pazar}
using System;
using System.Collections.Generic;
191
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace DrawImage
{
public partial class Form1 : Form
{
private Image m_image;
public Form1()
{
InitializeComponent();
this.ResizeRedraw = true;
this.DoubleBuffered = true;
try
{
m_image = new
Bitmap(@"E:\DotNetAppBasic\DrawImage\DrawImage\beatles2.jpg")
;
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}
192
Graphics g = e.Graphics;
FONT İŞLEMLERİ
193
Birinci parametre ile belirtilen font ailesi yanlış yazılırsa exception oluşmaz.
Bu durumda sistem default fontu kullanılır. Bu nedenle bu yazının doğru
yazılması önemlidir.
public Form1()
{
InitializeComponent();
label1.Text = "Test";
label1.ForeColor = Color.Red;
label1.Font = m_font;
}
Burada FontStyle, bold, italik, underline gibi elemanlar içeren bir enum
türüdür.
public Form1()
{
InitializeComponent();
label1.Text = "Test";
label1.ForeColor = Color.Red;
label1.Font = m_font;
}
}
194
public Form1()
{
InitializeComponent();
label1.Text = "Test";
label1.ForeColor = Color.Red;
label1.Font = m_font;
}
}
Bazen elimizde bir font olur ve bizde font ailesinin bu fonttan alınmasını
isteyebiliriz.
Font sınıfının ayrıca bool türden bold, italik, strikeout, underline gibi read
only property elemanları da vardır. Bu elemanlar fontun bu ikincil
karakteristiklerinin bulunup bulunmayacağını belirtir.
Time New Roman, Courier gibi font aileleri FontFamily sınıfı ile
temsil edilmektedir. FontFamily sınıfının Name elemanı, ilgili font ailesinin
ismini verir. Sınıfın pek çok faydalı fonksiyonu vardır. Font sınıfının
FontFamily isimli property elemanı, fontun ilişkili olduğu font ailesini,
FontFamily nesnesine verir.
public Form1()
{
InitializeComponent();
label1.Text = "Test";
label1.ForeColor = Color.Red;
label1.Font = m_font;
MessageBox.Show(m_font.FontFamily.Name);
}
}
195
Bir font nesnesi, bir FontFamily nesnesinden ve diğer font
karakteristiklerinden oluşur. FontFamily kavramı, font datasına ait
değişmez özellikleri belirtmektedir. Örneğin; fontun boyutu FontFamily
konusu içerisinde değildir.
public Form1()
{
InitializeComponent();
label1.Text = "Test";
label1.Font = m_font;
}
}
196
Anahtar Notlar
Her font tüm unicode karakterleri içermek zorunda değildir. Aslında bir
fontun hangi karakter görüntülerini içerdiği font data dosyası içerisinde
yazmaktadır. Örneğin; Windows’u kurduğumuzda arapça ya da japonca
karakterler Windows’un default fontları içerisinde bulunmamaktadır. Yani
özetle Windows ve .Net fonksiyonları, tüm unicode karakterleri ifade
edebilmektedir. Fakat bunların gösterilebilmesi için, içerisinde bu
karakterlere ilişkin bilgilerin bulunduğu font dosyasının da bulunması
gerekir. Eğer kullanılan fontta bu karakterler yoksa, karakterlerin yerine
boş kutucuklar ekrana basılmaktadır. Aslında tüm unicode karakterleri
içeren büyük font dosyaları bulunmaktadır. Fakat tüm unicode
karakterlerin font dosyaları çok büyük yer kaplamaktadır. Bunun için pek
tercih edilmemektedir. Bunun yerine font dosyaları ilgili dilin
karakterlerini içerek büyüklükte tutulmaktadır.
public Form1()
{
InitializeComponent();
label1.Text = "oiw";
label1.Font = m_font;
}
197
label1.Font = m_font;
}
}
DrawString FONKSİYONU
Anahtar Notlar
Alt alta yazı yazma teması ile çok sık karşılaşılmaktadır. Font içerisindeki
karakterlerin yükseklikleri değişebildiğine göre alt satıra geçme duygunu
nasıl verilmelidir? İşte fontun en yüksek karakterine belli bir aralık
eklenerek elde edilmiş bir değer bulunmaktadır. Font sınıfının Height
elemanı bunu vermektedir. O halde programcının yapacağı tek şey
yazdırdığı noktanın y değerine, bu Height değerini eklemektedir.
int y = 0;
198
for (int i = 0; i < 20; ++i)
{
g.DrawString("Number: " + i.ToString(), mf,
Brushes.Red, 0, y);
y += mf.Height;
}
}
{26.01.2008 Cumartesi}
namespace StringFormatSample
{
public partial class Form1 : Form
{
public Form1()
199
{
InitializeComponent();
this.ResizeRedraw = true;
}
Anahtar Notlar
Pen, Brush, Font gibi çizim nesnelerinin her defasında Paint mesajında
yaratılması yerine, onların bir kez yaratılıp sınıfın veri elemanlarında
saklanması daha etkin bir yöntemdir. Tabi bu her zaman mümkün
olmayabilir.
namespace StringFormatSample
{
public partial class Form1 : Form
{
private Font m_font;
public Form1()
{
InitializeComponent();
this.ResizeRedraw = true;
this.DoubleBuffered = true;
200
StringFormat sf = new StringFormat();
sf.Alignment = StringAlignment.Center;
sf.LineAlignment = StringAlignment.Center;
g.DrawString("This is a test", m_font,
Brushes.Red, this.ClientRectangle, sf);
}
}
}
namespace StringFormatSample
{
public partial class Form1 : Form
{
private Font m_font;
public Form1()
{
InitializeComponent();
this.ResizeRedraw = true;
this.DoubleBuffered = true;
201
}
}
202
Graphics sınıfının CopyFromScreen isimli fonksiyonları, ekranın belli
bir dikdörtgensel bölgesini Graphics nesnesinin belirttiği bölgeye
kopyalamaktadır. Örneğin.
namespace ScreenCapture
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.ResizeRedraw = true;
}
}
}
}
Bir Bitmap bir dosyadan hareketle yaratılmak zorunda değildir. Boş bir
biçimde de yaratılabilir. Bunun için Bitmap sınıfının iki parametreli
başlangıç fonksiyonu kullanılır.
203
Graphics sınıfının FromImage isimli static fonksiyonu, bir Image nesnesini
parametre olarak alır ve onunla çizim yapabileceğimiz bir Graphics
nesnesi verir.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Imaging;
namespace ScreenCapture
{
public partial class Form1 : Form
{
private Bitmap m_bmp;
public Form1()
{
InitializeComponent();
this.ResizeRedraw = true;
m_bmp = new
Bitmap(Screen.PrimaryScreen.Bounds.Width,
Screen.PrimaryScreen.Bounds.Height);
204
this.Invalidate();
}
}
}
TIMER İŞLEMLERİ
205
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace DigitialClock
{
public partial class Form1 : Form
{
private Font m_font;
private Timer m_timer;
public Form1()
{
InitializeComponent();
{
Graphics g = this.CreateGraphics();
string s = "00:00:00";
SizeF sf = g.MeasureString(s, m_font);
this.TopMost = true;
}
206
string clockText =
string.Format("{0:D2}:{1:D2}:{2:D2}", now.Hour, now.Minute,
now.Second);
{27.01.2008 Cumartesi}
THREAD İŞLEMLERİ
207
İşletim sistemlerinin proses yöneticileri thread’leri hangi sıraya göre
çalıştırıp dinlendirmektedir? Uygulanan algoritmik yönteme çizelgeleme
algoritması denilmektedir. En adil yöntem döngüsel çizelgeleme
algoritmasıdır. Bu sistemde sırasıyla tüm thread’ler, proses farkı göz
önüne alınmadan tek tek döngüsel bir biçimde ele alınıp çalıştırılır. Bugün
Windows sistemlerinde, öncelik sınıflarına ayrılmış döngüsel çizelgeleme
yöntemi kullanılmaktadır.
Bir thread dışsal bir olaya ilişkin işlemi başlattığında, işletim sistemi
tarafından geçici bir süre çizelge dışına çıkartılır. İşletim sistemi dışsal olayı
artık kendisi izler bu olay gerçekleştiğinde thread’i tekrar çizelgeye alır.
Böylece dışsal bir olayda thread’ın meşgul bir döngü içerisinde CPU
zamanı harcaması engellenir. Bu işleme thread’ın bloke edilmesi denir.
Örneğin; bir dosya işlemi sırasında, klavye işlemi sırasında, mesaj
kuyruğunda hiçbir mesaj olmadığında thread bloke edilmektedir.
Sistemdeki tüm thread’leri o anda çizelgede olmadığına dikkat edilmelidir.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
namespace ProcessList
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
208
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.IO;
namespace ProcessList
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
}
}
}
}
}
209
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.IO;
namespace ProcessList
{
public partial class Form1 : Form
{
Process[] m_procList;
public Form1()
{
InitializeComponent();
}
Process p = m_procList[index];
listBox2.Items.Clear();
210
listBox2.Items.Add(Path.GetFileName(pm.Fil
eName));
}
catch (Exception)
{
}
}
}
}
Bir Process’i sonlandırmak için, eğer Process bir GUI prosesi ise
öncelikle CloseMainWindow fonksiyonu uygulanmalıdır. Sonra belirli bir
süre beklenmeli eğer Process sonlanmazsa Kill fonksiyonu uygulanarak
zorla sonlanma yapılmalıdır.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.IO;
namespace ProcessList
{
public partial class Form1 : Form
{
Process[] m_procList;
public Form1()
{
InitializeComponent();
}
211
}
catch (Exception)
{
}
}
}
Process p = m_procList[index];
listBox2.Items.Clear();
}
}
m_procList[index].CloseMainWindow();
listBox1_SelectedIndexChanged(null, null);
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
212
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.IO;
using System.Threading;
namespace ProcessList
{
public partial class Form1 : Form
{
private Process[] m_procList;
private System.Windows.Forms.Timer m_timer;
private Process m_killProc;
public Form1()
{
InitializeComponent();
}
Process p = m_procList[index];
listBox2.Items.Clear();
213
listBox2.Items.Add(Path.GetFileName(pm.Fil
eName));
}
catch (Exception)
{
}
}
m_killProc = m_procList[index];
m_killProc.CloseMainWindow();
}
}
}
{03.02.2008 Pazar}
THREADLARIN YARATILMASI
214
ThreadStart isimli delege parametreli başlangıç fonksiyonu ile Thread
nesnesi yaratılabilir.
Anahtar Notlar
Örneğin:
class Program
{
static void Main(string[] args)
{
Thread t = new Thread(new ParameterizedThreadStart(ThreadProc));
}
}
Sleeep FONKSİYONLARI
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace ThreadSample1
{
215
class Program
{
static void Main(string[] args)
{
Thread t = new Thread(new
ParameterizedThreadStart(ThreadProc));
t.Start("Other Thread");
}
public static void ThreadProc(object o)
{
string str = (string)o;
216
her banka erişebilir fakat bazı banklara daha yavaş erişebilmektedir. NUMA
sistemi daha hızlı çalışmaya izin verse de başka sorunları vardır. Fakat
yinede bazı sistemlerde tercih edilmektedir.
THREADLERİN SONLANDIRILMASI
217
1- Thread fonksiyonunun çalışması bittiğinde, Thread otomatik olarak
sonlandırılır.
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace CSD
{
class Program
{
static void Main(string[] args)
{
Thread t = new Thread(new
ParameterizedThreadStart(ThreadProc));
t.Start("Other Thread");
System.Console.ReadLine();
t.Abort();
System.Console.ReadLine();
}
218
{
Console.WriteLine("{0}: {1}", str, i);
Thread.Sleep(1000);
}
catch (ThreadAbortException tae)
{
Console.WriteLine("Exception
occured!..");
Thread.ResetAbort();
}
}
}
}
}
Anahtar Notlar
219
ÇALIŞMAKTA OLAN THREADİN ELDE EDİLMESİ
{09.02.2008 Cumartesi}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Collections;
namespace CSD
{
public partial class GUIThreadForm : Form
{
private ArrayList m_threads;
public GUIThreadForm()
{
InitializeComponent();
220
}
m_threads.Add(t);
Application.Run(otf);
}
THREAD SENKRONİZASYONU
221
kontrol ediyor olsun. Makine üzerinde ardışıl adımlarla çeşitli işlemler
yapacak olalım. İşlemimiz bittiğinde makineyi eski halinde bırakacak
olduğumuzu varsayalım. Biz makineyi programlarken, bir aşamada
Thread’ler arası geçiş olursa ve başka bir Thread makineyi yeniden
programlamaya çalışsa, büyük bir olasılıkla program çöker. Çünkü ilk
Thread çalışmaya devam edeceği zaman makineyi son konumunda
sanacaktır. Fakat makine o konumda artık değildir. Ya da örneğin ortak
kullanılan bir ArrayList nesnesine iki Thread’ın Insert işlemi yaptığını
düşünelim. Insert işlemi aslında kaydırma ve yer açma gibi kritik işlemleri
gerektirmektedir. İşte tam Insert işlemi sırasında Thread‘ler arası geçiş
oluşsa ve akış diğer Thread’e geçip o da Insert işlemi yapsa, ArrayList
nesnesi darmadağınık olur. Muhtemelen ArrayList içerisindeki bilgiler
bozulacaktır. Şüphesiz tek Thread’li bir uygulamada böyle bir problem söz
konusu olmayacaktır. İşte bu nedenlerle Thread’lerin senkronize edilmesi
gerekir. Bir Thread ArrayList üzerinde işleme başladı ise Thread’ler arası
geçiş oluşup akış başka bir Thread’e geçse bile, geçilen Thread
ArrayList üzerinde işlem yapmamalı ve önceki Thread’in işini bitirmesini
beklemelidir.
Aynı anda baştan sona tek bir Thread tarafından işletilmesi gereken
koda kritik kod denilmektedir.
Kritik kod tipik olarak Monitor sınıfının Enter ve Exit isimli static
fonksiyonları ile oluşturulur:
Monitor.Enter(o);
Monitor.Exit(o);
222
referansı olduğunun bir önemi yoktur. Bağımsız kritik kodlar oluşturmak
için farklı nesne referansları vermek gerekir.
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace CriticalSection
{
class Program
{
private static Thread m_t1, m_t2;
private static Random m_rand;
private static object m_obj = new object();
m_t1.Start();
m_t2.Start();
Console.ReadLine();
}
Monitor.Enter(m_obj);
Console.WriteLine("{0}: 1.Adım", str);
Thread.Sleep(m_rand.Next(500));
223
Console.WriteLine("{0}: 2.Adım", str);
Thread.Sleep(m_rand.Next(500));
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Collections;
namespace CriticalSection
{
class Program
{
private static Thread m_t1, m_t2;
private static ArrayList m_a;
m_t1.Start();
m_t2.Start();
}
224
m_a.Insert(0, i);
Monitor.Exit(m_a);
}
}
m_a.Insert(0, i);
Monitor.Exit(m_a);
}
}
}
}
Kritik koda girildiğinde bir exception oluşursa, akış başka bir yere
aktarılabilir. Bu durumda Monitor kilitli kalır. O halde bu olumsuz durumu
engellemek için try-finally bloğundan faydalanabiliriz. Örneğin:
try
{
Monitor.Enter(m_o);
//...
}
finally
{
Monitor.Exit(m_o);
}
LOCK DEYİMİ
lock (o)
<deyim>
225
Monitor.Enter(o);
try
{
<deyim>
}
finally
{
Monitor.Exit(o);
}
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Collections;
namespace CriticalSection
{
class Program
{
private static Thread m_t1, m_t2;
private static ArrayList m_a;
m_t1.Start();
m_t2.Start();
m_t1.Join();
m_t2.Join();
}
lock (m_a)
m_a.Insert(0, i);
}
}
226
private static void ThreadProc2(object o)
{
for (int i = 0; i < 10000; ++i)
{
lock (m_a)
m_a.Insert(0, i);
}
}
}
}
ProgressBar KONTROLÜ
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace SampleProgressBar
{
public partial class Form1 : Form
{
private ProgressBar m_pb;
public Form1()
{
InitializeComponent();
this.Controls.Add(m_pb);
}
227
private void button1_Click(object sender, EventArgs
e)
{
for (int i = 0; i < 100; ++i)
{
m_pb.Value = i;
System.Threading.Thread.Sleep(300);
}
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace SampleProgressBar
{
public partial class Form1 : Form
{
private ProgressBar m_pb;
private Thread m_t;
public Form1()
{
InitializeComponent();
this.Controls.Add(m_pb);
button2.Enabled = false;
}
228
button1.Enabled = false;
button2.Enabled = true;
}
button1.Enabled = true;
button2.Enabled = false;
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace SampleProgressBar
{
public partial class Form1 : Form
{
private Thread m_t;
public Form1()
{
InitializeComponent();
229
button2.Enabled = false;
}
button1.Enabled = false;
button2.Enabled = true;
}
button1.Enabled = true;
button2.Enabled = false;
}
}
}
{10.02.2008 Pazar}
Tab KONTROLÜ
230
2- Eklenecek TabPage’ler, TabPage sınıfını türünden nesneler yaratılarak
oluşturulur.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace TabControlSample
{
public partial class Form1 : Form
{
private TabControl m_tc;
private TabPage m_tpage1;
private TabPage m_tpage2;
public Form1()
{
InitializeComponent();
231
m_buttonOK.Location = new Point(100, 100);
m_tpage1.Controls.AddRange(new Control[]
{ m_buttonOK, m_textBox });
this.Controls.Add(m_tc);
}
}
}
232
sekmeleri yerleştirir. Bu durumda sekmelerin genişlikleri aritmetik olarak
hesaplanmaktadır. Fixed seçeneğinde tüm sekmelerin genişlikleri aynı
olacak biçimde hesaplama yapılmaktadır.
BÖLME KONTROLÜ
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace SplitterSample
{
public partial class Form1 : Form
{
SplitContainer m_sc;
public Form1()
{
InitializeComponent();
233
this.Controls.Add(m_sc);
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace SplitterSample
{
public partial class Form1 : Form
{
private SplitContainer m_scVertical;
private SplitContainer m_scHorizontal;
public Form1()
{
InitializeComponent();
m_scVertical.Panel1.Controls.Add(m_scHorizontal);
m_scVertical.BorderStyle =
BorderStyle.FixedSingle;
this.Controls.Add(m_scVertical);
}
234
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Diagnostics;
namespace SplitterSample
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
try
{
fs = new FileStream("Test.cs",
FileMode.Create, FileAccess.Write);
235
sw = new StreamWriter(fs);
sw.Write(textBox2.Text);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
if (sw != null)
sw.Close();
}
try
{
textBox1.Text = sr.ReadToEnd();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
{16.02.2008 Cumartesi}
VERİTABANI İŞLEMLERİ
236
gibi işlemleri yapabilmektedirler. Örneğin; Faircom firmasının Ctreee
kütüphanesi ya da DBVista gibi kütüphaneler, pek çok kullanıcı tarafından
kullanılmıştır. Bu veritabanı kütüphaneleri, profesyonel programcılar için
tasarlanmıştır ve kullanımları yüksek bilinç düzeyini gerektirmektedir.
237
.Net içerisinde veritabanı yönetim sistemi ile bağlantı kuran ona
çeşitli SQL komutlarını gönderen ve onun ürettiği sonuçları geri alan,
bunları depolayan bir grup sınıf vardır. Bu sınıflara ADO sınıfları
denilmektedir. Görüldüğü gibi ADO sınıfları, veritabanı işlemlerini yapan
sınıflar değil veritabanı yönetim sistemleri ile ilişki kuran sınıflardır.
Burada Person tablosuna yeni bir kayıt eklenmiştir. Şüphesiz burada bir
algoritmik ekleme söz konusudur.
238
Kayıt silme için DELETE komutu kullanılır. Komutun örnek kullanımı
şöyledir:
Sorgulamalar sonucunda elde edilen kayıtlar belli bir sütuna göre sıraya
dizili olarak verilebilmektedir. Bunun için ORDER BY cümlesi kullanılır.
DataTable SINIFI
ile
aynı anlamdadır.
239
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace DataTableSample
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
240
derleme aşamasından geçilir. Fakat çalışma zamanı sırasında exception
oluşur.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace DataTableSample
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
dataGridView1.DataSource = dt;
}
}
}
DataRow dr = dt.NewRow();
dr[0] = "Kaan Aslan";
dr[1] = 123;
dt.Rows.Add(dr);
241
eklemeyi tek hamlede yapabiliriz. Örneğin; string ve type
parametresi alan Add fonksiyonu, kendi içerisinde DataColumn
nesnesi oluşturup eklemeyi yapmaktadır. Bu durumda sütun
eklemesi şöyle de yapılabilir:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace DataTableSample
{
public partial class Form1 : Form
{
DataTable dt = new DataTable("Person");
public Form1()
{
InitializeComponent();
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("No", typeof(int));
DataRow dr = dt.NewRow();
dr["Name"] = "Kaan Aslan";
dr["No"] = 123;
dt.Rows.Add(dr);
dataGridView1.DataSource = dt;
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
242
namespace DataTableSample
{
public partial class Form1 : Form
{
DataTable dt = new DataTable("Person");
public Form1()
{
InitializeComponent();
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("No", typeof(int));
dataGridView1.DataSource = dt;
}
}
}
O halde pratik olarak bir DataTable sınıfı aşağıdaki gibi oluşturulup kayıt
eklenebilir:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace DataTableSample
{
public partial class Form1 : Form
{
DataTable dt = new DataTable("Person");
public Form1()
{
InitializeComponent();
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("No", typeof(int));
dataGridView1.DataSource = dt;
}
}
}
243
DATAROW NESNESİNİN DURUMLARI
244
5- Nesnenin sütunları üzerinde değişiklik yapılmıştır. Nesne Modified
durumdadır.
{17.02.2008 Pazar}
DataRow NESNESİNİN VERSİYONLARI
ya da
245
Default: Default versiyon eğer DataRow nesnesinin durumu Edit
Modified ya da Deleted ise Current, Detached ise Proposed
versiyondur.
IdbConnection
DbConnection
246
XXXConnection
Özetle bu connection sınıflarının pek çok ortak elemanları vardır. Bu
nedenle OleDbConnection ile SqlConnection sınıflarının kullanımı çok
benzerdir.
try
{
dbCon.Open();
//...
}
finally
{
dbCon.Close();
247
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace AdoSample1
{
public partial class Form1 : Form
{
private OleDbConnection m_dbCon;
public Form1()
{
InitializeComponent();
248
}
Bir SQL komutu, düz bir metin olarak değil bir sınıfla temsil
edilmektedir. Dolayısıyla bizden SQL komut yazının kendisi değil bu sınıf
istenecektir. SQL komutları XXXCommand sınıfları ile temsil edilmektedir.
Örneğin OleDbCommand, OdbcCommand, SqlCommand gibi. Yine XXXCommand
sınıfları DbCommand isimli abstract sınıftan türetilmiştir. DbCommand sınıfı
da IdbCommand arayüzünü desteklemektedir.
IdbCommand
DbCommand
XXXCommand
249
Böylece bir veritabanı yönetim sistemi için comment sınıfı yazacak olan kişi
ya IdbCommand arayüzünü desteklemeli ya da DbCommand sınıfından
türetme yapmalıdır. OleDbCommand sınıfının CommandText isimli string
türden property elemanı IdbConnection arayüzünden gelmektedir.
Çalıştırılacak SQL cümlesi, bu property elemanınma girilmelidir. Tabi nesne
string parametreli başlangıç fonksiyonu ile de yaratılabilir. Örneğin:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace AdoSample1
{
public partial class Form1 : Form
{
private OleDbConnection m_dbCon;
public Form1()
{
250
InitializeComponent();
//...
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
m_dbCon.Close();
}
}
}
}
251
Komut yazısının kolay bir biçimde oluşturulması için parametre
yöntemi düşünülmüştür. Bu yöntemde programcı SQL komutunda
değişebilecek yerlere, yer tutucular yerleştirir. Bu yer tutuculara karşılık
gelecek değerleri de OleDbCommand sınıfının Parameters isimli
collectionuna girer. Parameters collectionu DbCommand sınıfından
gelmektedir. Parameters isimli collection property, XXXParameters
türünden nesneleri tutmaktadır. OleDb için bu sınıf OleDbParameters
sınıfıdır. OleDb uygulamalarında yer tutucu olarak “ ? ” kullanılır. Örneğin:
{23.02.2008 Cumartesi}
252
propertyler ileride kullanılacaktır. OleDbParameters sınıfının bazı
başlangıç fonksiyonları, zaten bu propertyleri otomatik set etmektedir.
Örneğin:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace AdoSample1
{
public partial class Form1 : Form
{
private OleDbConnection m_dbCon;
public Form1()
{
InitializeComponent();
if (arf.ShowDialog() == DialogResult.OK)
{
string cmdText = "INSERT INTO Info(PersonName,
PersonNo) VALUES(?,?)";
try
{
OleDbCommand cmd = new OleDbCommand();
cmd.CommandText = cmdText;
253
cmd.Parameters.Add(param1);
cmd.Parameters.Add(param2);
cmd.Connection = m_dbCon;
m_dbCon.Open();
cmd.ExecuteNonQuery();
//...
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
m_dbCon.Close();
}
}
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace AdoSample1
{
public partial class Form1 : Form
{
private OleDbConnection m_dbCon;
public Form1()
{
InitializeComponent();
254
m_dbCon.ConnectionString =
@"Provider=Microsoft.Jet.OLEDB.4.0; Data
Source=E:\DotNetAppBasic\AdoSample1\AdoSample1\Person.mdb";
}
if (arf.ShowDialog() == DialogResult.OK)
{
string cmdText = "INSERT INTO Info(PersonName,
PersonNo) VALUES(?,?)";
try
{
OleDbCommand cmd = new OleDbCommand();
cmd.CommandText = cmdText;
OleDbParameter param;
param = cmd.Parameters.Add("Name",
OleDbType.VarChar);
param.Value = arf.PersonName;
param = cmd.Parameters.Add("No",
OleDbType.Integer);
param.Value = arf.PersonNo;
cmd.Connection = m_dbCon;
m_dbCon.Open();
cmd.ExecuteNonQuery();
//...
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
m_dbCon.Close();
}
}
}
}
}
255
DataSet SINIFI
while(dr.Read())
{
//...
}
256
4- XXXDataReader sınıflarının iki indeksleyici elemanları vardır. String
parametreli indeksleyici, veritabanı tablosunun sütun bilgisini alarak,
o andaki kaydın sütun bilgisini verir. Int parametreli indeksleyici ise,
tablonun sütun indeks numarasını alarak, okunmuş olan kaydın
sütun numarasını verir. O halde örneğin; SELECT edilmiş kayıtların
elde edilmesi şöyle yapılabilir:
while(dr.Read())
{
string name = (string) dr[“PersonName”];
string no = (int) dr[“PersonNo”];
//...
}
Hocanın Örneği(SelectForm.cs):
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
namespace AdoSample1
{
public partial class SelectForm : Form
{
private OleDbConnection m_dbCon;
m_dbCon = dbCon;
}
try
{
OleDbCommand cmd = new OleDbCommand();
cmd.CommandText = cmdText;
257
cmd.Connection = m_dbCon;
m_dbCon.Open();
OleDbDataReader dr = cmd.ExecuteReader();
listView1.Items.Clear();
while (dr.Read())
{
string name = (string)dr["PersonName"];
int no = (int)dr["PersonNo"];
ListViewItem lvi = new ListViewItem(new
string[] {name, no.ToString()});
listView1.Items.Add(lvi);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
m_dbCon.Close();
}
}
}
}
while (dr.Read())
{
string name = dr.GetString(0);
int no = dr.GetInt32(1);
ListViewItem lvi = new ListViewItem(new string[] {name,
no.ToString()});
listView1.Items.Add(lvi);
}
258
SORGULAMA SONUCUNDA ELDE EDİLEN KAYITLARIN DATASET VE
DATABLE NESNELERİNE YERLEŞTİRİLMESİ
da.Fill(dt);
fd.ShowDialog();
}
catch (Exception ex)
{
259
MessageBox.Show(ex.Message);
}
}
da.Fill(ds);
fd.ShowDialog();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
da.Fill(ds, “Info”);
{24.02.2008 Pazar}
260
SELECT cümlesi ile bir DataSet ya da DataTable üzerine taşınmış
olan bilgilerde değişiklik yaptığımızda, bu durum yapılan değişikliklerin
diskteki veritabanına yansıtılacağı anlamına gelmez. Programcı çoğu kez
bellekte gerçekleştirilen değişikliklerden veritabanının etkilenmesini ister.
Örneğin; biz Fill fonksiyonu ile kayıtları bir DataTable içerisine
doldurduktan sonra, DataGridView kontrolü ile, kayıtları tek hamlede
DataGridView kontrolü üzerinde görüntüleyebiliriz. Bunun için tek
yapacağımız şey DataGridView kontrolünün DataSource elemanına,
DataTable nesnesini atamaktır. Bu işlemden sonra biz DataGridView
üzerinde değişiklik yaptığımızda, bu işlemlerden DataTable içerisindeki
satırlar etkilenir. Fakat veritabanı etkilenmez. Görüntüleme işlemi
DataGridView‘lar yerine TextBox’larla da yapılabilirdi. Aynı durum onun
için de geçerlidir. Şüphesiz programcı bu kontroller üzerindeki güncelleme
işlemlerini en azından bir tuşa basıldıktan sonra veritabanına yansıtılmasını
isteyecektir. DataTable ya da DataSet bellekte, veritabanından bağımsız
bir collection nesnesidir. Fill fonksiyonu ile biz kayıtları bu nesnelere
doldurduktan sonra veritabanı ile bu nesneler arasında bir bağlantı yoktur.
261
RowState elemanlarına bakar. Eğer RowState elemanı Edit ise
InsertCommand nesnesini, RowState elemanı Modified ise UpdateCommand
ve RowState elemanı Deleted ise DeleteCommand nesnelerini kullanarak
ExecuteNonQuery fonksiyonunu uygular. Bunu durumu değişmiş tüm
satırlar için yapmaktadır.
262
3- Artık komutun parametreleri tam olarak oluşturulmuştur ve bu
komut nesnesi ile ExecuteNonQuery fonksiyonu uygulanır.
OleDbParameter param;
param = deleteCmd.Parameters.Add("Name",
OleDbType.VarChar, 0, "PersonName");
param.SourceVersion = DataRowVersion.Original;
param = deleteCmd.Parameters.Add("No",
OleDbType.Integer, 0, "PersonNo");
param.SourceVersion = DataRowVersion.Original;
return deleteCmd;
}
Fill de kullanımı:
if (fd.ShowDialog() == DialogResult.Yes)
{
da.DeleteCommand = CreateDeleteCommand();
263
da.Update(ds.Tables["Info"]);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
OleDbParameter param;
param = insertCmd.Parameters.Add("Name",
OleDbType.VarChar, 0, "PersonName");
param.SourceVersion = DataRowVersion.Current;
param = insertCmd.Parameters.Add("No",
OleDbType.Integer, 0, "PersonNo");
param.SourceVersion = DataRowVersion.Current;
return insertCmd;
}
Fill de kullanımı:
da.Fill(ds, "Info");
264
if (fd.ShowDialog() == DialogResult.Yes)
{
da.DeleteCommand = CreateDeleteCommand();
da.InsertCommand = CreateInsertCommand();
da.Update(ds.Tables["Info"]);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
OleDbParameter param;
param = updateCmd.Parameters.Add("NameCurrent",
OleDbType.VarChar, 0, "PersonName");
param.SourceVersion = DataRowVersion.Current;
param = updateCmd.Parameters.Add("NoCurrent",
OleDbType.Integer, 0, "PersonNo");
param.SourceVersion = DataRowVersion.Current;
param = updateCmd.Parameters.Add("NameOriginal",
OleDbType.VarChar, 0, "PersonName");
param.SourceVersion = DataRowVersion.Original;
param = updateCmd.Parameters.Add("NoOriginal",
OleDbType.Integer, 0, "PersonNo");
param.SourceVersion = DataRowVersion.Original;
return updateCmd;
}
265
Fill içinde kullanımı:
if (fd.ShowDialog() == DialogResult.Yes)
{
da.DeleteCommand = CreateDeleteCommand();
da.InsertCommand = CreateInsertCommand();
da.UpdateCommand = CreateUpdateCommand();
da.Update(ds.Tables["Info"]);
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace AdoSample1
{
public partial class Form1 : Form
{
private OleDbConnection m_dbCon;
public Form1()
{
InitializeComponent();
if (arf.ShowDialog() == DialogResult.OK)
{
string cmdText = "INSERT INTO Info(PersonName,
PersonNo) VALUES(?,?)";
try
{
OleDbCommand cmd = new OleDbCommand();
266
cmd.CommandText = cmdText;
OleDbParameter param;
param = cmd.Parameters.Add("Name",
OleDbType.VarChar);
param.Value = arf.PersonName;
param = cmd.Parameters.Add("No",
OleDbType.Integer);
param.Value = arf.PersonNo;
cmd.Connection = m_dbCon;
m_dbCon.Open();
cmd.ExecuteNonQuery();
//...
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
m_dbCon.Close();
}
}
}
private void
deleteRecordToolStripMenuItem_Click(object sender, EventArgs
e)
{
DeleteRecordForm drf = new DeleteRecordForm();
if (drf.ShowDialog() == DialogResult.OK)
{
string cmdText = "DELETE FROM Info WHERE " +
drf.Condition;
try
{
OleDbCommand cmd = new OleDbCommand();
cmd.CommandText = cmdText;
cmd.Connection = m_dbCon;
m_dbCon.Open();
if (cmd.ExecuteNonQuery() == 0) {
MessageBox.Show("Record not found");
}
267
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
m_dbCon.Close();
}
}
}
if (sf.ShowDialog() == DialogResult.OK)
{
}
}
private void
randomRecordsToolStripMenuItem_Click(object sender, EventArgs
e)
{
RandomRecordsForm rrf = new RandomRecordsForm();
if (rrf.ShowDialog() == DialogResult.OK)
{
try
{
m_dbCon.Open();
string cmdText = "INSERT INTO
Info(PersonName, PersonNo) VALUES(?,?)";
OleDbCommand cmd = new OleDbCommand();
cmd.CommandText = cmdText;
OleDbParameter param;
cmd.Parameters.Clear();
param = cmd.Parameters.Add("Name",
OleDbType.VarChar);
param.Value = per.Name;
268
param = cmd.Parameters.Add("No",
OleDbType.Integer);
param.Value = per.No;
cmd.Connection = m_dbCon;
cmd.ExecuteNonQuery();
//...
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
m_dbCon.Close();
}
}
}
return per;
}
269
"SELECT PersonName, PersonNo FROM
Info", m_dbCon);
da.Fill(ds, "Info");
if (fd.ShowDialog() == DialogResult.Yes)
{
da.DeleteCommand = CreateDeleteCommand();
da.InsertCommand = CreateInsertCommand();
da.UpdateCommand = CreateUpdateCommand();
da.Update(ds.Tables["Info"]);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
OleDbParameter param;
param = deleteCmd.Parameters.Add("Name",
OleDbType.VarChar, 0, "PersonName");
param.SourceVersion = DataRowVersion.Original;
param = deleteCmd.Parameters.Add("No",
OleDbType.Integer, 0, "PersonNo");
param.SourceVersion = DataRowVersion.Original;
return deleteCmd;
}
OleDbParameter param;
270
param = insertCmd.Parameters.Add("Name",
OleDbType.VarChar, 0, "PersonName");
param.SourceVersion = DataRowVersion.Current;
param = insertCmd.Parameters.Add("No",
OleDbType.Integer, 0, "PersonNo");
param.SourceVersion = DataRowVersion.Current;
return insertCmd;
}
OleDbParameter param;
param = updateCmd.Parameters.Add("NameCurrent",
OleDbType.VarChar, 0, "PersonName");
param.SourceVersion = DataRowVersion.Current;
param = updateCmd.Parameters.Add("NoCurrent",
OleDbType.Integer, 0, "PersonNo");
param.SourceVersion = DataRowVersion.Current;
param = updateCmd.Parameters.Add("NameOriginal",
OleDbType.VarChar, 0, "PersonName");
param.SourceVersion = DataRowVersion.Original;
param = updateCmd.Parameters.Add("NoOriginal",
OleDbType.Integer, 0, "PersonNo");
param.SourceVersion = DataRowVersion.Original;
return updateCmd;
}
}
}
271
XXXCommandBuilder sınıfları, bir DataAdapter nesnesini alır ve
otomatik bir biçimde command nesnelerini oluşturur. Sınıfın DataAdapter
property elemanı vardır. Fakat atama, başlangıç fonksiyonu yoluyla
yapılabilir. Programcının yapacağı tek şey XXXCommandBuilder nesnesini
oluşturmaktır. XXXDataAdapter nesnesini alan sınıf, bütün bu işlemleri
otomatik olarak yapmaktadır. Yaratılan XXXCommandBuilder nesnesinin
kullanılmasına gerek yoktur. Çünkü komutların üretilmesi bazı event
işlemleri sırasında yapılmaktadır. Yani komutların üretilmesi
XXXCommandBuilder sınıfının başlangıç fonksiyonu yoluyla değil
XXXDataAdapter sınıfındaki bazı eventlerin gerçekleştirilmesi yoluyla
yapılmaktadır. O halde Update işlemi şöyle yapılabilir:
if (fd.ShowDialog() == DialogResult.Yes)
{
OleDbCommandBuilder cmdBuilder = new
OleDbCommandBuilder(da);
//da.DeleteCommand = CreateDeleteCommand();
//da.InsertCommand = CreateInsertCommand();
//da.UpdateCommand = CreateUpdateCommand();
da.Update(ds.Tables["Info"]);
}
if (fd.ShowDialog() == DialogResult.Yes)
{
new OleDbCommandBuilder(da);
da.Update(ds.Tables["Info"]);
}
272
DataGridView kontrolü, profesyonel uygulamalarda kullanıcılar için
yeterli bir arayüz sunmamaktadır. Kayıtlar görüntülenirken daha çok ileri
geri tuşları olan TextBox, CheckBox gibi kontrollerin kullanıldığı bir sunum
tercih eder. Örneğin; kullanıcı kişinin ismini ve numarasını bir TextBox’da
görüntüleyerek ileri geri işlemleri yapabilmelidir. Böyle bir uygulamayı
yapabilmek için manuel bir biçimde, kayıtların önce DataTable içerisine
yerleştirilip ileri geri tuşlarında bir aktif kayıt tutulabilir. Fakat bu işlemler
çok yorucudur. İşte bu işlemleri kolaylaştırmak için Microsoft veri bağlama
kavramını (data binding) geliştirmiştir. Veri bağlama sayesinde TextBox,
CheckBox gibi kontroller, veritabanı tablosunun çeşitli sütunları ile
ilişkilendirilebilir ve kayıt dolaşım işlemleri az bir çabayla
gerçekleştirilebilir.
MDI UYGULAMALARI
{02.03.2008 Pazar}
273
3- Yeni bir doküman penceresi yaratmak için, doküman penceresine
ilişkin Form sınıfı türünden new operatörü ile nesne yaratmak ve
Show fonksiyonunu uygulamak 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;
namespace MDISample
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
fr.Show();
}
274
Doküman pencerelerinden bir tanesi aktif durumdadır. Aktif
doküman penceresinin başlık kısmı default mavi yapılmıştır. Aktif
pencereler arasında dolaşmak için Ctrl+F6 ya da Ctrl+Tab tuşları
kullanılabilir. Fare ile herhangi bir pencerenin üzerine tıklanarak aktif hale
getirilebilir. Form sınıfının ActivateMdiChild isimli protected fonksiyonu,
parametre olarak bir doküman penceresi alır ve programlama yoluyla bu
doküman penceresini aktif hale getirir. Form sınıfının public
ActiveMdiChild isimli property elemanı read-only’dir ve o anda aktif olan
doküman penceresin vermektedir. Tabi bu property doküman penceresini
Form sınıfı biçiminde verir. Programcının aşağıya doğru dönüştürme
yapması gerekir.
Şüphesiz bir MDI uygulamasında, tek bir pencere tipi olmak zorunda
değildir. Örneğin; bir doküman penceresi fotoğrafları gösterirken diğeri
başka bir şeyleri edit edebilir. Bunların hepsi Frame penceresinde birer
form gibi saklanmaktadır.
275
Frame penceresinde MDI uygulamaları için MdiChildActivate isimli
bir event eleman da vardır. Herhangi bir doküman penceresi aktif hale
geldiğinde, bu event tetiklenir. Programcı bu eventte bazı işlemleri manuel
yapmak isteyebilir.
DocumentView MİMARİSİ
Anahtar Notlar:
Seri hale getirme işleminin zor olan tarafı, sınıfın başka sınıf
türünden veri elemanlarına sahip olması durumu ile ilgilidir. Örneğin; A
sınıfı B sınıfı türünden bir referansa sahipse, B sınıfı da C sınıfı türünden
bir referansa sahipse yalnızca A sınıfının veri elemanlarının saklanması
yetmez. Bütün bu referans zincirlerine ilişkin veri elemanlarının saklanması
276
gerekir. Geri alım sırasında benzer biçimde tüm bu elemanların okunması
ve bu nesnelerin tekrar yaratılması gerekir.
[Serializable]
class Sample
{
//...
}
Bir sınıf ya da yapının seri hale getirilebilmesi için, onun bütün veri
elemanlarının ve taban sınıfının Serializable özniteliği ile
özniteliklendirilmesi gerekir.
Anahtar Notlar
Bu durumda biz int, long, string gibi elemanlara sahip olan bir
sınıfı seri hale getirebiliriz.
277
elemanı varsa, bu döngüsellik fark edilmekte ve sonsuz döngü
oluşmamaktadır.
278