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

Error:type Mismatch

بدأه مبرمجة-123 في 17 أبريل 2008 · 5 رد · 832 مشاهدة · في لغة Ms Visual Basic 6 وما قبلها من إصدارات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

اهلا بالجميع ...

عندي برنامج بالفيجيوال بيسك ... لكني اواجه مشكلة تظهر لي ولم استطع حلها ...

Dim str(0 to 64) as string

//عرفت array من نوع string وطوله 64

وعرفت function تستقبل هذا ال string

verifyLength(str() as string  )

ولكن عند مناداتها يظهر لي اررور Type Mismatch: array or user defined type expected

verifyLength(str() )

وشئ آخر ... اريد استخدام متغيرات بحيث تكون Call By reference

اي انني ارسلها بالفنكشن ... وعند حدوث اي تغيير يتاثر المتغير الموجود بالدالة الاساسية

-لاني لاحظت مشكلة ايضا ان الفنكشن بالفييجيوال بيسك لابد ان اضع لها طرف اخر حتى تكون نتيجة الفنكشن فيها

اي لابد من وضع

OutPut= verifyLength(str())

شكرا لكم ... وآسفة على الاطالة

#2
verifyLength(str() as string  )

عدليه ليصبح :

verifyLength(str() )

اقتباس
-لاني لاحظت مشكلة ايضا ان الفنكشن بالفييجيوال بيسك لابد ان اضع لها طرف اخر حتى تكون نتيجة الفنكشن فيها

أكيد طبعا , وإلا لن تصبح دالة , لأنه الدالة ما يميزها وما يفرقها عن الإجراء (Sub) هو أنها تعود بقيمة , والقيمة يجب أن تحفظ في مكان ما , وهو المتغير أو الخاصية ...

اقتباس
If A is success in life, then A equals x plus y plus z. Work is x; y is play; and z is keeping your mouth shut

Albert Einstein

مدخل إلى برمجة وتصميم الألعاب : كيف أبدأ ؟

#3
اقتباس
عدليه ليصبح :

verifyLength(str() )

ضروري اني اكتب نوع المتغير اللي حرسله للفنكشن ؟ ( قبل مااكتب تعريف الفنكشن)

او هل تقصد عند مناداة الفنكشن ؟ ( داخل الكوماند بوتن )

#4

بإختصار شديد ، لا يجوز بناء متغير مصفوفة من أي نوع من أنواع البيانات سوي المتغير من نوع Variant !!!

مثال :

قم بإنشاء الغرض التالي :

Private Function VerifyLength(InArray() As Variant) As String
	Dim X As Long
	Dim strReturn As String

	For X = 0 To UBound(InArray)
		strReturn = strReturn & InArray(X) & " "
	Next

	VerifyLength = Trim(strReturn)
End Function

بعد ذلك نفذي الكود التالي علي زر أمر :

Private Sub Command1_Click()
	Dim X(3) As Variant
	X(0) = "Welcome"
	X(1) = "To"
	X(2) = "Arab"
	X(3) = "Team"
	Me.Caption = VerifyLength(X)
End Sub

صحيح كل شيء له إستخداماتة ، لكن هناك شيء أفضل من هذه الطريقة إذا كنتي تحبين تنفيذ العملية السابقة من المفضل إستخدام الطريقة ParamArray ، مثال :

Private Function VerifyLength(ParamArray InArray() As Variant) As String
	Dim X As Long
	Dim strReturn As String

	For X = 0 To UBound(InArray)
		strReturn = strReturn & InArray(X) & " "
	Next

	VerifyLength = Trim(strReturn)
End Function

ثم أكتبي الكود التالي في زر أمر كما يلي :

Private Sub Command1_Click()
	Me.Caption = VerifyLength("Welcome", "To", "Arab", "Team")
End Sub

ولكن يجب أن تنتبهي ، تعليمة الـ ParamArray وظيفتها الرئيسية هو إدخال المستخدم في دوارة Loop من الـ Array ، معني هذا الكلام أنه ليس من الممكن إستخدام أكثر من ParamArray في الإجراء ، وفي نفس الوقت لا يجوذ إدراج أكثر من Parameter آخر بعدة ، ولكن يجوز إدراج أكثر من Parameters قبلة . بالإضافة الي ذلك أنه لا يقبل أي نوع آخر من المتغيرات إلا النوع Variant ، لهذا لا تشغلي بالك بنوع المتغير وأتركية يأخذ المتغير من نفسة .

مع ملاحظة ، كل هذا الكلام تم تعديلة علي الـ Dot Net ، من باب العلم بالشيء .

شكراً

تم تعديل هذه المشاركة بواسطة MMA_EG_Cairo في 18 أبريل 2008 في 04:50

لا تخلط ما بين شخصيتي وأسلوبي .. فشخصيتي هي

ما أنا عليه وتحت تصرفي .. وأسلـوبي يعتمد عليـك

أنت وتصرفاتك

ولحظاتي صمت... وصمـت لحظاتي كلام ... كلامه

اشد آلام ... فصمتي أنا عنوان

عصر التكنولوجيا المعلوماتية(مدونتي الخاصة)

My FaceBook

#5

شكرا لك على المعلومة المفيدة :)

غيرت نوع ال array من String الى Variant

ولكن في بعض الدوال احتاج لارجاع اكثر من قيمة ... ولذلك اريد استخدام ByRef !؟

كيف ؟

#6

الأخ الغالي ، سؤال من فضلك ، هل ستستخدم هذا الـ Function لنفسك أم لغيرك !!!!

بمعني أدق ، أنت قمت بإنشاء Function يقوم بإيجاد مجموع مجموعة من الأرقام محددة ، هل الهدف منه هو إستخام أكثر من فرد لهذا الـ Function أم لغرض خاص ؟؟؟

الأخ الكريم ، أنا عاوزك تلاحظ معي شيء جميل جداً ، وهو أدوات التنسيق مثل خصائص الـ Format وغيرها ، تجد أنك تدخل قيم نصية !!!

بإختصار شديد هو إنشاء Parameter للغرض أو للإجراء يستقبل يرتجع قيم نصية ، علي سبيل المثال إدخال عدد أعمدة الجريد كما يلي :

Sub GridColsWidth(Cols As String)

End Sub

بحيث أن يتم إدخال الأعمدة في صورة نصية كما يلي :

Call GridColsWidth("500,150,700,980,,600")

وبعد ذلك يمكنك جلب القيمة النصية وتقسيمها الي ما تشاء ، وذلك كما يفعل الآداة CommonDialog عند إرسال قيمة الـ Filter له :

dlg.Filter = "File Picture BMP|*.bmp|All Files|*.*"

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

Public Function SumEx(ByRef Nums As String) As Double
	Dim dblCalc As Double
	Dim logLoop As Long
	Dim strNums() As String

	strNums = Split(Nums, ",")

	For logLoop = 0 To UBound(strNums)
		dblCalc = dblCalc + Val(strNums(logLoop))
	Next
	SumEx = dblCalc
End Function

Private Sub Command1_Click()
	Me.Caption = SumEx("5,5,10")
End Sub

اما بخصوص الـ ByVal و ByRef في مصفوفة ParamArray أعتقد أنه غير ممكن ، حيث مجرد مدخل In للغرض أو للإجراء فقط لا غير .

علي كلٍ ، كل شيء له حل ، وذلك بالطريقة الموضحة أعلاة

أما إذا كنت مثلاً ترغب في إرتجاع مصفوفة من البيانات التي تم معالجتها داخل الـ Function فأنظر الي المثال التالي :

 

Public Sub GetAscs(AscChars As String, Nums() As Variant)
	Dim X As Long
	Dim Arr() As String
	Dim varArr() As Variant

	Arr = Split(AscChars, ",")

	ReDim varArr(UBound(Arr))

	For X = 0 To UBound(Arr)
		varArr(X) = Asc(Arr(X))
	Next

	Nums = varArr

End Sub

Private Sub Command1_Click()
	Dim Arr() As Variant
	Dim X As Long

	Call GetAscs("A,B,C,R,F,D,Z", Arr)

	For X = 0 To UBound(Arr)
		MsgBox Arr(X)
	Next
End Sub

شكراً

تم تعديل هذه المشاركة بواسطة MMA_EG_Cairo في 21 أبريل 2008 في 02:19

لا تخلط ما بين شخصيتي وأسلوبي .. فشخصيتي هي

ما أنا عليه وتحت تصرفي .. وأسلـوبي يعتمد عليـك

أنت وتصرفاتك

ولحظاتي صمت... وصمـت لحظاتي كلام ... كلامه

اشد آلام ... فصمتي أنا عنوان

عصر التكنولوجيا المعلوماتية(مدونتي الخاصة)

My FaceBook

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