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

سلسلة الأمثلة المشروحة


محب العلم

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

السلام عليكم

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

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

أملا من المولى أن يوفقني وأياكم لهذا العمل الذي لا ابتغي من خلاله إلا رضى الله سبحانه وتعالى.

تحياتي لكم

رابط هذا التعليق
شارك

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

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

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

سر على بركة الله

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

تقبل اجمل وارق تحية :fff::gift2:

رابط هذا التعليق
شارك

المثال الأول

كيف نحاكي قدرات الجر والإفلات drag-and-drop في أكسيس .

المقدمة

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

الإجراءات

الاجراءات الأربعة الآتية سيتم استخدامها في هذا المثال وهي :

Sub DragStart(SourceFrm As Form)
هذا الاجراء يستخدم النموذج المصدر sourceFrm الذي يحتوي على عنصر التحكم الذي سيتم جره (يعني جر البيانات التي فيه)
Sub DragStop()
هذا الإجراء لإيقاف عملية الجر
Sub DropDetect(DropFrm As Form, DropCtrl As Control, _
                Button As Integer, Shift As Integer, _
                x As Single, Y As Single)
حيث :
  • DropFrm النموذج الذي ستفلت فيه البيانات
  • DropCtrl العنصر الذي ستفلت فيه البيانات
  • Button، X، Y المعلمات التي سنحصل عليها من حدث MouseMove
هذا الإجراء يمكن عنصر تحكم من أن يكون عنصر الإفلات (الذي سنعبىء البيانات فيه) ، يجب أن يطلب هذا الإجراء في حدث MouseMove للعنصر للذي يمكن أن يكون الهدف (الذي ستفلت عنده البيانات)
Sub DragDrop(DragFrm As Form, DragCtrl As Control, DropFrm As Form, DropCtrl As Control, _
              Button As Integer, Shift As Integer, x As Single, Y As Single)

حيث :

  • DragFrm النموذج الذي سنجر منه
  • DragCtrl العنصر الذي سنجر منه
  • DropFrm النموذج الذي سنفلت فيه البيانات
  • DropCtrl العنصر الذي سنفلت فيه البيانات
  • Botton وضع أزرار الماوس عند عملية الإفلات
  • وضع زر Shift ALt Ctrl عند إجراء الإفلات
  • X,Y إحداثيات الماوس عند تنفيذ عملية الإفلات
هذا الإجراء سيتم طلبه للإستجابة على عملية الجر والإفلات من عنصر مفعل لأن يكون عنصر جر إلى عنصر مفعل لأن يكون عنصر إفلات. في هذا الإجراء يمكن أن نعدل في الكود كي يتناسب مع ما نحتاجه أو ما نريد عمله على سبيل المثال يمكن أن تنسخ محتويات العنصر المجرور في العنصر المستقبل (عنصر الإفلات)

ملاحظات حول تطبيق المثال

1. ملاحظة الوحدة النمطية basdragdrop والتي تحتوي على الإجراءات المشار إليها أعلاه

2. لاحظ حقل ysnSelected الموجود في الجدول tblDragListBox

3. ملاحظة جميع الإحداث المعرفة على عنصري التحكم مربع قائمة list1 و list2 في النموذج frmDragDropListBoxes

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

DragDrop.rar

تحياتي

  • Like 1
رابط هذا التعليق
شارك

شكرا للجميع على التشجيع والدعم ،

ما زلنا في نفس الموضوع وهو

محاكاة قدرات الجر والإفلات drag-and-drop في أكسيس

المقدمة

كما ذكرت سابقا في أكسيس لا يوجد حدث معرف لعملية الجر والإفلات (DragDrop) كما هو الحال في فيجوال بيسك.

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

الإجراءات

 

Sub DragDrop(DragFrm As Form, DragCtrl As Control, DropFrm As Form, DropCtrl As Control, _
              Button As Integer, Shift As Integer, x As Single, Y As Single)
   ' Which form was dropped on?
   ' It is a good idea to use the DragDrop procedure to
   ' determine which drag-and-drop operation occurred; then call
   ' appropriate code to handle the special cases.
   Select Case DropFrm.Name
      Case "frmDragDropListBoxes"
         ListBoxExample DragFrm, DragCtrl, DropFrm, DropCtrl, _
                        Button, Shift, x, Y
      Case Else
         ' For all other cases, copy contents of Drag to Drop
         ' control.
         On Error Resume Next
         DropCtrl = DragCtrl
         If Err Then MsgBox Error$
   End Select
End Sub 

Sub ListBoxExample(DragFrm As Form, DragCtrl As Control, DropFrm As Form, DropCtrl As Control, _
                    Button As Integer, Shift As Integer, x As Single, Y As Single)
   
    Dim conn As ADODB.Connection
    Dim strSQL As String
    
    Set conn = CurrentProject.Connection
    
    ' create SQL statement to update Selected field of
    ' .. drag/dropped list box item.
    strSQL = "UPDATE tblDragListBox SET ysnSelected=" 

    ' drag from List1 toggle Selected=True, List2 toggles False.
    strSQL = IIf(DragCtrl.Name = "List1", strSQL & "True", strSQL & "False")
    
    ' if CTRL key not used, alter dragged value only.
    If (Shift And CTRL_MASK) = 0 Then
        strSQL = strSQL & " WHERE pkeyCustomerID ='" & DragCtrl & "'"
    End If 

    ' run update query to toggle Selected field of Customer record(s).
    conn.Execute strSQL 

    ' requery the list box controls to show update lists.
    DragCtrl.Requery
    DropCtrl.Requery End Sub
لننتبه جيدا كيف يتم تكييف الإجراءات حسب المسألة : أولا : نلاحظ أن إجراء الإفلات لا يتغير والذي يغير طبيعة (نتيجة) الإفلات هو استدعاء إجراء العمل وهو الذي يتغير من مثال إلى أخر
Case DropFrm.Name
      Case "frmDragDropListBoxes"
         ListBoxExample DragFrm, DragCtrl, DropFrm, DropCtrl, _
                        Button, Shift, x, Y
      Case Else
         ' For all other cases, copy contents of Drag to Drop
         ' control.
         On Error Resume Next
         DropCtrl = DragCtrl
         If Err Then MsgBox Error$
   End Select

لاحظ أن هذا الكود يخدم المثالين فإذا كان النموذج frmdragdroplistboxes مفتوحا (وهو المثال الأول) فإنه يتم استدعاء الإجراء الخاص بذلك وهو في هذه الحالة ListBoxEaxmple وعدا ذلك تتم فقط عملية الإفلات يعني في المثال الثاني وهو عملية الجر من نموذج والإفلات في أخر تتم العملية ببساطة من خلال الأمر DropCtrl = DragCtrl وهذه هي أبسط عمليات الإفلات أن نعبء البيانات في حقل الإفلات دون أي إجراء إضافي.

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

DragDrop12.rar

تحياتي

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

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

ما زلنا في موضوعنا الأول وهو

محاكاة قدرات الجر والإفلات drag-and-drop في أكسيس

المقدمة

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

post-27241-1198162966_thumb.jpg

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

الإجراءات

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

 

Private Sub c1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
 DragStart Me

End Sub

Private Sub c1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
   DropDetect Me, Me![c1], Button, Shift, X, Y
   
End Sub

Private Sub c1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
   DragStop
End Sub
وحدث مربع النص المستقبل الذي سيتم عنده الإفلات وهو
Private Sub dropto_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
DropDetect Me, Me![dropto], Button, Shift, X, Y
End Sub
وطبعا في النهاية لا ننسى وضع الكود المناسب في الوحدة النمطية لإجراء عملية التلوين ويتم ذلك كالأتي :
 

Sub Example3(DragFrm As Form, DragCtrl As Control, DropFrm As Form, DropCtrl As Control, _
                    Button As Integer, Shift As Integer, X As Single, Y As Single)
    
    DropCtrl.ForeColor = DragCtrl.ForeColor
    DropCtrl.Requery

End Sub

هذا كل شيء، كما ترون أن الأمر بسيط بعد أن تم فهمه

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

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

تحياتي

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

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

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

كيفية فتح مثيلات متعددة من نموذج MultipleInstance

المقدمة

هذا المثال يوضح كيفية استخدام VBA : Visual Basic for Applications لفتح المثيلات المتعددة لنموذج (نسخ عن النموذج) ويمكنك هذا من الاستفادة من هذه المثيلات باستطلاع عدة سجلات معا في آن واحد وبالتأكيد فإن الفائدة ستكون كبيرة في مجالات عدة.

التقاصيل

إن فتح مثيلات النموذج يتضمن بناء الجملة Set وذلك بواسطة عبارة تعيين الكلمة الأساسية (جديد) ومرجع للنموذج كما في المثال الآتي :

Set x = New Form_Form1

لأنك لا تستتخدم الكلمة الأساسية New لإنشاء مثيل جديد من كائن خفيف (lightweight Object)، فيجب تعيين الخاصية HasModule الخاصة به إلى True يعني للنموذج الذي تنوي استخدام الكلمة الأساسية جديد New له.

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

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

ولفهم تطبيق هذا المثال وكيفية فتح المثيلات المتعددة من نموذج، يجب ملاحظة الخطوات الآتية :

1. تعيين خاصية HasModule له كائن إلى true كما ذكرنا سابقا كالآتي :

post-27241-1198257410_thumb.jpg

2. حدث الضغط على زر أمر فتح مثيل جيد عن النموذج

 

Private Sub cmdOpen_Click()

 Set frmNewForm = New Form_frmMultipleInstance
      
    frmNewForm.SetFocus
   
    intInstanceNum = intInstanceNum + 1
    
     frmNewForm.Caption = "المثيل رقم - " & intInstanceNum     
End Sub
لاحظ هنا أننا أولا نطلب مثيل جديد عن النموذج وما مكننا من ذلك هو التعريف في الخطوة 1 وثم ننقل التركيز إلى النموذج الجديد ونطلق عليه (المثيل رقم - ؟) حيث يستخدم المتغير intInstanceNum لمتابعة ارقام المثيلات التي تفتح. 3. حدث فتح النموذج الأصلي
 

Private Sub Form_Open(Cancel As Integer)

    DoCmd.MoveSize xPos, yPos
    
     xPos = xPos + 300
    yPos = yPos + 300
    
End Sub
يتم تعريف المتغير xPos و yPos و intInstanceNum في الوحدة النمطية بشكل Public لتعرف في كل مكان ويتم تحديد موقع ظهور النموذج ومثيلاته بإزاحة بالإتجاه الأفقي من اليسار إلى اليمين والعمودي من الأعلى للأسفل بمقدار 300 نقطة (pixel) لئلا تفتح النماذج فوق بعضها. 4. ما الذي يغلق المثيلات عندما يغلق الأصيل علما أنه لا يوجد في حدث الأغلاق أي كود يتعلق بذلك ؟
 

Private Sub Form_Close()

    xPos = 300
    yPos = 300
    intInstanceNum = 0
    
End Sub

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

إليكم المثال بعد تعريبه :

MultipleInstance.rar

تحياتي

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

تحية حب وتقدير لك اخي محب العلم على هذه المجهودات الرائعة

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

والشكر موصول لاخي عمار زيد على التثبيت

رابط هذا التعليق
شارك

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

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

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

وكل عام وأنتم بخير

أخوكم

رابط هذا التعليق
شارك

أبأ أكرم (أكرمك الله) ويوسف ومعروف شكرا لكم جميعا

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

كيفية استخدام عدداً ثابتاً من السطور في صفحات التقرير

المصدر : مثال من تصميم المشرف Dream_Works

المقدمة

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

التفاصيل

1. للتحكم بعدد السطور يجب تعريف متغيرا يحدد فيه قيمة عدد السطور المطلوبة كالأتي :

Dim OnePageRecords As Byte

2. في حدث عند الفتح للتقرير نعرف قيمة هذا المتغير وهي عدد السطور المرغوب بها هكذا

Private Sub Report_Open(Cancel As Integer)
  OnePageRecords = 15
End Sub
3. في حدث عند التنسيق لقسم التفصيل في التقرير نقوم بزيادة هذا المتغير زيادة رتيبة مقدارها 1 هكذا
Private Sub تفصيل_Format(Cancel As Integer, FormatCount As Integer)
Static Count As Byte
  Count = Count + 1
  If Count = OnePageRecords Then
    Count = 0
    Me.Section(acDetail).ForceNewPage = 1
  End If
End Sub
لاحظ أن Me.Section(acDetail).ForceNewPage = 1 هذا السطر هو الذي سيفرض صفحة جديدة عند وصولنا إلى عدد السطور المطلوب. 4. ومهم جدا لكي تتم العملية بالشكل المطلوب تعريف ما يلي في حدث االصفحة page للتقرير
Private Sub Report_Page()
  Me.Section(acDetail).ForceNewPage = 0
End Sub

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

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

ملاحظة مهمة: لاحظ التعريف Static Count As Byte لأنه مهم بهذه الطريقة (يعني static ) وإذا عرفناه بطريقة أخرى لن يعمل لأن Static تعرف المتغير غلى مستوى الإجراء وتحتفظ بقيمته طالما الكود شغال .

كما تلاحظون فإننا قمنا بتثبيت عدد السطور داخل حدث عند الفتح للتقرير وهذا غير مفضل خصوصاً عندما نطلبه من نموذج،حيث أننا يمكن أن نحتاج أن نغيره في كل مرة نطلبه وهذا يكون من خلال تعيين قيمته بواسطة خاصية openargs وذلك لو طلبنه من النموذج كما يأتي:

post-27241-1198336134_thumb.jpg

وإليكم المثال للتجربة : Report.rar

تحياتي

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

:gift2: ألف مبارك لك الترقية أستاذنا الحبيب :gift2:

:wavetowel: تستحق تعظيم سلام :wavetowel:

وإن شاء الله ترقية في الدنيا والآخرة

:fff: تقبل تهنئتي الحارة ومحبتي القلبية :fff:

رابط هذا التعليق
شارك

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

جهد مبارك وجميل

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

بكل صدق واخوه ... اشجعك على الاستمرار فهو علم لك ولمن حولك

فعليك بالعزم و العزيمة

رابط هذا التعليق
شارك

الأخوة أبا أكرم (أكرمك الله) و أبا أدم (أدامك الله) وجمال شكرا لكم جميعا على الدعم والتشجيع، وشكرا لمشرفينا على الترقية

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

طريقة مثلى لإحضار المجموع الفرعي SubTotal من النموذج الفرعي إلى النموذج الرئيسي دون مشاكل

المقدمة

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

التفاصيل

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

التعبير الآتي في عنصر تحكم نموذج رئيسي على سبيل المثال، ينشئ رسالة إعلام بالخطأ "? Name# " الرسالة غير المرغوب بها:

=Sum([MySubForm].Form![ExtendedPrice])

حيث MySubForm هو اسم النموذج الفرعي

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

أنظر كيف يتم تعريف قيمة المجموع الفرعي في النموذج الفرعي

post-27241-1198429184_thumb.jpg

وأنظر كيف نطلبها من النموذج الرئيسي

post-27241-1198429987_thumb.jpg

وأنظر نتيجة هذا العمل الرائع

post-27241-1198429518_thumb.jpg

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

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

تحياتي

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

السلام عليكم

أخي محب العلم

جزاك الله خيرً , وعندي اقتراح بسيط بأن تقوم بإرفاق ملف PDF لكل درس تقوم بإرساله كيف يتم إرفاقه مع المثال وبهذا يكون مرجع للأعضاء

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

رابط هذا التعليق
شارك

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