سؤال

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

النموذج المشروط له ما يلي في الإعلانات العامة:

Public Event OnDialogBoxClose(NewRecordID As Long, DialogResult As DialogResults)

والرمز التالي حيث يتم النقر فوق الزر "موافق":

RaiseEvent OnDialogBoxClose(NewHardwareBaseItemID, dlgresBtnOKClicked)

النموذج الرئيسي له ما يلي في الإعلانات العامة:

Dim WithEvents RespondQuickAddClose As Form_qckfrmHardwareBaseItemCreate

ومعالج الحدث التالي:

Private Sub RespondQuickAddClose_OnDialogBoxClose(NewRecordID As Long, DialogResult As DialogResults)

    MsgBox "Responding to closing of the dialog box" 'Never happens
    Me.Requery

End Sub

هل يمكن لأحد أن يشرح لماذا لا يتم استدعاء معالج الأحداث أبدًا؟ شكرًا!

خلفية:

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

هذا يتبع مثالاً وجدته هنا:http://database.itags.org/ms-access-database/80292/

هل كانت مفيدة؟

المحلول

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

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

نموذج رمز في حدث OnoPen من تقرير يفتح نموذجًا لجمع القيم لتصفية التقرير:

  Private Sub Report_Open(Cancel As Integer)
    DoCmd.OpenForm "dlgDateRange", , , , , acDialog, "ThisYear"
    If IsLoaded("dlgDateRange") Then
       With Forms!dlgDateRange
         If .Tag = "Cancel" Then
            Cancel = True
         Else
            Me.Filter = "[InvoiceDate] Between #" & !txtStart & "# AND #" & !txtEnd & "#"
            Me.FilterOn = True
            Me!lblDateRange.Caption = StrConv(Trim(("from " + varZLStoNull(Format(!txtStart, "mm/dd/yyyy"))) _
                & (" to " + varZLStoNull(Format(!txtEnd, "mm/dd/yyyy")))), vbProperCase)
         End If
       End With
       DoCmd.Close acForm, "dlgDateRange"
    End If
  End Sub

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

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

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

نصائح أخرى

حسنًا ، أنا لا أوافق على

"في حين أن VBA يدعم WithEvents/Raiseevent ، لا يوجد سبب للحصول على هذا معقد هنا."

لقد عملت على مختلف مشروع VB6 و VBA. قمت مؤخرًا بترميز VBA في Excel حيث قمت برفع حدث من Winform. القليل من الأشياء التي يجب مراعاتها عند القيام بذلك.

  1. إذا كنت تتصل بـ Winform غير الوسائط في VBA مع WithEvents/Raiseevent. يجب أن تعمل بشكل طبيعي كما هو متوقع. لا يلزم حل بديل رئيسي
  2. إذا كنت تتصل بالموتاة في VBA. قد لا تعمل WithEvents/Raiseevents وفقًا للمتطلبات. يتمثل حل سريع في نقل البيانات باستخدام المتغيرات العامة المعلنة في ملف الوحدة النمطية.

ستحتاج إلى استخدام الحل البديل وأعتقد أنه سيعمل بشكل جيد تمامًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top