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

اضف إلى معلوماتك : تلميحات و خدع

مثبّترائج
بدأه محمد رضى في 12 سبتمبر 2009 · 69 رد · 30,544 مشاهدة · في قسم الدروس والمواضيع المتميزة
مشاركة: واتساب X فيسبوك تيليجرام
#51

السلام عليكم و رحمة الله تعالى و بركاته...

كيف تستعمل مدقق وورد اللغوي لتصحيح النصوص على مشاريعك؟

post-207152-1256594076_thumb.jpg

إذا كنت تحتاج لمدقق لغوي للنصوص على مشاريعك فلا تبحث كثيرا و لا تظيع الوقت في تطوير واحد جديد. كل ما تحتاج إليه هو برنامج Microsoft Word مثبت على جهاز مستخدمي برنامجك. و إن لم يكن تظهر مربع رسالة تخبر المستخدم فيها بوجوب وجود وورد لاستعمال المدقق اللغوي. و بهذا تساهم في زيادة مبيعات مايكروسوفت و تزيل حملا ثقيلا عن كاهلك برمي مسؤولية تكاسلك على كاهل المستخدم.

الكود الذي سنناقش في هذه التلميحة يقوم بتنفيذ تدقيق لغوي لنص باستعمال برنامج وورد. عند تنفيذ الكود يقوم بتشغيل برنامج وورد في الخلفية عن طريق كائن COM و بعد ذلك يقوم بإنشاء مستند جديد على البرنامج و ينسخ فيه النص المطلوب تصحيحه. بعد ذلك تظهر نافذة المدقق اللغوي لوورد و تساعد المستخدم في تصحيح النص حسب ما يريد و بعد ذلك ترجع النص المصحح إلى البرنامج. الكود بسيط و معلق عليه بالتفصيل :

		If TextBox1.Text = "" Then Return
		' إنشاء الكائن الممثل لبرنامج وورد
		Dim word As Object = CreateObject("Word.Application")
		' إنشاء مستند جديد
		word.Documents.Add()
		' نقل النص إلى المستند الجديد
		word.Selection.TypeText(TextBox1.Text)
		' عملية التدقيق اللغوي
		word.ActiveDocument.CheckSpelling()
		' تحديد النص المصحح كله
		word.Selection.WholeStory()
		' نسخ النص إلى الكليبورد
		word.Selection.Copy()
		' غلق المستند
		word.ActiveDocument.Close(0)
		' غلق وورد
		word.Quit()
		' تحرير الذالكرة المستعملة
		word = Nothing
		' إرجاع النص بعد تصحيحه إلى مربع النص
		TextBox1.Text = Clipboard.GetText()

ملاحظة : عملية إرجاع النص المصحح تتم عبر الكليبورد. لذا قد تحتاج إلى محو محتواها بعد تنفيذ الكود.

الكود المرفق به مشروع صغير به الكود الكامل مع التعليق.

تحياتي...

TestLab.rar

#52

السلام عليكم و رحمة الله تعالى و بركاته...

كيف تحمل ملف MS EXCEL إلى DataGridView؟

post-207152-1256652681_thumb.jpg

في هذه التلميحة سنتكلم, إن شاء الله, عن كيفية تحميل محتوى ملف MS EXCEL إلى DataGridView. الكود الذي سنتكلم عنه هنا ليس الأكثر فعالية و لكنني اخترته لأنه يعمل بغض النظر عن إصدارة Excel المثبتة على نظام التشغيل. الشرط الأساسي في هذه التلميحات هي بساطة طرح المواضيع حتى تسهل عملية قراءة الكود و فهمه. الكود ببساطته هذه يعمل جيدا مع الملفات الصغيرة. في حالة الرغبة في استعماله لتحميل ملفات كبيرة, يحتاج الكود إلى تعديلات لقراءة عدد من الخلايا مرة واحدة تم زيادتها على الداتاجريد فيو.

الكود بسيط للغاية و معلق عليه بالتفصيل :

		' إنشاء الكائن كوم الممثل لبرنامج إكسل
		Dim xla As Object = CreateObject("Excel.Application")
		' فتح ملف إكسل
		Dim xlw As Object = xla.Workbooks.Open(ofd.FileName)
		' الوصول إلى عدد الأسطر
		Dim nRows As Integer = xlw.Application.ActiveSheet.UsedRange.Rows.Count
		' الحصول على عدد الأعمدة
		Dim nClmns As Integer = xlw.Application.ActiveSheet.UsedRange.Columns.Count
		' زيادة الأعمدة على الداتاجريد فيو
		For i As Integer = 0 To nClmns - 1
			Dim s As String = Hex(i + 10) ' ABDCEF بسيطة
			DataGridView1.Columns.Add(s, s)
		Next
		' إستعراض الأسطر
		For y As Integer = 0 To nRows - 1
			' زيادة السطر الذي سيستقبل محتوى سطر من ملف إكسل
			DataGridView1.Rows.Add()
			' استعراض خلايا سطر ملف إكسل
			For x As Integer = 0 To nClmns - 1
				' إذا كانت الخلية غير فارغة
				If xlw.Application.Cells(y + 1, x + 1).Value <> Nothing Then
					' نسخ محتوى خلية ملف إكسل إلى خلية الداتاجريد فيو
					DataGridView1.Rows(y).Cells(x).Value = xlw.Application.Cells(y + 1, x + 1).Value
				End If
			Next
		Next
		' غلق ملف إكسل
		xlw.Close(False)
		' تحرير الذاكرة المحجوزة من طرف كائن ملف إكسل
		xlw = Nothing
		' غلق برنامج إكسل الذي يعمل في الخلفية
		xla.Quit()
		' تحرير الذاكرة المحجوزة
		xla = Nothing

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

xlw.Sheets("Sheet_Name").Select()

تحياتي...

TestLab.rar

#53

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

كيفية الحصول على نسخة من الفئه RegistryKey من Native Registry Handle

كثيرا ما استخدم دوال الـ API الخاصه بالريجسترى و حيث ان الفئه RegistryKey تحتوى على دوال جيده جدا لذا احتاج لإحضار نسخه منها فقط بتمرير الـ Handle الذى لدى لها، و لكن للأسف حيث ان هذه العمليه متاحه داخل الفئه إلا انها Private و تحتاج منا بعض العمل فهيا بنا نبدأ :

الفئه RegistryKey تحتوى على مشيد يأخذ الشكل التالى

Private Sub New(ByVal hkey As SafeRegistryHandle, ByVal writable As Boolean)

المعامل الأول من نوع SafeRegistryHandle و يمثل مقبض الـ Key الذى يتم عمل Initialize للفئه به، هذا النوع Protected و هو موجود داخل مجال الأسماء Microsoft.Win32.SafeHandles.

كما ترى للحصول على نسخة من الفئه RegistryKey لابد من العمل بشكل عكسى بمعنى انشاء نسخه من SafeRegistryHandle بقيمة الـ Handle بعدها انشاء نسخه من الفئه RegistryKey و تمرير لها القيم الخاصه بالمشيد المذكور بالاعلى.

حيث ان SafeRegistryHandle هو نوع لذا لابد من الوصول إليه عن طريق الـ Assembly الذى يحتويه و هو mscorlib كالتالى

Dim asm As Assembly = Assembly.Load("mscorlib, Version=2.0.0.0, Culture=Neutral, PublicKeyToken=b77a5c561934e089")

حيث ان المكتبه mscorlib مسجله داخل GAC فإن لها name داخله و هذا الإسم لا يتكرر و يمثل بالكشل المذكور بالكود السابق.

الأن توجد لدينا نسخه من الـ Assembly لذا نقوم الأن بالحصول على نسخه من الفئه Type لتمثل النوع SafeRegistryHandle عن طريق الكود التالى

Dim t As Type = asm.GetType("Microsoft.Win32.SafeHandles.SafeRegistryHandle")

حيث ان SafeRegistryHandle موجود داخل مجالات اسماء متداخله لذا يتم الوصول له عن طريق اسم مجال الأسماء فنقطه فإسم مجال الأسماء ........ و هكذا.

الأن قمنا بالحصول على نسخه من الفئه Type و التى تمثل وصف لـ SafeRegistryHandle نريد الأن إنشاء نسخه فعليه من هذه الفئه.

توجد عدة طرق لإتمام هذه الطريقه وقد اخترت اسهلهم وهو عن طريق استخدام الداله CreateInstance الموجوده بالفئه Activator : تقوم هذه الداله بإنشاء نسخه من الأنواع و تعود لنا بكائن منه.

Dim obj As Object = Activator.CreateInstance(t, True)

المعامل الثانى يسألك هل المشيد الإفتراضى لهذه الفئه Private و حيث انه فعلا Private فقمت بتمرير True.

الخطوه الثانيه هى وضع قيمة الـ Handle الخاص بالـ Key داخل الكائن obj و ذلك يتم عن طريق الوصول للمتغير handle (و هو Private ايضا) و بإعتبار ان قيمة الـ Key موجوده بمتغير اسمه hKey يكون الكود كالتالى

		Dim fld As FieldInfo = obj.GetType.GetField("handle", BindingFlags.NonPublic Or BindingFlags.Instance)
		fld.SetValue(obj, hKey)

للوصول للمتغير handle لابد من استخدم الداله GetField و تمرير لها اسم المتغير و حيث ان هذا المتغير Private يتم استخدام BindingFlags.NonPublic فى المعامل الثانى (اللى بيعمل كـ Filter بإستخدام القيم التى تمررها له) ايضا حيث ان هذا المتغير موجود بالذاكره الأن و يتبع كائن معين لابد من تمرير BindingFlags.Instance مع BindingFlags.NonPublic.

بعد ذلك قمت بإستدعاء الداله Setvalue لوضع القيمه بالمتغير الذى تمثله الفئه fld و قمت بتمرير الكائن obj كمعامل أول لتحديد ان القيمه سيتم وضعها داخل هذا المتغير (الممثل بالمتغير fld) الموجود داخل الكائن obj، و فى المعامل الثانى قمت بتمرير القيمه الخاصه بالـ Key.

نقطه اخرى نسيت توضيحها حيث ان النوع SafeRegistryHandle هو Private لذا لن نستطيع التصريح عنه مباشرة داخل الكود و لكن عوضا عن ذلك نقوم بإنشائه كما ذكرنا بالسابق و وضع النسخه الفعاله منه داخل متغير من نوع Object حيث انه هو النوع النهائى لكل الفئات داخل الدوت نت. عملية تخزين كائن من نوع معين داخل كائن من نوع اخر أب لهذا الكائن تسمى بـ Late Binding.

الان اصبح لدينا نسخه فعاله من SafeRegistryHandle داخل الكائن obj و اصبح مسألة انشاء نسخه من الفئه RegistryKey امر بسيط.

كما تعلم ان المشيد الذى سنستخدمه و الموجود داخل الفئه RegistryKey يطلب معاملين، عملية تمرير المعاملات لدوال Private ايا كانت طبيعة هذه الدوال تتم عن طريق صنع مصفوفه من نوع Object و وضع القيم التى تريد تمريرها كمعاملات داخل المصفوفه و بنفس ترتيب تمريرها للمعاملات بمعنى النصر الأول بالمصفوفه سيمرر كمعامل اول و العنصر الثانى كمعامل ثانى و هكذا، لذا قمت بإنشاء المصفوفه التاليه و التى تمثل المعاملين الموجودين بالمشيد

Dim regKey_ctor_values() As Object = {obj, True}

المعامل الثانى فى المشيد يمثل امكانيه التعديل على الـ Key او اى من ابنائه او الـ Keyvalue الموجوده داخله لذا جعلتها True.

الخطوه التاليه هى انشاء نسخه فعليه من الفئه RegistryKey

Dim ret As Object = Activator.CreateInstance(GetType(RegistryKey), BindingFlags.NonPublic Or BindingFlags.Instance, Nothing, regKey_ctor_values, Nothing)

هذه المره استخدمنا الداله CreateInstance بشكل مختلف حيث قمنا بتمرير المعامل الأول هو نوع الفئه RegistryKey و المعامل الثانى و الرابع يتعلق بالمشيد الذى سيتم استدعائه، بالنسبه للمعامل الثانى فهو الـ Filter ألذى به سنحصل على المشيد و هو كما ترى من شكله باول المشاكره فهو Private و كذلك هو يتبع لنسخه فعاله تم انشائها فعلا (حيث ان المشيد لا ينتمى إلا لفئه لم يتم انشائها و ليست فئه تم انشائها)، المعامل الرابع هو المعاملات التى سيتم تمريرها للمشيد.

الكائن ret يحتوى الأن على نسخه فعاله من الفئه RegistryKey و التى تحتوى على البيانات التى يشير إليها الـ handle الذى تم تمريره لها.

ملحوظه هامه : نسخه RegistryKey التى تم انشائها بهذه الطريقه لها عيب واحد فقط و هو عدم وجود KeyName بمعنى استدعائك للخاصيه Name ستجد انها فارغه و السبب فى ذلك انه عندما تقوم انت بفتح Key معين تقوم الفئه RegistryKey بحفظه داخلها بدلا من استخدام دوال الريجسترى للحصول على اسم الـ Key المفتوح لذا فى حالتنا هذه لم نقم بتمرير الإسم لذا فهو فارغ.

الداله كامله

	Private Function RegKeyFromHandle(ByVal hKey As IntPtr) As RegistryKey
		Dim asm As Assembly = Assembly.Load("mscorlib, Version=2.0.0.0, Culture=Neutral, PublicKeyToken=b77a5c561934e089")

		Dim t As Type = asm.GetType("Microsoft.Win32.SafeHandles.SafeRegistryHandle")
		Dim obj As Object = Activator.CreateInstance(t, True)
		Dim fld As FieldInfo = obj.GetType.GetField("handle", BindingFlags.NonPublic Or BindingFlags.Instance)
		fld.SetValue(obj, hKey)

		Dim regKey_ctor_values() As Object = {obj, True}
		Dim ret As Object = Activator.CreateInstance(GetType(RegistryKey), BindingFlags.NonPublic Or BindingFlags.Instance, Nothing, regKey_ctor_values, Nothing)

		Return DirectCast(ret, RegistryKey)
	End Function

test.rar

و الله ولى التوفيق

تم تعديل هذه المشاركة بواسطة Muhammad alaa في 28 أكتوبر 2009 في 09:27

مدونتي: C++ Tips and Tricks

#54

السلام عليكم و رحمة الله تعالى و بركاته...

كيف تتحقق من صحة سيناريو T-SQL قبل تنفيذه؟

post-207152-1256842474_thumb.jpg

كما قلت في درس سابق, يمكننا تقريبا عمل كل ما يستطيع برنامج Microsoft SQL Server Management Studio عمله. لماذا؟ لأن البرنامج يستعمل المكتبة SMO و المكتبات المرتبطة بها. و هذه المكتبات متوفرة مع كل إصدارات Visual Studio.

في هذه التلميحة, سنتكلم إن شاء الله عن كيفية التحقق من صحة سيناريو T-SQL قبل تنفيذه. السؤال الذي قد يتبادر إلى الذهن : فيما قد نحتاج لكود كهذا؟! طبعا قد نحتاجه في حالة ما إذا فكرنا في دمج Dynamic Filter Generator يقوم بإنشاء أو تحرير سيناريوهات T-SQL, في هذه الحالة, سنحتاج للتأكد من صحة السيناريو المنشأ قبل محاولة تنفيذه.

الكود و كما هي العادة في هذه التلميحات بسيط للغاية. سنحتاج أولا إلى زيادة مرجع للمكتبات SMO و ConnectionInfo للمشروع عن طريق فتح نافذة خصائص المشروع ثم الضغط على الزر Add على صفحة References. ثم زيادة الأسطر التالية أعلى الموديل الذي سنزيد فيه الكود :

Imports Microsoft.SqlServer.Server
Imports Microsoft.SqlServer.Management.Smo
Imports System.Data.SqlClient
Imports Microsoft.SqlServer.Management.Common

بعد ذلك سنحتاج إلى تعريف الكائنات التي سنربط بها الإتصال إلى خادم SQL Server :

	' كائن ربط الإتصال
	Private con As SqlConnection
	' كائن ربط الإتصال بخادم سكل سيرفر
	Private srvrCon As ServerConnection
	' كائن خادم سكل سيرفر
	Private srvr As Server

بعد ذلك سنحتاج إلى إنشاء الكائنات و تهيئتها حتى تصبح جاهزة للعمل :

		' تهيئة كائن الإتصال بجملة ربط بالخادم و ليس قاعدة بيانات
		con = New SqlConnection("Data Source=.\SQLEXPRESS;Integrated Security=SSPI;Connect Timeout=30")
		' تهيئة كائن ربط الإتصال بخادم سكل سيرفر
		srvrCon = New ServerConnection(con)
		' إنشاء كائن خادم سكل سيرفر
		srvr = New Server(srvrCon)

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

بعد ذلك, أقدم لكم قلب هذه التلميحة. الدالة ExecuteNonQuery التي نستعملها عادة و لكن طبعا نسخة أخرى للفئة ServerConnection. الدالة ExecuteNonQuery تقبل معاملين الأول من نوع String نمرر من خلاله سيناريو T-SQL الذي نريد التحقق من صحته, المعامل الثاني يقبل معرف طريقة تنفيذ السيناريو الذي سنحدده في ExecutionTypes.ParseOnly كي تقوم الدالة بالتأكد من صحة السيناريو فقط من دون تنفيذه. للمزيد من المعلومات MSDN بالطبع.

الكود :

		' طبعا عند وجود أخطاء في سيناريو تي سكل سوف يرفع استثناء
		Try
			' تنفيذ سيناريو تي سكل للتحقق من خلوه من أخطاء فقط
			srvrCon.ExecuteNonQuery(TextBox1.Text, ExecutionTypes.ParseOnly)
			' لا توجد أخطاء إذا وصلنا هنا
			TextBox2.ForeColor = SystemColors.ControlText
			TextBox2.Text = "لا يوجد أي خطأ في سيناريو T-SQL."
		Catch ex As ExecutionFailureException ' إذا وصلنا هنا فهناك أخطاء في سيناريو تي سكل
			' اللون الأحمر للخطأ
			TextBox2.ForeColor = Color.Red
			' عرض معلومات الاستثناء على مستوى التطبيق
			TextBox2.Text = "Source : " + vbCrLf + ex.Source + vbCrLf + _
							"Message : " + vbCrLf + ex.Message + vbCrLf + _
							"Content : " + vbCrLf
			' عرض معلومات الاستثناء على مستوى خادم سكل سيرفر
			Dim iex As SqlException = ex.InnerException
			Do
				If Not iex Is Nothing Then
					' عرض معلومات الخطأ كما هو الحال في برنامج SQL Management Studio
					TextBox2.Text = TextBox2.Text + "Err " + iex.ErrorCode.ToString() + ",Msg " + iex.Number.ToString() + ", Class " + iex.Class.ToString() + ", Line" + iex.LineNumber.ToString() + vbCrLf + iex.Message + vbCrLf
					iex = iex.InnerException
				End If
			Loop Until iex Is Nothing
		End Try

طبعا سننفذ الدالة ExecuteNonQuery داخل Try Catch فإذا رفع استثناء فهذه دلالة على وجود أخطاء في السيناريو و بالتالي نقرأ كائنات الاستثناءات التي سترسل لنا عبر الكائن ex من نوع ExecutionFailureException, و إذا لم يرفع استثناء فالسيناريو صحيح و جاهز للتنفيذ. ستلاحظون معي أننا نتحقق من الاستثناء الرئيسي ex الذي يحوي معلومات الاستثناء على مستوى التطبيق لكن الاستثناءات التي ترفع نتيجة أخطاء في سيناريو T-SQL تحتوي أيضا على الإستثناءات التي رفعت على مستوى خادم SQL Server و لهذا سنحتاج إلى الوصول إلى الإستثناءات الثانوية الموجودة على ex.InnerException التي بدورها قد تحتوي على استثناء آخر بناءا على السيناريو المراد التحقق من صحته.

في الملف المرفق مشروع صغير به الكود كاملا مع التعليق.

تحياتي...

TestLab.rar

#55

السلام عليكم و رحمة الله تعالى و بركاته...

أصبح من الصعب إيجاد خدعة أو تلميحة غير موجودة على المنتدى!..

كيف تدمج ترجمة النصوص إلى مشاريعك؟

post-207152-1257251987_thumb.jpg

قبل أن أبدء, أود أن أشكر الأخ Ahmead24 لأن سؤاله على هذا الرابط هو أصل هذه التلميحة التي تتكلم عن طريقة بسيطة لدمج ترجمة النصوص على مشاريع الدوت نت.

أولا, سنحتاج إلى تحميل مكتبة GTranslate.dll من على موقع جوجل. المشروع المرفق بهذه التلميحة يحتوي على نسخة من المكتبة GTranslate.dll في المجلد Bin\Debug.

ثانيا, سنحتاج إلى زيادة مرجع للمكتبة على المشروع الذي نريد دمج ترجمة النصوص فيه.

ثالثا, كود الترجمة بسيط جدا. عند تحميل البرنامج, سنقوم بتحميل لائحة اللغات المدعومة إلى لائحتي Combo Box التي تحدد لغة النص المراد ترجمته و الأخرى التي تحدد اللغة التي نريد ترجمة النص إليها. الكود :

	Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
		' تحميل لائحة اللغات المدعومة
		ComboBox1.DataSource = [Enum].GetValues(GetType(GoogleTranslate.GLanguages))
		ComboBox2.DataSource = [Enum].GetValues(GetType(GoogleTranslate.GLanguages))
		' اللغتين المستعملتين كثيرا
		ComboBox1.SelectedItem = GoogleTranslate.GLanguages.en
		ComboBox2.SelectedItem = GoogleTranslate.GLanguages.ar
	End Sub

بعد كتابة أو لصق النص المراد ترجمته على مربع النص العلوي, ننتظر المستخدم حتى يختار زر الترجمة. عملية الترجمة تتم في سطرين اثنين. الكود :

	Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
		' ترجمة النص
		' المعامل الأول, معرف لغة النص المراد ترجمته
		' المعامل الثاني, معرف اللغة المراد ترجمة النص إليها
		' المعامل الثالث, النص المراد ترجمته
		Dim gwrds As GoogleTranslate.GWords = GoogleTranslate.GTranslate.Translate(ComboBox1.SelectedValue, ComboBox2.SelectedValue, TextBox1.Text)
		' الحصول على النص بعد الترجمة
		TextBox2.Text = gwrds.Translate
	End Sub

ملاحظة : المكتبة بالطبع تستخدم موقع Google translator لترجمة النص و بالتالي الكود يحتاج لأن يكون الحاسوب مرتبطا بالانترنت حتى يتمكن من ترجمة النص.

في الملف المرفق مشروع صغير به كود التلميحة.

تحياتي...

gtrans.rar

تم تعديل هذه المشاركة بواسطة محمد رضى في 3 نوفمبر 2009 في 16:10

#56

السلام عليكم و رحمة الله تعالى و بركاته...

عودة مع ترجمة النصوص...

كيف تدعم ترجمة النصوص على مشروعك؟ (Bing Translator)

post-207152-1257337720_thumb.jpg

شخصيا أنا أفضل ترجمة خادم مايكروسوفت على مثيلتها من عند جوجل. و لهذا فقد قمت ببحث بسيط عن كيفية ترجمة النصوص عن طريق خادم مايكروسوفت. هذه الخدمة تحتاج من المطور الحصول على معرف تطبيق AppID من عند مايكروسوفت على هذا الرابط http://www.bing.com/developers/createapp.aspx و بدونه لن يتم تنفيذ كود هذه التلميحة.

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

http://api.microsofttranslator.com/V1/Http.svc/Translate?appId=#APP_ID#&from=#FLANG#&to=#TLANG#

حيث :

#APP_ID# : معرف التطبيق الذي يطلب خدمات الترجمة من الخادم.

#FLANG# : معرف لغة النص المراد ترجمته. تحديد هذا المعامل في فراغ يطلب من الخادم تحديد لغة النص المراد ترجمته. و هي :

	' لائحة اسماء اللغات المدعومة
	Private LangValues() As String = {"Auto-Detect", "Arabic", "Chinese Simplified", "Chinese Traditional", "Czech", "Danish", "Dutch", "English", "French", "German", "Greek", "Hebrew", "Italian", "Japanese", "Korean", "Polish", "Portuguese", "Russian", "Spanish", "Swedish", "Thai"}
	' لائحة معرفات اللغات المدعومة
	Private LangKey() As String = {"", "ar", "zh-CHS", "zh-CHT", "cs", "da", "nl", "en", "fr", "de", "el", "he", "it", "ja", "ko", "pl", "pt", "ru", "es", "sv", "th"}

#TLANG# : معرف اللغة التي نريد ترجمة النص إليها. أنظر الكود أعلاه. بالطبع تحديد هذا المعامل في فراغ سوف يتسبب في رفع استثناء من طرف الخادم.

الكود معلق عليه بالتفصيل :

		' الحصول على النص بصيغة UTF8
		Dim bytes() As Byte = Encoding.UTF8.GetBytes(TextBox1.Text)
		Dim MyAppID As String = "حدد هنا معرف التطبيق الخاص بك"
		' عنوان خادم الترجمة
		Dim uri As String = "http://api.microsofttranslator.com/V1/Http.svc/Translate?appId=#APP_ID#&from=#FLANG#&to=#TLANG#"
		' تحديد لغة النص الأصلي و لغة النص بعد الترجمة
		uri = uri.Replace("#FLANG#", LangKey(ComboBox1.SelectedIndex)).Replace("#TLANG#", LangKey(ComboBox2.SelectedIndex))
		' لاستعمال خادم الترجمة تحتاج للحصول على معرف التطبيق من عند مايكروسوفت على هذا الرابط
		' http://www.bing.com/developers/createapp.aspx
		uri = uri.Replace("#APP_ID#", MyAppID)
		' إنشاء كائن الربط بخادم الترجمة
		Dim req As HttpWebRequest = HttpWebRequest.Create(uri)
		' طريقة ارسال البيانات
		req.Method = "POST"
		' نوع النص المراد ترجمته
		req.ContentType = "text/plain"
		' حجم النص
		req.ContentLength = bytes.Count
		' ارسال النص المراد ترجمته إلى خادم الترجمة
		req.GetRequestStream().Write(bytes, 0, bytes.Count)
		' الحصول على الجواب من الخادم
		Dim resp As HttpWebResponse = req.GetResponse()
		' قراءة النص بعد الترجمة
		Dim sr As New StreamReader(resp.GetResponseStream())
		TextBox2.Text = sr.ReadToEnd()

بالطبع الكود و المشروع المرفق مع هذه التلميحة لن يشتغلا كما يجب إلا بتحديد معرف تطبيق بعد الحصول عليه من مايكروسوفت على هذا الرابط http://www.bing.com/developers/createapp.aspx

هناك طريقة أخرى للحصول على معرف تطبيق مستعمل و هي بالبحث على جوجل. لم أقل شيئا يا إخوان!

تحياتي...

mstrans.rar

#57

موضوع رائع جدا

بارك الله فيك وجعله في ميزان حسناتك

#58

يا سلام عليك

تم تعديل هذه المشاركة بواسطة محمد رضى في 27 يناير 2010 في 14:18 — السبب: حذف نص الاقتباس الكبير جدا جدا...

#59

السلام عليكم و رحمة الله تعالى و بركاته...

كيف تقوم بتحميل جزء أو مقطع من ملف من موقع؟

في بعض الأحيان, نحتاج لتحميل بيانات من ملف ما من على موقع و قد نحتاج لجزء منه لا أكثر. في هذه التلميحة, سنقوم باستعراض كود يمكن من تحميل مقطع أو جزء من ملف. الشرط الوحيد لضمان نجاح العملية هو دعم خادم الموقع لخاصية تحميل أجزاء الملفات.

الكود :

        ' رقم أول بايت نريد التحميل ابتداءا منه
        Dim FirstByte As Integer = 500
        ' رقم آخر بايت نريد التحميل انتهاءا عنده
        Dim LastByte As Integer = 999
        ' ارسال استعلام للخادم
        Dim req As HttpWebRequest = HttpWebRequest.Create("http://www.mywebsite.com/myfile.ext")
        ' طلب تحميل جزء أو مقطع من الملف
        req.AddRange("bytes", FirstByte, LastByte)
        ' الحصول على جواب الخادم
        Dim res As HttpWebResponse = req.GetResponse()
        ' التحقق من أن الخادم يدعم تحميل أجزاء الملفات
        If Not res.Headers.AllKeys.Contains("َAccept-Ranges") Then
            MsgBox("الخادم لا يدعم خاصية تحميل أجزاء الملفات...")
        End If
        ' الحصول على دفق البيانات
        Dim strm As IO.Stream = res.GetResponseStream()
        ' عدد البايتات التي تمت قراءتها في آخر عملية قراءة
        Dim i As Integer
        ' المخزن المؤقت للبيانات
        Dim buf(1024) As Byte
        While True
            ' قراءة البيانات الآتية من الخادم
            i = strm.Read(buf, 0, 1024)
            ' نهاية عملية القراءة عندما لا نقرأ أي شيء
            If i <= 0 Then Exit While
        End While
        ' غلق دفق البيانات
        strm.Close()
        ' غلق جواب الخادم
        res.Close()

الكود أعلاه مبسط جدا. الجديد فيه هو سطر المناداة على الدالة AddRange للكائن HttpWebRequest التي ستقوم بزيادة سطر إلى رأس الطلب أو header request نحدد من خلاله أننا نريد فقط تحميل جزء من الملف من البايت رقم FirstByte حتى البايت LastByte أي السطر التالي :

Range: bytes=500-999

عندما يصل الطلب إلى الخادم و نطلب الإجابة عن طريق الدالة GetResponse للكائن HttpWebResponse نتأكد من دعم الخادم لخاصية تحميل أجزاء الملفات عن طريق التحقق من وجود سطر Accept-Ranges بين سطور رأس الإجابة أو header response :

res.Headers.AllKeys.Contains("َAccept-Ranges")

الكود أعلاه يرجع true في حالة دعم الخادم تحميل أجزاء الملفات. إذا تم إرجاع false, فهذا يعني أن الخادم لا يدعم تحميل الأجزاء ما يحيلنا أن دفق البيانات الآتي من الخادم به محتوى الملف كاملا و ليس فقط جزء منه.

#60

السلام عليكم و رحمة الله تعالى و بركاته...

كيف تنادي على دالة حدث من مسلك مغاير للمسلك الرئيسي للتطبيق؟

الكل يعرف أن إطار الدوت نت وقت تعقب الأخطاء (DEBUG) يرفع استثناء كلما حاولنا الوصول إلى إحدى مربعات التحكم من كود مسلك غير المسلك الذي تم فيه إنشاؤها. تشدد فيجوال ستوديو هنا جيد و محبذ لأن إطار الدوت نت لا يمنع العملية وقت (RELEASE) و لكن حتما ستكون النتائج لا تحمد عقباها حيث يمكن أن يكون المسلك الذي أنشأ مربع التحكم يتهيئ لتحديث المحتوى بقيمة ما بينما مسلك آخر يتهيئ أو يقوم بعملية أخرى في نفس الوقت, الشيء الذي تكون نتائجه غير متوقعة و تكون سبب العديد من الأخطاء صعبة التعقب و التصحيح...

لنفترض أن الدالة التالية يتم استدعاؤها من مسلك آخر لكي تقوم ببعض عمليات تحديث لمربعات تحكم على نموذج ما تم إنشاؤه من قبل المسلك الرئيس للتطبيق :

    Sub SetTitleBarText()
        Me.Text = "Hello, world!"
    End Sub

الكود أعلاه إذا تم تنفيذه خارج المسلك الذي أنشأ النموذج (Me), سيتم رفع استثناء من فئة InvalidOperationException و تكون الرسالة من قبيل Cross-thread operation not valid...

تصحيح الكود أعلاه :

    Sub SetTitleBarText()
        ' إذا كان المسلك الحالي غير الذي أنشأ النموذج؟
        If Me.InvokeRequired Then
            ' المناداة على نفس الدالة لتعمل على المسلك الذي أنشأ النموذج
            Me.Invoke(New MethodInvoker(AddressOf SetTitleBarText))
            Return
        End If
        ' الوصول إلى مربعات التحكم بكل أمان من أي مسلك
        Me.Text = "Hello, world!"
    End Sub

الآن ندخل صلب موضوع هذه التلميحة. في حالة ما إذا كنا بصدد كتابة كود لفئة تنشئ مسلك خاص للقيام بعملها و الكود الذي ينفذ في إطار هذا المسلك يحتاج إلى تنبيه البرنامج إلى إلى حدوث حدث ما أو أحداث ما طيلة مدة تنفيذ كود المسلك الخاص. و داخل دالة الحدث نقوم بتحديث محتويات مربعات التحكم (منشأة من طرف المسلك الرئيس) لنقدم معلومات للمستخدم حول جريان العملية.

الطريقة العادية البسيطة لتنفيذ دالة حدث ما هي تعريف الحدث Event ثم تنفيذ الدالة أو الدوال المشتركة عن طريق RaiseEvent :

...
Public Event MyEvent()
...

' يتم التنفيذ على مسلك خاص بالدالة
Private Sub MyThreadProc()
...
RaiseEvent MyEvent()
...
End Sub

في الكود أعلاه, دالة الحدث MyEvent سيتم تنفيذها من داخل المسلك الذي يتم فيه تنفيذ الدالة MyThreadProc و إذا كانت دالة الحدث MyEvent تقوم مثلا بتحديث مربعات تحكم نموذج أنشئ داخل مسلك آخر سيقوم إطار الدوت نت برفع استثناء InvalidOperationException إذا ما كان التطبيق تم تشغيله ضمن فيجوال ستوديو في وضع تعقب الأخطاء.

في هذه الحالة, هل سنقوم بحل المشكلة بنفس الطريقة التي قمنا بها في أول الموضوع؟

بالطبع لا! لأننا هنا نقوم بتطوير فئة سيستعملها مبرمجون آخرون و من غير المعقول أن نرمي بثقل حل المشكلة على كاهل المبرمجين الآخرين بأن يقوموا بزيادة كود Me.InvokeRequired و Me.Invoke

ما الحل إذن؟

الحل بالطبع أن نقوم نحن بالتأكد من أن دالة الحدث سيتم تنفيذها على المسلك الذي تم فيه حجز اشتراك للدالة على الحدث الذي قمنا بتظمينه للفئة التي نقوم بتطويرها.

كيف؟

عن طريق تشخيص كل Event تنطلق من مسلك مغاير للمسلك الرئيس. مثال لحدث Event مشخص يقوم بضمان تنفيذ دالة الحدث من المسلك المناسب :

    ' أولا, نقوم بتعريف إجراء مفوض للمناداة على الدالة المشتركة في الحدث
    Public Delegate Sub MyEventHandler()

    ' ثانيا, نقوم بإنشاء عنصر من فئة الإجراء المفوض
    Private _myEvent As MyEventHandler

    ' ثالثا, نقوم بإنشاء حدث مشخص يقوم بزيادة و حدف اشتراكات الدوال و الأهم يقوم وقت رفع الأحداث
    ' بضمان تنفيذ الدوال المشتركة ضمن المسالك التي تم حجز الاشتراك فيها
    Public Custom Event MyEvent As MyEventHandler
        ' عندما يقوم مبرمج بحجز اشتراك لدالة ما, سيقوم إطار الدوت نت
        ' بالمناداة على هذه الدالة
        AddHandler(ByVal value As MyEventHandler)
            ' تسجيل الاشتراك الجديد
            _myEvent = [Delegate].Combine(_myEvent, value)
        End AddHandler

        ' عندما يقوم مبرمج بحذف اشتراك لدالة ما, سيقوم إطار الدوت نت
        ' بالمناداة على هذه الدالة
        RemoveHandler(ByVal value As MyEventHandler)
            ' الدالة المشتركة في الحدث سيتم حذف اشتراكها
            ' و لن تتم المناداة عليها مستقبلا وقت حدوثه
            _myEvent = [Delegate].Remove(_myEvent, value)
        End RemoveHandler

        ' وقت حدوث الحدث, يقوم كود الفئة برفع الحدث لتنفيذ الدوال المشتركة فيه
        ' سيقوم وقتئد إطار الدوت نت بالمناداة على هذه الدالة
        RaiseEvent()
            ' الوصول إلى المربع (نمودج) الذي تم حجز اشتراك دوال الحدث من داخله
            Dim EventReceiver As Control = DirectCast(_myEvent.Target, Control)
            ' إذا كان المربع قيد الاستعمال و لم يتم حذفه
            If Not EventReceiver.Disposing AndAlso Not EventReceiver.IsDisposed Then
                ' المناداة على دالة الحدث من المسلك الذي أنشأ مربع التحكم المرتبط
                EventReceiver.Invoke(_myEvent)
            End If
        End RaiseEvent
    End Event

الكود طويل نسبيا و معقد لأول وهلة و لكنه يقوم بالعمل كما يجب.

ملاحظة : ونحن نتكلم عن الدوت نت, تجدر الإشارة إلى أن C# يبسط هذه العملية كثيرا حيث يكفي :

        // أولا, نقوم بتعريف إجراء مفوض للحدث
        public delegate void MyEventHandler(object sender, EventArgs e);
        // ثانيا, نقوم بتعريف الحدث
        public event MyEventHandler MyEvent;
        ...

        // وقت رفع الحدث نقوم باستخلاص المربع الذي تم تعريف دالة الحدث بداخله
        // ثم نقوم بعملية المناداة للتنفيذ داخل المسلك المناسب
        ((Control)MyEvent.Target).Invoke(new MethodInvoker(delegate
        {
            MyEvent.Invoke(this, EventArgs.Empty);
        }));
#61

السلام عليكم و رحمة الله تعالى و بركاته...

كيف تحصل على اقتراحات google كما هو الحال على شريط العناوين لمتصفح google chrome؟

post-207152-095469400 1278893199_thumb.ppost-207152-039025300 1278893215_thumb.p

أول ما أثار انتباهي عندما قمت بتثبيت متصفح google chrome هي الاقتراحات التي يقوم بإظهارها وقت كتابة عنوان على شريط العناوين. بصراحة لم أبحث البتة في الموضوع بل اختصرت الطريق و تجسست على المتصفح باستعمال البرنامج WireShark حتى حصلت على عنوان الويب سرفيس الذي يقوم المتصفح بربط الاتصال به و إرسال استعلام بمدخل المستخدم على شريط العنوان و يحصل على اقتراحات يظهرها للمستخدم تعينه على الحصول على مبتغاه...

عنوان الويب سيرفيس الذي حصلت عليه هو :

http://clients1.google.com/complete/search?client=chrome&hl={0}&q={1}

حيث {0} تمثل اللغة المراد استعمالها في البحث عن الإقتراحات المناسبة للمستخدم و {1} تمثل مدخل المستخدم الذي سنحصل على اقتراحات مناسبة له.

إذا قمت بفتح أي متصفح و كتبت العنوان أعلاه مع تغيير البرامترات الأول و الثاني مثلا :

http://clients1.google.com/complete/search?client=chrome&hl=ar&q=الفريق العربي

ستحصل على النتيجة التالية :

["الفريق العربي",["الفريق العربي للبرمجة","الفريق العربي","الفريق العربي للبرمجة 2000"],["851.000 نتائج","5.190.000 نتائج","310.000 نتائج"],[],{"google:suggesttype":["QUERY","QUERY","QUERY"]}]

و ما عليك سوى مقابلة الإقتراح بعدد النتائج لتحصل على نتيجلة مقروءة للاستعلام. نظام الاقتراحات يعمل جيدا مع عناوين الويب مثلا مقطع من عنوان www.arabte

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

الكود مبسط للغاية و معلق عليه بالتفصيل :

		' إنشاء الفئة التي تمكننا من ربط الإتصال بالخادم لإرسال الإستعلام
		Dim q As HttpWebRequest = HttpWebRequest.Create(String.Format("http://clients1.google.com/complete/search?client=chrome&hl={0}&q={1}", languagecombobox.Text, queryTextBox.Text))
		q.Method = "GET" ' طريقة إرسال البرامترات
		' إنشاء الكائن الذي سيمكننا من قراءة جواب الخادم على الإستعلام الذي قمنا بإرساله
		Dim r As HttpWebResponse = q.GetResponse()
		' الحصول على دفق البيانات الآتي من الخادم و الذي به جواب الإستعلام
		Dim sr As StreamReader = New StreamReader(r.GetResponseStream(), True)
		' قراءة جواب الخادم
		Dim content As String = sr.ReadToEnd()
		' تحرير موارد النظام التي تم استعمالها في إرسال و استقبال البيانات
		sr.Close()
		r.Close()

		' تقسيم جواب الخادم لتسهيل الحصول على البيانات
		Dim parts As String() = content.split(New String(){",["}, stringsplitoptions.RemoveEmptyEntries)
		' الحصول على اقتراحات خادم قووقل بالنسبة لمدخل المستخدم
		Dim sugests As MatchCollection = regex.Matches(parts(1), "\""(.*?)\""")
		' الحصول على عدد نتائج البحث عن مدخل المستخدم في حالة القيام بعملية بحث عن طريق قووقل
		Dim results As MatchCollection = regex.Matches(parts(2), "\""(.*?)\""")
		' نتائج جديدة
		resultslistview.Items.Clear()
		' إظهار اقتراحات خادم قووقل
		For Each sug As Match In sugests
			Dim lvi As New ListViewItem(sug.ToString().Replace("""", ""))
			resultslistview.Items.Add(lvi)
		Next
		' إظهار عدد نتائج البحث بجوار كل اقتراح
		dim i as Integer = 0
		For Each res As Match In results
			resultslistview.Items(i).SubItems.Add(res.ToString().Replace("""", ""))
			i += 1
		Next
		resultslistview.AutoResizeColumns(columnheaderautoresizestyle.ColumnContent)

لا تترددوا في طرح الأسئلة حول الموضوع :)

في الملف المرفق تجدون مشروع صغير به الكود أعلاه...

googlesugest.rar

المرفقات
gus_image_1.pnggus_image_2.png
1
#62

السلام عليكم و رحمة الله تعالى و بركاته...

كيف تحصل على أيبي الأنترنت من جهاز مرتبط بشبكة محلية؟

عندما تحاول الحصول على أيبي الأنترنت من جهاز مرتبط بشبكة محلية عن طريق الطرق البرمجية العادية تحصل على أيبي الجهاز على الشبكة المحلية 192.168.1.2 مثلا...

هذا الكود يقوم بالاتصال بالموقع http://whatismyip.org/ للحصول على الأيبي الخارجي للجهاز/روتر :

	''' <summary>
	''' تقوم بالاتصال بموقع خارجي للحصول على الأيبي الخارجي للجهاز أو الروتر
	''' </summary>
	''' <returns>ترجع الأيبي الخارجي للروتر المتصل بالأنترنت</returns>
	Private Function GetMyExternalIP() As System.Net.IPAddress
		' ربط الإتصال بالموقع الخارجي الذي سيرسل لنا الأيبي الخارجي
		Dim wq As System.Net.HttpWebRequest = System.Net.HttpWebRequest.Create("http://whatismyip.org/")
		' الحصول على جواب
		Dim wr As System.Net.HttpWebResponse = wq.GetResponse()
		' قراءة المحتوى المرسول من الموقع الخارجي ألا وهو الأيبي بصيغة نصية بسيطة
		Dim sr As New System.IO.StreamReader(wr.GetResponseStream(), System.Text.Encoding.UTF8)
		' إنشاء كائن يمثل الأيبي المحصل عليه
		Dim ipa As System.Net.IPAddress = System.Net.IPAddress.Parse(sr.ReadToEnd)
		' تحرير موارد النظام
		sr.Close()
		sr.Close()
		' إرجاع الأيبي الخارجي للجهاز و الروتر
		return ipa
	End Function

لاستعمال الدالة GetMyExternalIP() :

TextBox1.Text = GetMyExternalIP().ToString()

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

#63

جزاكم الله الف خير اخواني على هذه الدروس الرائعة

فعلا افادتني كثير يعطيكم العافية

والى الأمام إن شاء الله

عن عبد الله بن مسعود رضي الله عنه قال: سألت النبي صلى الله عليه وسلم أي العمل أحب إلى الله عز وجل؟ قال: ( الصلاة على وقتها) قال: ثم أي؟ قال: ( بر الوالدين ) قال ثم أي؟ قال: ( الجهاد في سبيل الله )

302889519.gif

رابط المصحف الرقمي الفلاشي بأكثر من روايات - القرآن الكريم

#64

شكرا جزيلا لحضرتك علي الدروس القيمة

#65

السلام عليكم و رحمة الله تعالى و بركاته...

كيف تفك برمجيا ضغط رابط مضغوط (التعرف على الرابط الأصلي)؟

post-207152-007266200 1324315948_thumb.j

عندما تنقر من على متصفحك على رابط مضغوط (bit.ly أو ow.ly...) أو تدخله مباشرة في شريط العناوين يقوم المتصفح بإرسال طلب تحميل الصفحة إلى الخادم الذي يرسل جوابا مفاده أن الصفحة المراد تحميلها قد تم تغيير مكانها (http://en.wikipedia.org/wiki/HTTP_301) المكان أو الرابط الأصلي للرابط المضغوط يبعته الخادم كجواب لطلب تحميل الصفحة في قيمة المفتاح Location للمتغير Headers لكائن الفئة HttpWebResponse و هذا ما يبينه الكود البسيط التالي :

Console.Write("Type short url : ")
' نبعث بالرابط المضغوط إلى الخادم
dim rq As HttpWebRequest = HttpWebRequest.Create(Console.ReadLine())
' نحتاج للكذب حتى لا ترفض بعض الخوادم طلبنا
rq.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1)"
' نطلب من إطار الدوت نت ألا يقوم بالتتبع الأوتوماتيكي لجواب الخادم 301
rq.AllowAutoRedirect = false
' نستقبل جواب الخادم
dim rs As HttpWebResponse = rq.GetResponse()
' نقرأ الرابط الأصلي للرابط المضغوط من خادم bit.ly or ow.ly or tinyurl.com etc.
Console.WriteLine("Original url : " + rs.Headers("Location"))
' نحرر موارد النظام التي استعملناها
rs.Close()

أتمنى أن تروقكم هذه التلميحة التي تمكننا من تضمين مفكك ضغط الروابط في مشاريعنا...

المرفقات
unshort.jpg
#66

رائع وجزاك الله كل خير

#67

بارك الله فيك اخى الكريم

الرجاء المزيد من هذا العلم الغزير

الرجاء عمل تجميع لروابط اعمالك لانها جميعها قيمة

تقبل تحياتى

تم تعديل هذه المشاركة بواسطة محمود رغمان في 15 ديسمبر 2012 في 23:32

#68

الف شكر مشرفنا العزيز محمد رضى 

 ليست تلميحات وخدع فقط

بل هي كنز من المعلومات التي قدمت لنا على طبق من ذهب

كل موضوع طرحته  اشكرك عليه  

الحمد لله رب العالمين 


ضاقت ولما استحكمت حلقاتها فرجت وكنت اظنها لن تفرج


#69

عاشتت ايديك

#70

مشكوووووووووووووووووووووووووووووووووووور

باركك الله

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