1 Ekim 2007 Pazartesi

.NET ile RAW Printing & Escape Code Kullanımı

Tekrar Merhaba,

.NET ile RAW Printing gerçekleştirmek ve Win32 Print Spool API lerini kullanmayı daha önceki yazımda anlatmıştım. Aslında o yazı Microsoft'un Knowledge Base'indeki bir makalenin nispeten Türkçeleştirilmiş ve hemen uygulanabilir hale getirilmişiydi. O yazımın sonlarına doğru Dot Matrix yazıcıların ham veri (RAW DATA) ile arasının iyi olduğunu ancak belli başlı bazı şeyleri yapabilmek için (örneğin dar yazı, kalın yazı, italik yazı, satır atlamak, line feed/carriage return yapmak gibi) yazıcının escape kodlarının kullanılması gerektiğini söylemiştim. Gene bahsi geçen yazımın sonunda escape kodları anlatmanın başka bir yazıya kısmet olduğunu belirtmiştim. İşte bugünkü yazımda bu konu üzerinde durmaya çalışacağım.

Bir .NET projesi açıyoruz vs. gibi gereksiz ayrıntıları geçiyorum ve direk olarak işimize yarayacak kısımdan başlıyorum. Öncelikle benim kullandığım yazıcı EPSON LX-300 dü. Dolayısı ile EPSON sitesinden escape kodları ve detaylarını anlatan dökümanı indirdim ve inceledim. Bu doküman çok karmaşık gözüksede aslında çok basit bir referans dökümanı. Yazıcıya yaptırmak istediğiniz işlemi önce dökümandan buluyorsunuz ve ilgili sayfaya gidiyorsunuz. Burada o işlemin escape kodu ASCII, Decimal ve Hexadecimal olarak belirtilmiş. Biz Decimal olan değerlerle ilgileneceğiz. Bu kısa bilgiyide verdikten sonra gelelim kod içerisinde yapmamız gerekenlere. Bu bölümde oldukça basit. Aşağıdaki kod aslında bir önceki yazımla bu yazımı birleştiriyor ve kendi kendini açıklayan bir kod parçacığı.

string condensed = Convert.ToChar(27).ToString() + Convert.ToChar(15).ToString();
string cancelCondensed = Convert.ToChar(18).ToString();
string cr = Convert.ToChar(13).ToString();
string lf = Convert.ToChar(10).ToString();
string ff = Convert.ToChar(12).ToString();
string crlf = cr + lf;
string crff = cr + ff;
string newPageLength = Convert.ToChar(27).ToString() + Convert.ToChar(67).ToString() + Convert.ToChar(24).ToString();
string draftYaziTipi = Convert.ToChar(27).ToString() + Convert.ToChar(120).ToString() + Convert.ToChar(48).ToString();
Bir önceki makaleden hatırlayacaksınız, yazıcıya yollamak istediğimiz verileri WritePrinter metoduna parametre olarak (ki bu parametreler string tipindeydi ve önceden formatlıydı - preformatted raw data) geçiyorduk. Yazıcıya bir işlem yaptırmak istediğimiz zamanda farklı bir yöntem izlemiyoruz. Gene aynı şekilde WritePrinter metoduna yukarıdaki gibi örneklenebilen stringlerden bir tanesini parametre olarak geçiyoruz ve yazıcının belirlenen işlemi gerçekleştirmesini sağlıyoruz. Örneğin Condensed (Dar yazı) yazı tipi için yazıcıya yollamamız gereken kod:

string condensed = Convert.ToChar(15);
PrintDirect.WritePrinter(lhPrinter, condensed, condensed.Length, ref pcWritten);

şeklinde olmalıdır.

Sanırım bu bilgiler başlangıç için yeterli olacaktır. En azından nokta vuruşlu yazıcıların günümüzde halen daha kullanılıyor olması, özellikle fatura, irsaliye gibi önceden basılmış ve sıralı formların nokta vuruşlu yazıcılara ihtiyaç duyması ve bu gereksinimlere yönelik program geliştirenler olması nedeniyle, bu iki yazının işe yarayacağını düşünüyorum. Daha öncede dediğim gibi escape kodlar gerçekten çok fazla ve yapmak istediğiniz her ne ise onu araştırıp uygun kodları bulmalısınız. Bu döküman size sadece bir başlangıç ve şablon sunuyor. Şablonu alıp uygulamak ve/veya geliştirmek sizin elinizde. Şimdilik bu kadar, görüşmek üzere.

27 Eylül 2007 Perşembe

Samsung E200

Aslında bu tarz yazılar pek ilgimi çekmez ve yazmak da istemezdim ama uzun zamandır bozuk olan telefonumun yerine aldığım Samsung E200ün bu yazıyı hakettiğini düşünüyorum.

Artık bana göre salt telefon fonksiyonlu bir cep telefonunun devri çoktan geçti; fakat eğer sizde benim gibi bir telefonun iyi bir MP3 player olamayacağına ve gene iyi bir digital kamera olamayacağına inananlardansanız (ki bu iki tip ürününde hemen hemen en iyilerini kullandım, ve hala kullanıyorum) telefon gibi bir telefon arıyorsunuz demektir. Bende bu arayıştan yola çıkarak hemen hemen hiç bir telefonu alınabilir bulmamıştım. En sonunda biraz da kriterlerimi düşürerek bakındım ve E200 le karşılaştım. Gelelim telefon ile ilgili izlenimlerime:

  • Öncelikle telefon ince, yani hakikaten ince ve bu inceliğinden dolayı kırılcak gibi duruyor, nazik davranmak lazım.
  • Ses kalitesi gerçekten güzel. Menüleri kullanışlı ve bir çok ayarlanabilir özelliğe kolay erişim sağlıyor. Özellikle menülerin içinde kaybolmadan her türlü ayara kolayca ulaşabiliyorsunuz.
  • Mesajlaşma ben çok yaparım diyorsanız mesaj yazmaya alışmak biraz zamanınızı alabilir çünkü tuş takımı biraz küçük.
  • MicroSD kart yuvası ve satın alırken promosyon olarak verilen MicroSD kart ürünün alınabilitesini arttırıyor. Ama benim için ilk sırada gelen özellikleri değil.
  • Telefonu alalı 4 gün oldu batarya göstergesi şu an son noktada ama hala direniyor. Gerçi bu çok objektif bir analiz değil çünkü herkesin konuşma/telefon kullanma alışkanlıkları farklı.
  • Kamerası 1.3 MegaPiksel, yeni telefonlara göre biraz geride ama dediğim gibi benim için önemli değil.
  • Yanında gelen yazılım (Samsung PC Studio sanırım) çok iyi ve basit. Daha önceden Outlook a sync ettiğim rehberimi tek tıkla telefona aktardım. Özellikle önceki telefonumda aynı işleri yapmak için 2 saat harcadığımı düşünürsek bu kolaylık gözlerimi yaşarttı.
  • Radyosu var. En azından sıkıldığınızda kurcalamak için bir alternatif. Kulaklık radyo anteni vazifesi gördüğü için kulaklıksız kullanılmıyor.

Şimdilik yazabildiklerim, aklıma gelenler bunlar. Özetle iyi bir telefon alıyım, öyle çok da para vermiyim diyorsanız bence E200 alternatifleriniz arasında olsun.

26 Eylül 2007 Çarşamba

Dot Matrix Printer ve .NET ile RAW Printing

Çalıştığım projelerden birinde Windows Forms içinden (C#) belirli formattaki bir string i print edebilme gereksinimi vardı. Kullanılacak printer Nokta Vuruşlu yani Dot Matrix tipinde bir printer olacaktı. .NET ile fazla tecrübem olmamasına karşın bir çok basit problemi hakikaten basitçe çözebilmesine olan güvenimle hemen işe giriştim ve bir kaç googlelamadan sonra PrintDocument sınıfı ile işi kolayca çözebildim. Aşağıdaki kod bölümü bunu özetliyor.

PrintDocument printDoc = new PrintDocument();
printDoc.PrintPage += new PrintPageEventHandler(this.printDoc_PrintPage);
printDoc.Print();

private void printDoc_PrintPage(object sender, PrintPageEventArgs e) {

e.Graphics.DrawString("nereye ne yazmak istiyorsak yazariz",.....);
e.HasMorePages = false;
}


Üstteki bölümde yapılan .NET Frameworkunun bize hazır olarak sunduğu Printing API sinden faydalanmak ve PrintDocument sınıfından olan printDoc nesnemize yazdırmayı idare edecek EventHandlerı atamak. Daha sonra yazdırma işlemini printDoc.print() diyerek yapıyoruz ve olay Event Handler metodunun içeriğine kalıyor. Event Handler da metod parametrelerinden faydalanarak yazdırma işlemini fiziksel olarak tanımlayan Graphics objesine ulaşıyoruz ve DrawString, DrawLine gibi metodlarla istediğimiz formatı elde ediyoruz, dolayısı ile yazdıracağımız veriyi yazdırmış oluyoruz.

Buraya kadar herşey çok güzel ve hızlı. Ancak bu yöntem, yazdırma işlemi için Windowsun printer driveri üzerinden geçiyor ve Nokta Vuruşlu bir yazıcı için oldukça yavaş; çünkü windows bu işlemi graphics objesi oluşturarak yapıyor ve tüm veriyi önce graphics objesi üzerinde yerleştirip sonra yazdırma işlemine başlıyor. İşte tam bu noktada eski DOS tabanlı programların nokta vuruşlu yazıcılar ile ne kadar efektif ve hızlı çalıştığı aklıma geldi ve bunu araştırmaya başladım. Tahmin ettiğim gibi bu tarz programlar yazıcıya veriyi önceden formatlı bir şekilde ve RAW olarak yolluyorlardı. Dolayısı ile aradaki printer driveri ve graphics oluşturma şamatasına gerek kalmıyordu. Bende hemen işe koyuldum ve C# ile bunu yapmanın yollarını aramaya başladım. http://support.microsoft.com/?kbid=322091 linkinde konu ile ilgili bir makale buldum ve aynen tarif edilen gibi Win32 Spooler fonksiyonlarını DLLImport ile C# kodumda tanımlayarak kullanmaya başladım. Sonuç itibarı ile tam istediğim gibi hızlı, basit ve gereksinimi birebir karşılayan bir DotMatrixPrinting kabiliyeti elde etmiş oldum.

Bu arada bu Dot Matrix Printerlar hakikaten bir derya. Bu yazıcıların en ufak ayarını dahi ESCAPE CODE lar sayesinde kontrol edebiliyorsunuz. Özellikle benim projemdeki gibi önceden basılmış devamlı form kıvamında (fatura, irsaliye vb.) çıktılarla uğraşıyorsanız sayfa boyu ayarlamak, kalın/ince yazıya geçmek ve bunun gibi bir çok ayar için ESCAPE CODE lara ihtiyacınız var demektir. Gene RAW Printing vasıtası ile halledebileceğiniz bu konunun üzerinde bir sonraki yazımda duracağım çünkü gerçekten bu yazının hedefi dışında bir konu.

NOT: Bu işleri kurcalarken bir yerlerde gözüme eğlencelik bir komut çarptı. İsterseniz sizde bir deneyin.
1- Bir TEXT dökümanı oluşturun ve içine rastgele bir şeyler yazın. Yazdığınız garip bir formattada olabilir.
2- Komut satırına geçin ve oluşturduğunuz TEXT dökümanını direk yazıcıya yollayın.
copy Deneme.txt lpt1 şeklinde.
Bu şekilde de RAW Printing yapmış oluyoruz ve makalede belirtilenlere gerek kalmamış oluyor. Sadece C# kodumuz içerisinde bu komutu çalıştırmamız yeterli.

Hello World!

Uzun zamandır bir blog oluşturmak ve özellikle "yazılım geliştirme", "JAVA", "frameworkler" ve benzeri konularda bildiklerimi paylaşmak istiyordum. Özellikle benim gibi dağınık ve ne yaptığını unutan biriyseniz, daha önce karşılaştığınız bir problemi çözdüğünüzü unutuyorsanuz ve en önemlisi çözümünüzü yarı yolda hatırlayıp "ben bunu daha önce yapmıştım" diyorsanız aslında kendi blogunuzun olması en azından kendinizin kütüphanesi olması gibi bir şey. İşte bu noktadan hareketle yaptığım işleri bir yerlerde yazıya dökmenin, neyi nasıl yaptığımı paylaşmanın artık tam zamanının geldiğini hissettim ve çok geniş bir yelpazeden konularla blogumu doldurmaya karar verdim.

Umarım burayı düzenli bir şekilde güncelleyip içine sizlerinde işine yarar bir şeyler koyabilirim. Görüşmek üzere....