مرفق مثال توضيحي
أرجو المساعدة
لا تخلط ما بين شخصيتي وأسلوبي .. فشخصيتي هي
ما أنا عليه وتحت تصرفي .. وأسلـوبي يعتمد عليـك
أنت وتصرفاتك
ولحظاتي صمت... وصمـت لحظاتي كلام ... كلامه
اشد آلام ... فصمتي أنا عنوان
السلام عليكم...
أضف PictureBox آخر إلى الـ Form (الكود يفترض أن اسمه Picture2). لا يهم حجمه و مكانه لأنه سيتم ضبطه بالكود، و سيكون مخفياً.
أكتب الأكواد التالية حسب مكانها:
' قسم التصريحات العام
Private Const SRCCOPY = &HCC0020
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
' عند تحميل النافذة
Private Sub Form_Load()
' ضبط خصائص مربع الصورة المخفي
With Picture2
.ScaleMode = vbPixels ' ( = 3 - Pixel )
.BorderStyle = 0 ' ( = 0 - None )
.Width = Picture1.Width
.Height = Picture1.Height
.AutoRedraw = True
.Visible = False
End With
End Sub
' زر الطباعة
Private Sub cmdPrint_Click()
Dim hPicDC As Long
Dim OldMode As ScaleModeConstants
Dim WidthPixels As Long
Dim HeightPixels As Long
' الحصول على المقبض الرسومي للإطار
hPicDC = GetDC(Picture1.hwnd)
If hPicDC <> 0 Then
' تحويل عرض و ارتفاع الإطار إلى وحدة البكسل
WidthPixels = Me.ScaleX(Picture1.Width, Me.ScaleMode, vbPixels)
HeightPixels = Me.ScaleY(Picture1.Height, Me.ScaleMode, vbPixels)
' مسح مربع الصورة المخفي و رسم صورة الإطار به - بكل محتوياته
Picture2.Cls
BitBlt Picture2.hdc, 0, 0, WidthPixels, HeightPixels, hPicDC, 0, 0, SRCCOPY
' ضبط و تهيئة الطابعة
OldMode = Printer.ScaleMode
Printer.ScaleMode = vbPixels
Printer.Print "";
' نسخ الصورة إلى الطابعة
Printer.PaintPicture Picture2.Image, 0, 0, WidthPixels, HeightPixels, 0, 0, WidthPixels, HeightPixels
' إعطاء الأمر بالطباعة
Printer.EndDoc
Printer.ScaleMode = OldMode
End If
End Subنرجو الاستفادة و السلام.
وَ قُلِ اعْمَلُوا فَسَيَرَى اللهُ عَمَلَكُمْ وَ رَسُولُهُ وَ الْمُؤْمِنُونَ
صدق الله العظيم
والله هي فكرة عبقرية وعملية
بس كان نفسي يكون هناك طريقة مباشرة أفضل من ذلك ؟؟؟
علي العموم ، شكراً لحضرتك فهي تلبي الغرض
جزاك الله خير الجزاء
لا تخلط ما بين شخصيتي وأسلوبي .. فشخصيتي هي
ما أنا عليه وتحت تصرفي .. وأسلـوبي يعتمد عليـك
أنت وتصرفاتك
ولحظاتي صمت... وصمـت لحظاتي كلام ... كلامه
اشد آلام ... فصمتي أنا عنوان
لا تخلط ما بين شخصيتي وأسلوبي .. فشخصيتي هي
ما أنا عليه وتحت تصرفي .. وأسلـوبي يعتمد عليـك
أنت وتصرفاتك
ولحظاتي صمت... وصمـت لحظاتي كلام ... كلامه
اشد آلام ... فصمتي أنا عنوان
انا ايضاً ابنى تقاريري يدوياً وكنت استخدم هذه الطريقة لكنى وجدت انها ليست عملية على الإطلاق
فهي فقط تقوم بطباعة الصورة الظاهرة امامك .. فإذا كان الفورم خارج حدود الشاشة او غير ظاهر (في حالة رغبة المستخدم عمل طباعة مباشرة دون الحاجة لعرض التقرير) ففي هذه الحالة لن يتم طباعة سوى الجزء الظاهر من الفورم ..
في النهاية قمت بعمل Module يقوم بقراءة خصائص الادوات ورسمها يدوياً بدوال الرسم .. لكن حتى الآن يدعم فقط الادوات (TextBox, Label, Image, PictureBox, Line) ففي التقرير لا احتاج غير هذه الادوات .
It does not matter what they know about you, but what you can do, so let your work speak of you
mmghv VB6 Programmer
السلام عليكم...
السبب هو أن الـ DC مرتبط بمحتويات منطقة الشاشة التي تمثلها الـ DC حتى و إن لم تكن جزءاً من برنامجنا.
على أية حال، أتصور أن سبب محاولة إنشاء و طباعة تقرير بهذه الطرق هو عدم الرغبة في استعمال جدول في قاعد بيانات لحفظ البيانات التي سيتم عرضها، و إلا فإن تصميم تقرير مرتبط بجدول أو استعلام أسهل من استعمال أكواد برمجية لإنشاء التقرير يدوياً - رغم أني استعملت هذه الطرق في سنوات سابقة!
إذا كان الأمر كذلك فإنه يمكن إنشاء مجموعة سجلات (RecordSet) مؤقتة في الذاكرة، و تعبئتها بالبيانات، و ربطها بالتقرير، ثم عرض التقرير.
المثال المرفق يقوم على هذا الأساس، أي إنشاء RecordSet مؤقتة (في الذاكرة) ثم ربطها بـ DataGrid لعرض البيانات على الشاشة، و ربطها بتقرير (المثال يستعمل الـ DataReport) لغرض الطباعة - يوجد بعض الشرح بالعربي ضمن الكود.
نرجو الاستفادة و السلام.
وَ قُلِ اعْمَلُوا فَسَيَرَى اللهُ عَمَلَكُمْ وَ رَسُولُهُ وَ الْمُؤْمِنُونَ
صدق الله العظيم
najy_zl كتب:السلام عليكم...
السبب هو أن الـ DC مرتبط بمحتويات منطقة الشاشة التي تمثلها الـ DC حتى و إن لم تكن جزءاً من برنامجنا.
على أية حال، أتصور أن سبب محاولة إنشاء و طباعة تقرير بهذه الطرق هو عدم الرغبة في استعمال جدول في قاعد بيانات لحفظ البيانات التي سيتم عرضها، و إلا فإن تصميم تقرير مرتبط بجدول أو استعلام أسهل من استعمال أكواد برمجية لإنشاء التقرير يدوياً - رغم أني استعملت هذه الطرق في سنوات سابقة!
إذا كان الأمر كذلك فإنه يمكن إنشاء مجموعة سجلات (RecordSet) مؤقتة في الذاكرة، و تعبئتها بالبيانات، و ربطها بالتقرير، ثم عرض التقرير.
المثال المرفق يقوم على هذا الأساس، أي إنشاء RecordSet مؤقتة (في الذاكرة) ثم ربطها بـ DataGrid لعرض البيانات على الشاشة، و ربطها بتقرير (المثال يستعمل الـ DataReport) لغرض الطباعة - يوجد بعض الشرح بالعربي ضمن الكود.
نرجو الاستفادة و السلام.
أولاً ، أنا أتعامل مع التقارير بواسطة Crystal Report عموماً
ثانياً ، عمل سجلات Recordset مؤقتة في الذاكرة ، فدي شغلتي أساساً ولعبتي وسهلة بعون الله
ثالثاً ، المثال المرفق مجرد مثال هدفه الأساسي تطوير الفكرة لشيء خاص بيا مش أكثر
هذه هي القصة أستاذي الكريم ،، مجرد مثال !!!
اقتباسفي النهاية قمت بعمل Module يقوم بقراءة خصائص الادوات ورسمها يدوياً بدوال الرسم .. لكن حتى الآن يدعم فقط الادوات (TextBox, Label, Image, PictureBox, Line) ففي التقرير لا احتاج غير هذه الادوات .
من الواضح أنني في النهاية سألجأ لذلك !!!
لكن كان بودي أجد طريقة تكون أسهل من ذلك !!!
شكراً لحضرتك
تم تعديل هذه المشاركة بواسطة MMA_EG_Cairo في 18 أكتوبر 2012 في 00:52
لا تخلط ما بين شخصيتي وأسلوبي .. فشخصيتي هي
ما أنا عليه وتحت تصرفي .. وأسلـوبي يعتمد عليـك
أنت وتصرفاتك
ولحظاتي صمت... وصمـت لحظاتي كلام ... كلامه
اشد آلام ... فصمتي أنا عنوان
المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية
جارٍ التحقق من المتواجدين…