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

الطباعة في فجوال بيسك

مغلق
بدأه سكون الليل في 3 مايو 2003 · 8 رد · 3,697 مشاهدة · في لغة Ms Visual Basic 6 وما قبلها من إصدارات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله

شباب الحقوا علي شوية وبكسر الطابعة(لا تصدقوا توني شاريها)

الطباعة printOut على ورق كيف الطريقة اليه ؟؟؟؟

الرجاء الشرح الممل

ولكم جزيل الشكر وعشا باي مطعم :cool:

#2

أخي العزيز

أرجو إيضاح السؤال وشكراً

#3

اذا ما فهمت بس ابي اقول

اريد كل شئ عن الطباعة ...اخلي النموذج يخرج على ورق

يعني اريد كيف تتم مع اني جربت امر printform بس مشاكلة كثيرة

اذا في مثال يوضح الطباعة الرجاء ادراجه ولكم جزيل الشكر

#4

جرب هذا الكود وان شاء الله يصير معاك

form1.printform

وذلك داخل الكومند

وتحياتي

#5

الأخ الكريم، سكون الليل.

أرجو ان أكون فهمت طلبك، و بخصوص موضوع العشا ، ممكن تبعتهولى برسالة خاصة عشان محدش من الأعضاء ياكله :P

معذرة كنت أتمنى أعمل أكثر من هذا، و لكن لضيق الوقت

'Illustrated by: Mohammed Farouk El-Sayed Mohammed Younes.

'توضيح استعمال كائن الطباعة كاسلوب بدائى للطباعة من فيجوال بيزيك

'حاولت أن يكون الكود مفهوماً قدر الإمكان و بعيد عن التعقيد

'لا تصلح هذه الطريقة للقيام بكافة مهام الطباعة

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

'و للحصول على مزيد من التحكم



Private Sub Command1_Click()

'ثابت يحتوى على العبارة الجارى طباعتها

'يمكنك طباعة أى شئ،  و لا يلزم أن تخزنه فى ثابت

'توضيح فقط حتى لا يلتبس عليك الأمر

Const strToPrint As String = "مسلسل عربى أم فيلم أكشن أمريكانى؟"



With Printer

'ملحوظة : تحديد هذه الخصائص إختيارى

   .PrintQuality = vbPRPQHigh 'تحديد الجودة المطلوب الطباعة بها

   .Copies = 1 'تحديد عدد النسخ

   .Duplex = vbPRDPSimplex 'تحديد إذا كان النص سيطبع على وجهي الورقة

   'هذا إذا كانت الطابعة تدعم هذه الميزة

   .PaperSize = vbPRPSA4 'تحديد حجم الورق المراد الطباعة عليه

End With



'طباعة الصورة الأولى على اليسار من أعلى

Printer.PaintPicture Image1.Picture, 0, 0, , , , , , , vbSrcCopy

'طباعة الصورة الثانية على اليمين من أعلى

'CurrentX فكر قليلا فى المعادلة التى كتبتها لتحديد مكان الطباعة الأفقية

Printer.PaintPicture Image2.Picture, Printer.ScaleWidth - Image2.Width, 0, _

, , , , , , vbSrcCopy ' يمكن استعمال Opcode مخالف حسب مقتضى الحال



'تحديد خصائص خط الطابعة (إختيارى) ايضاً

With Printer.Font

    .Name = "Tahoma"

    .Size = 28

    .Charset = 178 'لأن الخط يحتوى أكثر من Charset فنختار مجموعة ترميز الحروف العربية

End With



'طباعة النص فى منتصف الصفحة أفقياً و لكن رأسياً يكون بعد الصور

Printer.CurrentX = (Printer.ScaleWidth - Printer.TextWidth(strToPrint)) / 2

Printer.CurrentY = Image1.Height ' مكان الطباعة الحالى رأسياً



Printer.Print strToPrint 'طباعة النص بالموقع و الخصائص المحددين

'للآن لم نقم بأى طباعة فعلية

'للبدء بالطباعة فورا، نخبر كائن الطباعة بأننا فرغنا من تحديد ما الذى نريد طباعته

'و أين نريد طباعته و فرغنا من تحديد الخصائص اللازمة، و أن يقوم بالبدء فى الطباعة الفعلية

Printer.EndDoc



'لمعرفة اسم الطابعة و منفذ الطباعة "ميناء الاتصال المتسلسل/المتوازى" المستخدم فى الطباعة

MsgBox "تمت الطباعة باستخدام الطابعة:" & vbCrLf & Printer.DeviceName & _

vbNewLine & "باستخدام المنفذ: " & Printer.Port, vbOKOnly + vbMsgBoxRight + vbMsgBoxRtlReading, "الطابعة المستخدمة"

End Sub
#6

الملف المرفق

print.zip

#7

بسم الله الرحمن الرحيم

الأخ/ سكون الليل

تحية طيبة و بعد.

أرجو تكون عند وعدك و أنا أطلب واحد كودبرجر بشرط أختار المنتدى اللى أهضمه "أفهمه" فيه، و لازم يكون خمس نجوم يعنى مثل منتدى "مايكروسوفت Visual Basic" و الحساب يوم الحساب.;)

الحقيقة ما رضيتها لك إنك ما توصل لما تريد، و خاصة إذا كنت أقدر أساعدك، أنا مجرب خيبة الأمل فى الآخرين، و عارف إنها صعبة و عشان كدة سهرت و وضبتلك المشروع دة، أرجو يفيدك.

و لاحظ أن الطريقة السابقة و لو تحب تجرب بها مشاكل عديدة كما قلت لك عند كتابتها، و منها لو حبيت تطبع سطر عرضه أكبر من عرض الصفحة فلن يتم عمل إلتفاف للنص المطبوع بل سيتم اقتصاصه، و هذا يبين قصور كائن الطباعة بفيجوال بيزيك كما أخبرتك.

أخوك.

ملحوظة قبل تشغيل الكود التالى : أضف أداة Command Button و أداة Rich Text Box و أضف موديول قياسى Standard Module و قم بلصق الكود التالى فى موديول النموذج Form Module:

Option Explicit 'لا بد من الاعلان عن المتغيرات و الا يصدر فيجوال بيزيك خطأ



Private Sub Form_Load()

   Dim LineWidth As Long



   'تحميل ملف لتجربة المشروع

   RichTextBox1.LoadFile App.Path + "Msg.rtf"

   

   ' أخبر أداة النص المنسق أن تؤسس عرضها بناء على الطابعة

   LineWidth = WYSIWYG_RTF(RichTextBox1, 1440, 1440) 'كل 1440 تويب تساوى بوصة واحدة



   ' تحديد عرض النموذج ليوافق عرض السطر

   Me.Width = LineWidth + 200

End Sub



Private Sub Command1_Click()

   ' طباعة محتويات أداة النص المنسق مع هامش عرضه بوصة واحدة

   PrintRTF RichTextBox1, 1440, 1440, 1440, 1440 'كل 1440 تويب تساوى بوصة واحدة

End Sub

و الكود التالى فى الموديول القياسي

Option Explicit 'لا بد من الاعلان عن المتغيرات و الا يصدر فيجوال بيزيك خطأ



'الاعلان عن الأنواع المخصصة

'فلا تعارض Private لاحظ أن هذا النوع معلن أيضاً فى الموديول القياسية و لكن كلاهما

Private Type Rect

   Left As Long

   Top As Long

   Right As Long

   Bottom As Long

End Type



Private Type CharRange

  cpMin As Long     ' أول حرف فى النطاق (صفر لللإشارة لبداية المستند)

  cpMax As Long     ' آخر حرف فى النطاق (-1 للإشارة لآخر المستند)

End Type



Private Type FormatRange

  hdc As Long       ' السياق الحقيقى الذى سنرسم عليه

  hdcTarget As Long ' السياق الهدف لتحديد تنسيق النص

  rc As Rect        ' مساحة السياق التى سيتم الرسم عليها (بوحدة الـ Twip)

  rcPage As Rect    ' مساحة السياق بكامله (حجم الصفحة) (بوحدة الـ Twip)

  chrg As CharRange ' نطاق النص الجارى رسمه (أنظر الإعلانات عاليه)

End Type



'الاعلان عن الثوابت

Private Const WM_USER As Long = &H400

Private Const EM_FORMATRANGE As Long = WM_USER + 57

Private Const EM_SETTARGETDEVICE As Long = WM_USER + 72

Private Const PHYSICALOFFSETX As Long = 112

Private Const PHYSICALOFFSETY As Long = 113



'الاعلان عن الوظائف

Private Declare Function GetDeviceCaps Lib "gdi32" ( _

   ByVal hdc As Long, ByVal nIndex As Long) As Long

Private Declare Function SendMessage Lib "USER32" Alias "SendMessageA" _

   (ByVal hWnd As Long, ByVal msg As Long, ByVal wp As Long, _

   lp As Any) As Long

Private Declare Function CreateDC Lib "gdi32" Alias "CreateDCA" _

   (ByVal lpDriverName As String, ByVal lpDeviceName As String, _

   ByVal lpOutput As Long, ByVal lpInitData As Long) As Long



' أداة النص المنسق تعرض محتواها كما سيعرض على الطابعة تماماً WYSIWYG_RTF  تجعل الدالة

' شرح المعاملات التى تمرر للدالة

' RTF أداة النص المنسق المراد تجهيزها للطباعة بشكل مماثل للعرض على الطابعة

' LeftMarginWidth - عرض الهامش الأيسر المطلوب بالتويب

' RightMarginWidth - عرض الهامش اليمين المطلوب بالتويب



'تقوم الدالة بالعودة بعرض السطر على الطابعة



Public Function WYSIWYG_RTF(RTF As RichTextBox, LeftMarginWidth As Long, RightMarginWidth As Long) As Long

   Dim LeftOffset As Long, LeftMargin As Long, RightMargin As Long

   Dim LineWidth As Long

   Dim PrinterhDC As Long

   Dim r As Long



   ' بدء عملية الطباعة لتهيئة كائن الطباعة

   Printer.Print Space(1) 'طباعة مسافة أو أى شئ، المهم تهيئة كائن الطباعة

   Printer.ScaleMode = vbTwips 'التأكيد على أن وحدة القياس هى التويب



   'الحصول على معادل المنطقة التى ستتم طباعتها "القابلة للطباعة" على الصفحة بوحدة التويب

   LeftOffset = Printer.ScaleX(GetDeviceCaps(Printer.hdc, _

      PHYSICALOFFSETX), vbPixels, vbTwips)



   ' حساب الهامش اليمين و الأيسر

   LeftMargin = LeftMarginWidth - LeftOffset

   RightMargin = (Printer.Width - RightMarginWidth) - LeftOffset



   ' حساب عرض السطر

   LineWidth = RightMargin - LeftMargin



   ' إنشاء سياق على الطابعة مشار إليه بكائن الطباعة

   ' سنحتاج لإستبقاء هذا السياق حتى تظل أداة النص المنسق تعرض محتوياتها بشكل مماثل للشكل

   ' الذى ستظهر به عند طباعتها على الطابعة

   PrinterhDC = CreateDC(Printer.DriverName, Printer.DeviceName, 0, 0)



   ' أخبر أداة النص المنسق أن تؤسس عرضها بناء على الطابعة

   ' على حسب عرض السطر الذى نرغب به

   r = SendMessage(RTF.hWnd, EM_SETTARGETDEVICE, PrinterhDC, _

      ByVal LineWidth)



   ' إجهاض أى عملية طباعة مؤقته استخدمت للحصول على معلومات عن الطابعة

   Printer.KillDoc



   WYSIWYG_RTF = LineWidth

End Function



' PrintRTF تقوم الدالة بطباعة محتوى أداة النص المنسق بإستخدام الهوامش المرسلة لها

' RTF أداة النص المنسق الجارى طباعة محتواها

' LeftMarginWidth الهامش الأيسر بالتويب

' TopMarginHeight الهامش العلوى بالتويب

' RightMarginWidth الهامش اليمين بالتويب

' BottomMarginHeight الهامش السفلى بالتويب



' على أداة النص المنسق الممررة للاجراء WYSIWYG_RTF ملاحظة: لو أنك قمت أيضاً باستخدام الدالة

' WYSIWYG_RTF فيجب أن تحدد نفس الهوامش اليمين و اليسار التى حددتها عند استدعاء الدالة



Public Sub PrintRTF(RTF As RichTextBox, LeftMarginWidth As Long, _

   TopMarginHeight, RightMarginWidth, BottomMarginHeight)

   Dim LeftOffset As Long, TopOffset As Long

   Dim LeftMargin As Long, TopMargin As Long

   Dim RightMargin As Long, BottomMargin As Long

   Dim fr As FormatRange

   Dim rcDrawTo As Rect

   Dim rcPage As Rect

   Dim TextLength As Long

   Dim NextCharPosition As Long

   Dim r As Long



   ' لكائن الطباعة hDC بدء عملية طباعة للحصول على قيمة صحيحة للخاصية

   Printer.Print Space(1)

   Printer.ScaleMode = vbTwips



   'الحصول على معادل المنطقة التى ستتم طباعتها "القابلة للطباعة" على الصفحة بوحدة التويب

   LeftOffset = Printer.ScaleX(GetDeviceCaps(Printer.hdc, _

      PHYSICALOFFSETX), vbPixels, vbTwips)

   TopOffset = Printer.ScaleY(GetDeviceCaps(Printer.hdc, _

      PHYSICALOFFSETY), vbPixels, vbTwips)



   ' حساب الهامش اليمين و الأيسر و العلوى و السفلى

   LeftMargin = LeftMarginWidth - LeftOffset

   TopMargin = TopMarginHeight - TopOffset

   RightMargin = (Printer.Width - RightMarginWidth) - LeftOffset

   BottomMargin = (Printer.Height - BottomMarginHeight) - TopOffset



   ' تحديد مربع المنطقة القابلة للطباعة

   rcPage.Left = 0

   rcPage.Top = 0

   rcPage.Right = Printer.ScaleWidth

   rcPage.Bottom = Printer.ScaleHeight



   ' تحديد المربع الذى سنطبع فيه (بالنسبة للمنطقة القابلة للطباعة) كما حددناها

   rcDrawTo.Left = LeftMargin

   rcDrawTo.Top = TopMargin

   rcDrawTo.Right = RightMargin

   rcDrawTo.Bottom = BottomMargin



   ' تحديد تعليمات الطباعة

   fr.hdc = Printer.hdc        ' استخدام نفس السياق لإجراء الحسابات و الطباعة

   fr.hdcTarget = Printer.hdc  ' أشر لسياق الطابعة

   fr.rc = rcDrawTo            ' الاشارة للمساحة التى سيتم الطباعة عليها فى الصفحة

   fr.rcPage = rcPage          ' الاشارة لحجم الصفحة الكلى

   fr.chrg.cpMin = 0           ' الاشارة لبداية النص و حتى

   fr.chrg.cpMax = -1          ' نهاية النص



   ' الحصول على طول النص بأداة النص المنسق

   TextLength = Len(RTF.Text)



   ' الدخول فى حلقة لطباعة كل صفحة حتى تمام الانتهاء من الصفحات

   Do

      'EM_FORMATRANGE طباعة الصفحة عن طريق ارسال الرسالة

      NextCharPosition = SendMessage(RTF.hWnd, EM_FORMATRANGE, True, fr)

      If NextCharPosition >= TextLength Then Exit Do  'نخرج من الحلقة لو تمت عملية الطباعة

      fr.chrg.cpMin = NextCharPosition ' موقع البدء للصفحة التالية

      Printer.NewPage                  ' الانتقال للصفحة التالية

      Printer.Print Space(1) ' إعادة تهيئة الخاصية hDC

      fr.hdc = Printer.hdc

      fr.hdcTarget = Printer.hdc

   Loop



   ' بدء تنفيذ عملية الطباعة فعلياً

   Printer.EndDoc



   ' تحرير المساحة المستخدمة بواسطة أداة النصوص المنسقة

   r = SendMessage(RTF.hWnd, EM_FORMATRANGE, False, ByVal CLng(0))

End Sub

كما يمكنك أن تريح نفسك من كل هذا العناء و تحمل الملف المرفق فقد قمت مسبقاً بهذا العمل، و لكن كتبت الكود لمن يحب أن يتفرج قبل أن يقوم بالتحميل، و لم أقم بإرفاق أى ملفات تنفيذية كنصيحة عامة بعدم إرفاقها فلا داعى لها مع وجود المشروع، حيث يمكن تشغيله و ترجمته على جهازك لو تحب، و تعفى نفسك من خطر التعرض لأى فيروسات قد يكون جهاز مقدم الملف التنفيذى مصاب بها و بدون علمه يصيبك بضرر بالغ، و لا ضرر و لا ضرار، أرجو ألا أكون أثقلت.

و فى الخدمة.

printdmo.zip

#8

ويش اقولك غير تسلم يا الغالي ودامك ذخرا للامة البرمجية

بخصوص العشا انت بس اتصل علي وانا بجيك والسندويشات جاهزة

تعال صدق تبي فلفل ولا بدون واكثرالدوال وبدون اكواد :D

#9

الحمد لله الذى وفقنى لمساعدتك، و أنا سعيد أنى فهمت قصدك بشكل صحيح و أن المشاركة أعجبتك.

و لا تتردد إذا احتجت شيء إن بس تأمر و أنا جاهز.

أخوك

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

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