الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

معلومة/Printing with VB.NET

مغلق
بدأه SOLO.NET في 21 ديسمبر 2005 · 12 رد · 7,993 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

الســــلام عليكم

نستعرض فى هذا المقال اهم مكونات الطباعة فى .NET وخواصها اتمنى ان تجدو فيها الفائدة.

**********

المكون الاساسى للطباعة فى .NET هو PrintDocumet فاللقيام باى عملية طباعة لابد اولا من اضافة هذا المكون الى المشروع وهو غير مرئى فى وقت التنفيذ ويظهر فى صينية المكونات فى وقت التصميم، للبدء قى عملية الطباعة يتم استدعاء الطريقة Print للكائن PrintDocumet وهذه الطريقة لا تفعل شئ غير انها تفجر الحدث PrintPage وهذا هو المكان الذى يوضع قيه الكود المسئول عن توليد المخرجات للطباعة يتم انشاء المخرجات بواسطة طرق الرسم للكائن Griphic وتبدأ عملية الطباعة بعد انهاء الحدث PrintPage

لفهم ما سبق انشئ مشروع جديد واضف Button وضع نسخة من المكون PrintDocumet على الفورم فى حدث النقر للزر اكتب الكود التالى والذى يقوم بتفجير حدث طباعة الصفحة :

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        PrintDocument1.Print()

    End Sub

وبالنقر المزدوج على المكون PrintDocumet تصل للحدث PrintPage الممرر الثانى للحدث e يعرض كل الخواص التى تحتاجها فى عملية الطباعة الخاصية Graphics تستخدم لتوليد المخرجات الى سترسل للطباعة الخاصية MarginBounds تحتوى على معلومات حول منطقة الطباعة للصفحة (الهوامش المحددة من قبل المستخدم والتى يجب اخذها بعين الاعتبار عند الطباعة) ، الخاصية PageSettings تحتوى على معلومات حول الصفحة التى ستطبعها(حجم الصفحة، اتجاه الصفحة، الهوامش وما الى ذلك...) ومن ضمن خواص الكائن PageSettings الخاصية PrinterSettings وهو كائن اخر يحتوى على معلومات حول الطابعة والاعدادات الخاصة بها

اكتب الكود التالى فى الحدث PrintPage وهذا الكود يقوم بطباعة مستطيل يغلق منطقة الطباعه للصفحة(الهوامش) ويقوم بطباعة نص فى داخله كما يقوم بطباعة نص خارج منطقة الطباعة القيمة الافتراضية للهوامش هى 1 انش لكل جانب

Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
       
        Dim G As Graphics = e.Graphics
        Dim X, Y, W, H As Integer
        X = e.MarginBounds.X
        Y = e.MarginBounds.Y
        W = e.MarginBounds.Width
        H = e.MarginBounds.Height

        G.DrawRectangle(Pens.Blue, New Rectangle(X, Y, W, H))
        Dim prnFont As New Font("Comic Sans MS", 36, FontStyle.Regular)
        G.DrawString("Printing with VB.NET", prnFont, _
                        Brushes.Green, 150, 300)
        G.DrawString("Sample Printout", _
                        New Font("Verdana", 16, FontStyle.Regular), _
                        Brushes.Gray, -10, -10)
       
    End Sub

الكائن PageSettings

وهو يحتوى على الخواص التالية :

Bounds: ونعود بكائن مستطيل Rectangle يمثل حجم الصفحة وهذه الخاصية مكافئة للخاصية MarginBounds للممرر e فى الحدث printpage ، الا ان الخاصية Bounds لا تاخذ بعين الاعتبار الهوامش المحددة من قبل المستخدم فى مريع حوار اعدادات الصفحة، فصفحة بحجم letter ابعاد المستطيل تكون 850×1100 وصفحة بحجم A4 تكون الابعاد 827×1169.

Color : تعود بقيمة منطقية True/False اسند اليها القيمة True اذا كانت الطابعة ملونة

    If printDoc.PrinterSettings.SupportsColor Then
            e.PageSettings.Color = True
        End If

: تعود بقيمة منطقية وهى تحدد اتحاه الطباعة هل هو افقيا landscape او عموديا portrait ،

استخدم هذه الخاصية لمعرفة الاتجاه الذى يحدده المستخدم فى مربع حوار اعدادات الصفحة، وتغيير قيمة هذه الخاصية لن يؤثر فى عملية الطباعة مباشرة اذ لابد من كتابة الكود اللازم لتغيير اتجاه الطباعة(تبديل عرض وارتفاع الصفحة)

Margins : تعود بكائن يمثل الهوامش المحددة من قبل المستخدم كخواص (Top, Left, Right, Bottom).

PaperSize: وتعود هذه الخاصية بكائن يمثل حجم الورق ، وابعاد الورقة هى تماما مثل الابعاد التى نحصل عليها من الخاصية Bounds ولكن توجد خاصيتان مهمتان لهذا الكائن هما Kind و PaperNameالخاصية Kind تاخذ احدى قيم المرقم PaperKind (Letter, B5 Envelope, etc.) بينما الخاصية PaperName

تستخدم مع الحجوم المخصصة من قبل المستخدم

PaperSource : تعود بكائن يمثل نوع ملقم الورق او صينية الورق على الطابعة المختارة فمثلا للطابعات ذات صينية الورق المفردة قيمة الخاصية PaperSourceName للكائن PaperSource تكون ''Auto Sheet Feeder."

PrinterResolution : تعود بكائن يمثل دقة الطباعة الخواص X,Y لهذا الكائن تعود بالقيم الافقية والعمودية على التوالى كنقاط لكل انش DPI والخاصية Kind تتضمن عدة خواص (Low, Medium, High, Custom, Draft )

PrinterSettings : تعود بكائن يمثل خواص الطابعة استخدم هذه الخاصية لمعرقة الخواص التى يحددها المستخدم فى مربع حوار اعددات الطابعة.

الكائن PrinterSettings

من اهم خواص هذا الكائن:

InstalledPrinters: وهى تسترجع اسماء كل الطابعات المثبته على الكمبيوتر بلاضافة الى اسماء الطابعات الموجودة ضمن الشبكة وله الحق فى الوصول اليها

Copies : فى هذه الخاصية يتم تحديد عدد النسخ المراد طباعتها استخدم الخاصية MaximumCopies لمعرفة اقصى عدد من النسخ تسمح به الطابعة فى المرة الواحدة

SupportsColor : تعود بقيمة منطقية تحدد اذا ما كانت الطابعة تدعم الطباعة بالالوان ام لا

IsValid: ذات قيمة منطقية وتحدد اذاما كان اسم الطابعة صحيح وان الطابعة متوفرة

The Printing Dialog Boxes

توجد ثلاث كائنات تظهر كمربعات حوار فى وقت التنفيذ تستتخدم بجانب الكائن Print Document للتحكم فى عملية الطباعة والاستجابة لخيارات المستخدم

PageSetupDialog وهو يسمح للمستخدم بتحديد اعدادات الصفحة (اتجاه الطباعة،الهوامش،الورق.....) صندوق الحوار هذا يعود بكائن PageSetting يمثل الاعدادات المحددة من قبل المستخدم والتى يجب اخذها بعين الاعتبار وجعل التطبيق يقوم بالطباعة على حسب ما يحده المستخدم

With PageSetupDialog1
    .PageSettings = PrintDocument1.DefaultPageSettings
    If .ShowDialog =DialogResult.OK Then _
               PrintDocument1.DefaultPageSettings = .PageSettings
End With

PrintDialog مربع حوار معروف لكل مستخدمى ويندوز وهو يسمح للمستخدم باختيار الطابعة وتحديد خواصها اذا قمت بتجاهل هذا المربع الحوار سترسل المخرجات الى الطابعة الافتراضية بشكل تلقائى وسيتم استخدام باقى الاعدادات الافتراضية

PrintDialog1.PrinterSettings = _
              PrintDocument1.DefaultPageSettings.PrinterSettings
PrintDialog1.AllowSelection = True
PrintDialog1.AllowSomePages = True
If PrintDialog1.ShowDialog = DialogResult.OK Then
    PageSetupDialog1.PageSettings = PrintDocument1.DefaultPageSettings
    If PageSetupDialog1.ShowDialog = DialogResult.OK Then
        PrintDocument1.DefaultPageSettings = _
                            PageSetupDialog1.PageSettings
        PrintDocument1.Print
    End If
End If

PrintPreview لعرض معاينة للمخرجات قبل طباعتها ويفضل توفيره للمستخدم دائما فهو يوفر كميات من الحبر حيث يقوم بمعاينة المخرجات ورؤيتها فاذا كانت ملائمة بقوم بطباعتها وعند استخدام هذا الكائن لاداعى لاستدعاء الطريقة Print للكائن PrintDocument فقط قم باسناد الكائن PrintDocument للخاصيةDocument للكائن PrintPreview وباستدعاء الطريقة ShowDialog يتم تفجير الحدث PagePrint وعرض المخرجات فى مربع حوارى

يوجد مثال مرفق ويعمل على اصدار 2005

بالتوفيق

VB.NET and C# Comparison

http://www.harding.edu/fmccown/vbnet_csharp_comparison.html

002.gif

=-=-=-=-=-=-=
ذو العلم يشقى فى النعيم بعلمه .:. واخو الجهالة فى الشقاوة ينعم
=-=-=-=-=-=-=
يا من بدنياه اشتغل . قد غره طول الأمل . فالموت يأتى بغتة . والقبر صندوق العمل
=-=-=-=-=-=-=
ان لم تستطع ان تجد ما تفعله فافعل ما لم تسطع ان تجده

screen_shot_2011-05-19_at_12.44.49_pm.pn

#4

ولا تزعل يا عمنا المثال فى المرفقات :D

PrintDemo.zip

VB.NET and C# Comparison

http://www.harding.edu/fmccown/vbnet_csharp_comparison.html

002.gif

=-=-=-=-=-=-=
ذو العلم يشقى فى النعيم بعلمه .:. واخو الجهالة فى الشقاوة ينعم
=-=-=-=-=-=-=
يا من بدنياه اشتغل . قد غره طول الأمل . فالموت يأتى بغتة . والقبر صندوق العمل
=-=-=-=-=-=-=
ان لم تستطع ان تجد ما تفعله فافعل ما لم تسطع ان تجده

screen_shot_2011-05-19_at_12.44.49_pm.pn

#5

شكراَ لك أخي على المقال وأرجو أن أجد حلاَ لمشكلتي عندك

و هي أنه في حال كون النص يحتاج أكثر من صفحة كيف أجعل عدد الصفحات يزداد حسب حاجة النص

وللتوضيح أكثر أرجو منك الاطلاع على السؤال كاملا مع الكود على الرابط التالي

http://www.arab-team.com/forum/index.php?showtopic=2532

#6

السلام عليكم

حمل المثال فستجد الحل باذن الله

VB.NET and C# Comparison

http://www.harding.edu/fmccown/vbnet_csharp_comparison.html

002.gif

=-=-=-=-=-=-=
ذو العلم يشقى فى النعيم بعلمه .:. واخو الجهالة فى الشقاوة ينعم
=-=-=-=-=-=-=
يا من بدنياه اشتغل . قد غره طول الأمل . فالموت يأتى بغتة . والقبر صندوق العمل
=-=-=-=-=-=-=
ان لم تستطع ان تجد ما تفعله فافعل ما لم تسطع ان تجده

screen_shot_2011-05-19_at_12.44.49_pm.pn

#7

السلام عليكم

المثال مكتوب بالاصدار 2005 ولم أتمكن من فتحه بواسطة الاصدار 2003

#8

هذا هو الكود حيث يمكنك فتح الملف Form1.vb بواسطة المفكرة

لا يوجد لدى vs.net حاليا وساقوم بارفاق المثال على 2003 قريبا

Public Class Form1

    Private Sub PD_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PD.PrintPage
        Static currentChar As Integer
        Static currentLine As Integer
        Dim txtFont As Font = Me.TextBox1.Font
        Dim txtH, txtW As Integer
        Dim LMargin, TMargin As Integer
        ' The dimensions of the printable area of the page
        With PD.DefaultPageSettings
            txtH = .PaperSize.Height - .Margins.Top - .Margins.Bottom
            txtW = .PaperSize.Width - .Margins.Left - .Margins.Right
            LMargin = PD.DefaultPageSettings.Margins.Left
            TMargin = PD.DefaultPageSettings.Margins.Top
        End With
        e.Graphics.DrawRectangle(Pens.Blue, _
                       New Rectangle(LMargin, TMargin, txtW, txtH))
        ' If landscape orientation, swap width and height
        If PD.DefaultPageSettings.Landscape Then
            Dim tmp As Integer
            tmp = txtH
            txtH = txtW
            txtW = tmp
        End If
        ' linesperpage is the number of lines per page
        Dim linesperpage As Integer = CInt(Fix(txtH / txtFont.Height)) - 1
        ' R is the rectangle in which the text should fit
        Dim R As New RectangleF(LMargin, TMargin, txtW, txtH)
        Dim fmt As New StringFormat(StringFormatFlags.LineLimit)
        If Not Me.TextBox1.WordWrap Then
            Dim i As Integer
            For i = currentLine To Math.Min(currentLine + linesperpage, _
                                     Me.TextBox1.Lines.Length - 1)
                e.Graphics.DrawString(Me.TextBox1.Lines(i), txtFont, Brushes.Black, _
                             New RectangleF(LMargin, _
                             TMargin + txtFont.Height * (i - currentLine), _
                             txtW, txtFont.Height), fmt)
            Next
            currentLine += linesperpage
            If i >= Me.TextBox1.Lines.Length Then
                e.HasMorePages = False
                currentLine = 0
            Else
                e.HasMorePages = True
            End If
            Exit Sub
        End If
        fmt = New StringFormat(StringFormatFlags.LineLimit)
        Dim lines, chars As Integer
        e.Graphics.MeasureString(Mid(Me.TextBox1.Text, currentChar + 1), txtFont, _
                                 New SizeF(txtW, txtH), fmt, chars, lines)
        If lines = linesperpage Then
            If Me.TextBox1.Text.Substring(currentChar + chars, 1) <> "" And _
                 Me.TextBox1.Text.Substring(currentChar + chars, 1) <> vbLf Then
                While chars > 0 AndAlso _
                      Me.TextBox1.Text.Substring(currentChar + chars, 1) <> "" AndAlso _
                      Me.TextBox1.Text.Substring(currentChar + chars, 1) <> vbLf
                    chars -= 1
                End While
                chars += 1
            End If
        End If
        e.Graphics.DrawString(Me.TextBox1.Text.Substring(currentChar, chars), _
                              txtFont, Brushes.Black, R, fmt)
        currentChar = currentChar + chars
        If currentChar < Me.TextBox1.Text.Length Then
            e.HasMorePages = True
        Else
            e.HasMorePages = False
            currentChar = 0
        End If

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Me.PPView.Document = Me.PD
        Me.PPView.ShowDialog()


    End Sub

   

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        With Me.PSetup
            .PageSettings = Me.PD.DefaultPageSettings
            If .ShowDialog = Windows.Forms.DialogResult.OK Then _
                      Me.PD.DefaultPageSettings = .PageSettings
        End With


    End Sub
End Class

VB.NET and C# Comparison

http://www.harding.edu/fmccown/vbnet_csharp_comparison.html

002.gif

=-=-=-=-=-=-=
ذو العلم يشقى فى النعيم بعلمه .:. واخو الجهالة فى الشقاوة ينعم
=-=-=-=-=-=-=
يا من بدنياه اشتغل . قد غره طول الأمل . فالموت يأتى بغتة . والقبر صندوق العمل
=-=-=-=-=-=-=
ان لم تستطع ان تجد ما تفعله فافعل ما لم تسطع ان تجده

screen_shot_2011-05-19_at_12.44.49_pm.pn

#9

شكراَ لك اخي وفقك الله

تعقيب بسيط بالنسبة للمثال حاول فتح نافذة ppview و إغلاقها أكثر من مرة

المثال عندي تتراكب الكلمات فوق بعضها لكن فقط عندما تكون أكثر من صفحة

قمت بإضافة هذا الكود على سبيل التجربة وليس الخبرة

Private Sub Pre_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles pre.Closing
        RemoveHandler pd.PrintPage, AddressOf PD_PrintPage
    End Sub

حيث يبدو أن إغلاق النافذة لا ينهي الحدث PrintPage لذلك يجب إنهاؤه بالكود

لا أعرف إن كان كلامي صحيح أم لا؟

#10

مساء الخير :::...

شكرا لك يا اخي علي الطريقة والكود والمثال

#11

شكرا لكم كثيرا

ولكن عندي اصدار قديم 2003

كيف لي ان ادرج printdocument من اين؟

#12

جزاك الله خير اخي solo.net

بالتوفيق للجميع

تحياتي

#13

ممكن أعرف اية الفائدة من استخدام هذة الطريقة على حساب Crystal Reports

Practice makes perfect 2007*

البرمجة بلا انطباعات

هذا الموضوع مغلق.

مواضيع مشابهة