Forma yerleştirilen button ve diğer nesnelerin ilgili olayıyla metotların ilişkisi istenirse Properties penceresinde kurulabilir. Aşağıda verdiğim ekran görüntüsünü aldığım sırada Properties penceresinde button1 nesnesinin özellikleri listeleniyordu.
Properties penceresi 2 amaca yönelik olarak işlev görmektedir. Birincisi, form ve Toolbox'tan yararlanılarak formlara yerleştirilen nesnelerin özellikleri hakkında bilgi edinmek ve gerekirse bu özelliklerde değişiklik yapmaktır. Bu penceredeki Events düğmesi tıklandığında ise o sırada seçili durumdaki nesneye kaynaklık eden Class'ın olayları listelenmektedir. Aşağıda verilen ekran görüntüsünü button1 nesnesinin özellikleri listelenirken Events düğmesini tıkladıktan sonra aldım.
Bu button nesnesinin Click olayı Express Edition(veya Visual Studio) tarafından daha önceden Form1.cs dosyasındaki button1_Click() metoduyla ilişkilendirildiği için Click olayının karşısında bu metodun adı yazılıdır. Bu sırada Click olayının karşısındaki metodun adını silerseniz Express Edition gider Form1.Desing.cs dosyadaki metot ile olayı ilişkilendiren satırı siler.
Konu üzerinde düşünmenizi sağlamak için forma button2 adında 2. bir düğme yerleştirip Properties penceresinden yararlanıp bu düğmenin Click olayına button1_Click adını vermiş olduğum metodun adını aktardım.
Bu şartlarda çalışma anında formdaki 2. düğme tıklandığında Express Edition'den yararlanıp button1 için hazırlayıp button1_Click() adını verdiğim metot işletilir. Bu şartlarda button1_Click() metodu ile, hem button1'in hem de button2'nin Click olayı ilişkilendirildiği için çalışma anında ister button1 ister button2 tıklansın aynı metot işletilir. Hem button1 hem de button2 için Properties penceresinde Click olayı için aynı metodu seçmenin etkisiyle "Form1.Designer.cs" dosyasına aşağıda verdiğim 2 satır eklenir.
this.button1.Click = new System.EventHandler(this.button1_Click);
this.button2.Click = new System.EventHandler(this.button1_Click);
Şimdi ise forma bir TextBox yerleştireceğim. Öncelikle forma daha önce yerleştirdiğim button1 ve button2 adlı düğmeleri sileceğim. Forma yerleştirdiğiniz düğmeleri seçip Delete tuşuna basarsanız Express Edition gider Form1.Designer.cs dosyasında bu düğmelerle ilgili ne var ne yok her şeyi siler. Ancak tasarım anında düğmeyi çift tıklayarak veya kendi hazırladığınız bir metot varsa Form1.cs dosyasından silinmez. Söz konusu metoda gerek duymuyorsanız kendiniz silebilirsiniz.
Forma yerleştirmiş olduğunuz TextBox'ı tasarım anında çift tıklarsanız Express Edition TextBox'ın TextChanged olayı için metot hazırlamak istediğinizi varsaymaktadır. Bu nedenle TextBox'ı çift tıklarsanız hem Form1.cs dosyasının içeriği görüntülenir hem de aşağıdaki gibi bir metot hazırlanır.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
}
}
Bu metot çalışma anında TextBox'ın içeriği değiştirildikçe otomatik olarak işletilir. Ancak kendim bu TextBox'ın TextChanged olayı için değil KeyPress olayı için metot hazırlamak istiyorum. Şimdi bir tekrar yapalım: Tasarım anında formu çift tıklarsanız Express Edition ve Visual Studio sizin formun Load olayı için bir metot hazırlamak istediğinizi, Button nesnesini çift tıkladığınızda button nesnenin Click olayı için metot hazırlamak istediğinizi ve TextBox'ı çift tıkladığınızda ise TextChanged olayını temsil edecek bir metot hazırlamak istediğinizi varsaymaktadır. Madem forma yerleştirdiğim TextBox'ın KeyPress olayını temsil edecek bir metot hazırlamak istiyorum o halde söz konusu TextBox seçili iken Properties penceresinde TextBox'a ait olaylarının listelenmesini sağlamalıyım.
Bu TextBox'la ilgili olarak KeyPress olayı meydana geldiğinde(yani imleç TextBox'ın içinde iken kullanıcı klavyenin herhangi bir tuşuna bastığında) işletilmek üzere daha önce hazırladığınız bir metot varsa bu olaya ait liste kutusunu açıp bu metodu KeyPress olayıyla ilişkilendirebilirsiniz.
Bu amaçla kullanabileceğimiz herhangi bir metodumuz olmadığı için KeyPress olayının üzerinde çift tıklama yapmalıyız. KeyPress olayını çift tıkladığınızda Express Edition hem bir metot hazırlar hem de Form1.Designer.cs dosyasına müdahale edip bu metot ile KeyPress olayını ilişkilendirir.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
}
}
Express Edition tarafından hazırlanan bu metotta, metot adından sonra parantezlerin içinde (object sender, KeyPressEventArgs e) bilgisi var. Başka bir deyişle TextBox1'in KeyPress olayını temsil etmek üzere hazırlanan bu metot Object ve KeyPressEventArgs tipinde 2 parametreye sahiptir. Basılan tuşu temsil eden bilgi metoda KeyPressEventArgs tipindeki 'e' adındaki parametre ile gönderilir. TextBox'ın içinde iken Enter tuşuna basıldığı zaman o zamana kadar TextBox'a girilmiş bilgileri bir diyalog kutusu içinde ekrana getirmek için bu metodu aşağıdaki gibi düzenledim.
private void textBox1_KeyPress(object sender,KeyPressEventArgs e)
{
if (e.KeyChar == 13)
MessageBox.Show(textBox1.Text);
}
Bu metotta 'if' deyimi ile en son basılan tuşun ASCII kodu 13 olan Enter olup olmadığı araştırılıyor. En son basılan tuşun kodu 13 ise MessageBox sınıfının Show() metodu ile TextBox'ın 'Text' özelliğinin içeriği ekrana getiriliyor. En son basılan tuşun kodu 13 değilse imleç TextBox'ın içinde bilgi girişi için beklemeye devam eder.
Forma yerleştirilen TextBox ve Button gibi nesnelerin değişik olaylarını temsil etmek üzere metot hazırlama işleminin kavranmasına katkı olması için TextBox'ların Enter ve Leave olaylarından söz edeceğim. Formdaki herhangi bir nesneden TextBox'ın üzerine gittiğinizde veya imlecin TextBox'a yerleşmesine neden olduğunuzda Enter olayı meydana gelir. Bu olayın nasıl kullanıldığına örnek olması için forma birden fazla TextBox yerleştirip ilk TextBox'ın Enter olayını temsil etmek üzere aşağıda verdiğim metodu hazırladım.
Tabii yarın bir gün yerli yazarın birisi ortaya çıkıp TextBox'ların Enter olayını temsilen metot hazırlamayı ilk ben akıl ettim, dolayısıyla fikri haklarıma tecavüz ettiniz diye buyrun mahkemeye derse hiç şaşırmamak gerekir. Zira bu memlekette bu böyle bir iddiayı onaylayacak çok sayıda bilim(sizlik) eri vardır.
private void textBox1_Enter(object sender, EventArgs e)
{
textBox1.BackColor = Color.GreenYellow;
}
Bu metoda yazılan satır sayesinde textBox1'in üzerine gidildiğinde zemin rengi değişikliği olur. Kullanıcı TextBox'a bilgi girip başka bir kontrolün yani nesnenin üzerine gittiğinde ise zemin rengini eski halinde çevirmek istiyorsanız aynı TextBox'ın Leave olayını temsil eden(yani Leave olayı meydana geldiğinde işletilen) metodu aşağıdaki gibi düzenleyebilirsiniz.
private void textBox1_Leave(object sender, EventArgs e)
{
textBox1.BackColor = Color.White;
}
Bazen istenen miktarda bilgi girmediği için kullanıcının TextBox'tan ayrılmasına izin verilmek istenmez. Bu gibi durumlarda Validated olayından yararlanılır. Kullanıcı TextBox'ı boş geçmek istediğinde buna izin vermemek için TextBox'ın Validated olayını temsil eden metodu aşağıdaki gibi düzenledim. Bu metotta kullanılan Focus() metodu ile formdaki istenen nesnenin üzerine gidilebilmektedir.
private void textBox1_Validated(object sender, EventArgs e)
{
if (textBox1.Text == ""
{
MessageBox.Show("Bu alanı boş geçemezsiniz";
textBox1.Focus();
}
}
Projeler İçin 2. Form Hazırlamak Yukarıdaki sayfalarda işaret edildiği gibi Express Edition ile gelen Windows Forms Application şablonu ile hazırlanan projeler 'Form1' adında bir forma sahip olmakta ve bu form projenin başlangıç formu olmaktadır. Projenizde 2. bir formun olmasını istiyorsanız Express Edition'nın Project menüsünden Add Windows Form komutunu verip ekrana aşağıda verilen Add New Item diyalog kutusu getirmelisiniz.
Bu diyalog kutusunda üzerinde çalıştığınız projeye kod dosyaları, formlar vs eklerken kullanabileceğiniz şablonlar listelenmektedir. Projeye normal bir form eklemek istediğim için Windows Form şablonunu seçtim. Bu diyalog kutusunda kod dosyasına vereceğiniz ad aynı zamanda hazırlanacak sınıfın yani formun adı olarak kullanılmaktadır. Üzerinde çalıştığım projeye Form2 adında ikinci bir form ekleyince Express Edition penceresi aşağıda verilen şekle dönüştü.
Add New Item diyalog kutusundaki Windows Form şablonundan yararlanıp üzerinde çalıştığım projeye Form2 adında 2. form dahil edince bu formu temsilen ikisi kod dosyası olmak üzere toplam 3 dosya hazırlandı. Form2.Designer.cs dosyasında formun görsel yapısı ile ilgili kodlar bulunurken 'Form2.cs' dosyasında ise programcının yazdığı satırlar olmaktadır.
Şimdi projedeki 2. formu başlangıç formu olarak ayarlayacağım. Başka bir deyişle proje çalıştırıldığı zaman ekrana 2. formun gelmesini sağlayacağım. Bu amaçla Program.cs dosyasındaki Main() metodunda Applicaiton sınıfının Run() metoduna parametre olarak "Form1" sınıfının örneği yerine Form2'nin örneğini parametre olarak verdim.
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form2());
}
Projeki 2. Formu Ekrana Getirmek Projenizdeki ikinci formu yani başlangıç formu olarak kullanılmayan formu ekrana getirmek istiyorsanız bazı hazırlıkları yapmanız gerekir. Üzerinde çalıştığım projedeki 2. formu ekrana getirirken kullanmak üzere ilk forma bir düğme yerleştirdim ve bu düğmenin Click olayını temsil etmek üzere aşağıda verdiğim metodu hazırladım. Bu metoda yazdığım satır ile Form2 sınıfından yola çıkılarak 'ikinci_Form' adında bir nesne hazırlanmaktadır. Bakmayın siz başka kitaplarda bu işleme 'yavru(m) değişken tanımlama' demelerine burada Form2 sınıfının örneği hazırlanmaktadır, yani nesne hazırlanmaktadır.
private void button1_Click(object sender, EventArgs e)
{
Form2 ikinci_form = new Form2();
}
Yukarıdaki sayfalarda belirtildiği gibi herhangi bir Class'ın(burada Form2) örneği hazırlanırken new anahtar kelimesi kullanılmaktadır. new anahtar kelimesinden sonra ilgili sınıfın yapıcı yani constructor metodunu kullanmak gerekiyor. Yukarıdaki sayfalarda belirtildiği gibi sınıfların yapıcı metoduna sınıfın adı verilmektedir. Buna göre Form2 sınıfının yapıcı metodunun adı 'Form2()' olmaktadır. C# programlama dilinde metotlar kullanılırken metot adına '()' eklenmektedir.
Bazı yazarlar bir sınıfın örneğini almaya yavru değişken tanımlama diyorlar. Tabii bazılarınızın aklına yavru değişken olduğuna göre torun değişken nasıl tanımlanır sorusu gelmiş olabilir. Size bir tiyo: Dünyanın en zor işlerinden birisi nesneye yönelik programcılık kavramlarına sahip olmadan C# gibi 0 nesneye yönelik programlama dilini anlatmaya soyunmaktır.
Bu metoda yazdığım satırda gerçekte 2 işlem yapılmaktadır. İlk işlemde Form2 tipinde değişken tanımlanmaktadır. 2. işlemde ise new anahtar kelimesi ile Form2 sınıfının yapıcı metodu işletilip bu metodun geriye gönderdiği nesne örneği(daha doğrusu nesnenin referansı) tanımlanan değişkene aktarılmaktadır.
Bu şekilde hazırlanan Form2 tipindeki nesne Show() metodu ile ekrana getirilir. 'Form' sınıfının Show() metodunun nasıl kullanıldığını aşağıda görebilirsiniz. 2 form içeren proje başlatıldığında projenin ilk formunun kendiliğinden ekrana geldiğini biliyorsunuz.
private void button1_Click(object sender, EventArgs e)
{
Form2 ikinci_form = new Form2();
ikinci_form.Show();
}
Bu kodda Form2 sınıfının örneğinin referansını tutacak değişkene ikinci_form adını verdim. Olur ya yerli yazarın birisi de kitabında ikinci_form adında bir değişken tanımlamıştır. Tedbir almazsam değişken adı çalmakla suçlanabilirim. 'değişken adı çalmış mı' sorusuna cevap aramak amacıyla bu metni okuyacaklara rehber olması bakımından yukarıda verdiğim kodu bir de aşağıdaki gibi düzenledim. Yani böylece değişkenlere ad seçerken çaresiz kalıp başka kitaplardan değişken adı çalmayı tercih etmediğimi bilgisayar tahsili yapmış öğretim üyelerine, bilen kişilere ve yerli yazarlara kanıtlamış oluyorum.
private void button1_Click(object sender, EventArgs e)
{
Form2 ikinci_kazma = new Form2();
ikinci_kazma.Show();
}
Böylece değişkenlere ad bulabildiğimi kanıtladıktan sonra konumuza devam edebiliriz. Ekranda 2. form varken yukarıda verilen kod işletildiğinde, yani formdaki düğme tekrar tıklandığında aynı formun 2. veya 3. kopyası ekrana getirilir. Projedeki 2. formun 2. ve 3. kopyasının aynı anda ekrana gelmesini engellemek için kullanılabilinecek değişik teknikler olmakla birlikte ilk aklıma geleni yazacağım. Bu amaçla yukarıda hazırladığım kodu değiştirip Show() metodu yerine ShowDialog() metodunu kullandım.
private void button1_Click(object sender, EventArgs e)
{
Form2 ikinci_form = new Form2();
ikinci_form.ShowDialog();
}
ShowDialog() metodu ile ekrana getirilen form kapatılmadan projenin ana formuna geçilemez. Formları ShowDialog() metodu ile ekrana getirmenin bir diğer özelliği ise şudur: ShowDialog() metodu ile ekrana getirilen form normal bir şekilde yani Kapat düğmesi tıklanarak kapatıldığında bellekten yok edilmeyip gizlenmektedir.
Bu sorunun önüne geçmek, başka bir deyişle hem 2. formu Show() metodu ile ekrana getirmek hem de ekranda aynı anda 2. kopyasının olmasını engellemek için değişken tanımlama satırı düğmeye ait Click() metodunun dışına alınabilinir. Aşağıda verilen kodda bu işlemi nasıl yaptığımı görebilirsiniz.
Yukarıda verdiğim kodda 'ikinci_form' adındaki değişkeni button1_Click() metodu sınırları içinde tanımladığım için bu değişken yani nesne ancak bu metodun sınırları içinde yaşar. Aşağıda verdiğim kodda ise bu değişkeni metodun sınırları dışına, başka bir Class bloğuna aldığım için bu nesne bu Class'ın her yerinde yaşar.
Form2 ikinci_form = new Form2();
private void button1_Click(object sender, EventArgs e)
{
ikinci_form.Show();
}
Bu şartlarda formdaki düğmeyi tekrar tıklasanız bile projedeki 2. form tekrar ekrana getirilmez. Ancak bu şekilde ekrana getirdiğiniz 2. formu kapattıktan sonra Show() metodu ile tekrar ekrana getirmek istemeniz halinde hata meydana gelir. Çünkü bu şekilde hazırlanıp Show() metodu ile ekrana getirilen form normal bir şekilde kapatıldığında otomatik olarak bellekten silinir. Dolayısıyla yok edilen form tekrar ekrana getirilemez.
Projedeki 2. formun ekrana getirilmesi sırasında yaşanan bütün sorunların önüne geçmek için formu oluşturan ve Show() metodu ile ekrana getiren satırları aynı metoda yazdım ama form nesnesini new anahtar kelimesi ile tekrar oluştururken mevcut olup olmadığını araştırdım. Söz konusu form henüz oluşturulmadıysa null olmaktadır.
Form2 ikinci_form;
private void button1_Click(object sender, EventArgs e)
{
if (ikinci_form == null || ikinci_form.IsDisposed)
{
ikinci_form = new Form2();
ikinci_form.Show();
}
}
Yukarıdaki sayfalarda yazılanlara göre projede kaç form olursa olsun 'Program.cs' dosyasında bu formlardan birisinin örneği new anahtar kelimesi ile hazırlanıp Application nesnesinin Run() metoduna parametre olarak verilmektedir. Program.cs dosyasında new anahtar kelimesini birden fazla kez kullanıp farklı sonuçlar elde edebilirsiniz. Bu konuda bilgi vermek için 2 forma sahip yeni bir proje hazırladım ve "Program.cs" dosyasındaki Main() metodunu aşağıdaki gibi düzenledim.
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
Application.Run(new Form2());
}
Bu şartlarda proje çalıştırılırsa Run() metodunun kullanıldığı ilk satırda projenin ilk formu ekrana getirilir. İlk form kapatıldığında Run() metodunun 2. kez kullanıldığı satır işletilir ve 2. form ekrana getirilir. Bu şartlarda Form2 kapatıldıktan sonra projenin çalışması sona erer.
Formları Kapatmak ve Projelerin Çalışmasını Sona Erdirmek Projenizin başlangıç formunu kapattığınızda ister o sırada açık olan başka form olsun ister olmasın projenin çalışması sona erer. İster projenin başlangıç formu ister diğer formlar kapatılmak istensin kapatılma öncesi FormClosing olayı meydana gelmektedir. Bu olay meydana geldiği zaman işletilecek bir metot hazırlayarak kullanıcıyı uyarabilir veya formun kapatılmasını engelleyebilirsiniz.
Bu amaçla Properties penceresinde projenin ilk formunun özellikleri listelenirken Events sekmesine geçtim ve FormClosing olayını çift tıklayıp Express Edition'nın aşağıdaki gibi bir metot hazırlamasını sağladım.
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
}
Metodun yapısı incelendiğinde birisi object tipinde diğeri FormClosingEventArgs tipinde 2 parametreye sahip olduğu görülür. Kullanıcı formu kapatmak isteyip FormClosing olayının meydana gelmesine neden olduğunda metotta 'e' adı verilen FormClosingEventArgs tipindeki parametreden yararlanıp formun kapatılmasını kullanıcının onayına bağlayabilirsiniz. Bu işlemin nasıl yapıldığını anlatmak için bu metodu aşağıdaki gibi düzenledim.
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
DialogResult Sonuc;
Sonuc=MessageBox.Show("Pencere kapatılsın mı?",
Kapatma", MessageBoxButtons.YesNoCancel);
if (Sonuc == DialogResult.No || Sonuc == DialogResult.Cancel)
{
e.Cancel = true;
}
}
Bu kodda önce DialogResult tipinde bir değişken tanımladım. Çünkü kullanıcıdan onay alınırken kullanılan MessageBox sınıfının Show() metodu geriye DialogResult tipinde bilgi göndermektedir. Bu metotta MessageBox sınıfının Show() metodunun 3 parametreli sürümünü kullandım. 3. parametre olarak MessageBoxButtons.YesNoCancel kullanarak ekrana getirilecek diyalog kutusunda Evet, Hayır ve İptal düğmelerinin olmasını sağladım.
MessageBox sınıfının Show() metodu ile ekrana getirmek istediğim diyalog kutusunda Durdur, Yeniden Dene ve Yoksay düğmelerinin olmasını istemiş olsaydım 3. parametre olarak MessageBoxButtons.AbortRetryIgnore sabitini kullanırdım. MessageBox sınıfının Show() metodu, tıklanan düğmeye bağlı olarak geriye DialogResult tipinde bir değer göndermektedir. Geriye gönderilen bilgiyi öğrenmek için 'Sonuc' değişkenin içeriğini kontrol edip kullanıcı hayır veya iptal düğmesini tıkladıysa metodun FormClosingEventArgs tipindeki 2. parametresinin Cancel özelliğini True yapıp formun kapatılmasını engelledim.
Kullanıcı MessageBox sınıfının Show() metodu ile ekrana getirilen diyalog kutusunda Evet düğmesini tıklarsa 'if' deyimi ile yapılan karşılaştırma doğru değerini vermeyeceği için 'e' adlı parametrenin Cancel özelliği false olarak kalmaya devam edeceği için formun kapatılmasının önüne geçilmemiş olunur.
Yukarıda işaret edildiği gibi projenizin başlangıç formunu kapatmanız halinde projenin çalışması sona ermektedir. Varsayalım ki karşınızda projenizin başlangıç formu yok ve siz projenin çalışmasını sona erdirmek istiyorsunuz. Bu durumda önce başlangıç formunu aktif form yapıp sonra kapatırsınız. Projenizin çalışmasını sona erdirirken Application sınıfının Exit() metodundan yararlanabilirsiniz. Bu metodun nasıl kullanıldığını anlatmak için forma 'Cikis' adında bir düğme yerleştirip bu düğmenin Click olayını temsil eden metodu aşağıdaki gibi düzenledim.
private void Cikis_Click(object sender, EventArgs e)
{
DialogResult onay;
onay = MessageBox.Show("Projeden Çıkılsın mı?",
"Onay Kutusu", MessageBoxButtons.YesNo);
if (onay == DialogResult.Yes)
{
Application.Exit();
}
}
Bu metotta önce DialogResult tipinde bir değişken tanımladım. Ardından kullanıcıdan programdan çıkılıp çıkılmayacağı konusunda MessageBox sınıfının Show() metodu sayesinde onay alınmaktadır. Show metodu bu şekilde kullanıldığında ekrana getirilecek diyalog kutusunda Evet veya Hayır düğmeleri olur.
Kullanıcı bu diyalog kutusundaki Evet düğmesini tıklarsa 'onay' değişkenine 'DialogResult.Yes' bilgisi, Hayır düğmesini tıkladığında ise 'DialogResult.No' bilgisi aktarılır. 'onay' adını verdiğim değişkenine "DialogResult.Yes" sabiti aktarılmışsa if deyimine parametre olarak verilen karşılaştırmanın sonucu doğru olur ve '{' ile '}' işaretleri arasında bulunan satır işletilir ve Application.Exit(); satırı ile projenin işletimi sona erdirilir
PictureBox Konrolü .NET Framework ile gelip Visual Studio ve Express Edition'nın Toolbox'ında yer alan çok sayıda kontrol bulunmaktadır. Gerçekte birer sınıf olan bu kontrollerin her birisinin farklı işlevleri vardır. Bu kitapçıkta ancak birkaç kontrolden söz edebildik. Programcılığa henüz adım atanların ilgisini çeken kontrollerden birisi PictureBox olduğu için kısaca PictureBox'tan söz edeceğiz. Bu amaçla Toolbox'tan yararlanıp üzerinde çalıştığım projenin formuna PictureBox nesnesi yerleştirdim.
Forma PictureBox nesnesini yerleştirdikten sonra PictureBox tarafından sınırlanan alanda istediğiniz resim dosyasının içeriğini görüntüleyebilirsiniz. Bu işlemi Properties penceresinde yapmak yerine kod yazarak yapacağım. Bu amaçla forma Button nesnesi yerleştirip bu düğmenin Click olayı ile ilişkilendirdiğim metodu aşağıdaki gibi düzenledim.
private void resim_sec_Click(object sender, EventArgs e)
{
pictureBox1.Image= System.Drawing.Bitmap.FromFile("C:\\jazz.jpg";
}
Bu metoda yazdığım satırda System.Drawing'de bulunan Bitmap sınıfının FromFile() metodu ile ilgilendiğim jpg dosyasını okuyup PictureBox nesnesinin Image özelliğine aktardım. Express Edition ve Visual Studio ile hazırlanan projelerde System.Drawing adlı namespace kod dosyasının başında using deyimi ile kullanılacak sınıfların aranacağı listeye dahil edildiği için Bitmap sınıfından önce namespace adını yazmayabilirdim. Burada dikkat edilmesi gereken bir nokta var: C#'ta '\' karakteri özel bir karakter olduğu için çift '\\' kullanmak gerekiyor.
PictureBox'ta görüntülenecek dosyayı çalışma anında seçebilmek için forma ayrıca bir OpenFileDialog nesnesi yerleştirdim. OpenFileDialog nesnesi çalışma anında formun üzerinde görünmediği, başka bir deyişle görsel bir kontrol olmadığı için formun altında hazırlanan panele yerleştirilmektedir.
Çalışma anında kullanıcı formdaki düğmeyi tıkladığında ekrana dosya seçimi yapılan diyalog kutusunu getirmek ve seçilen dosyayı PictureBox'ta görüntülemek için yukarıda verdiğim kodu aşağıdaki gibi düzenledim.
private void resim_sec_Click(object sender, EventArgs e)
{
System.Windows.Forms.DialogResult Sonuc;
openFileDialog1.Filter = "Resim Dosyaları |*.JPG;*.BMP;*.GIF";
Sonuc = openFileDialog1.ShowDialog();
if (Convert.ToString(Sonuc) == "OK"
{
string Dosya = openFileDialog1.FileName;
pictureBox1.Image = System.Drawing.Bitmap.FromFile(Dosya);
}
}
Bu kodda tanımladığım değişken ve nesnelere verdiğim adlar(resim_sec, Sonuc ve Dosya) herkesin aklına gelebilecek birer değişken adı olduğu için 'değişken adı hırsızı' olarak anılmam an meselesidir. Bu nedenle yani bu kodda tanımlanan değişkenlere başka adlar verilse bile kodun çalışacağını kanıtlamak için bu kodu bir de aşağıdaki gibi düzenledim.
private void adam_sec_Click(object sender, EventArgs e)
{
System.Windows.Forms.DialogResult hatice_netice;
openFileDialog1.Filter = "Resim Dosyaları |*.JPG;*.BMP;*.GIF";
hatice_netice = openFileDialog1.ShowDialog();
if (Convert.ToString(hatice_netice) == "OK"
{
string kutuk_oglu_kutuk = openFileDialog1.FileName;
pictureBox1.Image=System.Drawing.Bitmap.FromFile(kutuk_oglu_kutuk);
}
}
Bu metotta önce System.Windows.Forms.DialogResult tipinde bir değişken tanımladım. Bu değişkenden dosya seçilen diyalog kutusunu kullanıcının hangi düğme ile kapattığını öğrenirken yararlanacağım. Devamında OpenFileDialog nesnesinin Filter özelliğini ayarladım. Bu ayarlama sayesinde OpenFileDialog nesnesi ile ekrana getirilecek diyalog kutusunda yalnızca geçerli klasördeki JPG, BMP ve GIF uzantılı dosyaların listelenmesini sağladım.
FromFile() metodunun işlevi üzerinde düşünmenizi sağlamak için önce bir Bitmap tipinde bir değişken tanımladım. Devamında FromFile() metodu ile okuduğum resim dosyasını Bitmap nesnesine, oradan da PictureBox'a aktarmaya çalıştım.
private void resim_sec_Click(object sender, EventArgs e)
{
Bitmap resim;
resim = Bitmap.FromFile("C:\\jazz.jpg";
pictureBox1.Image = resim;
}
İlk bakışta bu 3 satırlık koddan sonuç alınabileceği sanılabilir. Gerçekte bu kod hataya neden olur. Çünkü Bitmap sınıfının FromFile() metodu geriye Image tipinde nesne göndermesine rağmen Bitmap tipindeki değişkene aktarmaya çalıştık. Yukarıda FromFile() metodunun geriye gönderdiği nesneyi direk PictureBox'ın Image tipindeki Image özelliğine aktardığımız için sorun yaşamamıştık. Bu 3 satırlık kod aşağıdaki gibi düzenlenirse hata meydana gelmez.
private void resim_sec_Click(object sender, EventArgs e)
{
Image resim;
resim = Image.FromFile("C:\\jazz.jpg";
pictureBox1.Image = resim;
}
Programcıların en çok gerek duydukları işlemlerden birisi tipler arasında dönüştürme yapmaktır. Image tipindeki nesneyi Bitmap tipindeki nesneye aktarmak için bu kodu değiştirip Bitmap tipinde değişken tanımlayıp FromFile() metodunun geriye gönderdiği Image tipindeki nesneyi dönüştürüp Bitmap tipindeki değişkene aktardım.
private void resim_sec_Click(object sender, EventArgs e)
{
Bitmap resim;
resim = (Bitmap)Bitmap.FromFile("C:\\jazz.jpg";
pictureBox1.Image = resim;
}
Burada 2. satırdaki '(Bitmap)' ile söz konusu bilgi Bitmap tipine dönüştürülmektedir. İlgilenilen nesne hangi tipe dönüştürülmek isteniyorsa o tip parantezlerin içinde dönüştürülmek istenen nesnenin önüne yazılmalıdır. Burada kafaların karışmasına neden, Bitmap sınıfının FromFile() metodunun geriye Bitmap yerine Image tipinde bilgi göndermesidir. Bitmap sınıfının FromFile() metodu yerine Image sınıfının FromFile() metodunu kullansaydım dönüştürme yapmaya gerek kalmazdı.
private void resim_sec_Click(object sender, EventArgs e)
{
Image resim;
resim = Image.FromFile("C:\\jazz.jpg";
pictureBox1.Image = resim;
}
Dönüştürme işleminin anlaşılmasına katkı olması için şimdi de ICO uzantılı bir dosyayı PictureBox'ta görüntüleyeceğim. Bu amaçla hazırladığım kodu aşağıda görebilirsiniz. System.Drawing'de yer alan Icon sınıfının Bitmap ve Image sınıflarında olduğu gibi FromFile() gibi bir metodu olmadığı için ilgilendiğim ico uzantılı dosyayı Icon sınıfının yapıcı metoduna parametre olarak verdim.
private void resim_sec_Click(object sender, EventArgs e)
{
Icon ikon = new Icon("C:\\kapat.ico";
pictureBox1.Image = (Image)ikon ;
}
İlk bakışta bu kodun hatasız çalışıp Icon tipindeki nesnenin Image tipine dönüştürülüp PictureBox'ta görüntüleneceği sanılabilir. Ne ki burada yapıldığı gibi icon tipindeki nesneyi Image nesnesine dönüştürmek mümkün olmadığı için Icon sınıfının ToBitmap() metodundan yararlanmak gerekiyor. Bu metodun nasıl kullanıldığını aşağıda görebilirsiniz.
private void resim_sec_Click(object sender, EventArgs e)
{
Icon ikon = new Icon("C:\\kapat.ico";
pictureBox1.Image = ikon.ToBitmap() ;
}