اذهب الي المحتوي
أوفيسنا

الردود الموصى بها

قام بنشر (معدل)

الأخوة حامل المسك وعمار وشمشوم شكرا لكم

الأخ عمار سأعمل بنصيحتك لكل عشر أمثلة معا، وأرجو منك فضلا تغيير اسم الموضوع إلى (سلسلة الأمثلة المشروحة)

المثال الخامس

الفروقات بين مربع القائمة List Box ومربع التحرير والسرد Combo Box

المقدمة

تساءل أحد الأعضاء في إحدى المشاركات (هــنــا) إن كان بالإمكان اخفاء سهم مربع التحرير والسرد ليظهر كأنه مربع القائمة. ويتضح ضمنا من سؤاله أنه يود أن يستخدم احد الخصائص التي تتوفر في مربع التحرير والسرد وبنفس الوقت يستفيد من شكل مربع القائمة. إن هذا السؤال في محله بلا شك، رغم أن الكثيرين ممن لا يدققون في الأمور كثيرا قد يظنوا أن مربع القائمة لا يختلف عن مربع التحرير والسرد سوى في الشكل. في هذا المثال سيتم إلقاء الضوء على الفروقات بين List Box و Combo Box.

التفاصيل

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

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

1. في لسان التبويب other الخصائص الأخرى أو الإضافية

post-27241-1198572863_thumb.jpg

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

2. في لسان التبويب Event الأحداث

post-27241-1198573093_thumb.jpg

لاحظ أربعة أحداث غير موجودة في مربع القائمة

3. في لسان التبويب data البيانات

post-27241-1198573168_thumb.jpg

لاحظ ثلاث خصائص غير موجودة في مربع القائمة

4. في لسان التبويب format التنسيق

post-27241-1198573247_thumb.jpg

لاحظ ثمان تنسيقات غير موجودة في مربع القائمة

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

تحياتي

تم تعديل بواسطه محب العلم
قام بنشر (معدل)

ما زلنا في المثال الخامس

مرحلة التطبيق والتجربة

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

1. طريقة خداع اللون التي قدمها لنا المشرف يوسف المحترم

من مربع الادوات اضف مستطيل الى النموذج واجعل حجمه يساوي تماما المربع الخاص بالسهم لمربع التحرير والسرد وضعه فوق مربع السهم ليغطيه تماماً

واضبط خصائص المستطيل كما يلي:-

ــ لون الخلفية او ( BackColor ) غيره ليصبح مثل لون خلفية النموذج.

ــ نمط الخلفية او ( BackStyle ) اجعله عادي ( Normal ) وهذه هي القيمة الافتراضية لهذه الخاصية .... اتركها كما هي.

ــ نمط الحدود او ( BorderStyle ) اجعله شفاف ( Transparent ).

بهذا فان سهم مربع التحرير والسرد لن يظهر سوى عند التركيز عليه فقط وغير ذلك سيظهر كمربع نص.

مثال المشرف يوسف : dbHideComboboxArrow.rar

وهي طريقة رائعة سهلة التطبيق وناجحة 100%

2. طريقة إسناد قيمة مربع التحرير والسرد إلى مربع نص يوضع فوقه

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

بحيث يعمل مربع نص ويجعل مصدره مربع التحرير والسرد ويوضع فوقه تماما ونغير خاصية (visible) لمربع التحرير والسرد إلى(لا) في وضع التصميم ليتم اخفاءه عندما يفتح النموذج، وبواسطة حدث الدخول لهذا المربع وحدث الخروج من مربع التحرير والسرد يمكن تنفيذ المطلوب كما يآتي

 
Private Sub Text_Enter()
Me.Combo.Visible = True
Me.Combo.SetFocus
Me.Text.Visible = False
End Sub
Private Sub combo_Exit(Cancel As Integer)
Me.Text.Visible = True
End Sub

المثال : CombBoxNoArrow.rar

تحياتي

تم تعديل بواسطه محب العلم
قام بنشر

بارك الله فيك اخي محب العلم

مواضيع رائعة ومفيدة جداً .. جزاك الله خيراً

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

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

لدي استفسار عن كيفية إخفاء السهم في القائمة المنسدلة ( combobox ) في النموذج ليكون شكله مثل مربع النص .

علماً أنني بحث حول هذا الموضوع ولم أجد إجابة .. أتمنى ممن لديه إجابة أن لايبخل علينا بها ..

مع شكري وتقديري للجميع .

مع الشكر والتقدير لجهودك المبذولة

قام بنشر (معدل)

شكرا للأخ يوسف

المثال السادس

كيفية التحقق من أن النموذج في وضع التعديل تلقائيا

المقدمة

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

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

الفوائد الجانبية للمثال

1. كيفية التراجع عن مجموعة التعديلات على سجل .

2. كيفية التحكم في صفحة النموذج

3. التعرف على حدث Dirty والذي يتفعل قبل أن يتم التعديل على حقل أو سجل

الأسلوبان المراد اتباعهما لتحقيق هدف المثال هما :

1. استخدام حدث عداد الوقت للنموذج

2. استخدام خاصية dirty في تعبير

التفاصيل

الأسلوب الأول : استخدام حدث عداد الوقت للنموذج

1. يتم تحديد الزمن هكذا

post-27241-1198658109_thumb.jpg

2. يتم تعريف إجراء عداد الوقت للنموذج هكذا

Private Sub Form_Timer()
    ' the Timer Interval has been set at 1000, that is, once per second.
    
    Static bFlag As Boolean
    If Me.Dirty Then
        If Not bFlag Then
            Me!cmdUndo.Enabled = True
            bFlag = True
        End If
    Else
        If bFlag Then
            Me!txtFirstName.SetFocus
            Me!cmdUndo.Enabled = False
            bFlag = False
        End If
    End If
End Sub
وما يقوم به هذا الاجراء هو التحقق بشكل دوري كل (ثانية) حسب الزمن المحدد في خطوة 1 إذا تم اي تعديل في السجل وتبديل حالة زر التراجع عن التعديلات بين التفعيل وعدمه وهكذا نكون قد حققنا ما نصبو له بحسب حالة هذا الزر. 3. كما ذكرت سابقا فإن احد اجراءات النحكم في النموذج قد تكون التراجع عن هذه التعديلات وذلك يكون هكذا
Sub cmdUndo_Click()
    ' same action as clicking Undo from the Edit menu
    DoCmd.RunCommand acCmdUndo
End Sub
والنتيجة تكون كأننا ضغطنا على زر التراجع عن التغييرات ctrl+z عدة مرات الأسلوب الثاني : استخدام خاصية dirty في تعبير 1. تعريف الإجراء التالي في وحدة نمطية
Function EditModeChange (F As Form) As Variant

   If F.Dirty Then
      F!btnUndo.Enabled = True
   Else
      F!btnUndo.Enabled = False
   End If

End Function
2. تعريف حدث بعد التحديث للنموذج كما يآتي
Sub Form_AfterUpdate ()
   Me!txtEditModeChange.Requery
End Sub
وهذا بدوره سيحقق المطلوب كما هو الحال بإستخدام الأسلوب الأول من الفوائد الجانبية لهذا المثال كيفية عمل صفحات في النموذج والتنقل بينها وذلك يتم كما يلي 1. في وضع التصميم أضف pagebreak فاصل صفحات في موضع الفصل كم يأتي : post-27241-1198659850_thumb.jpg 2. ثم بناء على أزرار الأمر يتم التوجه للصفحة المطلوبة هكذا
 

]Private Sub cmdCompanyInfo_Click()
    ' move to first page of form.
    Me.GoToPage 1
End Sub[/size]

Private Sub cmdPersonalInfo_Click()
    ' move to second page of form.
    Me.GoToPage 2
End Sub

المثال بعد تعريبه : DetectEdit.rar

تحياتي

تم تعديل بواسطه محب العلم
قام بنشر (معدل)

المثال السابع

أربعة أساليب لمنع ظهور رسائل التحذير التي ستظهر قبيل تنفيذ استعلاماً إجرائياً

المقدمة

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

التفاصيل

الأساليب التي سنستخدمها لمنع الرسائل التحذرية هي

1. الطريقة اليدوية من الخيارات

2. طريقة استخدام الماكرو

3. باستخدام CurrentDB.Execute

4. باستخدم DoCmd.SetWarnings

والأن لنتعرف على تفاصيل كل أسلوب من هذه الأساليب

الطريقة الأولى: يدويا من الخيارت وذلك يتم بحسب الشكل الآتي :

post-27241-1198747427_thumb.jpg

الطريقة الثانية : بواسطة الماكرو وذلك يتم بعمل ماكرو كما يآتي

post-27241-1198747886_thumb.jpg

الماكرو الأول Hide سيمنع الرسائل من الظهور

والماكرو الثاتي Show سيعمل على إظهار الرسائل

ويطلب هكذا

 

Private Sub أمر1_Click()
 Dim SQL As String

 SQL = "insert into students (name) " & _
       "values ('طالب')"

 DoCmd.RunMacro "Messages.Hide"
 DoCmd.RunSQL SQL
 DoCmd.RunMacro "Messages.Show"

End Sub
الطريقة الثالثة : باستخدام CurrentDB.Execute لتنقيذ الإجراء بدلا من DoCmd.RunSQL هكذا
Private Sub أمر2_Click()

Dim SQL As String

SQL = "insert into students (name) " & _
      "values ('طالب')"
      
CurrentDb.Execute SQL

End Sub
الطريقة الرابعة : بواسطة الأمر DoCmd.SetWarnings هكذا
 
Private Sub أمر3_Click()

Dim SQL As String


SQL = "insert into students (name) " & _
       "values ('طالب')"
      
DoCmd.SetWarnings False
  DoCmd.RunSQL SQL
DoCmd.SetWarnings True

End Sub

المثال : StopWarnings.rar

أفضل وأسهل طريقة هي الثالثة

تحياتي

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

الأخ عمار سأعمل بنصيحتك لكل عشر أمثلة معا، وأرجو منك فضلا تغيير اسم الموضوع إلى (سلسلة الأمثلة المشروحة)

أرجو فضلا تصحيح عنوان الموضوع إلى (سلسلة الأمثلة المشروحة) ولكم جزيل الشكر والامتنان

:jump:

تحياتي

قام بنشر (معدل)

المثال الثامن

استخدام طرق البحث في البيانات بواسطة اقترانات البحث في مجال aggregate functions

المقدمة

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

التفاصيل

من اقترانات البحث في مجال معين مثل جدول Dlookup ، DFirst ، DLast ، DSum ، DCount ، DAvg ، DMax ، DMin وغيرها

في المثال تم بناء جدول بيانات الطلاب : الرقم والاسم وتاريخ الميلاد و المصروف و إن كان للطالب أخ وقد اختيرت هذه البيانات بالتحديد لإختلاف أنواع البيانات فيها فالرقم (رقم Number) والاسم (نص Text) وتاريخ الميلاد (تاريخ Date) والمصروف (رقم مزدوج Double) وله أخ (منطقي Boolean) ولكي نتعلم كيف نستخدم هذه العناصر في الشروط.

وقد قمت في هذا المثال بعمل عدة اسئلة وهي

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

1. البحث عن طالب بواسطة الرقم ؟

 

Private Sub cmd1_Click()

no = InputBox("الرجاء إدخال رقم الطالب", "ادخال")

w = Nz(DLookup("[sno]", "[student]", "[sno] = " & Str(no)), Empty)

If Not IsEmpty(w) Then
  MsgBox w
Else
  MsgBox "لا يوجد نتيجة"
End If

End Sub
استخدمت هنا الأقواس [ ] لحصر أسماء الحقول والجدول وهذا غير ضروري إذا كان الحقول من مقطع واحد ولكنه مهم جدا عند تكون الحقول أو اسم الجدول من مقطعين كأن يكون اسم الجدول مثلا جدول الطلاب أو يكون حقل التاريخ اسمه تاريخ الميلاد الاقتران Nz يضم لنا عدم ارجاع القيمة الفارغة Null فإذا كان الجواب Null يرجع لنا كجواب للبحث القيمة الخالية Empty ومنها نعرف نتيجة البحث لاحظ هنا كيف تم حصر الرقم بالاقتران str لتحويله إلى نص string 2. البحث عن طالب بواسطة الاسم ؟
 

Private Sub cmd2_Click()
N = InputBox("الرجاء إدخال  الاسم", "ادخال")

w = Nz(DLookup("[sname]", "[student]", "[sname] = '" & N & "'"), Empty)

If Not IsEmpty(w) Then
  MsgBox w
Else
  MsgBox "لا يوجد نتيجة"
End If

End Sub
لاحظ هنا مع الحقل من نوع نص كيف نستخدم علامات التنصيص المفردة ' للإحاطة بالمتغير النصي 3. البحث عن طالب بواسطة تاريخ الميلاد ؟
 


Private Sub cmd3_Click()
D = InputBox("الرجاء إدخال  تاريخ الميلاد", "ادخال")

w = Nz(DLookup("[sdate]", "[student]", "[sdate] = #" & D & "#"), Empty)

If Not IsEmpty(w) Then
  MsgBox w
Else
  MsgBox "لا يوجد نتيجة"
End If

End Sub
لاحظ هنا كيف نستخدم إشارة النمبر # للإحاطة بحقل من نوع تاريخ 4. البحث عن طالب بواسطة الرقم و الاسم معا ؟
 

Private Sub cmd4_Click()
no = InputBox("الرجاء إدخال رقم الطالب", "ادخال")
N = InputBox("الرجاء إدخال  الاسم", "ادخال")

w = Nz(DLookup("[sno]", "[student]", "[sno] = " & Str(no) & " and [sname] = '" & N & "'"), Empty)

If Not IsEmpty(w) Then
  MsgBox "الطالب موجود"
Else
  MsgBox "لا يوجد نتيجة"
End If

End Sub
5. البحث عن طالب بواسطة وقوع تاريخ ميلاده بين تاريخين محددين ؟
 

Private Sub cmd5_Click()
D1 = InputBox("الرجاء إدخال  التاريخ الأول", "ادخال")
D2 = InputBox("الرجاء إدخال  التاريخ  الثاني", "ادخال")

w = Nz(DLookup("[sdate]", "[student]", "[sdate]  between #" & D1 & "# and #" & D2 & "#"), Empty)

If Not IsEmpty(w) Then
  MsgBox w
Else
  MsgBox "لا يوجد نتيجة"
End If
End Sub
عملية استخدام between ولا تنسى أن حدي البحث متضمنان في البحث 6. البحث عن عدد الطلاب بواسطة سنة تاريخ الميلاد ؟
 Private Sub cmd6_Click()
Y = InputBox("الرجاء إدخال سنة تاريخ الميلاد", "ادخال")

w = DCount("*", "[student]", "year([sdate]) = " & Str(Y))

If Not IsEmpty(w) Then
  MsgBox w
Else
  MsgBox "لا يوجد نتيجة"
End If

End Sub
لاحظ هنا طريقة المقارنة مع السنة وهي رقم 7. البحث عن أول طالب بواسطة إبتداء اسمه بأحرف معينة ؟
 Private Sub cmd7_Click()
N = InputBox("الرجاء إدخال  بداية الاسم", "ادخال")

w = Nz(DFirst("[sname]", "[student]", "[sname] Like '" & N & "*'"), Empty)

If Not IsEmpty(w) Then
  MsgBox w
Else
  MsgBox "لا يوجد نتيجة"
End If

End Sub
لاحظ كيف استخدمنا Like وأين وضعنا * 8. البحث عن أصغر تاريخ ميلاد ضمن المجموعة ؟
 Private Sub cmd8_Click()

w = Nz(DMin("[sdate]", "[student]"), Empty)

If Not IsEmpty(w) Then
  MsgBox w
Else
  MsgBox "لا يوجد نتيجة"
End If

End Sub
في بعض الاحيان لا نحتاج إلى شروط في البحث 9. البحث عن مجموع المصاريف لكل الطلاب ؟
 Private Sub cmd9_Click()
w = Nz(DSum("[sexp]", "[student]"), Empty)

If Not IsEmpty(w) Then
  MsgBox w
Else
  MsgBox "لا يوجد نتيجة"
End If

End Sub
10. البحث عدد الطلاب الذين لهم أخ ؟
 Private Sub cmd10_Click()

w = Nz(DCount("[sexp]", "[student]", "[shasbrother] = True"), Empty)

If Not IsEmpty(w) Then
  MsgBox w
Else
  MsgBox "لا يوجد نتيجة"
End If

End Sub
لاحظ هنا كيف استخدمنا البحث عن حقل نعم/لا boolean منطقي واستخدام true ويمكن أيضا المقارنة العدد -1 11. البحث عن مجموع مصروف الطلبة الذين ليس لهم أخ وولدوا في شهر بعد الذي سيتم تحديده ؟
 Private Sub cmd11_Click()
M = InputBox("الرجاء إدخال  الشهر", "ادخال")
w = Nz(DSum("[sexp]", "[student]", "[shasbrother] = false and month([sdate]) > " & Str(M)), Empty)

If Not IsEmpty(w) Then
  MsgBox w
Else
  MsgBox "لا يوجد نتيجة"
End If

End Sub
لاحظ كيفية صياغة الشروط المركبة مع and 12. البحث عن معدل مصروف الطلبة الذين لم يولدوا في السنة المحددة ؟
 Private Sub cmd12_Click()
Y = InputBox("الرجاء إدخال  السنة", "ادخال")
w = Nz(DAvg("[sexp]", "[student]", "year([sdate]) <> " & Str(Y)), Empty)

If Not IsEmpty(w) Then
  MsgBox w
Else
  MsgBox "لا يوجد نتيجة"
End If

End Sub
<> تعني لا يساوي 13. البحث عن أخر طالب في الجدول له أخ ؟
 Private Sub cmd13_Click()

w = Nz(DLast("[sname]", "[student]", "[shasbrother] = True"), Empty)

If Not IsEmpty(w) Then
  MsgBox w
Else
  MsgBox "لا يوجد نتيجة"
End If
End Sub
14. عرض اسم وتاريخ ميلاد أول طالب يظهر في الجدول ؟
 Private Sub cmd14_Click()
w = Nz(DFirst("[sname] & ' ' & [sdate]", "[student]"), Empty)

If Not IsEmpty(w) Then
  MsgBox w
Else
  MsgBox "لا يوجد نتيجة"
End If
End Sub

لاحظ علاملات التنصيص المفردة ' وذلك لترك فراغ بين الرقم والاسم

المثال : aggregate.rar

تحياتي

تم تعديل بواسطه محب العلم
  • Like 1
قام بنشر

خبيرنا الغالي / محب العلم :fff::gift2:

نكرر الشكر والتقدير لك على هذه المجهودات الكبيرة والرائعة والتي هي بالفعل دروس قيمة جداً

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

قام بنشر

أسأل الله أن يزقك العلم النافع والعمل الصالح وأن يلهمك سبيل الرشاد

ولو كل منا حرص على ما تحرص عليه لرفع الله الجهل عن الأمة

وفقك الله أخي محب العلم

قام بنشر

شكرا لكم إخواني جميعا على التشجيع والدعم .

أخي يوسف ، رجوعا إلى ما تفضلت به عن جمع المادة العلمية في ملف pdf ، أرجو منك فضلا أن ترشدني إلى البرنامج الخاص بذلك أو أن تقوم مشكورا سلفا بعمل المطلوب لأول 10 دروس/أمثلة.

أشكرك كثير أخي يوسف والمسؤولين على دعمي وترقيتي وإن شاء الله أكون قدر حمل اللقب المناط بي.

الأخ أبو ناره تحياتي لك

ماذا تقصد بإنك لم ترى شرح ، لم أفهم قصدك عن أي مثال تتحدث ؟

تحياتي

قام بنشر

شكرا لكم إخواني جميعا على التشجيع والدعم .

أخي يوسف ، رجوعا إلى ما تفضلت به عن جمع المادة العلمية في ملف pdf ، أرجو منك فضلا أن ترشدني إلى البرنامج الخاص بذلك أو أن تقوم مشكورا سلفا بعمل المطلوب لأول 10 دروس/أمثلة.

أشكرك كثير أخي يوسف والمسؤولين على دعمي وترقيتي وإن شاء الله أكون قدر حمل اللقب المناط بي.

الأخ أبو ناره تحياتي لك

ماذا تقصد بإنك لم ترى شرح ، لم أفهم قصدك عن أي مثال تتحدث ؟

تحياتي

قام بنشر (معدل)

المثال العاشر

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

المقدمة

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

التفاصيل

لنفترض أن أسم النموذج المفرد : Ambulance

وأن النموذج قائمة البيانات هو : AmbulanceDS

وأننا سنطلب AmbulanceDS من Ambulance بواسطة زر وهو الزر الذي شكلة كالقائمة في مثالنا يقع مباشرة فوق زر الخروج.

الفكرة مبينية على حدث (في الحال on current ) للنموذج في عرض القائمة وهو الذي سيتم طلبه حيث نضع ما فيه ما يأتي

Private Sub Form_Current()
    Dim rs As Object
    If IsLoaded("Ambulance") Then
     Set rs = Forms!Ambulance.Recordset.Clone
     rs.FindFirst "[ambId] = '" & Controls(0).Value & "'"
     If Not rs.EOF Then Forms!Ambulance.Bookmark = rs.Bookmark
    End If
End Sub
لاحظ هنا أننا نفحص وضع النموذج الأب Ambulance أولا قبل تحويل المؤشر بواسطة إقتران فحص فتح النموذج المعروف وهو
 
Function IsLoaded(ByVal strFormName As String) As Boolean
Const conObjStateClosed = 0
Const conDesignView = 0

If SysCmd(acSysCmdGetObjectState, acForm, strFormName) <> conObjStateClosed Then
If Forms(strFormName).CurrentView <> conDesignView Then
IsLoaded = True
End If
End If

End Function

ثم بعد ذلك وبناء على النتيجة فإننا نقوم بتحويل المؤشر للنموج الأب Ambulance للسجل الذي نكون عنده في الأبن AmbulanceDS

لاحظ لو قمنا بفتح النموذج الأبن بدون نموذج الأب فلا مشكلة.

المثال التطبيقي :Example10.rar

تحياتي

تم تعديل بواسطه محب العلم
قام بنشر

بارك الله فيك اخي محب العلم

ولا شكر على واجب ... فانت اهل لذلك واتمنى لك التوفيق .... والى الامام دائماً ان شاء الله

اعتذر عن التأخر في الرد بخصوص طلبك تجميع الدروس نظراً لانشغالي

وعموماً بامكانك الحصول على البرنامج الخاص بذلك بالبحث في قوقل عن PdfCreator وستجده باصداراته

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

دمت بود

قام بنشر (معدل)

المثال الحادي عشر

كيفية عمل مجموع تراكمي باستخدام DSum في النموذج

المقدمة

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

التفاصيل

كما ذكرنا يستخدم المثال التالي الدالة ()DSum لإنشاء مجموع تراكمي على نموذج

1. إنشاء النموذج الجديدة استناداً إلى الجدول Orders (الطلبيات) وفي تذييل النموذج نجعل مصدر البيانات لعنصر التحكم الخاص بالمجموع التراكمي كما يأتي :

=DSum("[Freight]","Orders",  "[OrderID] <= Forms![Form1]![OrderID]")

2. تحسب الدالة dsum مجموع كافة تكاليف الشحن Freight على الترتيب والتي مفتاح السجل لها (الرقم) أقل من أو يساوي الرقم المعروض حاليا. لهذا السبب اعتمد المجموع على مفتاح أي فريد ومتسلسل.

3.عند عرض النموذج في طريقة العرض " نموذج " ، لاحظ أن مربع النص للمجموع التراكمي لمصاريف الشحن الإجمالية يعرض المجموع للرقم المعروض وكل الطلبيات السابقة للرقم المعروض .

4. المجموع التراكمي يجب أن يكون في تذييل النموذج.

المثال : RunningSum.rar

مع وافر الاحترام

تم تعديل بواسطه محب العلم
قام بنشر

المثال الثاني عشر

كيفية إنشاء نموذج عداد الوقت StopWatch

المقدمة

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

التفاصيل

1. يمكن بناء هذا النموذج في أي قاعدة بيانات مفتوحة بغض النظر عن هدفها أو عملها.

2.قم بإنشاء نموذج فارغ لا يستند إلى أي جدول أو استعلام وقم بتعيين الخصائص التالية للنموذج:

ScrollBars: Neither
   RecordSelectors: No
   NavigationButtons: No
   OnTimer: [Event Procedure]
   TimerInterval: 0
3. أضف مربع نص إلى النموذج وقم بتعيين الخصائص التالية في مربع النص:
Name: ElapsedTime
   DefaultValue: "00:00:00:00"
   Enabled: No
   Locked: Yes
4. قم بإضافة زر أمر على النموذج وتعيين الخصائص التالية لزر الأمر:
Name: btnStartStop
   Caption: Start
   OnClick: [Event Procedure]
5. قم بإضافة زر أمر ثاني إلى النموذج وتعيين الخصائص التالية لزر الأمر الثاني:
Name: btnReset
   Caption: Reset
   OnClick: [Event Procedure]
6. انقر فوق الرمز في القائمة عرض لفتح المحرر. اكتب الأسطر التالية في مقطع Declarations:
Option Explicit
Dim TotalElapsedMilliSec As Long
Dim StartTickCount As Long
Private Declare Function GetTickCount Lib "kernel32" () As Long
7. قم بتعيين الخاصية OnTimer من النموذج إلى إجراء الحدث التالي:
Private Sub Form_Timer ()

   Dim Hours As String
   Dim Minutes As String
   Dim Seconds As String
   Dim MilliSec As String
   Dim Msg As String
   Dim ElapsedMilliSec As Long

   ElapsedMilliSec = (GetTickCount() - StartTickCount) + _
      TotalElapsedMilliSec

   Hours = Format((ElapsedMilliSec \ 3600000), "00")
   Minutes = Format((ElapsedMilliSec \ 60000) Mod 60, "00")
   Seconds = Format((ElapsedMilliSec \ 1000) Mod 60, "00")
   MilliSec = Format((ElapsedMilliSec Mod 1000) \ 10, "00")

   Me!ElapsedTime = Hours & ":" & Minutes & ":" & Seconds & ":" _
      & MilliSec

End Sub
8. قم بتعيين الخاصية OnClick من زر أمر btnStartStop إلى إجراء الحدث التالي:
Private Sub btnStartStop_Click()

   If Me.TimerInterval = 0 Then
      StartTickCount = GetTickCount()
      Me.TimerInterval = 15
      Me!btnStartStop.Caption = "Stop"
      Me!btnReset.Enabled = False
   Else
      TotalElapsedMilliSec = TotalElapsedMilliSec + _
         (GetTickCount() - StartTickCount)
      Me.TimerInterval = 0
      Me!btnStartStop.Caption = "Start"
      Me!btnReset.Enabled = True
   End If

End Sub
9. قم بتعيين الخاصية OnClick من زر أمر btnReset إلى إجراء الحدث التالي:
Private Sub btnReset_Click()
   TotalElapsedMilliSec = 0
   Me!ElapsedTime = "00:00:00:00"
End Sub

10. افتح النموذج وتمتع بالنتيجة

المثال : StopWatch.rar

مع وافر الاحترام

قام بنشر (معدل)

المثال الثالث عشر

إنشاء حدث جديد في النموذج اسمه AfterUndo لمعالجة مشكلة تغيير الحسابات الناتجة عن ضغط زر التراجع

المقدمة

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

التفاصيل

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

لإنشاء إجراء AfterUndo اتبع هذه الخطوات:

1. افتح النموذج الذي تريد إضافة إجراء AfterUpdate في طريقة العرض " تصميم " ، ثم أضف مربع نص ذو الخصائص التالية إلى النموذج:

Name: txtEditModeChange
   ControlSource: =[Form].[Dirty] & CheckUndo([Form])
   Visible: No
2. إضافة إجراء الحدث التالي إلى الخاصية AfterUpdate من النموذج:
Sub Form_AfterUpdate ()

   PrevBookmark = Null

End Sub
3. إنشاء وحدة نمطية ثم اكتب السطر التالي في مقطع Declarations:
Option Explicit
Dim PrevBookmark
4. اكتب الإجراء التالي:
Function CheckUndo (F As Form) As Variant
         
   Dim CurrBookmark

   If Not F.Dirty Then
      On Error Resume Next
      CurrBookmark = F.bookmark

      If Err Then CurrBookmark = "NewRecord"

         AfterUndo
      Else
               PrevBookmark = CurrBookmark
      End If
   End If

End Function

Sub AfterUndo ()
End Sub
5. تعديل التعليمات البرمجية في إجراء AfterUndo (تم إنشاؤه في الخطوة 4) كما يلي:
Sub AfterUndo ()
   MsgBox "Record Changes Undone"
End Sub

6. عرض النموذج في طريقة العرض " نموذج ".

7. تعديل أي حقل في أي سجل في النموذج.

8. في القائمة تحرير، انقر فوق السجل تراجع عن الحقل الحالي . لاحظ أن مربع الرسالة يظهر " Undone Changes " .

9. كتابة أي نص في أي حقل في السجل الجديد.

10. اضغط المفتاح ESC . لاحظ أن مربع الرسالة يظهر " Undone Changes " .

المثال بعد تعريبه : AfterUndo.rar

مع وافر الاحترام

تم تعديل بواسطه محب العلم
قام بنشر (معدل)

المثال الرابع عشر

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

المقدمة

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

التفاصيل

مثلا من المعروف أن كلمة Hello معناها مرحبا

ماذا يحدث لو أدخلنا كلمة Halo ، Halloe ، Helo ، Hailo ، Helw بشكل خاطىء ونحن نقصد الكلمة Hello

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

post-27241-1200235254_thumb.jpg

طبعا هذا الاقتران يختلف عن المتشابهات باستخدام العامل Like و * المتوفر من أكسيس كما تلاحظون

السؤال الأهم هل يمكن استخدام الإقتران بالعكس إي من العربي إلى الإنجليزي والجواب نعم

فمثلا مرهبا ، محربا ، مرهوب ، ممورهبا كلها تعطينا الكلمة مرحبا

المثال التطبيقي : Soundex.zip

هنيئاً لصناع القواميس بهذا الإقتران الرائع

مع وافر الاحترام والتقدير

تم تعديل بواسطه محب العلم
قام بنشر (معدل)

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

أخي يوسف حفظك الله من كل سوء ،

أشكرك جزيل الشكر على هذا المجهود الطيب ، وفعلا اصبحت المواضيع هكذا مرجعا يسهل التعامل معه

مع وافر الاحترام والتقدير

تم تعديل بواسطه محب العلم

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

زائر
اضف رد علي هذا الموضوع....

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • تصفح هذا الموضوع مؤخراً   0 اعضاء متواجدين الان

    • لايوجد اعضاء مسجلون يتصفحون هذه الصفحه
×
×
  • اضف...

Important Information