تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
ما هو سبب الخطأ A Generic Error Occurred in GDI+
#1
السلام عليكم
اخوتي الاعزاء ما معنى الخطأ التالي ان امكن
A Generic Error Occurred in GDI+
المشكلة الخطأ اعلاه لا يظهر دائما و انما بشكل متقطع و هو غير مرتبط بعملية محددة في البرنامج علماً ان الخطأ ليس له علاقة بالتعامل مع الصور و هو يحصل في البروسيجرات الموجودة في ملف الـ (dll) 
ان امكن شرح سبب هذا الخطأ و المعالجات

ملاحظة: 
* صورة الخطأ في المرفقات
* SalePointInsert_UpdateRec الموجود في اعلى الصورة المرفقة هو اسم ملف الـ (dll)

اجمل تحية ..


الملفات المرفقة صورة/صور
   
الرد }}}
تم الشكر بواسطة:
#2
وهل ملف dll مفتوح المصدر، أي هل نستطيع أن نرى الكود، فقد يكون جزء متعلق بالرسم بشكل ما، وتسبب بهذه المشكلة.

إذا أمكن وضع المشروع، أو كود ملف dll، لأن المسألة متعلقة بالرسوميات أو حفظ الصور.
الرد }}}
#3
الخلاصة ان الكود الذي تسبب في الخطأ كانت نتيجته خطأ عام مع ملف System.Drawing بشكل ما

ومن عنوان الخطأ ربما السبب هو عملية Update Rectangle و في تلك الحالة قد يكون السبب أنه لا يتم تمرير البيانات بشكل دقيق
و بالتالي عملية الرسم لا تتم بالشكل المطلوب
أو انه يتم عمل Dispose لبعض المتغيرات المستخدمة في الرسم قبل أن تتم عملية الرسم

أن أقدر أقول لك ألف سبب للمشكلة هذه لكن بدون الكود فإن تحديد أسباب الخطأ سيكون صعب
الرد }}}
تم الشكر بواسطة: ابراهيم النعيمي
#4
بداية اشكر الاخوة (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.CellBoundsDataGridViewPaintParts.All)

 
               Dim bmpFind As Bitmap Image.FromFile("deletebtn.png")
 
               Dim ico As Icon Icon.FromHandle(bmpFind.GetHicon)
 
               e.Graphics.DrawIcon(icoe.CellBounds.Lefte.CellBounds.Top 1)
 
               e.Handled True
            End 
If
 
       Catch ex As Exception
            MsgBox
(ex.Message)
 
       End Try

 
   End Sub 

الاجراء اعلاه كما هو واضح يقوم بتعيين صورة من نوع (PNG) تتضمن علامة الحذف على احد ازرار الـ (DataGridView) حيث ان وظيفة ذلك الزر حذف ذلك القيد فقط 
سؤالي هو هل ان الاجراء اعلاه ممكن ان يتسبب بهذا الخطأ و ما هي التعديلات المطلوبة


اجمل تحية ..
الرد }}}
تم الشكر بواسطة:
#5
استفسار!
لماذا تريد تحويل الصورة لأيقونة؟ في حين أنه يمكنك استخدامها كما هي
(انصح بوضع الصورة في الريسورس كما في المثال)
PHP كود :
'============================================================================================================================
    '
============================================================================================================================
    
' لرسم علامة × على زر الحذف في الكرد
    '
============================================================================================================================
    
'============================================================================================================================
    Public Shared Sub DGVDeletebtn(ByVal e As DataGridViewCellPaintingEventArgs, ByVal cellindex As Int16)
        '
KillProcess()

        If 
e.ColumnIndex cellindex Then
            e
.Paint(e.CellBoundsDataGridViewPaintParts.All)
            
e.Graphics.DrawImage(My.Resources.deletebtne.CellBounds.Xe.CellBounds.1)
            
e.Handled True
        End 
If
    
End Sub 

ملاحظة هامة: لا تستخدم أي رسائل مثل MsgBox أو غيرها داخل أي حدث Paint لأنها غالباً ستتسبب تعارض مع الرسم

لا تنسى أن تضع الصورة deletebtn.png في الريسورس Resources
الرد }}}
تم الشكر بواسطة: sendbad100 , ابراهيم النعيمي
#6
شكراً اخي abdualla جعله الله في ميزان حسناتك

اجمل تحية ..
الرد }}}
تم الشكر بواسطة: abdualla
#7
الخطأ كان يحدث أحيانا و أحيانا أخري لا يحدث لأن هذه مشكلة Threading
حيث أنه أثناء عملية الرسم و تحديدا في الكود الخاص بتحويل الصورة الي ايقونة
عندما تكون ذاكرة الكمبيوترة مليئة هنا يحدث الخطأ لأن الكمبيوتر لا يستطيع قراءة الصورة من الملف بسرعة
و طبعا العكس صحيح

و لتفادي تكرار مثل هذا الاشياء عليك ان تقرأ الصورة اولا ثم تتاكد انها لا تساوي Nothing ثم تقوم بتحويلها إلي أيقونة
من  الافضل أيضا ان تتم عملية تحويل الصورة الي ايقونة باستخدام دالة منفصلة
الرد }}}
تم الشكر بواسطة: sendbad100 , ابراهيم النعيمي , abdualla
#8
شكراً اخي (Silverlight) 
بارك الله بيك على التوضيح .. الان المشكلة باتت واضحة 

مع ذلك قمت باستخدام تعديل الاخ (abdualla) لانه بالفعل لا يوجد حاجة لتحويل الصورة الى ايقونة مع الاستفادة من ملاحظتك القيمة ليكون الاجراء بالشكل التالي:
PHP كود :
On Error Resume Next
        If e
.ColumnIndex cellindex Then
            e
.Paint(e.CellBoundsDataGridViewPaintParts.All)
 
           If Not My.Resources.deletebtn Is Nothing Then
                e
.Graphics.DrawImage(My.Resources.deletebtne.CellBounds.Xe.CellBounds.1)
 
           End If
 
           e.Handled True
        End 
If 

اي الغاء تحويل الصورة الى ايكونة مع قراءة الصورة قبل رسمها داخل خلية الكرد فيو

اجمل تحية ..
الرد }}}
تم الشكر بواسطة: abdualla
#9
أخي ابراهيم

لا تحتاج إلى هذا السطر  If Not My.Resources.deletebtn Is Nothing Then
لأن الصورة في الريسورس، أي مدمج مع ملف البرنامج وليس ملف خارجي لتتأكد من وجوده
PHP كود :
       If e.ColumnIndex cellindex Then
            e
.Paint(e.CellBoundsDataGridViewPaintParts.All)
 
           e.Graphics.DrawImage(My.Resources.deletebtne.CellBounds.Xe.CellBounds.1)
 
           e.Handled True
        End 
If 
الرد }}}
تم الشكر بواسطة: sendbad100 , ابراهيم النعيمي



التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم