السلام عليكم
أنوي بعون الله أن أقدم تباعاً بعض المعلومات التي أكتسبها بحكم الدراسة والخبرة.
اعذروني إن كان شرحي ضعيفاً فأنا لا أعرف الاستطالة في الكلام، فسوف أفترض أن من يكتسب هذه المعلومة هو من يريد زيادة خبرته. وإن كان هناك من يحب أن يشرح بتفصيل فأنا أرحب به ليعينني على إيصال المعلومات. على كل الأحوال، سوف يكون الشرح معتمداً على برنامج بسيط أقوم بشرح خطوات تنفيذه.
ضمن هذه المشاركة الأولى لي من نوعها سوف أقدم طريقة الوصول إلى قاموس Word من VB:
تهم هذه العملية كل من ينشئ برامج تحرير نصوص.
نبدأ مباشرة في العمل؛
ابدأ بمشروع جديد، وأضف إلى المشروع مرجع Microsoft Word 10.0 Object Library، أضف أداة RichTextBox للنموذج وليكن اسمها rtbText وأضف زر وليكن اسمه cmdCheckSpelling
أولاً عرف متغيير من النمط Application ضمن حدث ضغط الزر، مع العلم بأن هذا النمط لن يكون موجوداً إلا بعد إضافة المرجع المشار إليه سابقاً.
Dim wordDic as Application
ثم أنشئ Object جديد من النمط Application يشير إليه المتغيير السابق بتعليمة set
Set wordDic = new Application
أصبح الآن هذا المتغير يحمل كافة خصائص وطرائق النمط Application والذي هو Microsoft Word. ومن بينها طريقة CheckSpelling و CheckGrammer، حيث الأولى تفحص صحة الكتابة للكلمة الواحدة والثانية تفحص صحة كتابة الجملة قواعدياً.
wordDic.CheckSpelling(word)
بفرض المتغير word من نمط String يحمل الكلمة المطلوب فحصها.
مبرجي Word VBA يعرفون ما يسمى بـ ActiveDocument يعادله في VB تعريف متغير من النمط Document، يمكن من خلاله الوصول إلى الأخطاء كافة الموجودة في المستند (الكتابية والقواعدية) من خلال الطريقتين سابقتي الذكر. أما إذا أردت أن تفحص صحة كتابة كلمة معينة ليست موجودة ضمن مستند فيجب استعمال Application ويعادله في VB ما سبق ذكره، حيث تستطيع من خلاله تمرير الكلمة المطلوب فحصها كمعامل "Argument".
نتابع في المشروع؛ نفترض وجود function بالاسم endOfWord يعيد رقم من نمط Integer يدل على نهاية الكلمة، حيث يأخذ معاملين هما النص الذي سيتم البحث فيه، ورقم يدل على بداية الكملة. ثم نضيف الشيفرة التالية التي تحدد كل كلمة ضمن النص وتفحص صحة كتابتها، وفي حال الكتابة الخاطئة تغيير لونها إلى الأحمر.
start = 1 Do Until start > Len(rtbText.Text) last = endOfWord(rtbText.Text, start) length = last - start word = Mid(rtbText.Text, start, length) If Not wordDic.CheckSpelling(word) Then rtbText.SelStart = start - 1 rtbText.SelLength = length rtbText.SelColor = vbRed End If start = last + 1 DoEvents Loop
حيث نحدد أولاً شرط انتهاء الحلقة وهو تجاوز قيمة المتغير start لطول النص. ثم نحدد رقم موضع نهاية الكلمة بمعونة التابع endOfWord، ثم طول الكلمة. وبعد اقتطاع الكلمة نفحص صحتها، حيث يعيد التابع CheckSpelling قيمة true في حال كانت الكلمة صحيحة. وfalse في الحالة المعاكسة. وكما هو واضح عندما تكون الكلمة خطأ نغير لون هذه الكلمة إلى أحمر. ثم نضع في start قيمة last مضافاً إليها 1 حتى نبدأ العد في الحلقة التالية بعد بمحرف من الكلمة السابقة.
أما بالنسبة للشيفرة الخاصة بالـ function endOfWord فهي:
Private Function endOfWord(ByRef s As String, start As Integer) As Integer Dim smallest As Integer, smallestAux As Integer If start < Len(s) Then smallest = InStr(start, s, " ", vbTextCompare) For n = 33 To 125 If n = 39 Then n = 40 smallestAux = InStr(start, s, Chr(n), vbTextCompare) If (smallest = 0 Or smallest > smallestAux) And smallestAux > 0 Then smallest = smallestAux If n = 64 Then n = 91 ElseIf n = 96 Then n = 123 End If Next smallestAux = InStr(start, s, Chr(13), vbTextCompare) + 1 If (smallest = 0 Or smallest > smallestAux) And smallestAux > 1 Then smallest = smallestAux If smallest = 0 Then smallest = Len(s) + 1 End If endOfWord = smallest End Function
حيث يقوم هذا التابع بالبحث عن أول مسافة أو أحد أنواع الفواصل بين الكلمات ابتداءً من نقطة البداية start، ثم إعادة رقم موضعها كما سبق وذكرنا.
وها هنا أضع المثال السابق ضمن الملف المرفق لتسهيل عملية المراجعة والتجربة.
أتمنى أن أكون قد قدمت الجديد والمفيد.