18-03-17, 03:33 PM (آخر تعديل لهذه المشاركة : 18-03-17, 03:35 PM {2} بواسطة ابراهيم النعيمي.)
السلام عليكم
اخوتي الاعزاء ما معنى الخطأ التالي ان امكن
A Generic Error Occurred in GDI+
المشكلة الخطأ اعلاه لا يظهر دائما و انما بشكل متقطع و هو غير مرتبط بعملية محددة في البرنامج علماً ان الخطأ ليس له علاقة بالتعامل مع الصور و هو يحصل في البروسيجرات الموجودة في ملف الـ (dll)
ان امكن شرح سبب هذا الخطأ و المعالجات
ملاحظة:
* صورة الخطأ في المرفقات
* SalePointInsert_UpdateRec الموجود في اعلى الصورة المرفقة هو اسم ملف الـ (dll)
19-03-17, 05:03 AM (آخر تعديل لهذه المشاركة : 19-03-17, 05:10 AM {2} بواسطة silverlight.)
الخلاصة ان الكود الذي تسبب في الخطأ كانت نتيجته خطأ عام مع ملف System.Drawing بشكل ما
ومن عنوان الخطأ ربما السبب هو عملية Update Rectangle و في تلك الحالة قد يكون السبب أنه لا يتم تمرير البيانات بشكل دقيق
و بالتالي عملية الرسم لا تتم بالشكل المطلوب
أو انه يتم عمل Dispose لبعض المتغيرات المستخدمة في الرسم قبل أن تتم عملية الرسم
أن أقدر أقول لك ألف سبب للمشكلة هذه لكن بدون الكود فإن تحديد أسباب الخطأ سيكون صعب
بداية اشكر الاخوة (abdualla) و (Silverlight) على المشاركة
حيث نبهتني جملة الاخ (Silverlight) التالية
إقتباس :الخلاصة ان الكود الذي تسبب في الخطأ كانت نتيجته خطأ عام مع ملف System.Drawing بشكل ما
ثانياً اعتذر عن الجملة التالية
إقتباس :علماً ان الخطأ ليس له علاقة بالتعامل مع الصور
لاني بعد ان قمت بتدقيق ملف ال(dll) وجدت الاجراء التالي الذي يتعامل مع الصور و لكن للامانة فاتني انه ممكن ان يتسبب بالخطأ اعلاه
PHP كود :
'============================================================================================================================ '============================================================================================================================ ' لرسم علامة × على زر الحذف في الكرد '============================================================================================================================ '============================================================================================================================ Public Shared Sub DGVDeletebtn(ByVal e As DataGridViewCellPaintingEventArgs, ByVal cellindex As Int16) Try 'KillProcess()
If e.ColumnIndex = cellindex Then e.Paint(e.CellBounds, DataGridViewPaintParts.All)
Dim bmpFind As Bitmap = Image.FromFile("deletebtn.png") Dim ico As Icon = Icon.FromHandle(bmpFind.GetHicon) e.Graphics.DrawIcon(ico, e.CellBounds.Left, e.CellBounds.Top + 1) e.Handled = True End If Catch ex As Exception MsgBox(ex.Message) End Try
End Sub
الاجراء اعلاه كما هو واضح يقوم بتعيين صورة من نوع (PNG) تتضمن علامة الحذف على احد ازرار الـ (DataGridView) حيث ان وظيفة ذلك الزر حذف ذلك القيد فقط
سؤالي هو هل ان الاجراء اعلاه ممكن ان يتسبب بهذا الخطأ و ما هي التعديلات المطلوبة
21-03-17, 05:05 PM (آخر تعديل لهذه المشاركة : 21-03-17, 05:06 PM {2} بواسطة abdualla.)
استفسار!
لماذا تريد تحويل الصورة لأيقونة؟ في حين أنه يمكنك استخدامها كما هي
(انصح بوضع الصورة في الريسورس كما في المثال)
PHP كود :
'============================================================================================================================ '============================================================================================================================ ' لرسم علامة × على زر الحذف في الكرد '============================================================================================================================ '============================================================================================================================ Public Shared Sub DGVDeletebtn(ByVal e As DataGridViewCellPaintingEventArgs, ByVal cellindex As Int16) 'KillProcess()
If e.ColumnIndex = cellindex Then e.Paint(e.CellBounds, DataGridViewPaintParts.All) e.Graphics.DrawImage(My.Resources.deletebtn, e.CellBounds.X, e.CellBounds.Y + 1) e.Handled = True End If End Sub
ملاحظة هامة: لا تستخدم أي رسائل مثل MsgBox أو غيرها داخل أي حدث Paint لأنها غالباً ستتسبب تعارض مع الرسم
لا تنسى أن تضع الصورة deletebtn.png في الريسورس Resources
21-03-17, 08:30 PM (آخر تعديل لهذه المشاركة : 21-03-17, 08:31 PM {2} بواسطة silverlight.)
الخطأ كان يحدث أحيانا و أحيانا أخري لا يحدث لأن هذه مشكلة Threading
حيث أنه أثناء عملية الرسم و تحديدا في الكود الخاص بتحويل الصورة الي ايقونة
عندما تكون ذاكرة الكمبيوترة مليئة هنا يحدث الخطأ لأن الكمبيوتر لا يستطيع قراءة الصورة من الملف بسرعة
و طبعا العكس صحيح
و لتفادي تكرار مثل هذا الاشياء عليك ان تقرأ الصورة اولا ثم تتاكد انها لا تساوي Nothing ثم تقوم بتحويلها إلي أيقونة
من الافضل أيضا ان تتم عملية تحويل الصورة الي ايقونة باستخدام دالة منفصلة
شكراً اخي (Silverlight)
بارك الله بيك على التوضيح .. الان المشكلة باتت واضحة
مع ذلك قمت باستخدام تعديل الاخ (abdualla) لانه بالفعل لا يوجد حاجة لتحويل الصورة الى ايقونة مع الاستفادة من ملاحظتك القيمة ليكون الاجراء بالشكل التالي:
PHP كود :
On Error Resume Next If e.ColumnIndex = cellindex Then e.Paint(e.CellBounds, DataGridViewPaintParts.All) If Not My.Resources.deletebtn Is Nothing Then e.Graphics.DrawImage(My.Resources.deletebtn, e.CellBounds.X, e.CellBounds.Y + 1) End If e.Handled = True End If
اي الغاء تحويل الصورة الى ايكونة مع قراءة الصورة قبل رسمها داخل خلية الكرد فيو
22-03-17, 08:20 AM (آخر تعديل لهذه المشاركة : 23-03-17, 06:52 PM {2} بواسطة abdualla.)
أخي ابراهيم
لا تحتاج إلى هذا السطر If Not My.Resources.deletebtn Is Nothing Then
لأن الصورة في الريسورس، أي مدمج مع ملف البرنامج وليس ملف خارجي لتتأكد من وجوده
PHP كود :
If e.ColumnIndex = cellindex Then e.Paint(e.CellBounds, DataGridViewPaintParts.All) e.Graphics.DrawImage(My.Resources.deletebtn, e.CellBounds.X, e.CellBounds.Y + 1) e.Handled = True End If