Makale Özeti

Bu yazımızda .NET Framework içerisinde bulunan ve yazdırma olayınnı gerçekleştiren bir Namespace bahsedeceğiz: System.Drawing.Printing

Makale

VB.NET te SYSTEM.DRAWING.PRINTING

VB.NET te SYSTEM.DRAWING.PRINTING

Bu yazımızda .NET Framework içerisinde bulunan ve yazdırma olayınnı gerçekleştiren bir Namespace bahsedeceğiz: System.Drawing.Printing

Bir Programı pek çok yolla yazdırabiliriz. Örneğin; bir seçenek olarak program ile  Microsoft Word arasında bir bağlantı kurarak Word üzerinden dökümanımızı yazdırabiliriz. (Bu konuda yazılmış bir makaleyi www.yazgelistir.com sitesinden bulabilirisiniz). Veya Crystal Reports gibi componentleri de kullanabiliriz. Fakat bu programların yetersiz kaldığı durumlar olabilir. Printing Namespace i ile direk olarak yazı ve grafik çıktısı alabiliyoruz.

Visual Basic.Net te yazdırma işlemi Visual Basic in önceki versiyonlarından kavram olarak farklıdır. Visual Basic in önceki sürümlerini kullananlar Printer nesnesini hatırlayacaktır. Ama artık öyle bir nesne yok; yerine bir namespace var: System.Drawing.Printing.

 

Visual Basic te bir dökümanı yazdırmak için;

  • System.Drawing.Printing.PrintDocument nesnesinin bir instance’ ını (kopya) yaratmalıyız. Bu nesne mutlakakendi olaylarıyla birlikte (WithEvents) çağrılmalıdır.
  • Yazdırma işimizin karakterini tanımlamak için özellikleri belirtmeliyiz.
  • Yazdırma işlemine başlamak için Printer nenesine ait olan Print() methodunu çağırmalıyız.

Yazdırma işlemi dökümanımızdaki her bir sayfayı yazma işlemine hazırlarken, delegate methodu çağrılır. Delegate methodunu; PrintDocument nesnesinin PrintPage olayını yönetmek için tanımlarız. Bu kısım ile bir sonraki sayfanın nasıl yazdırılacağı işlemini belirtiriz.

 

Biliyorum bu yukarıda anlatılanlar biraz havada kaldı. Şimdi basit bir örnek yapalım. Böylelikle konuyu daha rahat kavrayabiliriz.Bu örneğimizde, bir text dosyasının içeriğini yazdıran bir uygulama oluşturacağız. Örneğimizi Console Application da yapalım. Böylece sadece konuya odaklanabiliriz. İsmi TextDosyaPrint olan yeni bir proje yaratalım. Module1 in en üstüne aşağıdaki Imports ifadesi ile başlayan namespace leri ekleyelim;

 

Imports System.Drawing

Imports System.Drawing.Printing

Imports System.IO

 

Yukarıdaki namespaceler yazdırma işlemini gerçekleştirebilmemizi ve text dosyamızı okumamızı sağlayacak sınıfları içeriyor. Yukarıdaki Namespaceleri eklerken Visual Studio.Net bize kızıp bu kod hatalı derse Solution Explorer penceresinde bulunan References bölümüne Sysyem.Drawing Namespace ini ekleyelim. Şimdi, modül düzeyinde erişilebilen değişkenleri kodumuza ekleyerek kodumuza devam edelim. Bu değişkenler; dosyadan okumamızı sağlayacak ve yazdırma işlemini gerçekleştirecektir. Module1 içerisine aşağıdaki kodları ekleyelim;

 

Private WithEvents m_oDoc As PrintDocument Yazdırma işlemi için

Private m_oFile As StreamReader Text dosyayı okumak için

 

Değişkenlerimizi tanımladık ve namespacelerimizi kodumuza ekledik ve artık programımızın kodlarını yazmaya hazırız. Sub Main içinde text dosyamızı açarak ve yazdırma işlemini yaparak kodumuza başlayalım. Kodumuzu olabildiğince basit tutmaya çalıştığımız için, hiçbir hata kontrolü kullanmadık. Text dosyamızı da daha önce oluşturduğumuzu varsaydık. Sub Main bloğu içine aşağıdaki kodumuzu ekleyelim;

 

Sub Main()

m_oFile = File.OpenText("C:\textdosyam.txt")

m_oDoc = New PrintDocument

m_oDoc.Print()

End Sub

 

Bu noktada, uygulamamız text dosyası açıyor ve yazdırma işlemine başlıyor, fakat bir sorun var; "textdosyam.txt" içerisindeki hiçbir data yazılmadı. yani karşımıza boş bir kağıt çıktısı geldi. Nedeni PrintDocument nesnesi olayları ile (WithEvents) birlikte kullanılır. Bu uygulamadaki gerçek çalışma m_oDoc değişkeninin PrintPage methodu için bir temsilci(delegate) görevlendirerek tanımlanan bir method içinde yapılır. Şimdi aşağıdaki kodumuzu Module1 içine ekleyelim; sonra satır satır kodları inceleyelim;

 

Private Sub OnPagePrint(ByVal Sender As Object, _

ByVal arg As System.Drawing.Printing.PrintPageEventArgs) _

Handles m_oDoc.PrintPage

Dim sngCurY As Single

Dim sngLineHeight As Single

Dim oFont As Font

Yazdırılacak yazının Fontunu Belirleyelim

oFont = New System.Drawing.Font("Courier New", 12)

Yazdırma işlemi için fontun boyutunu belirliyoruz.

sngLineHeight = oFont.GetHeight(arg.Graphics)

Kürsörü sayfanın en başına konumlandırıyoruz.

sngCurY = arg.MarginBounds.Top

Dosyadaki bilginin alınıp alınamayacağını kontrol ediyoruz

If m_oFile.Peek() <> -1 Then

Do

Kürsörü sayfadaki bir sonraki satıra konumlandırıyoruz.

sngCurY += sngLineHeight

dosyanın sonraki satırını çizer yani belirlenen formatta okur.

arg.Graphics.DrawString(m_oFile.ReadLine(), _

oFont, Brushes.Black, _

arg.MarginBounds.Left, sngCurY)

Loop Until sngCurY >= arg.MarginBounds.Bottom Or _

m_oFile.Peek() = -1

End If

Bir sonraki sayfanın olup olmadığı burada belirlenir.

If m_oFile.Peek <> -1 Then

arg.HasMorePages = True

Else

arg.HasMorePages = False

End If

End Sub

 

İlk satırda, OnPagePrint Sub ını tanımladık. Bu işlem 2 argüment kabul eder: ilki Object tipinde ikincisi ise System.Drawing.Printing.PrintPageEventArgs. “arg” değişkeni ile belirttiğimiz bu ikinci argüman yazıcıya yazdırma işlemimiz hakkında ve çıktımız hakkındaki bilgileri görmemizi ve değiştirmemizi sağlar. Bu method; PrintDocument nesnesinin PrintPage methodunu gösterdiği içinbu methodda Handles kelimesini kullandık.

 

Sonraki satırlarda, yazıcı çıktımız için önemli olan değişkenleri tanımladık. sngCurY değişkeni sayfadaki yatay pozisyonumuzu belirler. Bu değişkeni, yazdırmak için sonraki sayfaya gideceğimiz zamanı belirtmek için kullanacağız. sngLineHeight sayfamızdaki satırın yüksekliğini verir. Bu olay, Font nesnesinin GetHeight methodu kullanılarak hesaplanır. Son olarak yazdırma işlemimizde kullanılacak fontumuzun karakterini tanımlayan Font nesnemizi  oFont değişkeni ile tanımlıyoruz.

 

Devam eden satırlarda değişkenlerimize değerler atadık. oFont değişkeni için Courier Newadlı fontun 12 font boyutunu kullandık. Sonra, dökümanımızdaki her bir satırın boyutunu belirtmek için sngLineHeight değişkenini oFont un GetHeight methodu ile ayarlıyoruz. sngCurY değişkenimizi arg.MarginBounds.Top değeri ile tanımlayarak dökümanımızdaki ilk satırdan itibaren yazma işleminin başlayacağını belirttik.

Bir sonraki adımda,dosyamızın içinde yazdırılabilecek bir data var mı diye kontrol ettik. Bunu StreamReader nesnesinin Peek() methodunu çağırarak yaptık. Peek methodu sonraki alınabilecek karakterin ASCII kodunu döndürür. Eğer hiç karakter yoksa -1 değerini döndürür.

 

Do-Loop döngüsü içinde, önce sayfadaki yatay pozisyonumuzu belirlemeliyiz. Bunu biz sngCurY ye sngLineHeight in değerini ekleyerek yapıyoruz. Sonra arg değişkeni yoluyla erişebilelim diye System.Drawing nesnesinin DrawString methodunu çağırıyoruz. Döngümüz sayfanın sonuna gelinceye kadar veya yazdırdığımız data bitinceye kadar devam eder.

 

Son satırlarda; eğer döngümüz sayfa sonuna geldiği için bitmişse yani daha hala yazdırılacak data varsa arg değişkenimizin HasMorePages özelliğini True yaparak yazdırma işleminin bir sonraki sayfaya ihtiyaç duyduğunu söyleyebiliriz. Data bitince HasMorePages özelliği False olacaktır. Yani yazdırma işlemi tamamen bitmiş olacaktır. Yazdırma işlemini bitirmek için mutlaka HasMorePages özelliği sonunda False olmalıdır. İsterseniz son yazılan satırları silin (If döngüsünü) ve yerine arg.HasMorePages = True satırını yazın ve gözlemleyin.Program sonsuza kadar yazıcıya kağıt göndermeye çalışacaktır.

 

System.Drawing.Printing

Method

Açıklama

System.Drawing.Printing.Duplex()

Bu sayıcı yazıcının duplex ayarlarını tanımlar.

System.Drawing.Printing.InvalidPrinterException()

 

Bu sınıf; geçersiz ayarlarla yazıcı kullanılmaya kalkışıldığı zaman alınan hata mesajları için kullanılan temel sınıftır.

System.Drawing.Printing.Margins()

 

Bu sınıf sayfanın sınır ayarlarını belirlemede kullanılır.

System.Drawing.Printing.MarginsConverter()

 

Bu sınıf farklı tiplerdeki sınırları çevirmede kullanılır.

System.Drawing.Printing.PageSettings()

 

Bu sınıf bir sayfa için ayarlamalarının yapıldığı sınıftır.

System.Drawing.Printing.PaperKind()

 

Bu sayıcı standart kağıt boyutunu belirlemede kullanılır.

System.Drawing.Printing.PaperSize()

 

Bu sınıf kağıt boyutunu belirlemede kullanılır.

System.Drawing.Printing.PaperSource()

 

Bu sınıf standart kağıt tabla kaynağını belirlemede kullanılır.

System.Drawing.Printing.PaperSourceKind()

 

Bu sayıcı standart kağıt kaynağını belirlemede kullanılır.

System.Drawing.Printing.PreviewPageInfo()

 

Bu sınıf bir tekli sayfa için yazdırma önizleme nesnelerini içerir. Bu sınıf inherit edilemez.

System.Drawing.Printing.PreviewPrintController()

 

Bu sınıf bir printcontroller için nesneler içerir.

System.Drawing.Printing.PrintController()

 

Bu sınıf bir dökümanın nasıl yazdırıldığını kontrol eden nesneler içerir.

System.Drawing.Printing.PrintDocument()

 

Bu sınıf dökümanı yazıcıya gönderen nesneler içerir.

System.Drawing.Printing.PrinterResolution()

 

Bu sınıf yazıcının yazım kalitesini gösteren nesneler içerir.

System.Drawing.Printing.PrinterResolutionKind()

 

Bu sayıcı standart yazıcı yazım kalitesini gösteren nesneler içerir.

System.Drawing.Printing.PrinterSettings()

 

Bu sınıf bir dökümanın nasıl yazıldığını gösteren nesneler içerir.

System.Drawing.Printing.PrinterUnit()

 

Bu sayıcı yazıcı için ölçüm birimi tanımlamak için kullanılan simgeleri içerir.

System.Drawing.Printing.PrinterUnitConvert()

 

Bu sınıf API yazdıran WIN32 ile çalışmak için kullanılan nesneleri içerir.

System.Drawing.Printing.PrintEventArgs()

 

Bu sınıf beginprint ve endprint olaylarıyla kullanılan yazdırma işlemi nesnelerini içerir.

System.Drawing.Printing.PrintEventHandler()

 

Bu delegate beginprint, endprint, ve

querypagesettings olaylarını tutar.

System.Drawing.Printing.PrintPageEventArgs()

 

Bu sınıf printpage olayı ile kullanılan yazdırma nesnelerini içerir.

System.Drawing.Printing.PrintPageEventHandler()

Bu delegate printpage olayını tutar.

System.Drawing.Printing.PrintRange()

 

Bu sayıcı yazdırma diyalog kutusundaki options butonlarını özelleştirmek için kullanılır.

System.Drawing.Printing

.QueryPageSettingsEventArgs()

Bu sınıf querypagesettings olayı için data sağlar.

System.Drawing.Printing

.QueryPageSettingsEventHandler()

Bu delegate querypagesettings olayı içindir.

System.Drawing.Printing.StandardPrintController()

 

Bu sınıf yazıcıya bilgi gönderen yazıcı kontrollerini tanımlar.

 

Bu yazıda Printing namespace i incelendi ve VB.Net te bu namespacein kullanım yolları anlatıldı. yapabileceklerimiz bu kadar mı? Tabiki hayır. Printing ile isterseniz programınızdaki bir datagridi yazdırabilirsiniz( http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_vbcode/html/vbtskCodeExamplePrintingDataGrid.asp ). Veya formun tamamını kağıda basabilirsiniz.( http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_vbCode/html/vbtskcodeexampleprintingform.asp ).

 

Başka yazılarla görüşmek üzere...

kadirerdogan@hotmail.com