refactoring - مس أسيس-أفضل طريقة ل مودولاريس/فك الأشكال لإعادة بيعها




access-vba modularity (2)

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

الطريقة التي يتم بها حاليا هي مثل ذلك؛

Form1 يحتوي على زر على أنه يسمى Cmd1 الذي يفتح نموذج جديد ( DoCmd.OpenForm "Form2" ) وقبل تعبئة بعض الضوابط على النموذج باستخدام Forms!Form2.Control = Me.Control . عند إغلاق Form2 ، يتم إرجاع البيانات إلى Form1 عن طريق استدعاء Forms!Form1.Control = Me.Control .

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

أرى 5 طرق لتمرير القيم ذهابا وإيابا بين الأشكال، مع كل مشاكلهم، وكنت أتساءل ما أوصى.

  1. الطريقة المستخدمة بالفعل كما هو موضح أعلاه.
  2. باستخدام أوبينارغس - يجعل الكثير من القيم صعبة كما لديك لتحليل سلسلة وهو أحادي الاتجاه.
  3. باستخدام المتغيرات العالمية - وهذا يعني طن من المتغيرات في وحدة عشوائية ويعرض كابوس تحديد النطاق.
  4. تخزين القيم التي سيتم تمريرها بين النماذج في جدول مؤقت.
  5. الحفاظ على إشارة إلى النموذج الأول باستخدام

    Public master As Form
    Private Sub Form_Load()
        Set master = Screen.ActiveForm
        Me.Control = master.Control
    End Sub
    

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

نعم، هل هناك طريقة موصى بها؟


هذا هو مثل هذا السؤال الحاسم لتطوير المهنية، تطبيق الوصول القابلة للحفظ.

أولا، بعض التعليقات على قائمة الأساليب الخاصة بك:

  • أوافق على تقييمك لعيب الطرق رقم 1 و # 2
  • # 3 و # 4 نفس المشكلة: جدول عالمي هو مجرد عالمية مثل متغير عمومي. لا يمكنك الحد بشكل أساسي من الوصول إلى أي منهما.
  • # 5 سوف حتما تحصل على المشاكل. إن اإلشارة اإلضافية طويلة األجل إلى النموذج، في بعض الظروف، ستبقيها على اإلغالق.

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

على سبيل المثال، نموذج يسمى frmFoo سوف تحصل على وحدة مطابقة اسمه modFrmFoo . سوف تحتوي الوحدة على كافة الأساليب العامة لاستخدام فرمفو:

هنا هو مودفرمفو مبسطة:

Private mvID As Variant

' read-only (no Let)
Public Property Get frmFoo_ID() As Variant
    frmFoo_ID = mvID
End Property

Public Sub frmFoo_Show(ID As Variant, Name As Variant)
    ' note use of temporary object reference
    Dim rFoo As Form_frmFoo
    mvID = ID
    DoCmd.Open acForm, "frmFoo"
    Set rFoo = Forms("frmFoo")
    rFoo.ShowName Name
End Sub

وحدة نموذج فرمفو تحتاج إلى طريقة عامة واحدة:

' only frmFoo should refer to its internal controls and code
Public Sub ShowName(Name As Variant)
    lblName.Caption = Name
End Sub

و، الاستعلام عن فرمفو:

SELECT ID, [other stuff] FROM tblFoo WHERE tblFoo.ID = frmFoo_ID() 

يقوم الاستعلام بمزامنة النتائج مع قيمة المعرف التي تم ارجاعها بواسطة الخاصية frmFoo_ID ().

عرض فرمفو من نموذج آخر من السهل:

' frmBar
Private Sub cmdShowFoo_Click() 
    frmFoo_Show 123, "your name"
End Sub

مزايا هذا الأسلوب:

  1. يحدد واجهة عامة لجميع العمليات العامة في نموذج. أشكال خارجية استدعاء وحدة نمطية، أبدا النموذج مباشرة.
  2. يحافظ على جميع الأعمال الخاصة القطاع الخاص الخاص - يمكن إعادة تسمية ضوابط نموذج أو حذف دون إزعاج جميع الأشكال الأخرى التي تعتمد عليه.
  3. يحدد في مكالمة واحدة ما هو مطلوب لكل طريقة للعمل - على سبيل المثال، frmFoo_Show () يتطلب معرف واسم.

هذا هو على غرار كيف أفعل تطبيق جديد من الصفر.

سواء كان ذلك عمليا لتحديث التطبيق القديم، متشابكة هو مكالمتك.


قد يكون هذا من المساعدة:

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

يمكنك القيام بذلك عن طريق فتح نموذج آخر كما لو كانت فئة

إنشاء وحدة نمطية تسمى غلوبالفارس التي تتضمن هذا السطر:

Public Form_MyFormNameToOpen as Form_MyFormNameToOpen

(سيبقى النموذج الذي تفتحه مفتوحا حتى يتغير هذا المتغير، لذا اجعله عالميا لإبقائه على قيد الحياة)

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

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

' Opens the form using it as it were a class
Set GlobalVars.Form_MyFormNameToOpen = New Form_MyFormNameToOpen

' The modify the form you have just opened however you want to.
With Form_MyFormNameToOpen
    .Visible = True

    ' This relies ont he control names never changing
    .Controls("ProviderID") = 10
    .Controls("ProviderFileID") = 11


    ' it's better to use properties created on the called form
    ' eg
    .MyLetProviderID = 10
    .MyProviderFileID = 11
End With

آمل أن يساعد هذا.

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

(ربما يمكنك استخدام تقنية مماثلة للتقارير، والأشكال الفرعية الخ ...)