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

رسالة Out Of memory عند عرض الصورة في PictureBox

مغلق
بدأه mqmmss في 2 أغسطس 2006 · 2 رد · 604 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

إخواني السلام عليكم ورحمة الله وبركاتة

بعدكثير من المحاولات في التعامل مع الصور وإضافتها إلى قاعدة البيانات أنا حالياً أعمل على برنامج يقوم بإضافة مجموعة من الصور إلى قاعدة البيانات دفعة واحدة ( بنفس الزر (الــ Button)) وذلك كما سترون في البرنامج الموضح

حيث يقوع البرنامج بعرض الصورة أولاً في أداة PicturBox ومن ثم يضيفها في قاعدة البياانت ويوضح ذلك الـــ ProgressBar الموجود في البرنامج

ولكن بعد إضافة عدد من الصور تظهر رسال Out Of Memory في سطر عرض الصورة في الأداة PictureBox فما هو السبب؟؟؟

حاولت أن أضع المتغير ms.Close وكذلك ms.Disponse ولكن لافاتدة من ذلك

إليكم الكور الموضوع في زر Button

		Dim Fs As New Scripting.FileSystemObject
		Dim Fd As New Scripting.FileSystemObject
	'FolderOffers الحصول على محتويات المجلد 
		Dim Fls As IEnumerator = Fs.GetFolder(Application.StartupPath & "\FolderOffers\").Files.GetEnumerator
	'TempFolderPictures إنشاء مجلد مؤقت بإسم 
		Dim Dir As Scripting.Folder = Fs.CreateFolder(Application.StartupPath & "\TempFolderPictures")
		Static c As Int16 = 0
		'لمعرفة عدد الملفات
		Do While Fls.MoveNext
			c += 1
		Loop
		Fls.Reset()
		Me.ProgressBar1.Visible = True
		Me.ProgressBar1.Value = 0
		If con.State = ConnectionState.Open Then con.Close()
		con.Open()
	   'ليتم إعادة تحميل الصور إلى الجدول Offers حذف محتويات الجدول 
		Dim Cd As New OleDb.OleDbCommand("Delete From Offers", con)
		Cd.ExecuteNonQuery()
	'البدأ في تحميل الصور وذلك على مرحلتين
	'مع تغيير أسمائها TempFolderPictures والذي يحوي عدد من الصور إلى المجلد المؤقت  FolderOffers المرحلة الأولى نسخ محتويات المجلد
	' المرحلة الثانية البدأ بتحميل الصور إلى الجدول من المجلد المؤقت 
		Do While Fls.MoveNext
	   'المرحلة الأولى 
			Static i As Int16 = 0
			i += 1
			Dim F As Scripting.File = CType(Fls.Current, Scripting.File)
			Fs.CopyFile(F.Path, Application.StartupPath & "\SpactelPictures\" & i & ".jpg")

			''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
		''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
			''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''



 		'PictureBox  عرض الصور في أداة 

   'إخواني هنا تحدث المشكلة حيث تظهر رسالة  Out Of memory  


			Dim img As Image = Image.FromFile(Application.StartupPath & "\SpactelPictures\" & i & ".jpg")
			PictureBox1.Image = img
			''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
		''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
			''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

 	   'المرحلة الثانية

			If con.State = ConnectionState.Open Then con.Close()
			con.Open()

			Dim Cm As New OleDb.OleDbCommand("insert into Offers (Picture_No) values(" & i & ")", con)
			Cm.ExecuteNonQuery()
			Dim strSQL As String = "Update Offers Set Picture=" & "@pic" & " where Picture_No=" & i
			Dim cmdSQL As New OleDb.OleDbCommand(strSQL, con)


			Dim ms As New IO.MemoryStream()
			Dim arrimg() As Byte


			PictureBox1.Image.Save(ms, PictureBox1.Image.RawFormat)

			arrimg = ms.GetBuffer


			With cmdSQL
				.Parameters.Add(New OleDb.OleDbParameter("@pic", SqlDbType.Image)).Value = arrimg
			End With
			Try
				If con.State = ConnectionState.Open Then con.Close()
				con.Open()
				cmdSQL.ExecuteNonQuery()
				con.Close()
			Catch ex As SqlClient.SqlException
				MsgBox(ex.Message)
			Finally
				con.Close()
			End Try
			If Me.ProgressBar2.Value + (100 / c) > 100 Then
				Me.ProgressBar2.Value += 100 - Me.ProgressBar2.Value
			Else
				Me.ProgressBar2.Value += (100 / c)
				If Me.ProgressBar2.Value > 100 Then
					Me.ProgressBar2.Value = 100
				End If
			End If
			System.Threading.Thread.Sleep(5)
		Loop
		Me.ProgressBar2.Visible = False
		'MsgBox("ssssssssssssssssssssssss")
		'Dim Fdd As New Scripting.FileSystemObject
		'Fdd.DeleteFolder(Application.StartupPath & "\SpactelPictures", True)

		MessageBox.Show("تمت العملية بنجاح", "SpacetelYemen", MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1, MessageBoxOptions.RtlReading)
		Dispose(True)
		Application.Restart()
		'  Catch ex As Exception
		'MsgBox(ex.Message)
		'  End Try

ياريت ياإخواني تساعدوني فأنا في أمس الحاجة لمعالجة هذه المشكلة حيث أن عملي متوقف عند هذه المشكلة

مع خالص شكري mqmmss

تم تعديل هذه المشاركة بواسطة mqmmss في 2 أغسطس 2006 في 14:08

#2

السلام عليكم

أخي من الطبيعي ظهور هذه الرسالة لأن الصور لها مساحة كبيرة جدا جدا و هذا يؤثر بشكل كبير على البرنامج و أنا لا أعلم سبب ظهور الرسالة تماما و ذلك لقلة علمي و لكني أنصحك بعدم حفظ الصورة بقاعدة البيانات لأن هذا يزيد حجم قاعدة البيانات بشكل مرعب و يسبب بطئ كبير جدا في عمليات البحث و و و و هو أمر لا داعي له بإمكانك بدلا من حفظ الصور في قاعدة بيانات وضع الصور في مجلد بجانب قاعدة البيانات و حفظ مسار كل صورة في قاعدة البيانات و بذلك تكون قد اختصرت مساحة هائلة و تجاوزت مشكلة البطئ و أظن أن مشكلة الرسالة Out Of Memory سوف تحل بهذه الطريقة

أرجو أن تجد الحل في هذا الكلام

و شكرا

#3

أخي الكريم السلام عليكم ورحمة الله وبركاتة

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

أما بالنسبة لرسالة الخطأ Out Of Memory فأنا قد عرفت سبب هذه الرسالة رغم التأخير حيث أن السبب لايعود ألى وجود خطأ في الشفرة أو بسبب حجم الصورة ( كما قلت ) ولكن السبب طبيعي ومنطقي للأسسسسف حيث أن الشفرة الموضحة سابقاً تفترض بأن كافة محتويات المجلد المحدد يجب أن يكون صور لكي يتمكن النظام من عرضها في أداة PictureBox وبعد ذلك يتم حفظ الصورة في القاعدة .

توضيح : إخواني الأعزاء إن البرنامج كان يقوم بقراءة الملف النظامي والمخفي Tumbs.db وهذا يسبب في حدوث خطأ Out Of Memory .

إذا إخواني أرجو المساعدة في إعطائي السطر البرمجي الذي يحدد نوع الملف *.jpg و *.bmb و *.gif

فأرجو مساعدتي هذا وللعلم بأنني قد حاولت بإستخدام الخاصية التالية ولكن هنالك قصور :

()F.FileType ولكن وجدت بأنها ترجع النص التالي ( JPG صورة )

بالمختصر إخواني كيف أعرف إمتداد الملف.

ومشكورين

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

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