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

*فورم* فوائد حول مربع التحرير والسرد

مغلق
بدأه ابو حازم في 7 سبتمبر 2001 · 23 رد · 4,504 مشاهدة · في قسم الأرشيف و المواضيع المميزه
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

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

إختيار إسم المدينة ومن خصائصة الإلتزام بالقائمة ، وعند عدم الوجود في

القائمة يظهر مربع حوار يطلب من المستخدم الإختيار من القائمة او النقر

المزدوج لإضافة مدينة إلى القائمة. وبعد النقر المزدوج يضهر نموذج آخر وهو

نموذج لكتابة اسم المدينة الجديدة وبعد إغلاقه يضهر إسم المدينة الجديدة

ضمن مربع التحرير والسرد ولكن عند النقر المزدوج مرة اخرى وإضافة مدينة

جديدة اخرى وإغلاق نموذج الإضافة والبحث عن إسم المدينة ضمن مربع التحرير

والسرد يتضح انها غير موجودة !‍ وهي في الواقع موجودة ضمن جدول النموذج..

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

ولكن في إعتقادي انها غير عملية إلا حدٍ ما.

السؤال هنا لماذا عند كتابة إسم المدينة الأول يتم التعرف علية من قبل

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

التحديث او إغلاق النموذج وفتحه مرة اخرى ..

شكرً لجهودكم الرائعة في هذا المجال .

#2

اكتب كود النقر المزدوج فقد يكون هناك خطأ .

ثانيا لماذا وضعت الإضافة في حدث النقر المزدوج ولم تضعها في حدث عند عدم الوجودفي القائمة ؟

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

ولك تحياتي

#3

الأخ أبو حازم :اكتب الكود التالي في خصائص مربع التحرير والسرد عند التركيز إجراء حدث:

Private Sub اسم مربع التحرير والسرد_GotFocus()

Me.اسم مربع التحرير والسرد.Requery

End Sub

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

#4

الأخ حارث

أبشر بما طلبت وزياده .

والجواب على السؤال نعم يضيفها إلى الجدول .

وهذه خمس طرق للإضافة :

أولاً : طريقة للإضافة الى القائمة بدون الحاجة لإظهار نموذج :

1- ضع التزام بالقائمة إلى نعم

2- في حدث عند عدم الوجود في القائمة ضع الإجراء التالي :

On Error GoTo HandleErr

Dim db As Database

Dim strSQL As String

Const فاصلة = """"

strSQL = "Insert into اسم الجدول (اسم حقل بيانات القائمة في الجدول) Values " _

& "(" & فاصلة & NewData & فاصلة & ")"

Set db = CurrentDb

If MsgBox("هل ترغب في إضافة هذا البند إلى القائمة ؟", vbYesNo, "تسجيل بند جديد") = vbYes Then

db.Execute strSQL

Response = acDataErrAdded

Else

Response = acDataErrDisplay

End If

ExitHere:

Exit Sub

HandleErr:

Select Case Err

Case Else

MsgBox Err & ": " & Err.Description, , "خطأ"

End Select

Resume ExitHere

3- حدد كلمتي "اسم الجدول" ثم غيرهما الى اسم الجدول الذي تأخذ القائمة البيانات منه ، لاحظ أنه إذا كان اسم الجدول مركب من كلمتين فأكثر فضعه بين قوسين مربعين مثال : [جدول الأسماء] .

4- حدد عبارة "اسم حقل بيانات القائمة في الجدول" واستبدلها باسم الحقل في الجدول ، انتبه اسم الحقل في الجدول الذي تأخذ القائمة البيانات منه .

5- إذا أردته أن يضيف مباشرة دون رسالة فأزل العبارة الشرطية If .

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

في حدث عند عدم الوجود في القائمة اكتب مع تعديل الأسماء :

Response = acDataErrContinue

If MsgBox("البند غير موجود بالقائمة ." & vbCrLf & _

"هل ترغب في إضافته الى القائمة ؟", vbYesNo, "بند غير موجود") = vbYes Then

[اسم القائمة على النموذج] = DFirst("[حقل مصدر البيانات]", "[اسم الجدول]")

DoCmd.OpenForm "النموذج الذي سيتم إدخال البيانات فيه", , , , , acDialog, "gotonew"

Me![اسم القائمة على النموذج].Requery

[اسم القائمة على النموذج] = DLast("[حقل مصدر البيانات]", "[اسم الجدول]")

DoCmd.GoToControl "اكتب الحقل الذي تود الانتقال إليه بعد إدخال البيانات في القائمة"

End If

في حدث عند التحميل للنموذج اكتب :

If Me.OpenArgs = "gotonew" Then DoCmd.GoToRecord , , acNewRec

ثالثاً : طريقة للإضافة مع إظهار النموذج والإضافة إليه تلقائيا ثم إغلاقه وكتابة الكلمة أو العبارة المضافة في الحقل والانتقال الى الحقل التالي :

ملاحظة لن ترى النموذج لسرعة الإجراء .

في حدث عند عدم الوجود في القائمة اكتب :

If MsgBox("البند غير موجود بالقائمة ." & vbCrLf & _

"هل ترغب في إضافته الى القائمة ؟", vbYesNo, "بند غير موجود") = vbYes Then

Response = acDataErrAdded

DoCmd.OpenForm "اسم النموذج الذي ستضاف البيانات فيه", , , , acAdd, acDialog, NewData

Else

Response = acDataErrContinue

End If

وفي حدث عند التحميل للنموذج المذكور سابق اكتب :

If Not IsNull(Me.OpenArgs) Then

Me![اسم الحقل المبنيه عليه القائمة] = Me.OpenArgs

DoCmd.Close

End If

يعيب هذه الطريقة أنك إذا كنت تفتح هذا النموذج مع تحديد OpenArgs من نموذج آخر غير النموذج الذي تم فتح هذا النموذج منه فسوف تتم إضافة القيمة التي تحملها OpenArgs تلقائيا (لغزعبارة غامضه) ولتوضيح ذلك :

لنفرض أن اسم النموذج الذي فيه القائمة "نموذج الذي توجد فيه القائمة" والنموذج الذي ندخل فيه البيانات اسمه "نموذج تسجيل بيانات القائمة" لو طبقنا كل الكلام الوارد في ثالثا ستتم الإضافة بدون مشاكل ، ولكن لو كان لدينا نموذج آخر بأي اسم يحتاج هذا النموذج الى فتح "نموذج تسجيل بيانات القائمة" لأي غرض آخر غير الإضافة الى القائمة وكان يستخدم OpenArgs فالنتيجة ستتم إضافة قيمة OpenArgs إلى بيانات القائمة لأن النموذج عنده قصر نظر فلا يفرق بين النماذج أرجو أن تكون المسألة قد وضحت ، وكحل لذلك يمكنك استخدم دالة IsLoaded للتأكد من كون النموذج "نموذج الذي توجد فيه القائمة" مفتوح ، وإليك دالة Isloaded :

Public Function IsLoaded(ByValstrformname As String) As Integer

Const CondesignView = 0

Const ConObjectClosed = 0

IsLoaded = False

If SysCmd(acSysCmdGetObjectState, acForm, strformname) <> ConObjectClosed Then

If Forms(strformname).CurrentView <> CondesignView Then

IsLoaded = True

End If

End If

End Function

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

If IsLoaded("اسم النموذج المطلوب التأكد من كونه مفتوحاً") Then

بقيه الإجراء ...

ويعدل حدث التحميل ليكون كالتالي :

If IsLoaded("اسم النموذج المطلوب التأكد من كونه مفتوحاً") Then

If Not IsNull(Me.OpenArgs) Then

Me![اسم الحقل المبنيه عليه القائمة] = Me.OpenArgs

DoCmd.Close

End If

end if

ملاحظة : لدي طريقة أخرى للتأكد من كون نموذج مفتوح أم لا ، وكذلك طريقة للتأكد من كون التقرير مفتوحا ، إذا رغبها أحد كتبتها .

هناك تشبه الطريقة السابقة ولكن باستخدام متغير عام .

رابعا : باستخدام DAO

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

Dim db As Database

Dim rst As Recordset

If MsgBox("البند غير موجود بالقائمة ." & vbCrLf & _

"هل ترغب في إضافته الى القائمة ؟", vbYesNo, "بند غير موجود") = vbYes Then

' Response = acDataErrAdded

Set db = Application.CurrentDb

Set rst = db.OpenRecordset("اسم الجدول الذي تأخذ القائمة البيانات منه")

rst.AddNew

rst![اسم الحقل المبنيه عليه القائمة] = NewData

rst.Update

rst.Close

db.Close

Response = acDataErrAdded

[اسم القائمة على النموذج]= DLast("[حقل بيانات القائمة في الجدول]", "[اسم الجدول]")

Else

Response = acDataErrContinue

End If

End Sub

خامساً : باستخدام ADO

في حدث عند عدم الوجود في القائمة اكتب

If MsgBox("البند غير موجود بالقائمة ." & vbCrLf & _

"هل ترغب في إضافته الى القائمة ؟", vbYesNo, "بند غير موجود") = vbYes Then

Dim rst As New ADODB.Recordset

rst.Open "[جدول الأسماء]", CurrentProject.Connection, _

adOpenStatic, adLockOptimistic

rst.AddNew

rst![اسم الحقل المبنيه عليه القائمة] = NewData

rst.Update

rst.Close

Response = acDataErrAdded

[اسم القائمة على النموذج]= DLast("[حقل بيانات القائمة في الجدول]", "[اسم الجدول]")

Else

Response = acDataErrContinue

End If

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

=======================================

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

=======================================

إظهار البند التالي في قائمة منسدلة عند النقر المزدوج

ضع في وحدة نمطية عامة الدالة التالية :

Public Function عرض_بنود_القائمة(قائمة As ComboBox)

Dim مجموع_الإدخالات As Byte, رقم_فهرس_حالي As Byte

مجموع_الإدخالات = قائمة.ListCount

If مجموع_الإدخالات = 0 Then

DoCmd.Beep

MsgBox "لايوجد أي بند مسجل في القائمة .", vbMsgBoxRight + vbMsgBoxRtlReading + vbInformation, "قائمة فارغة"

Exit Function

End If

If قائمة.ListIndex <> -1 Then

رقم_فهرس_حالي = قائمة.ListIndex

End If

If رقم_فهرس_حالي <> مجموع_الإدخالات And قائمة.ListIndex <> -1 Then

قائمة = قائمة.ItemData(رقم_فهرس_حالي + 1)

Else

قائمة = قائمة.ItemData(0)

End If

If قائمة.ListIndex = -1 Then قائمة = قائمة.ItemData(0)

End Function

وضع الاستدعاء التالي لها في حدث عند النقر المزدوج للقائمة :

Call عرض_بنود_القائمة(Me![اسم القائمة])

ولك تحياتي

#5

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

شكراً ابو حمود وحارث على تعاونكم.

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

التعبير بدلاً من إضهار محتويات الحقل.

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

في القائمة طلبت ان يضهر مربع حوار هو (انقرنقراً مزدوجاً لإضافة مدينة إلى القائمة)

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

وضيفته فتح نموذج الإضافة فقط .

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

تحت قائمتة. يااخوان هل يعقل عند قتح نموذج ادخال البيانات من قبل المستخدم

لإضافة سجلات جديدة وحاجتة في إضافة اكثر من مدينة أن لا يتمكن من سرد

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

مربع التحرير إلا بعد تحديث النموذج اوإغلاقه وفتحة مرة أخرى؟

#6

الأخ أبو حازم : أنا أطبق نفس العملية التي تقوم بها بالضبط وهي موجودة فى الأمثلة مع أكسيس 97 أو 2000 وتعمل معي زي الحلاوة

قارن هنا بالكود الذي كتبته مع الكود الذي تشتغل به أنت عند حدث النقر المذدوج قد تجد اختلاف يحل مشكلتك

Dim lngEmployeeID As Long

If IsNull(Me![st_loca]) Then

Me![st_loca].Text = ""

Else

Me![st_loca] = Null

End If

DoCmd.OpenForm "F_location", , , , , acDialog, "GotoNew"

Me![st_loca].Requery

If lngEmployeeID <> 0 Then Me![st_loca] = lngEmployeeID

أو انسخ هذا الكود مع تغيير اسم النموذج واسم الحقل لديك

أشرف خليل

#7

الأخ ابوحازم

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

كل المشكلة أن القائمة بحاجة الى تحديث لإظهار البيانات الجديدة والسطر :

Me![st_loca].Requery

المذكور في كود أشرف هو الخاص بتحديث القائمة .

الأخ أشرف

السطر الأخير أنا ماني مطمن له أظن مسحه أفضل .

وللجميع تحياتي

#8

الأخ العزيز أبو حمود

شكرا على رد اللطيف ولو أنني أعتبرك الأستاذ الكبير

عندك حق فى السطر الأخير هذا

lngEmployeeID <> 0 Then Me![st_loca] = lngEmployeeID

ولكنه مرتبط بالسطر الأول هذا

Dim lngEmployeeID As Long

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

وعلى فكرة يا شياب حاولوا البحث فى الأمثلة التي مع الأكسيس فهي مليئة بالأشياء التي نحتاجها

أشرف خليل

#9

الأخ أشرف

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

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

ولك تحياتي

#10

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

من التلميذ المبتدئ إلى الخريجين العباقره..

بعد الصلاة على افضل الخلق والمرسلين ومن رحاب طيبة الطيبة لايسعني إلا ان اقدم لكم

الشكر والإمتنان على ماقدمتموة.

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

واخيراً أُحييكم على هذه الروح العالية.

#11

طيب انحلت المشكلة وإلا لا .

الأمر الثاني كن كثير الأسئلة فيما يفيدك كثير المتابعة ولك تحياتي .

#12

إنحلت المشكلة ياعزيزي والف شكر لك وللإخوان.

#13

السلام عليكم اخواني الكرام

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

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

وشكرا

#14

فتى الصحراء

طريقة وضع جدول لكل قائمة هذه الطريقة تجعل الكائنات تكثر بدون داع خاصة إذا كانت بيانات القوائم قليلة .

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

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

الكود التالي ضعه في حدث عند عدم الوجود في القائمة مع تغيير خاصية التزام بالقائمة الى نعم :

INSERT INTO [جدول بيانات القوائم] ( [بيانات القوائم], [اسم القائمة], [اسم النموذج] )

SELECT & علامة & NewData & علامة & AS بيانات, 'امسح هذه العبارة واكتب هنا اسم القائمة' AS قائمة, 'امسح هذه العبارة واكتب اسم النموذج' AS نموذج

WITH OWNERACCESS OPTION;

ولك تحياتي

#15

شكرا لك يابوحمود

وإن شاء الله أنجح في تطبيق ذلك

#16

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

أخوك حارث

#17

الأخ حارث

أشكرك على كلامك الطيب ، وثق أن أكثر ما يهمني أن أقرأ أن العضو قد طبق ما كتبته وعمل معه ، فهنا أحس أن تعبي وكتابتي لم تضع سدى وأن هناك من استفاد منها .

والله يحفظك ويرعاك .

ولك تحياتي

#18

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

الطريقة الأولى :

السهم العلوي للبند السابق

السهم السفلي للبند التالي

السهم العلوي +Shift أول بند في القائمة

السهم السفلي+Shift آخر بند في القائمة

في حدث عند مفتاح للأعلى للقائمة اكتب

[اسم القائمة المنسدلة].SelLength = 0

استعراض_بنود_القائمة Me!مربع_تحرير_وسرد0, KeyCode, Shift

[اسم القائمة المنسدلة].SelLength = 0

وفي الوحدة النمطية لنموذج اكتب :

Private Function استعراض_بنود_القائمة(قائمة As ComboBox, KeyCode As Integer, Shift As Integer)

Dim مجموع_الإدخالات, رقم_فهرس_حالي As Integer

' لمنع التكرار

If KeyCode = 16 And Shift = 1 Then Exit Function

مجموع_الإدخالات = قائمة.ListCount

If مجموع_الإدخالات = 0 Then

DoCmd.Beep

MsgBox "لايوجد أي بند مسجل في القائمة .", vbMsgBoxRight + vbMsgBoxRtlReading + vbInformation, "قائمة فارغة"

Exit Function

End If

' معرفة رقم الفهرس الحالي تمهيدا للزيادة عليه أو النقص منه

If قائمة.ListIndex <> -1 Then

رقم_فهرس_حالي = قائمة.ListIndex

End If

' إظهار أول بندا في القائمة

If KeyCode = 38 And Shift = 1 Then

قائمة = قائمة.ItemData(0)

Exit Function

End If

' إظهار آخر بندا في القائمة

If KeyCode = 40 And Shift = 1 Then

قائمة = قائمة.ItemData(مجموع_الإدخالات - 1)

Exit Function

End If

If KeyCode = 38 And Shift = 0 Then

If رقم_فهرس_حالي = 0 And قائمة.ListIndex <> -1 Then

قائمة = قائمة.ItemData(مجموع_الإدخالات - 1)

Else

قائمة = قائمة.ItemData(رقم_فهرس_حالي - 1)

End If

End If

If KeyCode = 40 And Shift = 0 Then

If رقم_فهرس_حالي = مجموع_الإدخالات And قائمة.ListIndex <> -1 Then

قائمة = قائمة.ItemData(0)

Else

قائمة = قائمة.ItemData(رقم_فهرس_حالي + 1)

End If

End If

If قائمة.ListIndex = -1 Then قائمة = قائمة.ItemData(0)

End Function

======================

الطريقة الثاني بواسطة حدث عند عدادا الوقت :

ولإظهار البند التالي تلقائيا من الأعلى أو من الأسفل :

اضغط Ctrl+Shift يعني اضغط على Ctrl وواصل الضغط ثم انقر Shift مرة واحدة للإستعراض من البند المسجل أخيرا الى البند المسجل أولا (من أسفل القائمة إلى أعلاها) .

اضغط Shift+Ctrl يعني اضغط على Shift وواصل الضغط ثم انقر Ctrl مرة واحدة للإستعراض من البند المسجل أولا الى البند المسجل أخيرا(من أعلى القائمة إلى أسفلها)

ولإيقاف الاستعراض اضغط Ctrl أو Shift مرة واحدة فقط بدون مواصلة .

في حدث عند مفتاح للأعلى ضع

عرض_تلقائي Me, Me![اسم القائمة المنسدلة], KeyCode, Shift

ثم ضع الدالة التالية في الوحدة النمطية الخاصة بالنموذج :

Private Function عرض_تلقائي(النموذج As Form, القائمة As ComboBox, KeyCode As Integer, Shift As Integer)

Dim NumSecond As Integer

' تحديد سرعة إظهار البند كل 1000 تساوي ثانية واحدة

NumSecond = 1000

If النموذج.TimerInterval <> 0 Then

If KeyCode = 17 And Shift = 2 _

Or KeyCode = 16 And Shift = 1 Then

النموذج.TimerInterval = 0

Exit Function

End If

End If

If KeyCode = 16 And Shift = 3 Then ' البند التالي

النموذج.TimerInterval = NumSecond

النموذج.OnTimer = "=استعراض_بنود_القائمة(" & القائمة.Name & ", 40, 0)"

End If

If KeyCode = 17 And Shift = 3 Then ' البند السابق

النموذج.TimerInterval = NumSecond

النموذج.OnTimer = "=استعراض_بنود_القائمة(" & القائمة.Name & ", 38, 0)"

End If

End Function

Private Function استعراض_بنود_القائمة(قائمة As ComboBox, KeyCode As Integer, Shift As Integer)

Dim مجموع_الإدخالات, رقم_فهرس_حالي As Integer

' لمنع تكرار الضغط

If KeyCode = 16 And Shift = 1 Then Exit Function

مجموع_الإدخالات = قائمة.ListCount

If مجموع_الإدخالات = 0 Then

DoCmd.Beep

MsgBox "لايوجد أي بند مسجل في القائمة .", vbMsgBoxRight + vbMsgBoxRtlReading + vbInformation, "قائمة فارغة"

Exit Function

End If

' معرفة رقم الفهرس الحالي تمهيدا للزيادة عليه أو النقص منه

If قائمة.ListIndex <> -1 Then

رقم_فهرس_حالي = قائمة.ListIndex

End If

'MsgBox رقم_فهرس_حالي

' إظهار أول بندا في القائمة

If KeyCode = 38 And Shift = 1 Then

قائمة = قائمة.ItemData(0)

Exit Function

End If

' إظهار آخر بندا في القائمة

If KeyCode = 40 And Shift = 1 Then

قائمة = قائمة.ItemData(مجموع_الإدخالات - 1)

Exit Function

End If

If KeyCode = 38 And Shift = 0 Then

If رقم_فهرس_حالي = 0 And قائمة.ListIndex <> -1 Then

قائمة = قائمة.ItemData(مجموع_الإدخالات - 1)

Else

قائمة = قائمة.ItemData(رقم_فهرس_حالي - 1)

End If

End If

If KeyCode = 40 And Shift = 0 Then

If رقم_فهرس_حالي = مجموع_الإدخالات And قائمة.ListIndex <> -1 Then

قائمة = قائمة.ItemData(0)

Else

قائمة = قائمة.ItemData(رقم_فهرس_حالي + 1)

End If

End If

If قائمة.ListIndex = -1 Then قائمة = قائمة.ItemData(0)

End Function

===============

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

فضع في حدث عند النقر للقائمة

عرض_تلقائي Me, Me![اسم القائمة المنسدلة], 17, 2

وغير حدث عند مفتاح للأعلى للآتي :

[اسم القائمة المنسدلة].Dropdown

عرض_تلقائي Me, Me![اسم القائمة المنسدلة], KeyCode, Shift

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

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

وللجميع التحية

#19

الأخ العزيز أبو حمود

والله رهيب على أمثلتك الرائعة والتي كم هي تضفي جمالا ورونقاً على البرنامج .

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

عموما طريقه مفيده ، جديده ، خفيفه .

أشرف خليل

#20

الأخ أشرف

قد تكون المشكلة في الكيبورد لديك جرب مرة أخرى لأن الكود ليس فيه مايمنع استخدام Enter لإخفاء الرسالة .

جرب الكود الثاني فهو أريح خاصة للكسولين من أمثالي .

ولك تحياتي

#21

الأخ أشرف

لقد جربت الكود السابق وظهر لي فيه عيب وهو أنه يمنع تحديد البيانات (بضغط Shfit+Home أو Shift+End) بعد اختيارها من القائمة يمنع نسخها ولأن المستخدم قد يحتاج لنسخ أحد بنود القائمة فقد عدلت الكود السابق إلى التالي :

في حدث عند مفتاح للأعلى للقائمة ضع :

استعراض_بنود_القائمة Me![اسم القائمة], KeyCode, Shift

وفي الوحدة النمطية الخاصة بالنموذج ضع :

Private Function استعراض_بنود_القائمة(قائمة As ComboBox, KeyCode As Integer, Shift As Integer)

Dim مجموع_الإدخالات, رقم_فهرس_حالي As Integer

' لمنع عدم تحديد بيانات القائمة وكذلك منع أي مفتاح آخر

If KeyCode <> 38 And KeyCode <> 40 Then Exit Function

If Shift <> 1 And Shift <> 0 Then Exit Function

مجموع_الإدخالات = قائمة.ListCount

If مجموع_الإدخالات = 0 Then

DoCmd.Beep

MsgBox "لايوجد أي بند مسجل في القائمة .", vbMsgBoxRight + vbMsgBoxRtlReading + vbInformation, "قائمة فارغة"

Exit Function

End If

' معرفة رقم الفهرس الحالي تمهيدا للزيادة عليه أو النقص منه

If قائمة.ListIndex <> -1 Then

رقم_فهرس_حالي = قائمة.ListIndex

End If

' إظهار أول بندا في القائمة

If KeyCode = 38 And Shift = 1 Then

قائمة = قائمة.ItemData(0)

Exit Function

End If

' إظهار آخر بندا في القائمة

If KeyCode = 40 And Shift = 1 Then

قائمة = قائمة.ItemData(مجموع_الإدخالات - 1)

Exit Function

End If

If KeyCode = 38 And Shift = 0 Then

If رقم_فهرس_حالي = 0 And قائمة.ListIndex <> -1 Then

قائمة = قائمة.ItemData(مجموع_الإدخالات - 1)

Else

قائمة = قائمة.ItemData(رقم_فهرس_حالي - 1)

End If

End If

If KeyCode = 40 And Shift = 0 Then

If رقم_فهرس_حالي = مجموع_الإدخالات And قائمة.ListIndex <> -1 Then

قائمة = قائمة.ItemData(0)

Else

قائمة = قائمة.ItemData(رقم_فهرس_حالي + 1)

End If

End If

If قائمة.ListIndex = -1 Then قائمة = قائمة.ItemData(0)

' السطر التالي يمنع تحديد كامل نص البيانات أثناء الإنتقال

' إذا كنت ترغب في تحديد النص الموجود في القائمة فامسحه

قائمة.SelLength = 0

End Function

تلاحظ أن التغير بين الدالتين الأولى وهذه ليس كبيرا .

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

===========================

في طريقة عرض صفحة البيانات للنماذج

===========================

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

لعرض البند التالي اضغط Shift+السهم الأعلى

لعرض البند السابق اضغط Shift+السهم السابق

لعرض البند الأول اضغط Ctrl+Shift+السهم العلوي

لعرض البند الأخير اضغط Ctrl+Shift+السهم السفلي

في حدث عند مفتاح للأعلى ضع

استعراض_بنود_القائمة Me![المخالفة], KeyCode, Shift

وفي الوحدة النمطية ضع الدالة التالية :

Public Function استعراض_بنود_القائمة(قائمة As ComboBox, KeyCode As Integer, Shift As Integer)

Dim مجموع_الإدخالات, رقم_فهرس_حالي As Integer

' لمنع عدم تحديد بيانات القائمة وكذلك منع أي مفتاح آخر

If KeyCode <> 38 And KeyCode <> 40 Then Exit Function

If Shift <> 3 And Shift <> 1 Then Exit Function

' لمنع فتح سجل جديد إاذ كانت القائمة فارغة

If IsNull(قائمة) And KeyCode <> 38 And Shift <> 1 _

Or IsNull(قائمة) And KeyCode <> 40 And Shift <> 1 Then Exit Function

قائمة.SelLength = 0

مجموع_الإدخالات = قائمة.ListCount

If مجموع_الإدخالات = 0 Then

DoCmd.Beep

MsgBox "لايوجد أي بند مسجل في القائمة .", vbMsgBoxRight + vbMsgBoxRtlReading + vbInformation, "قائمة فارغة"

Exit Function

End If

' معرفة رقم الفهرس الحالي تمهيدا للزيادة عليه أو النقص منه

If قائمة.ListIndex <> -1 Then

رقم_فهرس_حالي = قائمة.ListIndex

End If

' إظهار أول بندا في القائمة

If KeyCode = 38 And Shift = 3 Then

قائمة = قائمة.ItemData(0)

قائمة.SelLength = 0

Exit Function

End If

' إظهار آخر بندا في القائمة

If KeyCode = 40 And Shift = 3 Then

قائمة = قائمة.ItemData(مجموع_الإدخالات - 1)

قائمة.SelLength = 0

Exit Function

End If

If KeyCode = 38 And Shift = 1 Then ' البند السابق

If رقم_فهرس_حالي = 0 And قائمة.ListIndex <> -1 Then

قائمة = قائمة.ItemData(مجموع_الإدخالات - 1)

Else

قائمة = قائمة.ItemData(رقم_فهرس_حالي - 1)

End If

End If

If KeyCode = 40 And Shift = 1 Then ' البند التالي

If رقم_فهرس_حالي = مجموع_الإدخالات And قائمة.ListIndex <> -1 Then

قائمة = قائمة.ItemData(0)

Else

قائمة = قائمة.ItemData(رقم_فهرس_حالي + 1)

End If

End If

If قائمة.ListIndex = -1 Then قائمة = قائمة.ItemData(0)

قائمة.SelLength = 0

End Function

وللإستعراض التلقائي اكتب في حدث عند مفتاح للأعلى

عرض_تلقائي Me, Me![المخالفة], KeyCode, Shift

ثم اكتب الدالة التالية في الوحدة النمطية الخاصة بالنموذج :

Public Function عرض_تلقائي(النموذج As Form, القائمة As ComboBox, KeyCode As Integer, Shift As Integer)

If النموذج.TimerInterval <> 0 Then

If KeyCode = 17 And Shift = 2 _

Or KeyCode = 16 And Shift = 1 Then

النموذج.TimerInterval = 0

Exit Function

End If

End If

If KeyCode = 16 And Shift = 3 Then ' البند التالي

النموذج.TimerInterval = 1000

النموذج.OnTimer = "=استعراض_بنود_القائمة(" & القائمة.Name & ", 40, 1)"

End If

If KeyCode = 17 And Shift = 3 Then ' البند السابق

النموذج.TimerInterval = 1000

النموذج.OnTimer = "=استعراض_بنود_القائمة(" & القائمة.Name & ", 38, 1)"

End If

End Function

مع نسخ الدالة استعراض_بنود_القائمة أيضا .

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

ولك تحياتي

#22

الأخ أبو حمود : بارك الله فيك

لكن تقصد هنا بالمخالفة فى هذا الأمر

استعراض_بنود_القائمة Me![المخالفة], KeyCode, Shift

أي القائمة المنسدلة بالنموذج للأخرين .

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

ولي طلب لديك لو تكرمت وضع keycode على النت للاستفادة منهاحيث قمت سابقا بعمل زرF10 للحفظ والضغط على esc للخروج ولكن لا أعرف الباقي .

أشرف خليل

#23

الأخ أشرف

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

للحفظ ضع في حدث عند مفتاح للأعلى

If KeyCode = 121 And Shift = 0 Then

DoCmd.Save

End If

ولإغلاق النموذج ضع في حدث عند مفتاح للأعلى

If KeyCode = 27 And Shift = 0 Then

DoCmd.Close

End If

وأرقام المفاتيح موجودة عندي للأحداث الثلاثة Form_KeyDown وForm_KeyUp وForm_KeyPress ولكنها في جداول وتنسيقها يأخذ وقت طويل لا استطيع التفرغ له في هذا الوقت ومن يعرف طريقة تنزيل الجداول بحيث لا تتلخبط محتوياتها فليعلمني وأنا مستعد لتنزيلها .

وللتعرف أكثر على أرقام المفاتيح استخدم مثلا في حدثي عند مفتاح للأعلى وعند مفتاح للأسفل الطريقة التالية :

MsgBox KeyCode & " " & Shift

وهي طريقة بسيطة ولكن فعالة فالرقم الأول الذي يظهر لـ KeyCode والثاني لـ Shift .

ولحدث Form_KeyPress استخدم :

MsgBox KeyAscii

ثم ضع شروطك حسب الأرقام المطلوبة .

وترتيب وقوعها :

KeyDown =< KeyPress =< KeyUp

ملاحظة : لايعود هذا الحدث بقيمة عند النقر على أحد الأزرار التالية : Tab-CapsLock-Shift-Ctrl-Alt أو مفاتيح الأسهم ، وكذلك المفاتيح التالية : Insert-Home-PageUp-Delete-End-PageDown-ScrollLock-Pause وجميع المفاتيح من F1 إلى F12

أرجو أن يفيدك ما كتبت .

ولك تحياتي

#24

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

[اسم القائمة].Dropdown

الآن تنقل بالسهم العلوي والسفلي وإذا أردت اختيار بند اضغط Enter .

وللجميع التحية

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

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