Daron Hocamızın açıklamasa hiç haberimizin olmayacağı :) Visual Studio 2008 de C# ile kod yazarken ihtiyacımız olan bütün klavye kısayolları. Görmeyenler için buradan da duyuruyorum. Artık kod yazarken mouse a son.
Kullanmadığımız ne kadar da çok kısayol varmış meğer. Posteri buradan indirebilirsiniz.
C# etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
C# etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
16 Aralık 2008 Salı
15 Aralık 2008 Pazartesi
C# Konsol Uygulamalarında Global Değişken
C# konsol uygulamalarında global değişken tanımlanamıyor. Global değişkenler tanımlandığı alandaki, fonksiyonlarda tekrar tanımlanmaya gerek duymadan kullanılabilen değişkenlerdir. Konsol uygulamalarında global değişken tanımlama yok, bunun yerine;
static int sayi = 0;
tanımlanıp global değişken gibi kullanılabilir.
static int sayi = 0;
tanımlanıp global değişken gibi kullanılabilir.
11 Aralık 2008 Perşembe
Resim Üzerine Yazı Yazma
Resim üzerine yazı yazma konusu herkesin bildiği bir şey. Graphics sınıfı kulanılarak istenen yere drawSring fonksiyonuyla yazı yazılır.
Sorun şurda, birden fazla resimler üzerine reklam amacıyla bir yazı yazmaya çalışıtığınızda farklı resimlere aynı font büyüklüğü değerini kulanılmıyor, tahmini bir değer de verilmiyor. width 100px olan bir resme 10 font büyüklü olursa, 200px olan bir resme 20 font büyüklüğü olur mantığı yanlıştır ve çalışmaz. Gerçek örnekler üzerinden gidersek 1600x1200 olan bir resimde font büyüklüğü bir arttığında resim üzerinde yazılan yazının büyüklüğü 42px kadar artar, fakat 900x1250 olan bir resimde ise 10px kadar artar. O yüzden kafamızdan bir font büyüklüğü belirleyemiyoruz.
Bir zamandır bununla uğraşıyordum bunu nasıl otomatik bir hale getirebilirim diye. Kodunu paylaşmak istedim. Alınan resmin tam ortasına yazılması istenen yazıyı yazıyor.
int fontSize = 1;
bool enough = false;
SizeF f = new SizeF();
string name = ""; // buraya serverda olan resmin adını yazıyoruz mesela a.jpg
Bitmap bmp = new Bitmap(Server.MapPath("~/resim/" + name));
Graphics g = Graphics.FromImage(bmp);
StringFormat format = new StringFormat(StringFormatFlags.FitBlackBox);
format.Alignment = StringAlignment.Center;
format.LineAlignment = StringAlignment.Center;
while (enough == false)
{
f = g.MeasureString("www.xx.com.tr", new Font("Verdana", fontSize, FontStyle.Regular));
if (f.Width <= bmp.Width - 40) //40 değeri formatta verilen dikdörtgenden dışarı çıkmaması için öylesine verilmiş bir değerdir
{
fontSize++;
}
else if (f.Width > bmp.Width - 40)
{
enough = true;
}
}
g.DrawString("www.xx.com.tr", new Font("Tahoma", fontSize, FontStyle.Bold), Brushes.White, new RectangleF(10, bmp.Height / 3, bmp.Width - 20, bmp.Height / 3), format);
bmp.Save(Server.MapPath("~/yaziliResim/Written" + name)); //resmin yazılmış şeklini kaydetme
Sorun şurda, birden fazla resimler üzerine reklam amacıyla bir yazı yazmaya çalışıtığınızda farklı resimlere aynı font büyüklüğü değerini kulanılmıyor, tahmini bir değer de verilmiyor. width 100px olan bir resme 10 font büyüklü olursa, 200px olan bir resme 20 font büyüklüğü olur mantığı yanlıştır ve çalışmaz. Gerçek örnekler üzerinden gidersek 1600x1200 olan bir resimde font büyüklüğü bir arttığında resim üzerinde yazılan yazının büyüklüğü 42px kadar artar, fakat 900x1250 olan bir resimde ise 10px kadar artar. O yüzden kafamızdan bir font büyüklüğü belirleyemiyoruz.
Bir zamandır bununla uğraşıyordum bunu nasıl otomatik bir hale getirebilirim diye. Kodunu paylaşmak istedim. Alınan resmin tam ortasına yazılması istenen yazıyı yazıyor.
int fontSize = 1;
bool enough = false;
SizeF f = new SizeF();
string name = ""; // buraya serverda olan resmin adını yazıyoruz mesela a.jpg
Bitmap bmp = new Bitmap(Server.MapPath("~/resim/" + name));
Graphics g = Graphics.FromImage(bmp);
StringFormat format = new StringFormat(StringFormatFlags.FitBlackBox);
format.Alignment = StringAlignment.Center;
format.LineAlignment = StringAlignment.Center;
while (enough == false)
{
f = g.MeasureString("www.xx.com.tr", new Font("Verdana", fontSize, FontStyle.Regular));
if (f.Width <= bmp.Width - 40) //40 değeri formatta verilen dikdörtgenden dışarı çıkmaması için öylesine verilmiş bir değerdir
{
fontSize++;
}
else if (f.Width > bmp.Width - 40)
{
enough = true;
}
}
g.DrawString("www.xx.com.tr", new Font("Tahoma", fontSize, FontStyle.Bold), Brushes.White, new RectangleF(10, bmp.Height / 3, bmp.Width - 20, bmp.Height / 3), format);
bmp.Save(Server.MapPath("~/yaziliResim/Written" + name)); //resmin yazılmış şeklini kaydetme
19 Ağustos 2008 Salı
C#'ta Transaction işlemi
Veri tabanından bildiğimiz transaction işlemlerini C# üzerinde veriTabanı bağlantılı projelerimizde de kullanabiliyoruz.
İlk önce nedir bu transaction sen neden bahsediyon kardeşim diyen olur kısaca, veri tabanı üzerinde yaptığımız değişikliklerde bir hata oluşması durumunda veya oluşmaması durumunda :) size kalmış o anda yapılan değişikleri geri alabiliyorsunuz (rollback tran) veya yapılan değişikleri artık veri tabanında gerçek yerine kaydet diyebiliyorsunuz (commit). Çünkü yapılan işlemler ram üzerinde olur commit derseniz veri tabanında ilgili yerlerde güncelleme yapılır rollback derseniz güncelleme yapılmaz eski hali kalır.
sp_calisanSil stored procedure
create proc [dbo].[sp_calisanSil]
@calisanID int
AS
delete from siparisDetaylari where siparisID IN(select siparisID from siparisler where calisanID = @calisanID)
delete from siparisler where calisanID = @calisanID
delete from calisanMemleket where calisanID = @calisanID
delete from calisanlar where calisanID = @calisanID
[C# kodu]
SqlConnection con = new SqlConnection("Data source=.; Initial Catalog=Northwind;Integrated Security=SSPI;");
SqlCommand cmd = new SqlCommand("sp_calisanSil", con);
cmd.CommandType = CommandType.StoredProcedure;
con.Open();
SqlTransaction tr = con.BeginTransaction();
cmd.Transaction = tr;
cmd.Parameters.AddWithValue("@calisanID", int.Parse(txtCalisanID.Text));
try {
cmd.ExecuteNonQuery();
tr.Commit();
}
catch (Exception ex) {
tr.Rollback();
MessageBox.Show(ex.Message);
}
finally {
if (con.State != ConnectionState.Closed)
con.Close();
}
Burada görüldüğü gibi bir çalışanı silmek için ilk önce siparisDetaylari, siparisler, calisanMemleket ve calisanlar tablosundaki silinmek istenen calisana ait bilgiler silinmelidir. Eğer bu sırayı yanlış yaparsak örneğin siparisDetaylari, calisanMemleket, siparisler, calisanlar diye siparisDetaylari ndaki veri silinir calisanMemleket teki veri silinmez ve sp bundan ileriye gitmez hata verir bu şekilde veri bütünlüğü bozulmuş olur. Bizim örneğimizde eğer bu şekilde hata olursa yapılan işlemler geri alınır (tr.Rollback()). Eğer hata oluşmazsa değişikler veri tabanı üzerine yazılır (tr.Commit())
Normal bağlantıdan farkı SqlTransaction nesnesi. Bu nesneyi, connection nesnesi ile transaction başlatıp eşitliyoruz, command nesnesinin transaction özelliğine transaction nesnesini veriyoruz ve gereken yerlerde commit ve rollback kullanıyoruz.
İlk önce nedir bu transaction sen neden bahsediyon kardeşim diyen olur kısaca, veri tabanı üzerinde yaptığımız değişikliklerde bir hata oluşması durumunda veya oluşmaması durumunda :) size kalmış o anda yapılan değişikleri geri alabiliyorsunuz (rollback tran) veya yapılan değişikleri artık veri tabanında gerçek yerine kaydet diyebiliyorsunuz (commit). Çünkü yapılan işlemler ram üzerinde olur commit derseniz veri tabanında ilgili yerlerde güncelleme yapılır rollback derseniz güncelleme yapılmaz eski hali kalır.
sp_calisanSil stored procedure
create proc [dbo].[sp_calisanSil]
@calisanID int
AS
delete from siparisDetaylari where siparisID IN(select siparisID from siparisler where calisanID = @calisanID)
delete from siparisler where calisanID = @calisanID
delete from calisanMemleket where calisanID = @calisanID
delete from calisanlar where calisanID = @calisanID
[C# kodu]
SqlConnection con = new SqlConnection("Data source=.; Initial Catalog=Northwind;Integrated Security=SSPI;");
SqlCommand cmd = new SqlCommand("sp_calisanSil", con);
cmd.CommandType = CommandType.StoredProcedure;
con.Open();
SqlTransaction tr = con.BeginTransaction();
cmd.Transaction = tr;
cmd.Parameters.AddWithValue("@calisanID", int.Parse(txtCalisanID.Text));
try {
cmd.ExecuteNonQuery();
tr.Commit();
}
catch (Exception ex) {
tr.Rollback();
MessageBox.Show(ex.Message);
}
finally {
if (con.State != ConnectionState.Closed)
con.Close();
}
Burada görüldüğü gibi bir çalışanı silmek için ilk önce siparisDetaylari, siparisler, calisanMemleket ve calisanlar tablosundaki silinmek istenen calisana ait bilgiler silinmelidir. Eğer bu sırayı yanlış yaparsak örneğin siparisDetaylari, calisanMemleket, siparisler, calisanlar diye siparisDetaylari ndaki veri silinir calisanMemleket teki veri silinmez ve sp bundan ileriye gitmez hata verir bu şekilde veri bütünlüğü bozulmuş olur. Bizim örneğimizde eğer bu şekilde hata olursa yapılan işlemler geri alınır (tr.Rollback()). Eğer hata oluşmazsa değişikler veri tabanı üzerine yazılır (tr.Commit())
Normal bağlantıdan farkı SqlTransaction nesnesi. Bu nesneyi, connection nesnesi ile transaction başlatıp eşitliyoruz, command nesnesinin transaction özelliğine transaction nesnesini veriyoruz ve gereken yerlerde commit ve rollback kullanıyoruz.
7 Ağustos 2008 Perşembe
F1 Help! C#
C# ta kod yazarken F1 in kullanımıyla ilgili bir örnek yapacağım, çok kolay ama önemli. Yapılan projelerde kullanıcıya bilgi vermek isteyebilirsiniz.
Öncelikle formun HelpButton özelliğini true olarak ayarlayıp kodumuzu da formun HelpRequested event ine yazacağız.
Örnekte mouse ile üzerinde olduğunuz kontrolü F1 tuşuna basarak o kontrolün adını öğrenebilirsiniz. Here is the sample..
Point pt = this.PointToClient(e.MousePos);
Control ctr = GetChildAtPoint(pt);
if (ctr == null) return;
MessageBox.Show("Bu kontrol: " + ctr.Name.ToString());
Bu kadar ;). Ne yapacağım kontrol adını öğrenipte :D
O zaman F1 tuşuna basıldığında program tarafından bir .html sayfası açtırın.
string file = Path.GetFullPath("xxx.html");
Help.ShowHelp(this, file);
Artık bundan sonrası hayal gücüne ve kullanım değişikliğine bakar. Değişik bir sürü şey yaplabilir.
Öncelikle formun HelpButton özelliğini true olarak ayarlayıp kodumuzu da formun HelpRequested event ine yazacağız.
Örnekte mouse ile üzerinde olduğunuz kontrolü F1 tuşuna basarak o kontrolün adını öğrenebilirsiniz. Here is the sample..
Point pt = this.PointToClient(e.MousePos);
Control ctr = GetChildAtPoint(pt);
if (ctr == null) return;
MessageBox.Show("Bu kontrol: " + ctr.Name.ToString());
Bu kadar ;). Ne yapacağım kontrol adını öğrenipte :D
O zaman F1 tuşuna basıldığında program tarafından bir .html sayfası açtırın.
string file = Path.GetFullPath("xxx.html");
Help.ShowHelp(this, file);
Artık bundan sonrası hayal gücüne ve kullanım değişikliğine bakar. Değişik bir sürü şey yaplabilir.
6 Temmuz 2008 Pazar
C# modifiers
C# modifiers değişkenlerin, classların, fonksiyonların vb. yerlerde kullanılan ve onların bazı özelliklerini belirten tanımlayıcı kelimelerdir. Her zaman karıştırılabilecek ve kullanılmadıkça unutulacak belirteçlerdir.
Başına eklendiği tip veya tip değişkenlerinin,
public: her yerden ulaşılabileceği ve değiştirilebileceği anlamına gelir.
private: sadece tanımlandığı alandan(class, form, vb) erişilip değiştirilebileceği anlamına gelir.
protected: tanımlandığı yerden miras alan alanlar tarafından erişilebilirler.
C#ta tanımlı bütün nesneler ulaşım belirteci olarak bu üçünden birini mutlaka alırlar.
abstract: Classların başına gelir ve bu sınıfın temel sınıf olduğunu belirtir. Yani bu sınıftan sadece miras alınabilir ve bu sınıfı new ile instance ını(kopyasını) alamayız.
sealed: selaed olarak tanımlanan sınıflar miras veremezler.
const: Sabit demektir. Tanımladığı nesneye en tanımladığı anda değer atar ve daha sonra bu değerin değiştirilmesine izin vermez.
virtual: Bu şekilde tanımlanan metodların daha sonra gerektiği yerde ezilecebileceği (değiştirilebileceği) anlamı taşır.
override: virtual olarak tanımlanan metodları miras alan sınıfta değiştirebilmek için override olarak tanımlamamız gerekiyor.
Sınıflarda tanımlanan bazı metodlar, o sınıftan miras alan bazı sınıflar tarafından kullanılamayabilir veya istenilen sonucu vermeyebilir. Miras alınan sınıftaki o metodu virtual tanımlarız daha sonra da miras alan sınıfta o metodu override ederek içeriğini değiştirebiliriz.
Başına eklendiği tip veya tip değişkenlerinin,
public: her yerden ulaşılabileceği ve değiştirilebileceği anlamına gelir.
private: sadece tanımlandığı alandan(class, form, vb) erişilip değiştirilebileceği anlamına gelir.
protected: tanımlandığı yerden miras alan alanlar tarafından erişilebilirler.
C#ta tanımlı bütün nesneler ulaşım belirteci olarak bu üçünden birini mutlaka alırlar.
abstract: Classların başına gelir ve bu sınıfın temel sınıf olduğunu belirtir. Yani bu sınıftan sadece miras alınabilir ve bu sınıfı new ile instance ını(kopyasını) alamayız.
sealed: selaed olarak tanımlanan sınıflar miras veremezler.
const: Sabit demektir. Tanımladığı nesneye en tanımladığı anda değer atar ve daha sonra bu değerin değiştirilmesine izin vermez.
virtual: Bu şekilde tanımlanan metodların daha sonra gerektiği yerde ezilecebileceği (değiştirilebileceği) anlamı taşır.
override: virtual olarak tanımlanan metodları miras alan sınıfta değiştirebilmek için override olarak tanımlamamız gerekiyor.
Sınıflarda tanımlanan bazı metodlar, o sınıftan miras alan bazı sınıflar tarafından kullanılamayabilir veya istenilen sonucu vermeyebilir. Miras alınan sınıftaki o metodu virtual tanımlarız daha sonra da miras alan sınıfta o metodu override ederek içeriğini değiştirebiliriz.
25 Mayıs 2008 Pazar
C# harddiske veri kaydetme
C# ta listView , listBox veya bunlara benzer kontrollerdeki veriler kolayca harddiske kaydedilir böylece uygulamanın tekrar açılışında veri kaybını önlemiş oluruz. İlk önce kaydedeceğimiz veriler bir class içinden alınıyorsa bu class a bi attribute eklememiz gerekiyor. class tanımlamadan önce namespace tanımlamasından sonra [Serializable] ekliyoruz.
Kullancağım değişkeni önce beilirteyim kisiler diye bir class tipinde dizi değişkenimiz var ve kaydetmek istediğimiz veriler bunun içinde olsun.
System.IO namespace altında tanımlanan özellikleri kullanacağız bu yüzden projenize bunu eklemeyi unutmayın.
Bir buton sayesinde kaydetme işlemi yapacağız. Buton click event ine aşağıdaki kodları yazmamız gerekiyor.
FileStream fs = new FileStream("Fihrist.bak", FileMode.Create);
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(fs, kisiler);
fs.Close();
MessageBox.Show("Kaydedildi");
FileStream bize dosyayı istediğimiz yerde oluşturup onu ne yapacağımızı bildirdiğimiz kısımdır. Burada FileStream("Fihrist.bak", FileMode.Create); FileStream e verilen ilk parametre dosyayı kaydedeceğimiz yerdir. C:/Fihrist.bak şeklinde yazarsak C'nin altına kaydedecektir sadece ismini yazarsak bizim projemizde bulunan bin dosyasının altındaki Debug klasörünün altına kaydedecektir. İstediğimiz ismi ve uzantıyı verebiliriz. Burada FileMode ile ise bu yeni bir dosya oluşturacağımızı söylüyoruz. İstersek var olan dosyayı da açabiliriz.
Dosyayı kullandıktan sonra kapatmayı unutmayın yoksa açık kalır :D
BinaryFormatter asıl işi yapar verimizi Serialize metodu sayesinde dosyaya binary halinde kaydeder. İşte bu kadar...
Daha sonra diyelim bu dosyadaki verileri açıp gereken yere koymak istiyoruz. O zaman şunları da Formun Load event ine yazın
FileInfo fInfo = new FileInfo("Fihrist.bak");
if (fInfo.Exists)
{
FileStream fs = new FileStream("Fihrist.bak", FileMode.Open);
BinaryFormatter bf = new BinaryFormatter();
kisiler = bf.Deserialize(fs) as List;
fs.Close();
Listele();
}
Buradaki Listele() metodu benim verilerimi ListView e yazmaya yarıyor. Fazla uzatmayayım en kısa bu kadar oldu.
Kullancağım değişkeni önce beilirteyim kisiler diye bir class tipinde dizi değişkenimiz var ve kaydetmek istediğimiz veriler bunun içinde olsun.
System.IO namespace altında tanımlanan özellikleri kullanacağız bu yüzden projenize bunu eklemeyi unutmayın.
Bir buton sayesinde kaydetme işlemi yapacağız. Buton click event ine aşağıdaki kodları yazmamız gerekiyor.
FileStream fs = new FileStream("Fihrist.bak", FileMode.Create);
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(fs, kisiler);
fs.Close();
MessageBox.Show("Kaydedildi");
FileStream bize dosyayı istediğimiz yerde oluşturup onu ne yapacağımızı bildirdiğimiz kısımdır. Burada FileStream("Fihrist.bak", FileMode.Create); FileStream e verilen ilk parametre dosyayı kaydedeceğimiz yerdir. C:/Fihrist.bak şeklinde yazarsak C'nin altına kaydedecektir sadece ismini yazarsak bizim projemizde bulunan bin dosyasının altındaki Debug klasörünün altına kaydedecektir. İstediğimiz ismi ve uzantıyı verebiliriz. Burada FileMode ile ise bu yeni bir dosya oluşturacağımızı söylüyoruz. İstersek var olan dosyayı da açabiliriz.
Dosyayı kullandıktan sonra kapatmayı unutmayın yoksa açık kalır :D
BinaryFormatter asıl işi yapar verimizi Serialize metodu sayesinde dosyaya binary halinde kaydeder. İşte bu kadar...
Daha sonra diyelim bu dosyadaki verileri açıp gereken yere koymak istiyoruz. O zaman şunları da Formun Load event ine yazın
FileInfo fInfo = new FileInfo("Fihrist.bak");
if (fInfo.Exists)
{
FileStream fs = new FileStream("Fihrist.bak", FileMode.Open);
BinaryFormatter bf = new BinaryFormatter();
kisiler = bf.Deserialize(fs) as List
fs.Close();
Listele();
}
Buradaki Listele() metodu benim verilerimi ListView e yazmaya yarıyor. Fazla uzatmayayım en kısa bu kadar oldu.
Kaydol:
Kayıtlar (Atom)