08 Ağu 2008 Access Modifier (Erişim Belirleyicler) Kategori: Yazılım Etiketler: C#C# 4.0C# 3.0C# 2.0 0 Yorum C# da kullanılan erisim belirleyiciler sunlardır,public Public olan üyelere heryerden erisilebilir. privatePrivate üyelere sadece bulundugu sınıftan erisilebilirinternalInternal üyelere sadece bulundugu assembly`den erisilebilirprotectedProtected üyelere sadece miras alan sınıflar erisebilir. Miras alan sınıfı miras alan sınıflarda erisebilir. Kısaca bütün miras alma islemlerinde kullanılır. Instance`ı olusturulup kullanılamaz.protected internalProtected Internal üyelere kendinsini miras alan sınıflar erisir veya aynı assembly içinden erisebilirler
13 Haz 2008 C# ile MASAÜSTÜ ARKAPLANINI DEGISTIRME Kategori: C#.NET Etiketler: C#C# 2.0 1 Yorum Merhaba arkadaslar, bu makalemizde C# ile Registry Class sinifini kullararak isletim sistemimizin masaüstü arkaplan resminin nasil degistirilecegine bakacagiz. Isletim sistemimiz üzerindeki neredeyse tüm ayarlar registry'de saklanir. Masaüstü arkaplan resmi de bunlardan bir tanesidir. Registery'e erismek için .Net Framework içerisinde Win32 namespace'nin altinda RegistryKey Sinifi bulunmaktadir. Bu sinif Kayit Defterinde bulunan registry degerleri okumamiza, silmemize ve degistirmemizi saglar. Özellikleri ve metodlari sunlardir.Isletim sistemimiz üzerindeki neredeyse tüm ayarlar registry'de saklanir. Masaüstü arkaplan resmi de bunlardan bir tanesidir. Registery'e erismek için .Net Framework içerisinde Win32 namespace'nin altinda RegistryKey Sinifi bulunmaktadir. Bu sinif Kayit Defterinde bulunan registry degerleri okumamiza, silmemize ve degistirmemizi saglar. Özellikleri ve metodlari sunlardir. Name ÖzelligiAnahtarin adini verir. SubKeyCount ÖzelligiAlt anahtar sayisini verir. ValueCount ÖzelligiDeger sayisini verir. OpenSubKey() Metodu Bu metod bir deger okumak amaciyla kullanilir ve geriye registry'e kaydedilmis bir alt anahtar açar. GetValue() MetoduSeçilen anahtarin degeri gösterir. SetValue() Metodu Seçilen anahtara yeni degeri atanir. DeleteSubKey() MetoduAlt anahtari siler. Close() MetoduAçilan anahtari kapatir.Evet kullanacagimiz metodlari inceledikten sonra ilk olarak yeni bir proje açalim ve bir class ekleyelim. Wallpaper.cs using System; using System.Runtime.InteropServices; using System.Drawing; using Microsoft.Win32; namespace ChangeWallpaper { public class Wallpaper { const int SPI_SETDESKWALLPAPER = 20; const int SPIF_UPDATEINIFILE = 0x01; const int SPIF_SENDWININICHANGE = 0x02; [DllImport("user32.dll", CharSet = CharSet.Auto)] static extern int SystemParametersInfo( int uAction, int uParam, string lpvParam, int fuWinIni); public enum Pozisyon : int { Tiled,Centered, Stretched// Resmi Döse, Ortala, Sigdir }public void ArkaPlaniDegistir(string path, Pozisyon Pozisyon) { RegistryKey key = Registry.CurrentUser.OpenSubKey("Control Panel\\Desktop", true); // Wallpaperin tutuldugu registry Key'i açiyoruz. switch(Pozisyon) //Keye yeni degeri atiyoruz. { case Pozisyon.Stretched : key.SetValue(@"WallpaperPozisyon", "2") ; key.SetValue(@"TileWallpaper", "0") ; break; case Pozisyon.Centered : key.SetValue(@"WallpaperPozisyon", "1") ; key.SetValue(@"TileWallpaper", "0") ; break; case Pozisyon.Tiled : key.SetValue(@"WallpaperPozisyon", "1") ; key.SetValue(@"TileWallpaper", "1") ; break; } SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, path, SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE); // Ayarlari Kaydediyoruz. } }} Simdi bir form ekleyelim ve içine bir tane buton koyalim. C:\ArkaPlan\Kediler.Bmp isimli bir resim koydum ve oradaki resim de iste burada :) Simdi masaüstümüzdeki resmi degistirecek kodu yazalim ve buton'a tiklayalim. Button1.Clickprivate void button1_Click(object sender, EventArgs e) { Wallpaper w = new Wallpaper(); w.ArkaPlaniDegistir("c:\\ArkaPlan\\Kediler.bmp", Wallpaper.Pozisyon.Centered); // Burada enum içerisinde yer alan farkli özellikleri kullanarak farkli sonuçlar elde edebiliriz. }Butona tikladim ve sonuç :)Bir sonra ki makalemiz de görüsmek üzere. Iyi çalismalar dilerim. Sem Göksu sem.goksu@yazilimgunlugu.com www.semgoksu.com | www.yazilimgunlugu.com Kaynaklar http://www.msdn.com
30 May 2008 Boş string atama Kategori: Yazılım Etiketler: C# 0 Yorum stringstr = "Sem"; str+=new String(` `,10); str+="Göksu"; MessageBox.Show(str);Yukarıdaki kodu çalıstırdıgımız da Sem ve Göksu arasına on adet bosluk atar. Not: Bu islemi Ana-Alt kategorileri kontrollere eklerken kullanabiliriz.
12 Mar 2008 C# ile CD’ye Yazdırma Kategori: C#.NET Etiketler: C#C# 2.0 1 Yorum Merhaba arkadaşlar, bu makalemiz de C# ile İmapi’nin CD ya da DVD yazdırmak için sunmuş olduğu DLL’i kullanarak CD ya da DVD yazdırma işleminin nasıl yapılacağına göz atacağız. Makaleye baslamadan önce neden Windows'un bize sunmus oldugu yazma programını ya da nero gibi kabul görmüs bir programı kullanmıyoruz diyebilirsiniz. Bunun bana göre iki yanıtı var. Ilki Eger yazılım gelistiricisi isek mutlaka ve mutlaka böyle bir seyi kendimiz de yazmak istemeliyiz. Ikincisi de programımız da dogan ihtiyaçlardan dolayıdır. Sonuç olarak bizim görevimiz kullanıcıların isteklerini yerine en iyi sekilde getirmek ve onların islerini kolaylastırmaktır. Eger bir katalog programı veya benzeri bir program hazırlıyorsak hazırladıgımız program içerisinden de belirledigimiz ürünlerinin listelenerek kataloga yazdırılmasını saglamak isteyebiliriz. Bu daha mantıklı bir yaklasım sanırım J Ihtiyaçlarımız bununla da sınırlı kalmayacaktır elbette. Isi daha da büyütüp kendi CD yazma programını yazmak isteyebiliriz. J Konuyu anlamak için bir örnek yapalım. Yeni bir proje olusturalım. Ilk olarak projemizin referanslarına IMAPI_CDBurner.dll'ni ekleyelim. Sonra projemize bir class ekleyelim. Bu class içerisinde 3 adet readonly property olacak. Bu propertylerin degerlerini IMAPI_CDBurner.dll'i ile dolduracagız. Ilk property bize sistemimiz de CD Yazmak için gerekli aygıt olup olmadıgını, ikinci property eger sistemimizde CD Yazma aygıtı varsa onun sürücüsünün adını tutacaktır. Üçüncü ve son property de ise CD'ye yazma islemini yaparken kullanılacak olan tampon bellegin yolunu tutacagız. Simdi artık Classımıza geçelim. CDYaz.cs using System; using System.Runtime.InteropServices; using System.Text; namespace CSharpIleCDyeYazma { public class CDYaz { private IMAPI_CDBurner.ICDBurn objBurner; ;//CD Yazma islemini yapacak nesneyi tanımlıyoruz. private bool cdYaziciVarmi = false; private string cdYazici = ""; private StringBuilder cdyeYazilacakAlan = new StringBuilder(1024); [DllImport("shell32.dll")] public static extern Int32 SHGetFolderPath (IntPtr hwndOwner, Int32 nFolder, IntPtr hToken, UInt32 dwFlags, StringBuilder pszPath); const int CSIDL_CDBURN_AREA = 0x03b; //CD Yazıcı olup olmadıgını kontrol edecegimiz property public bool CdYaziciVarmi { get { return cdYaziciVarmi; } } // CD Yazıcımızın path'ni tutacak property public string CdYazici { get { return cdYazici; } } // CD'ye yazmamız için dosyaları kopyalayacagımız path(tampon bölge) public string CdyeYazilacakAlan { get { return cdyeYazilacakAlan.ToString(); } } // Classımızın Constructor'ını tanımlıyoruz public CDYaz() { objBurner = new IMAPI_CDBurner.CDBurnClass();//Burner Nesnesinin instance'ni alıyoruz. int i = 0; objBurner.HasRecordableDrive(out i); cdYaziciVarmi = i > 0; string drive = "???"; objBurner.GetRecorderDriveLetter(drive, 4); // CD Yazıcının sürücü adını burner nesnesi aracılıgı ile alıyoruz cdYazici = drive; SHGetFolderPath((IntPtr)0, CSIDL_CDBURN_AREA, (IntPtr)0, 0, cdyeYazilacakAlan); // Bu metod ile cdYeYazilacak olan tampon bilgisi cdyeYazilacakAlan propertysine set ediliyor } public void YazmaIsleminiBaslat (IntPtr h) // Bu metod ile CD Yazma islemi gerçeklestiriliyor. { objBurner.Burn((uint)h); } } } Burada benin yapacaklarımız simdilik bu kadar. Gelistirmek size kalmıs J Kullanıcı ara yüzünde yapacaklarımıza geçelim. Formum üzerine bir Textbox ve bir adet de Button ekleyelim. Simdi ilk olarak Form yüklenirken sistemimiz de CD yazıcı var mı? Yok mu? Diye kontrol edip. Varsa sürücü adını yazdıralım. Form Load Eventi private CDYaz nCDYaz;nCDYaz = new CDYaz(); private void frmMain_Load(object sender, EventArgs e) { if (nCDYaz.CdYaziciVarmi) { reLog.AppendText("Sisteminiz üzerinde CD Yazıcı var.\r\n"); reLog.AppendText("Sürücü Adı: " + nCDYaz.CdYazici + "\r\n"); reLog.AppendText("Dosyaların Kopyalanacagı Tampon Bellek: " + nCDYaz.CdyeYazilacakAlan); } else { reLog.AppendText("CD'Ye yazmak için Bir CD Yazıcınız yok !"); } } Simdi de yazma için butona tıkladıgımıza yapılacak islemleri yazalım. Button Click Eventi private void btnBurn_Click(object sender, System.EventArgs e) { string kopyalanacakKlasor = @"E:\Belgelerim\Resimlerim";// Bu klasördeki dosyaları CD'ye yazacagız DirectoryInfo di = new DirectoryInfo(kopyalanacakKlasor); FileInfo[] rgFiles = di.GetFiles("*.*"); foreach (FileInfo fi in rgFiles) // Klasördeki dosyaları CD'ye yazılacak alana kopyala { File.Copy(fi.FullName, nCDYaz.CdyeYazilacakAlan + "\\" + fi.Name); } reLog.AppendText("Yazma islemi Basladı..\r\n"); nCDYaz.YazmaIsleminiBaslat(this.Handle); // CD Yazma islemini baslat reLog.AppendText("Yazma isllemi bitti\r\n"); } Kod olarak yapacaklarımız simdilik bu kadar. Artık Test'e baslayabiliriz J Ilk adım basarılı J ileri diyoruz, CD sürücümde CD Yok ve asagıdaki gibi bir uyarı verdi. CD sürücüme CD takıp ileri diyorum, Yazma islemi basladı, Bitmesini bekliyoruz J Ve mükemmel sonuç J Simdi de CD'yi takıp içinde resim var mı yok mu bakalım J Iste bu kadar J Hepimize hayırlı olsun J Bu makalenin de sonuna geldik. Bir sonraki makale de görüsmek üzere. Iyi çalısmalar dilerim. Not: Makale fikrini veren Fatih Sahin'e tesekkürlerimi sunarım. Sem GöksuMCP | MCAD.NET |MCTSsem.goksu@semgoksu.com www.semgoksu.com | www.semgoksu.com Kaynaklar http://msdn.com
29 Oca 2008 Hata Mesajlarının Event Log’a Yazılması Kategori: .NET Framework Etiketler: C#.NET Framework 3 Yorum Merhaba arkadaşlar bu makalemiz de benim hemen hemen her proje kullandığım hata mesajlarının event loga yazdırılmasından bahsedeceğim. Bir proje de bir hata olduğun da bunun nedenini bulmak için projeyi açar debug eder uzunca bir müddet o hatayı ararız (Bu arama bazen çok kısa da sürebilir J ). Bu proje asamasında çok sorun olmasa da proje yayına girdiginde programın hata verip vermedigini ancak kullanıcıların geri bildirimleriyle anlayabiliriz. Her ne kadar testerlar projeyi çok çok iyi test etseler de zamanla beklenmedik sorunlarla karsılasabiliriz. Bu sorunlardan aklıma ilk gelen sey Data tarafında kaynaklanan sorunlar olabilecegidir. (SQL Server'in Timeout'a düsmesi vb.gibi sorunlar). Yazdıgımız programın hata verip vermedigini kullanıcıların anlayamadıgı baska sorunlar var mı? Yok mu? Gibi sorunları takip etmek için try-catch blogunda hata mesajlarını Event Log'a yazdırıp oradan takip edebiliyor olacagız. Niye Böyle bir sey Yapalım ki? Isimizi sansa ve kullanıcıya bırakmadan projemizdeki bugları bulabilecegız. (Ne demisler koyundan post userdan dost olmaz J) Bu da kötü niyetli kullanıcıların programdaki bugları degerlendirmesine engel olacaktır. Buda projemizin daha saglıklı ilerlemesini saglayacaktır. ÖRNEK: Konuyla ilgili bir örnek yapalım. Ilk olarak hata mesajını event loga nasıl yazacagız ona bakalım. Bunun için Bos bir Class açalım. HataMesajiYaz Adında Static bir metod yazacagız.Ilk olarak using System.Diagnostics; Namespaceni projemize dahil etmeliyiz. C# .NET EventLogaYaz.cs public static void HataMesajiYaz(Exception HataMesaji) { string strLogMessage = "\nMessage : " + HataMesaji.Message + "\nSource : " + HataMesaji.Source + "\nTarget Site : " + HataMesaji.TargetSite + "\nStack Trace : " + HataMesaji.StackTrace; string logName = "BenimProjem"; // EventLogda Hata Mesajının Nereye yazılacagını Belirliyoruz. BenimProjem adında bir Log adı olmadıgı için açmamız gerekiyor. Bunu da asagıda anlatacagım. if (!EventLog.SourceExists(logName)) { EventLog.CreateEventSource(logName, logName); } EventLog log = new EventLog(); log.Source = logName; //Nereye yazılacak? Event Logda BenimProjem Event log dosyasına yazılacak. strLogMessage += "\r\n\r\n--------------------------\r\n\r\n" + HataMesaji.ToString(); // Hata Mesajını alıyoruz. log.WriteEntry(strLogMessage, EventLogEntryType.Error, 65534); // Hata mesajını log dosyasına yazdırıyoruz. } Simdi aynı islemin VB.NET ile nasıl yapıldıgına bakalım. VB .NET EventLogaYaz.vb Public Shared Sub HataMesajiYaz(ByVal HataMesaji As Exception) Dim strLogMessage As String = "" & Chr(10) & "Message : " + HataMesaji.Message + "" & Chr(10) & "Source : " + HataMesaji.Source + "" & Chr(10) & "Target Site : " + HataMesaji.TargetSite + "" & Chr(10) & "Stack Trace : " + HataMesaji.StackTrace Dim logName As String = " BenimProjem " If Not EventLog.SourceExists(logName) Then EventLog.CreateEventSource(logName, logName) End If Dim log As New EventLog() log.Source = logName strLogMessage += "" & Chr(13) & "" & Chr(10) & "" & Chr(13) & "" & Chr(10) & "--------------------------" & Chr(13) & "" & Chr(10) & "" & Chr(13) & "" & Chr(10) & "" + HataMesaji.ToString() log.WriteEntry(strLogMessage, EventLogEntryType.[Error], 65534) End Sub Yukarıda da bahsettigim gibi projemiz için EventLog da yeni bir Log adı açmamız gerekiyor. Bunun için Kayıt Defterine girip yeni bir Dosya Adı açmalıyız. Bu dosya Adı da yukarıda belirttigimiz BenimProjem olacak J Kayıt Defterini açıp HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Eventlog Gelip, EventLog üzerinde sag tus diyelim. Yeni Sekmesinden Anahtarı seçelim ve BenimProjem Yazalım J Evet artık hata mesajlarımız artık loga yazılmaya hazır J Simdi bir proje de hata ve hatalar yapalım J public HaberKolleksiyonu HaberleriGetir(int KategoriID, int AktifSayfa) { try { SqlParameter[] parameters = new SqlParameter[] { new SqlParameter("@KategoriID",KategoriID), new SqlParameter("@AktifSayfa", AktifSayfa) }; Ds = SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, "HaberleriGetir",parameters); if (Ds != null && Ds.Tables.Count > 0&& Ds.Tables[0].Rows.Count>0) { kHaberKolleksiyonu = new HaberKolleksiyonu(); for (int i = 0; i < Ds.Tables[0].Rows.Count; i++) { nHaberNesnesi = new HaberNesnesi(); Ds.Tables[0].Rows[i]["werwerwe"].ToString(); > Burada Hata yaptık J Böyle Bir field yok kHaberKolleksiyonu.Add(nHaberNesnesi); nHaberNesnesi = null; } } return kHaberKolleksiyonu; } catch (Exception HataMesaji) { LogYonetimi.HataMesajiYaz(HataMesaji); // Burada hata MesajınıEventloga yazdırıyoruz return null; } Simdi event loga gidelim. Hatayı loga yazdık bakalım hata mesajı olarak ne yazıyor. Message : Column 'werwerwe' does not belong to table Table. > Bu tabloda böyle field bulunamadı ! Geçmis olsun J Bu makalenin de sonunda geldik. Baska bir makale de görüsmek üzere. Sem Göksusem.goksu@yazilimgunlugu.com www.semgoksu.com | www.yazilimgunlugu.com Kaynaklar www.msdn.com ww.aspalliance.com