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

السؤال الأسبوعي

مغلقرائج
بدأه HMS في 17 يناير 2005 · 265 رد · 18,628 مشاهدة · في قسم تكنولوجيا Microsoft .NET العام
مشاركة: واتساب X فيسبوك تيليجرام
#101

سلام عليكم

HMS كلام الاخ محمد صحيح مع احترامي للاخ محمد عبدالعليم لانه كان يرى الحلول ،

ولكن لرضى جميع الاذواق هذا حل لكلام الاخ HMS :

Dim frm As Form2
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If frm Is Nothing Then
            frm = New Form2
            frm.Show()
            Button1.Text = "إغلاق"
        Else
            frm.Close()
            frm = Nothing
            Button1.Text = "فتح"
        End If
    End Sub

وشكرا

تم تعديل هذه المشاركة بواسطة Non-top في 20 فبراير 2005 في 05:59

" اللهم لاسهل إلا ماجعلته سهلاً وأنت تجعل الحزن إذا شئت سهلاً "

003.gif

قواعد طرح الأسئله والمشاركات

-------------------

MSN Messenger : nontop@gmail.com

Happy coding

-------------------

#102

بسم الله الرحمن الرحيم

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

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

كما يخطر لي إقتراح بسيط ( أظنه سيروق كثيراً للأخ crazy-man ) وهو أن لا تكون هناك مدة معينة لا يتم أختيار الإجابة الفائزة إلا بعدها بل أن يتم إعتماد عدد معين للمشاركات مثلاً ( اربع ) مشاركات فإن تحصل واضع السؤال على اربع إجابات يتم بعدها مباشرة إختيار الأفضل او وضع الإجابة التي يراها افضل ... ثم يتم الإنتقال للسؤال الذي يليه و إن حصل ان جاء احدنا متأخر و لديه إجابة يمكن ان تكون مفيدة فيمكنه ان يضعها للفائدة و أن يشير أنها إجابة للسؤال السابق بحيث نستفيد جميعناً من الطرق التي يفكر بها الحاظرون في حل مشاكلهم ... فليس المهم من الرابح بالقدر الذي يهمني ويهمكم بالتأكيد الإطلاع على الكثير من الحلول المتباينة لنفس المشكلة.

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

بالنسبة لفكرة الأخ العزيز Non-Top بإستخدام تقنية الإستدعاء الذاتي هي رائعة بالتأكيد ... و لكن ليس في هذه الحالة التي يتوقع ان يتم فيها إدخال نصوص كبيرة للبحث فيها و بما أنه لا يخفى عليك أخي كون هذه التقنية تقوم بتخزين بياناتها ( بيانات كل إستدعاء جديد ) في مخزن النظام ( STACK ) فإن هذا يهدد بإمتلاء المخزن خاصة إذا كانت البيانات المررة كبيرة في كل مرة ( تخيل معي سلسلة نصية تقاس بعشرات الميجا بايت ) يتم إستدعائها لهذا العدد الكبير من المرات .... و يوجد خطأ بسيط كان قد أشار إليه العزيز Undo ... و القصور يكمن في كونك إستخدمت الأمر Remove التابع للكائن StringToSearch و بالتالي فأنت هنا تجبر البرنامج على إزالة جزء معين من النص و بالتالي تكوين سلسلة جديدة ثم تمريرها إلى الدالة مرة أخرى و هذا سيؤدي إلى بطىء اكبر مما قد تتخيله اذا كان حجم السلسة كبيرا حيث انه قد تتكرر عملية تفكيك السلسلة هذه الى آلاف المرات ( وهو شيء في افضل الحالات سوف يؤدي إلى شل عمل الجهاز ) نظراً للضغط على المعالج و الذاكرة ... و اخيراً اخبرك عزيزي انه يمكن استخدام المتغير X كمتغير ثابت Static غير ان هذا لن يجدي بسبب كون المتغيرات من النوع Static تحتفظ بقيمتها فلو انك استخدمت الدالة على سلسلة نصية معينة وكان الناتج منها هو 3 فإن هذه يعني ان قيمة المتغير X هي 3 و بالتالي أي استخدام آخر للدالة سواءاً مع نفس السلسلة او مع سواها فإن هذا يعني ان المتغير سوف يبدأ وهو يحمل القيمة 3 بدلا من 0 كما هو متوقع و بالتالي قد تفاجىء بأن الإستدعاء الاول للدالة يعيد لك الرقم 3 و الثاني يعيد لك 6 !! .. على الرغم من اختبارك لنفس السلسلة ..

طبعاً لا اشك في انك تفهم مناقشتي لشفرتك عزيزي ليس لكي اثبت بانها غير سليمة بالعكس ( فانا احترمها كثيراً ) خاصة وكونك فكرت في حل مبتكر للمسألة احييك عليه ... و كما اسلفت بإني اتمنى ان نناقش سبب نجاح وفشل الحلول المطروحة كي يخرج المرء منا وقد استفاد اضعاف ما كان سيتفيد لو اكتفينا بإستخراج الرابح منا فقط ... على العموم اخي العزيز Non-Top هذا مثال بسيط لتطبيق الإستدعاء الذاتي في هذه المسئلة :

Function CountOccurrencesNonTop(ByVal strMain As String, ByVal strFind As String, Optional ByVal StartAt As Integer = 0) As Integer
	Dim Pos As Integer = strMain.IndexOf(strFind, StartAt)
	If Not Pos Then
  Return CountOccurrencesNonTop(strMain, strFind, Pos + StartAt) + 1
	Else
  Return 0
	End If
End Function

لاحظ معي في كوننا استخدمنا بارمتير جديد هو StartAt بحيث يحدد لنا نقطة البداية في البحث وهذا سوف يجنبنا إستخدام الأمر Remove لتلقيص حجم النص في كل مرة ... و بشكل عام ينبغي تجنب استخدام الإستدعاء الذاتي في هذه المسئلة نظراً لانها ستفشل مع النصوص كبيرة الحجم.

و كما قال الأخ العزيز Undo يمكن تحسين اداء هذه الدالة بإستخدام الدالة Instr التي يحبها العزيز النحراوي لأن ادأها اسرع من إستخدام InstrOf في اغلب الأحيان.

و بالإنتقال إلى نقطة أخرى فقد اشار الأخ الرائع crazy-man الى الدالة Split في شفرته التي اعتمدت عليها لتجزئة النص المدخل إلى كلمات ثم البحث فيها عن الهدف و بالتالي فإن الدالة ستنجح عند البحث عن كلمة مثل "One" في نص كهذا "One One" لانها ستقسمها الى كلمتين اعتماداً على الفراغ بينهما غير انها ستفشل في نص كا "OneOne" حيث ان عدم وجود الفراغ سيؤدي إلى عدم تقسيمها بالشكل المطلوب و كلي ثقة في كونه قد فهم مطلب الأخ Undo بشكل غير سليم و إلا فأن كلي ثقة في كون الأخ العزيز crazy-man كان ستحفنا بحل رائع إن كان قد فهم ما طلبه اخونا Undo بشكل سليم.

و الآن اذا كنا نبحث عن اقصر الحلول ربما سيكون من الجميل استخدام الدالة Split بالشكل التالي :

Return Split(StringToSearch, StringToFind).Length - 1

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

و بالتالي فإن ادخالك لنص طويل فلنقل 10 ميجا بايت يحتوي على 100 مرة تكررت فيها الكلمة التي نبحث عنها سيؤدي هذا إلى إنشاء مصفوفة نصية تحتوي على 101 عنصر بطول إجمالي تقريبي هو 10 ميجا بايت بالإضافة الى النص الأصلي الذي هو 10 ميجابايت و بالتالي فإن إستخدام هذا المبدأ يجهد الذاكرة بشكل كبير نظراً لإحتياجه الى مساحة بضعف حجم النص المدخل الى الدالة و بالتالي فإن الوقت المستغرق في التعامل المجهد مع الذاكرة سيؤثر سلباً على اداء الدالة بشكل عام.

و ربما كان من الأفضل إستخدام كود آخر و اقترح شيئاً مثل :

Function strCount(ByVal strMain As String, ByVal strFind As String) As Integer
	Dim Stp As Integer = strFind.Length
	Dim Pos As Integer = -Stp + 1
	Dim Num As Integer = -1

	Do
  Num = Num + 1
  Pos = InStr(Pos + Stp, strMain, strFind)
	Loop While Pos <> 0

	Return Num
End Function

يمكن ان تكون هذه الدالة سريعة نوعاً ما ففي البيانات التجريبية التي اعتمدتها لتجربتها وهو سلسلة نصية بطول 14 ميجابايت أي ما يقارب ( 14 و نصف مليون حرف ) فقد قامت بإيجاد كلمة البحث التي تكررت 93540 مرة ... بزمن مقداره ربع ثانية ( مايقارب 260 ملي ثانية ).

مع ملاحظة ان السرعة تختلف بختلاف عدد مرات تواجد الكلمة التي نبحث عنها في النص المدخل.... كما ان النتائج قد تختلف بإختلاف طريقة الإختبار و الجهاز الذي يتم الإختبار عليه فمثلاً هذه النتائج كانت في جهازي اذي يملك المواصفات PIII 800MHz مع ذاكرة RAM بمقدار 256MB ... بالمناسبة اتمنى ان يطلعنا الأخ العزيز Undo على الطريقة التي اعتمدها في إختبار الدوال ... كي نستفيد منها.

ملاحظة :

هذا بالطبع مع عدم إهمال النقطة المهمة التي اشار إليها الأخ العزيز Undo بالنسبة للتأكد من كون المتغيرات المدخلة ليست Nothing في جميع الدوال التي ناقشناها هنا.

اخيراً بالنسبة لسؤال الأخ العزيز محمد عبد العليم فيبدو أنني ايضاً لم افهمه جيداً و سيكون من الجميل لو تكرمت أخي بمزيد من التوضيح.

اخيراً عزيزي Undo بالفعل لقد اصبت بالفضول لمعرفة السؤال الذي طرحه الأخ crazy-man و الذي لا اشك في كونه سيكون رائعاً مثله.

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

تم تعديل هذه المشاركة بواسطة رغيد الطيب في 20 فبراير 2005 في 08:32

مواضيع برمجية تقنية جديدة

----------------------------------------------------------------------------------------------------------------------------------------------

• إستغلال خدمة الـ RSS في برامجنا ومواقعنا ! (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج للبحث في الملفات ومحتواياتها (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• فئة للتراسل بين برنامجين في جهاز واحد ! (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

مواضيع برمجية تقنية قديمة

----------------------------------------------------------------------------------------------------------------------------------------------

• إستغلال رسائل البالونات Balloons في الوينذوز أكس بي(VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• مقالة : لماذا يجب ان نعتني بشفرات برامجنا !؟- (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• لمطوري البرامج و مواقع الويب - برنامج تركيب ألوان - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج : بسيط للتحكم بالنظام, عن طريق الريجستري - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج : لتقييد و منع تشغيل البرامج الاخرى - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• النوافذ المنبثقة و طريقة لإستغلالها في برامجنا -(VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• تقنية الإستدعاء الذاتي - (VB.NET , VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• مصفوفات الأدوات Control Arrays افكار وتلميحات ! - (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• أفكار و تلميحات[ المعنى الحقيقي للـ True و False ] - أمثلة (VB.NETVB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• دوال الـ APIs و مايقابلها في الدوت نت ! - (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

#103

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

مرحباً بالأخ الحبيب رغيد الطيب

أحد الحلول التي أرفقتها (الحل الاول)

 Function CountOccurrences(ByVal StringToSearch As String, ByVal StringToFind As String) As Integer
        Dim FoundPos As Integer
        Dim TempPos As Integer
        Dim Count As Integer
        FoundPos = 1
        Do
            FoundPos = InStr(FoundPos, StringToSearch, StringToFind)
            TempPos = FoundPos
            If FoundPos > 0 Then
                Count += Count
                FoundPos += Len(StringToFind)
            End If
        Loop Until FoundPos = 0
        Return Count
    End Function

أظن أنه تقريباً نفس الكود الذي رشحته أنت

ولكنك لم تناقش هذا الحل (أظنك لم تره) وهو الحل الثاني

 Private Function CountOccurrences(ByVal StrToSearch As String, ByVal StrToFind As String, ByVal CaseSensitive As Boolean) As Integer
       Dim RetValue As Integer
       Dim Slen As Integer = StrToSearch.Length
       Dim Flen As Integer = StrToFind.Length
       If Not CaseSensitive Then
           StrToSearch = StrToSearch.ToLower
           StrToFind = StrToFind.ToLower
       End If
       For I As Integer = 0 To (Slen - Flen)
           If StrToSearch.Substring(I, Flen) = StrToFind Then RetValue += 1
       Next
       Return RetValue
   End Function

مناقشتك له تهمني

جزاك الله خيراً

#104

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

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

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

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

ثالثاً: المتغير static لفت انتباهي اكثر من الحل بالكامل ، كيف استطيع ان اعرف متغير static داخل الـ function ، أي داخل حدود الداله وليس الـ calss، ارجو ان اجد اجابة لديك يا استاذي العزيز !!

رابعاً: لم يتم توضيح السؤال من اقبل الاخ Undo فأول حل خطر في بالي هي Split !! هل البحث عن كلمة ام احرف ؟؟ انا اعتبر حل الاخ crazy-man صحيح وفهمه لسؤال صحيح ايضاً .

خامسا: تأكد تماماً أننا ندعو لك في ظهر الغيب ولا نحمل في قلوبنا سوى معزة اخي قدير واستاذ في مجاله ، فأنت قدوة في الأخلاق والعلم والمعرفة , وفقك الله لما يحبه ويرضاه .

وأسف على كثرة الكلام .

تم تعديل هذه المشاركة بواسطة Non-top في 20 فبراير 2005 في 08:06

" اللهم لاسهل إلا ماجعلته سهلاً وأنت تجعل الحزن إذا شئت سهلاً "

003.gif

قواعد طرح الأسئله والمشاركات

-------------------

MSN Messenger : nontop@gmail.com

Happy coding

-------------------

#105

بسم الله الرحمن الرحيم

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

اذهب بعد قليل الى الكلية بإذن الله تعالى ... و لنا لقاء بعد ان اعود بإذن الله تعالى

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

مواضيع برمجية تقنية جديدة

----------------------------------------------------------------------------------------------------------------------------------------------

• إستغلال خدمة الـ RSS في برامجنا ومواقعنا ! (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج للبحث في الملفات ومحتواياتها (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• فئة للتراسل بين برنامجين في جهاز واحد ! (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

مواضيع برمجية تقنية قديمة

----------------------------------------------------------------------------------------------------------------------------------------------

• إستغلال رسائل البالونات Balloons في الوينذوز أكس بي(VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• مقالة : لماذا يجب ان نعتني بشفرات برامجنا !؟- (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• لمطوري البرامج و مواقع الويب - برنامج تركيب ألوان - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج : بسيط للتحكم بالنظام, عن طريق الريجستري - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج : لتقييد و منع تشغيل البرامج الاخرى - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• النوافذ المنبثقة و طريقة لإستغلالها في برامجنا -(VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• تقنية الإستدعاء الذاتي - (VB.NET , VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• مصفوفات الأدوات Control Arrays افكار وتلميحات ! - (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• أفكار و تلميحات[ المعنى الحقيقي للـ True و False ] - أمثلة (VB.NETVB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• دوال الـ APIs و مايقابلها في الدوت نت ! - (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

#106

من الأستاذ رغيد الطيب عندنا يا مرحبا يا مرحبا

و الله فرحت جدا عندما وجدت آخر رد هو ردك فدخلت متلهفا للموضوع حتى أرى مشاركتك و التي علمت مسبقا أنها ستكون مميزة كما هي دائما

بالنسبة للأقتراح الذي أقترحت فأنا أوافق عليه 100/100 حتى لانضيع من الوقت في سؤال واحد أكثر من ما يلزم و كما قلت حتى اذا تأخر أحدنا في وضع الجواب و رأى أن لديه ما قد يفيدنا فليضعه حتى نستفيد, و أنا عندي فكرة أخرى حتى نحث جميع أعضاء منتدى الفيجوال دوت نت للمشاركة في المسابقة (لأني أرى نفس الوجوه ) و هي عند فوز أحدنا في السؤال المطروح يكتب أسمه في أعلى المنتدى بطريقة تجذب النظر (يعني مكافئة :D ) هذا لأن معظمنا لا يشارك في شئ الا اذا كان هناك مقابل (و هذا شئ سئ جدا)

اما بالنسبة لسؤالي الذي أثار فضولك أخي رغيد فأتمنى من الأخ UNDO ان يطرحه اليوم لأني أرى أن سؤال الأخ عبد العليم تمت الأجابة بجميع الطرق الممكنة و المنطقية

و شكرا

تم تعديل هذه المشاركة بواسطة crazy-man في 20 فبراير 2005 في 14:16

#107

:D يا جماعة، سؤالي هذا مقصود انه يكون سهل حتى نزيد من تفاعل الأعضاء مع هذا الموضوع (و لقد نجحت الى حد ما ;) )... وقد قام الأخوة الكرام بالاجابة بشتى الطرق كمال قال crazy-man و أيضاً يبدو ان النقاش حول سؤال Undo الأخير لم ينتهي بعد...

على العموم مع ظهور مشتركين جدد في هذا الموضوع (خاصةً رغيد الطيب) سيزيد من تفاعل الأعضاء مع هذا الموضوع، و أقترح بجانب اقتراح رغيد الطيب أن يتم نقل هذا الموضوع الى قسم "منتدى تكنولوجيا Microsoft .Net العام" حتى يشترك محبي الـ #C أيضاً و نكون بذلك حققنا فرصة أكبر للتحدي بين الأعضاء، ما رايكم..؟؟؟

ما رأيك يا هارون أنت و undo ؟؟ ;)

تم تعديل هذه المشاركة بواسطة محمد عبد العليم في 20 فبراير 2005 في 16:24

رأس الحكمة الإيمان بالله

#108

كما يبدو فإن الموضع أصبح جدّ... فلكم بإعتراف.

أقسم بالله العظيم بأنني لم أفهم المعيار الذي وضعه Undo للكود الفائز إلا بعد ظهور النتائج، قال بأن الحل الأسرع سيكون هو الفائز وظننت بأنه يقصد بأن الفائز هو الأول في وضع كود يعمل، ولم أعي بأنه يقصد بأن سرعة تنفيذ الكود هو ما يقصد إلا بعد أن رأيت جوابه... على كل حال، أرجو أن تضحكوا عليّ وعلى كودي السلحفائي :lol:

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

اقتباس
أظن أنه تقريباً نفس الكود الذي رشحته أنت

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

اقتباس
و أقترح بجانب اقتراح رغيد الطيب أن يتم نقل هذا الموضوع الى قسم "منتدى تكنولوجيا Microsoft .Net العام"

بالنسبة لسؤالك أخي محمد فهو ناجح تماماً للهدف الذي أوردته، وبالنسبة لنقل الموضوع الى "منتدى تكنولوجيا Microsoft .Net العام" فنعم الرأي، ولكن أرجو أن يترك رابط له هنا لأن الكثير من الأعضاء لا يعرف سوى هذا القسم.

أما بالنسبة لإقتراح رغيب بترك السؤال مفتوحاً لحين الوصول الى أربع إجابات فرأيي بأن مدة إسبوع هي كافية ولكن يترك الخيار لصاحب السؤال بتمديد المدة بناء على ما يراه من تفاعل من الأعضاء، أما تحديد حد أدنى من المشاركات فهو صعب فأحياناً قد لا تصلك أربعة إجابات لصعوبة السؤال أو لعدم متعته.

Learn Japanese :>>> http://www.nouben.com/

#109

نعم الخطأ هو خطأ سهو

فبدلاً من أن أكتب

                Count += 1

كتبت

                Count += Count
#110

بسم الله الرحمن الرحيم

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

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

وعودة الى موضوع الكلمات المكررة التي وضعه عزيزنا Undo و لمشاركات محمد النحراوي الرائعة فيه .... فنقول عزيزي النحراوي ان الإجابة الأولى المتمثلة في :

Function CountOccurrences(ByVal StringToSearch As String, ByVal StringToFind As String) As Integer
       Dim FoundPos As Integer
       Dim TempPos As Integer
       Dim Count As Integer
       FoundPos = 1
       Do
           FoundPos = InStr(FoundPos, StringToSearch, StringToFind)
           TempPos = FoundPos
           If FoundPos > 0 Then
               Count += Count
               FoundPos += Len(StringToFind)
           End If
       Loop Until FoundPos = 0
       Return Count
   End Function

هي فكرة رائعة و سريعة للغاية و بالفعل فهي تعتمد نفس المبدأ الذي و ضعته انا في مقترحي :

Function strCount(ByVal strMain As String, ByVal strFind As String) As Integer
Dim Stp As Integer = strFind.Length
Dim Pos As Integer = -Stp + 1
Dim Num As Integer = -1

Do
 Num = Num + 1
 Pos = InStr(Pos + Stp, strMain, strFind)
Loop While Pos <> 0

Return Num
End Function

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

CountOccurrences : 
260, 260, 251, 251, 240, 260, 260, 260, 250, 251 ==> ( 2543/10 ) = 254.3

strCount :
250, 250, 250, 250, 251, 260, 261, 251, 250, 250 ==> ( 2523/10 ) = 252.3

وهي عبارة عن الفترات الزمنية التي استغرقتها كلا الدالتين للبحث في سلسلة نصية بطول 14 مليون ونصف المليون من الحروف لعشر مرات متتالية بوحدة الملي ثانية و منها يظهر ان دالتك استغرقت ما متوسطه هو 254.3 ملي ثانية بينما استغرقت الثانية زمن مقداره 252.3 ملي ثانية و بالتالي فإن الدالة strCount اسرع بزمن لم يتجاوز العشرين ملي ثانية ! و هو رقم لا يمكن ابداً ان يؤخذ بعين الإعتبار نظراً لكونه صغيرا جدا...

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

Function CountOccurrences(ByVal StringToSearch As String, ByVal StringToFind As String) As Integer
       Dim FoundPos As Integer
       Dim TempPos As Integer
       Dim Count As Integer
       FoundPos = 1
       Do
           FoundPos = InStr(FoundPos, StringToSearch, StringToFind)
           TempPos = FoundPos
           If FoundPos > 0 Then
               Count += Count
               FoundPos += Len(StringToFind)
           End If
       Loop Until FoundPos = 0
       Return Count
   End Function

و ذلك بسبب ان زيادة المتغير Count ينبغي ان تكون :

Count += 1
وليس
Count += Count

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

Private Function CountOccurrences(ByVal StringToSearch As String, ByVal StringToFind As String) As Integer
	Dim FoundPos As Integer = 1
	Dim Count As Integer

	Do
  FoundPos = InStr(FoundPos, StringToSearch, StringToFind)

  If FoundPos > 0 Then
 	 Count += 1
 	 FoundPos += Len(StringToFind)
  End If
	Loop Until FoundPos = 0

	Return Count
End Function

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

و إن انتقلنا الى كود الدالة الأخرى التي اقترحتها انت عزيزي :

Private Function CountOccurrences(ByVal StrToSearch As String, ByVal StrToFind As String, ByVal CaseSensitive As Boolean) As Integer
      Dim RetValue As Integer
      Dim Slen As Integer = StrToSearch.Length
      Dim Flen As Integer = StrToFind.Length

      If Not CaseSensitive Then
          StrToSearch = StrToSearch.ToLower
          StrToFind = StrToFind.ToLower
      End If

      For I As Integer = 0 To (Slen - Flen)
          If StrToSearch.Substring(I, Flen) = StrToFind Then RetValue += 1
      Next

      Return RetValue
  End Function

فهي ايضاً رائعة من اخرى من ابداعاتك اخي العزيز غير انها لن تكون اسرع من دالتك السابقة نظراً لكونها تعتمد على SubString وهي عملية إستخراج لجزء من النص للمقارنة عليه في كل دورة من الدورات التي هي بالأصل دورات كثيرة بسبب انها تعتمد على المتغير I الذي يزداد بقيمة 1 فقط في كل دورة ... و بالتالي اذا استخدمناه مع سلسلتنا العتيقة ذات الطول ذو الـ 14 ونصف المليون حرف فانها ستدور بعدد من المرات مساوي لطولها وهو شيء مهول .. وكان الوقت المستغرق فيها طويل مقارنة بحلك الأول .. فالزمن الذي استغرقته كان 5698 أي ما يقارب 5.7 ثانية بينما كان حلك الأول يقوم بنفس العمل في زمن تقريبي مقداره 0.25 من الثانية ( ربع ثانية فقط ) ...

واذا اردنا استخدام هذه الدالة مع شيء من التعديل فلن يكون إضافة Setp الى الـ FOR كما اوضحت انت سابقا تمام بأن هذا الأسلوب لن ينفع هنا و إنما يمكن ان نقوم بعمل قفزة بسيطة في قيمة المتغير I بمقدار طول كلمة البحث (Flen - 1) بدلا عن القفز بمقدار 1 وذلك كلما عثرت الدالة على كلمة البحث في النص ... أي تعديل الدالة بالشكل التالي :

Private Function CountOccurrences(ByVal StrToSearch As String, ByVal StrToFind As String, ByVal CaseSensitive As Boolean) As Integer
      Dim RetValue As Integer
      Dim Slen As Integer = StrToSearch.Length
      Dim Flen As Integer = StrToFind.Length

      If Not CaseSensitive Then
          StrToSearch = StrToSearch.ToLower
          StrToFind = StrToFind.ToLower
      End If

For I As Integer = 0 To (Slen - Flen)
	If StrToSearch.Substring(I, Flen) = StrToFind Then
  RetValue += 1
  I += (Flen - 1)
	End If
Next
Return RetValue
End Function

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

بالنسبة للعزيز Non-Top نفعني الله واياك بخير دعائك لي و جزاك عن أخيك كل الخير عزيزي ... و اما بالنسبة للمتغيرات الـ Static فيمكن تعريفها بالشكل الطبيعي مثلاً :

Function NonTop() As Integer
Static X As Integer 
X+=1
Return X
End Function

حيث انك في كل مرة تستعدي الدالة NonTop فإن الناتج عنها سيكون اكبر من سابقه .. و لتنفيذ المبدأ في دالتك التي اقترحتها سابقاً عزيزي .. سيصبح الناتج شيئاً مثل

Function CountOccurrencesNonTop(ByVal strMain As String, ByVal strFind As String, Optional ByVal StartAt As Integer = 0) As Integer
	Dim Pos As Integer = strMain.IndexOf(strFind, StartAt)
	Static X As Integer

	If Not Pos Then
  X += 1
  CountOccurrencesNonTop(strMain, strFind, Pos + 1)
	End If

	Return X
End Function

اذا جربت الدالة ستجد أن الناتج سيتزايد في كل مرة تستدعي فيها الدالة حتى و إن استخدمت نفس المدخلات حيث اننا استخدمنا المتغير كمتغير Static و بالتالي فإن قيمته بقيت حتى الإستدعاء التالي للدالة ...

للتوضيح دعنا نفترض مثلا ان لديك نص مثل "OneOne" و آخر مثل "OneTwo" فإنه عن استدعائك للدالة السابقة للبحث عن الكلمة "One" سيؤدي الى ناتج هو 2 ( بعدد ظهورها في العبارة "OneOne" ) و بالتالي فإن القيمة الأخيرة للمتغير X هي 2 ... و اذا قمت في اي وقت آخر بإستدعاء الدالة مرة اخرى على العبارة الثانية "OneTwo" فإنك تتوقع الحصول على الناتج 1 ( لان الكلمة "One" قد تكررت مرة واحدة فقط ) غير انك ستفاجىء بكون الناتج هو 3 لان المتغير X كان من الاستدعاء السابق يحتوي على القيمة 2 و إضيف له الان قيمة الاستدعاء الثاني ( 1 ) و بالتالي فإن الناتج هو 3 ...

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

Function CountOccurrencesNonTop(ByVal strMain As String, ByVal strFind As String, Optional ByVal StartAt As Integer = 0) As Integer
	Dim Pos As Integer = strMain.IndexOf(strFind, StartAt)
	Static X As Integer

	If StartAt = 0 Then X = 0

	If Not Pos Then
  X += 1
  CountOccurrencesNonTop(strMain, strFind, Pos + 1)
	End If

	Return X
End Function

وسيفي هذا بالتعديل المطلوب بإذن الله تعالى غير أني عزيزي اتمنى ان لا تعتبر هذه الدوال جاهزة للإستخدام نظراً لكونها فقط لتوصيل الفكرة فقط وليستا بالكفائة التي تؤهلهما للإستخدام لحل سؤال الأخ Undo.

و اخيراً عزيزي Crazy Man مرحبا بك انت اخي الكريم ... و لا انسى ان اهنئك عزيزي على الاداه الرائعة AdvancedLabel التي اضفتها للمنتدى مؤخراً ولعلها تكون فاتحة خير عليك بإذن الله تعالى.

و بما أن استاذنا العزيز محمد عبد العليم قد بين أن سؤاله قد تمت الإجابة عليه فأتمنى أن يتم وضع سؤال الأخ CrazyMan او يسمح لأي من الأخوة وضع سؤالاً آخر ... و يبدو أنني ايضاً بدأت اتحمس كي اضع سؤالا جديدا.

بالنسبة للعزيز الغالي هارون HMS لا داعي بأن تقسم بالله عزيزي لأنك لن تجد اكثر منا تصديقا لما تقول لاننا ببساطة نعرف من هو هارون و بالتالي فإني لا اشك في كونك ستنتج كودا افضل بكثير مما انتج انا و لن نجد هنا بعدها من يمكن ان توصف اكوداه بالسلحفائية سواي انا عزيزي ...

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

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

اتمنى ان اكون قد اوصلت مقصدي عزيزي و اما ان رأيت ما يخالف رأيي فإني معك ارى ما تراه اخي العزيز.

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

مواضيع برمجية تقنية جديدة

----------------------------------------------------------------------------------------------------------------------------------------------

• إستغلال خدمة الـ RSS في برامجنا ومواقعنا ! (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج للبحث في الملفات ومحتواياتها (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• فئة للتراسل بين برنامجين في جهاز واحد ! (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

مواضيع برمجية تقنية قديمة

----------------------------------------------------------------------------------------------------------------------------------------------

• إستغلال رسائل البالونات Balloons في الوينذوز أكس بي(VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• مقالة : لماذا يجب ان نعتني بشفرات برامجنا !؟- (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• لمطوري البرامج و مواقع الويب - برنامج تركيب ألوان - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج : بسيط للتحكم بالنظام, عن طريق الريجستري - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج : لتقييد و منع تشغيل البرامج الاخرى - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• النوافذ المنبثقة و طريقة لإستغلالها في برامجنا -(VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• تقنية الإستدعاء الذاتي - (VB.NET , VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• مصفوفات الأدوات Control Arrays افكار وتلميحات ! - (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• أفكار و تلميحات[ المعنى الحقيقي للـ True و False ] - أمثلة (VB.NETVB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• دوال الـ APIs و مايقابلها في الدوت نت ! - (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

#111

" ان الله يحب ان عمل احدكم عملاً ان يتقنه"...

نشكرك أخي رغيد على هذا الشرح الوافي، درس رائع رائع...

هل بقي من تعليقات بالنسبة لسؤال Undo؟ إن لم يكن هناك تعليقات أو إستفسارات فنرجو الإنتقال الى سؤال الاخ محمد عبدالعليم... (للأسف سبقني الأخوة للحلول التي أعرفها).

سؤال الإسبوع القادم سيكون من نصيب رغيد، بعد إذن الأخوة المشرفين

تم تعديل هذه المشاركة بواسطة HMS في 21 فبراير 2005 في 01:50

Learn Japanese :>>> http://www.nouben.com/

#112

ما شاء الله لا قوة إلا بالله

تحليل غاية في الروعة والإفادة

عندي اقتراح وأرجو أن يلقى قبولاً بين الإخوة

ما رأيكم أن يضع السؤال التالي من فاز في السؤال الحالي وهكذا ؟

أظن أنها ستكون فكرة جيدة

وبما أن أخانا الكريم رغيد الطيب هو من فاز (لا داعي للنقاش) ، فإذا وافقتم على المقترح فإن الدور يصير عليه لوضع السؤال القادم

ما رأيكم ؟

#113

بسم الله الرحمن الرحيم

اولا و قبل كل شئ اود أن اقول أني جد سعيد بمدى التفاعل الموجود في هذا الموضوع و شكرا للأخ رغيد فبمجرد حضوره بيننا يشجعنا للأستمرار و العطاء

و أسمحوا لي أن أطرح سؤال الأسبوع الذي تم حذفه من قبل الأخ Undo و لأني أرى أن الأخ Undo غير موجود فسأعيد السؤال و هو جد جد جد جد جد جد سهل .

السؤال

اعمل كود يمكنك من معرفة اسم الأداة التي يوجد الماوس عليها و مثال البرنامج مرفق .

ملحوظة : يمكن أن يكون في الفورم مثلا 100 أداة B)

و اتمنى منكم المشاركة بكثافة أن شاء الله

MouseEnter.zip

تم تعديل هذه المشاركة بواسطة crazy-man في 20 فبراير 2005 في 21:53

#114

أخي "الرجل المجنون" :lol:

هل انتهينا من سؤال الأخ محمد عبدالعليم؟ ، فأنا للأسف لم استشف من مداخلته الأخيرة بأنه تم الإجابة على سؤاله، سأفترض ذلك وأحظى بشرف طرح الجواب الأول (أو محاولة الجواب) على سؤالك الكريم:

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim cont As Control
        For Each cont In Controls
            AddHandler cont.MouseEnter, New EventHandler(AddressOf HMS)
        Next
End Sub



Private Sub HMS(ByVal sender As Object, ByVal e As System.EventArgs)
        Label1.Text = "أنت الآن على الأداة " & CType(sender, Control).Name.ToString
End Sub


Private Sub Form1_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.MouseEnter
        Label1.Text="أنت الآن على الفورم"
End Sub

ولكن عليك ملاحظة ما يلي:

1) ليس كل أداة هي كنترول (قلت حضرتك : ملحوظة : يمكن أن يكون في الفورم مثلا 100 أداة)

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

لذلك يفضل أن نكتب الكود التالي أيضاً:

Private Sub Form1_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.MouseLeave
        Label1.Text = "أنت خارج الفورم"
End Sub

ولاحظ أيضاً بأننا فيه هذه الحالة لا نعتبر شريط أدوات الفورم الأزرق من ضمن الفورم (وكذلك جوانبه الثلاث (حوالي المليمتر من الثلاثة أطراف)

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

تم تعديل هذه المشاركة بواسطة HMS في 21 فبراير 2005 في 00:08

Learn Japanese :>>> http://www.nouben.com/

#115

بسم الله الرحمن الرحيم

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

عزيزي النحراوي صدقني كودك هو الفائز وهذا شيء لا يختلف عليه إثنان هنا كما وأني كما اسلفت لم ادخل للمنافسة عزيزي ...

و على العموم يظهر من كلام العزيز هارون ان سؤال الأخ عبد العليم لم تتم الإجابة عليه مع أني ظننت انها انتهت لهذا اتمنى من الاستاذ محمد ان يخبرنا بالنتائج قبل ان ننتقل إلى سوال العزيز CrazyMan.

و إن كان المقصود من السؤال هو تغيير عناوان Button مثلاً من Play إلى Stop و العكس مع كل نقرة على نفس الزر .. فيمكن القيام بالعديد من الطرق لتأدية هذه المهمة كما اسلف الأخوة في إجاباتهم الجميلة و إن كان هذا هو المطلوب فيكمن ايضاً اضافة بعض الطرق للفائدة مثل :

Private Sub Button1_Click( ... ) Handles Button1.Click
	Button1.Text = IIf(Button1.Text = "Play", "Stop", "Play")
End Sub

او بواسطة إستخدام متغيير خارجي، بالشكل التالي :

Static Play As Boolean
Play = Not Play
Button1.Text = IIf(Play, "Stop", "Play"))

او يمكن كذك استخدام الأمر Swicth كالتالي :

Static Play As Boolean
Play = Not Play
Button1.Text = Microsoft.VisualBasic.Switch(Play, "Stop", Not Play, "Play")

وبالإستغناء عن المتغير الإضافي تصبح :

Button1.Text = Microsoft.VisualBasic.Switch(Button1.Text = "Stop", "Play", Button1.Text <> "Stop", "Stop")

ايضاً الدالة Choose ستنفع في الأمر :

Button1.Text = Microsoft.VisualBasic.Choose(Math.Abs(CInt(Button1.Text = "Stop")) + 1, "Stop", "Play")

في الحقيقة لا اظن ان للطرق حصراً إن كان هذا ما عناه استاذنا عبد العليم فإن لم يكن حبذا لو اعلمنا بذلك كي ننتقل الى سؤال الأخ Crazy-Man و بعدها بإذن الله تعالى ارى ما يمكنني ان اضع من سؤال تلبية لطلب العزيزين النحراوي و هارون.

و لا اخفيكم ان لغياب الأخ العزيز Undo افتقاد كبير.

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

مواضيع برمجية تقنية جديدة

----------------------------------------------------------------------------------------------------------------------------------------------

• إستغلال خدمة الـ RSS في برامجنا ومواقعنا ! (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج للبحث في الملفات ومحتواياتها (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• فئة للتراسل بين برنامجين في جهاز واحد ! (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

مواضيع برمجية تقنية قديمة

----------------------------------------------------------------------------------------------------------------------------------------------

• إستغلال رسائل البالونات Balloons في الوينذوز أكس بي(VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• مقالة : لماذا يجب ان نعتني بشفرات برامجنا !؟- (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• لمطوري البرامج و مواقع الويب - برنامج تركيب ألوان - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج : بسيط للتحكم بالنظام, عن طريق الريجستري - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج : لتقييد و منع تشغيل البرامج الاخرى - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• النوافذ المنبثقة و طريقة لإستغلالها في برامجنا -(VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• تقنية الإستدعاء الذاتي - (VB.NET , VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• مصفوفات الأدوات Control Arrays افكار وتلميحات ! - (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• أفكار و تلميحات[ المعنى الحقيقي للـ True و False ] - أمثلة (VB.NETVB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• دوال الـ APIs و مايقابلها في الدوت نت ! - (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

#116

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

هذا فقط من حسن خلقك (ولا نزكي على الله أحدا)

لماذا لم يعلق أي من الإخوة الأفاضل على إقتراحي

"ما رأيكم أن يضع السؤال التالي من فاز في السؤال الحالي"

هذا سييوجد نوعاً من التنظيم

أنتظر ردكم

#117

شكراً أخي رغيد على هذه الفوائد.

اقتباس
ما رأيكم أن يضع السؤال التالي من فاز في السؤال الحالي

أنا مع هذه الفكرة إن راقت لكم، ولكن بعد السؤال التالي والذي سيكون من نصيب أخونا وحبيبنا رغيد.

أظنني أستطيع التحدث بإسم أخي محمد عبدالعليم وأقول بأننا تجاوزنا سؤاله وحللناه.

والآن أرجو تلبية رغبة أخينا Crazy_Man بالمشاركة بكثافة في سؤاله.. وسننتظر منه بعد ذلك القرار.

تم تعديل هذه المشاركة بواسطة HMS في 21 فبراير 2005 في 01:49

Learn Japanese :>>> http://www.nouben.com/

#118

بسم اله الرحمن الرحيم

أولا : أخي العزيز هارون كما ذكر أستاذنا رغيد الطيب سؤال الأخ عبد العليم تمت الأجابة عليه و ذلك بعدة طرق و كما ذكر في آخر مشاركته أن هناك العشرات من الطرق لذا أرتأيت أن أضع السؤال

ثانيا :

أخي العزيز هارون أود أن أوضح لك شيئا مهما هو أني عندما قلت أداة عنيت بها أداة (كل ما يوضع على الفورم دون أستثناء)

أما عن ما يكتب في عند خروجي من الفورم (يعني ان البرنامج يقول لي اني لازلت داخل الفورم) فذلك شئ جد جد بسيط تجاهلته و لم أجهله لأني كنت أسرع في كتابة السؤال قبل ان يسبقني أحد :D و لذا اوضح أن كودكم يجب أن تكون فيه هذه الخاصية

و بالنسبة لجوابك فأنا لن أناقشه معك الآن ختى أرى الأجوبة الأخرى

و شكرا ;)

#119
رغيد الطيب كتب:
و إن كان المقصود من السؤال هو تغيير عناوان Button مثلاً من Play إلى Stop و العكس مع كل نقرة على نفس الزر .. فيمكن القيام بالعديد من الطرق لتأدية هذه المهمة كما اسلف الأخوة في إجاباتهم الجميلة و إن كان هذا هو المطلوب فيكمن ايضاً اضافة بعض الطرق للفائدة مثل :

Private Sub Button1_Click( ... ) Handles Button1.Click
	Button1.Text = IIf(Button1.Text = "Play", "Stop", "Play")
End Sub

او بواسطة إستخدام متغيير خارجي، بالشكل التالي :

Static Play As Boolean
Play = Not Play
Button1.Text = IIf(Play, "Stop", "Play"))

او يمكن كذك استخدام الأمر Swicth كالتالي :

Static Play As Boolean
Play = Not Play
Button1.Text = Microsoft.VisualBasic.Switch(Play, "Stop", Not Play, "Play")

وبالإستغناء عن المتغير الإضافي تصبح :

Button1.Text = Microsoft.VisualBasic.Switch(Button1.Text = "Stop", "Play", Button1.Text <> "Stop", "Stop")

ايضاً الدالة Choose ستنفع في الأمر :

Button1.Text = Microsoft.VisualBasic.Choose(Math.Abs(CInt(Button1.Text = "Stop")) + 1, "Stop", "Play")

:lol: :lol: :lol:

بصراحة لا أجد ما أقوله..... شكراً للأخ رغيد على حلوله (أول مرة أرى IIF هذه :s ) و أشكر ايضاً الأعضاء الذين اشتركوا في الحل فكلها حلول وافية و مباشرة...

و كما قال هارون فلننتقل لسؤال crazy-man و نرى طرق حله..

اقتباس
ما رأيكم أن يضع السؤال التالي من فاز في السؤال الحالي

هي فكرة جيدة، و لكني أعتقد ان العضو سيفكر 100 مرة قبل الاجابة على السؤال خائفاً أن يفوز هو و لا يجد سؤالاً مناسباً للمرة القادمة :s ، و لكن اذا تم موافقة جماعية على هذا الموضوع، فلنجرب..

ملحوظة:

لقد قمت بنقل الموضوع لقسم "منتدى تكنولوجيا Microsoft .Net العام" مع الإحتفاظ بالوصلة الأصلية في قسم الـ VB.Net حتى نتيح الفرصة لمحبي الـ #C الاشتراك في حل الأسئلة...

لكن للأسف لا نستطيع أن نحتفظ بالموضوع مثبت قي كلا القسمين، فقد تم ازالة التثبيت لوصلة الموضوع في قسم الـ VB.Net بطريقة آلية بعد ما نقلت الموضوع لقسم "منتدى تكنولوجيا Microsoft .Net العام"...

تم تعديل هذه المشاركة بواسطة محمد عبد العليم في 21 فبراير 2005 في 02:23

رأس الحكمة الإيمان بالله

#120

بسم الله الرحمن الرحيم

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

لم انتبه إلى ان الاستاذ هارون كان قد اجاب على سؤال الأخ CrazyMan و من إجابته يمكن ان نفهم انه يمكن الإنتقال لسؤال الأخ Crazy و إستخدام الاخ هارون قد للـ AddHandler هو الحال المثالي و القياسي لمعالجة اكثر من كائن لحدث واحد .. و للمعلومة يمكن كتابة السطر :

AddHandler cont.MouseEnter, New EventHandler(AddressOf HMS)

بالشكل التالي اختصاراً :

AddHandler cont.MouseEnter, AddressOf HMS

و بالتالي فهي إجابة وافية بإذن الله تعالى ...و بالنسبة لمن يجهل إستخدام الأمر AddHandler ( يمكن رؤية تطبيق عملي له في المقالة بعنوان مصفوفة الأدوات في الـ Visual Baisc .NET ) الموجودة في المنتدى ..

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

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
	Dim myPoint As Point = Me.PointToClient(Cursor.Position)
	Dim myControl As Control

	If Me.ClientRectangle.Contains(myPoint) Then
  myControl = Me.GetChildAtPoint(myPoint)
  If myControl Is Nothing Then
  	Me.Text = "Your Mouse Over : " + Me.Name
  Else
  	Me.Text = "Your Mouse Over : " + myControl.Name
  End If
	End If
End Sub

الطريقة السابقة فقط للفائدة و لا يمكن ابداً مقارنتها بطريقة الأخ هارون الرائعة.

و بما ان الاتفاق السائد بين الحاظرين كان على كوننا نبحث عن الفائدة من تعدد الطرق و الإحتمالات فإن يمكن ان نخرج عن مطلب عزيزنا Crazy الذي اجاب عليه هارون إجابة وافية ... و افترضنا انه يوجد داخل الفورم حاويات Containers اخرى مثلاً GroupBox او Panel بحيث تحتوي احداها على عناصر بداخلها .... لاحظ معي الصورة التالية :

Controls.JPG

يظهر هنا انه وعلى الرغم من كون مؤشر الماوس على الاداة RadioButton2 إلا ان العنوان يظهر أن الفأرة موجودة على الـ GroupBox1 أي على الحاوية التي احتوت الـ RadioButton.

و يعني هذا ان الشفرة :

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
	For Each Item As Control In Me.Controls
  AddHandler Item.MouseEnter, AddressOf ShowName
	Next
	AddHandler Me.MouseEnter, AddressOf ShowName
End Sub

Private Sub ShowName(ByVal sender As Object, ByVal e As System.EventArgs)
	Me.Text = "Your Mouse Over [ " + sender.name + " ]"
End Sub

و السبب هنا ليس لأنه تحتوي على قصور بل لأن المجموعة Controls التابعة للفورم يختلف تركيبها عن عما كان عليه الوضع أيام الـ VB6 حيث كانت تحتوي هذه المجموعة على جميع العناصر التي على الفورم اياً كانت الحاويات تبعها .. اما الآن فأن هذه المجموعة اصبحت تشير فقط على الكائنات الموجودة في الفورم فقط بدون الاوات الاخرى المحتواه بداخل كل حاوية و يعني هذا ان المجموعة Controls التابعة للـ GroupButton1 تحتوي على الكائنات RadioButton3 و RadioButton2 و RadioButton1 .... وكذلك الحال بالنسبة لـ Panel1 ( الذي يظهر باللون الأبيض في الصورة ) فهو يحتوي على LinkLabel4 و LinkLabel3 و LinkLabel2 .. و يمكن تعديل الدالة بحيث تقوم بعملها بأي طريقة ممكنة بحي تترك الحرية للمستخدم بأن يضع ادواته اينما شاء و يبقى على دالتنا ان تكييف نفسها كما ينبغي بإذن الله تعالى.

التعديل المقترح يمكن ان يتم بطريقتين الاولى بالطريقة التقليدية و الثاني عن طريق إستخدام تقنية الإستدعاء الذاتي ( من أجل العزيز NonTop ) .

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

	Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  FindControls()
	End Sub

	Private Sub FindControls()
  Dim Items As New Stack
  Items.Push(Me)

  Do Until (Items.Count = 0)
  	Dim Parent As Control = Items.Pop()

  	AddHandler Parent.MouseEnter, AddressOf ShowName

  	For Each Item As Control In Parent.Controls
    Items.Push(Item)
  	Next
  Loop
	End Sub

	Private Sub ShowName(ByVal sender As Object, ByVal e As System.EventArgs)
  Me.Text = "Your Mouse Over [ " + sender.name + " ]"
	End Sub

و بواسطة هذه التعديل البسيط يمكن للدالة ان تعمل في اغلب الظروف بإذن الله تعالى.

و اما اذا اردنا اسباع رغبة حبيبنا NonTop فيمكن إستخدام تقنية الإستدعاء الذاتي بالشكل التالي :

	Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  FindControls(Me)
	End Sub

	Private Sub FindControls(ByVal Parent As Control)
  AddHandler Parent.MouseEnter, AddressOf ShowName
  For Each Item As Control In Parent.Controls
  	FindControls(Item)
  Next
	End Sub

	Private Sub ShowName(ByVal sender As Object, ByVal e As System.EventArgs)
  Me.Text = "Your Mouse Over [ " + sender.name + " ]"
	End Sub

يمكن ملاحظة ان إستخدام الإستدعاء الذاتي جعل الدالة لا تتجاوز الثلاثة السطور حيث انه سهل قراءة الشفرة كثيراً و في مثل هذه الحالات يحبذ إستخدام هذه التقنية.

على العموم و قبل أن اذهب اضع ملف يحتوي على امثلة واضحة على ما تم مناقشته اعلاه .. و اتمنى للجميع حظاً موفقاً

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

UnderMouse.zip

تم تعديل هذه المشاركة بواسطة رغيد الطيب في 21 فبراير 2005 في 02:42

مواضيع برمجية تقنية جديدة

----------------------------------------------------------------------------------------------------------------------------------------------

• إستغلال خدمة الـ RSS في برامجنا ومواقعنا ! (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج للبحث في الملفات ومحتواياتها (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• فئة للتراسل بين برنامجين في جهاز واحد ! (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

مواضيع برمجية تقنية قديمة

----------------------------------------------------------------------------------------------------------------------------------------------

• إستغلال رسائل البالونات Balloons في الوينذوز أكس بي(VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• مقالة : لماذا يجب ان نعتني بشفرات برامجنا !؟- (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• لمطوري البرامج و مواقع الويب - برنامج تركيب ألوان - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج : بسيط للتحكم بالنظام, عن طريق الريجستري - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج : لتقييد و منع تشغيل البرامج الاخرى - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• النوافذ المنبثقة و طريقة لإستغلالها في برامجنا -(VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• تقنية الإستدعاء الذاتي - (VB.NET , VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• مصفوفات الأدوات Control Arrays افكار وتلميحات ! - (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• أفكار و تلميحات[ المعنى الحقيقي للـ True و False ] - أمثلة (VB.NETVB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• دوال الـ APIs و مايقابلها في الدوت نت ! - (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

#121

بسم الله الرحمن الرحيم

و الله لا أجد ما أقول بعد أجابة الأستاذ رغيد الطيب الذي أشار الى نقطة نسيتها في كودي و هي ماذا اذا وجدت اداة داخل Container آخر و قد جربتها بكودي فلم يكتشفه لكن و الحمد تحقق هدف هذه المنسابقة (على الأقل بالنسبة لي) فتعلمت و الحمد لله شيئا جديدا على يدي أستاذنا الطيب و أجابته لحد الآن هي الوافية و الملمة بجميع النواحي أما بالنسبة لجواب الأخ هارون فأنا جربت كودك لكن لاحظت أنه عندما أضفت أداة TabControl الى الفورم كودك لا يكتشفها أتمنى تجريب الأمر حتى تتأكد و أنا في أنتظار حلول من جميع الأعضاء حتى تعم الفائدة ;)

تم تعديل هذه المشاركة بواسطة crazy-man في 21 فبراير 2005 في 04:23

#122

السلام عليكم

صباح الخير اخواني الاعزاء ، ما شاء الله عليكم ، لم تتركو لناس النائمين مجال .

اعتقد ان رد الاستاذ رغيب الطيب وافي ولا مجال لزيادة وانا شخصيات لعملت اشياء وليس شيء منه ،

بالنسبة لإقتراح الاخ محمد النحراوي هو جميل جداً ولكن مسألت التقييم الكود الفائز سوف تكون صعبة على طارح السؤال ... (h)

ووين الاخوة C# ابناء العم :rolleyes: ، اي مشاركاتهم .

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

" اللهم لاسهل إلا ماجعلته سهلاً وأنت تجعل الحزن إذا شئت سهلاً "

003.gif

قواعد طرح الأسئله والمشاركات

-------------------

MSN Messenger : nontop@gmail.com

Happy coding

-------------------

#123

مممم، يبدو أنني خسرت للمرة الثانية :angry:

أخواني الأحبة في هذا المشاركة الممتعة:

أرجو أن تعذروا لي تغيبي لمدة تقارب من العشرة أيام، ليس فقط من هذه المشاركة ولكن من عالم الإنترنت... وأرجوكم أن لا تكثروا من الأسئلة في هذه الفترة فأنا لا أريد أن أخسر أي درس في هذه المدرسة الرائعة...

أراكم على خير...

Learn Japanese :>>> http://www.nouben.com/

#124

ما شاء الله

مبروك أخي هارون ، فعلاً تستحق الفوز ، الكود أعجبني أول ما رأيته (وكلام في سرك

حاولت أعمل أحسن معرفتش :) )

أما عن تعليق الأخ الفاضل رغيد الطيب فهو توجيه جيد ولكن وفي نظري لا يؤثر مطلقاً على مستوى فكرة الحل المطروحة فمستوى الفكرة (في نظري) هي الأساس

المهم إنت هربان على فين أوعى تكون رايح اليابان :)

طيب أنا أرى أن اقتراحي وجد قبولاً بين الإخوة ، وهذا يعتبر تطبيقاً له

ولكن كانت رغبتنا (على الأقل أخي هارون وأنا) أن يطرح الأستاذ رغيد السؤال القادم - وبعد إذن الإخوة - فليتفضل .. نحن في شوق ، لكن لو كان السؤال صعب ممكن تعتبروني حاغيب أنا كمان أسبوع ولا عشر أيام مش عاوزين احراج :)

#125

بسم الله الرحمن الرحيم

معأحترامي للأخ هارون فأن كوده رغم كل ذلك قاصر حيث أنه لا يأخذ بعين الأعتبار الأدوات داخل ال Containers الآخرين غير الفورم و حتى اذا لم نجعل هذا الأخير شرطا للفوز فأنا جربت كوده على أداة TabControl لكنه لم يكتشفها لذا فلحد الآن الأخ رغيد هو الفائز اما اذا كانت اجاباته فقط توجيهات و لم يطرح أي أحد آخر حلا فعند اذا نستطيع أن نقول مبرو لأخ هارون B)

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

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…