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

كيفية إغلاق برنامج في الأكسيس بعد مضي فترة معينة من الزمن

بدأه captin في 30 نوفمبر 2010 · 10 رد · 5,157 مشاهدة · في قواعد بيانات Microsoft Access
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

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

مرفق مثال للتعديل عليه

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

ولكم مني جزيل الشكر والتقدير

close.rar

#2

هذا مثال

/index.php?showtopic=230499&st=0&p=1144604&hl=+%C7%DB%E1%C7%DE%20+%C7%E1%E4%E3%E6%D0%CC&fromsearch=1entry1144604

ومثال اخر

/index.php?showtopic=217093&st=0&p=1075079&hl=+%C7%DB%E1%C7%DE%20+%C7%E1%E4%E3%E6%D0%CC&fromsearch=1entry1075079

تم تعديل هذه المشاركة بواسطة malik2010 في 30 نوفمبر 2010 في 14:43

سيد الاستغفار

{ اللهم أنت ربي لا إله إلا أنت خلقتني وأنا عبدك وأنا على عهدك ووعدك ما استطعت أعوذ بك من شر ما صنعت أبوء لك بنعمتك علي وأبوء لك بذنبي فاغفر لي فإنه لا يغفر الذنوب إلا أنت}

من قالها من النهار موقنا بها فمات من يومه قبل أن يمسي فهو من أهل الجنة ومن قالها من الليل وهو موقن بها فمات قبل أن يصبح فهو من أهل الجنة .رواه البخاري

#3

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

شكرا لك أخي malik2010 علي سرعة الرد

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

وكما أوضحت بسؤالي أن البرنامج به العديد من النماذج ولا نستطيع أن نتنبأ على أي من النماذج سوف يتوقف المستخدم عن العمل لكي يتم حساب الوقت المتبقي لإيقاف البرنامج فمثلا في المثال المرفق يمكن أن يتوقف المستخدم عند النموذج الأول أو الخامس أو أي نموذج آخر فكيف سيتم حساب الوقت المتبقي لإيقاف البرنامج ؟

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

ولك مني جزيل الشكر على الإهتمام

#4

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

للرفع .......

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

ولكم منا جزيل الشكر

#5

للرفع

#6

اليك اخى ماتريد

افتح وحدة نمطية و ضع بها هذا الكود

Dim ArrayIntelized As Boolean
Dim EventsArray, OldEventsArray
Dim EventArrayArgs
Public MyTime As Date
Dim objActiveForm As Object
Dim PrevInterval As Long

Const IdleMinuts = 2

Sub IntelizeArray()
    If ArrayIntelized = True Then Exit Sub
    ArrayIntelized = True
    EventsArray = Array("OnTimer", "OnMouseMove", "OnKeyDown", "Detail.OnMouseMove")
    OldEventsArray = Array("", "", "", "")
    EventArrayArgs = Array(0, 4, 2, 4)
End Sub

Public Property Set ActiveForm(ByVal vNForm As Form)
    On Error Resume Next
    If Not ArrayIntelized Then IntelizeArray
    Set objActiveForm = vNForm
End Property

Public Property Get ActiveForm() As Form
    Set ActiveForm = objActiveForm
End Property

Public Sub AddEventsHandlerr(ObjForm As Form)
    On Error Resume Next
    MyTime = Now()
    If ActiveForm Is ObjForm Then Exit Sub

    Set ActiveForm = ObjForm
    Call IntelizeArray
    Dim Obj As Object
    Dim Evt As String

    For i = 0 To UBound(EventsArray)
        Evt = EventsArray(i)
        If InStr(Evt, ".") > 0 Then
           ObjName = Left(Evt, InStr(Evt, ".") - 1)
           Evt = Mid(Evt, InStr(Evt, ".") + 1)
           Set Obj = CallByName(ObjForm, ObjName, VbGet)
        Else
          Set Obj = ObjForm
        End If

        OldEventsArray(i) = CallByName(Obj, Evt, VbGet)
        If IsNumeric(OldEventsArray(i)) Then OldEventsArray(i) = ""
        If LCase(EventsArray(i)) = "ontimer" Then
           PrevInterval = Obj.TimerInterval
           If Obj.TimerInterval = 0 Then ObjForm.TimerInterval = 1000
           CallByName ObjForm, Evt, VbLet, "=TimerLooping()"
        Else
            CallByName Obj, Evt, VbLet, "=CallBackProcedure(" & i & ")"
        End If
    Next
End Sub

Sub ResetEvents(ObjForm As Form)
On Error Resume Next
'    If ActiveForm Is ObjForm Then Exit Sub
    If IsArray(EventsArray) = False Then Call IntelizeArray
    Dim Obj As Object, ObjName As String
    Dim Evt As String
    ObjForm.TimerInterval = PrevInterval
    For i = 0 To UBound(EventsArray)
        Evt = EventsArray(i)
        If InStr(Evt, ".") > 0 Then
           ObjName = Left(Evt, InStr(Evt, ".") - 1)
           Evt = Mid(Evt, InStr(Evt, ".") + 1)
           Set Obj = CallByName(ObjForm, ObjName, VbGet)
        Else
           Set Obj = ObjForm
        End If
        CallByName Obj, Evt, VbLet, CStr(OldEventsArray(i))
    Next
End Sub

Function CallBackProcedure(Index)
     On Error Resume Next
     MyTime = Now()
     Dim PrevProc As String
     PrevProc = OldEventsArray(Index)
     Evt = EventsArray(Index)
     If PrevProc = "[Event Procedure]" Then
        If InStr(Evt, ".") > 0 Then
           ObjName = Left(Evt, InStr(Evt, ".") - 1)
           Evt = Mid(Evt, InStr(Evt, ".") + 1)
        Else
           ObjName = "Form"
        End If
        Set Obj = ActiveForm
        Evt = ObjName & "_" & Mid(Evt, 3)
        Select Case EventArrayArgs(Index)
            Case 1
                CallByName Obj, Evt, VbMethod, 0
            Case 2
                CallByName Obj, Evt, VbMethod, 0, 0
            Case 3
                CallByName Obj, Evt, VbMethod, 0, 0, 0
            Case 4
                CallByName Obj, Evt, VbMethod, 0, 0, 0, 0
            Case 5
                CallByName Obj, Evt, VbMethod, 0, 0, 0, 0, 0
            Case Else
                CallByName Obj, Evt, VbMethod
        End Select
     ElseIf Left(PrevProc, 1) = "=" Then
        Application.Run Mid(OldEventsArray(Index), 1)
     ElseIf Len(PrevProc) > 0 Then
        DoCmd.RunMacro OldEventsArray(Index)
     End If

     If LCase(Evt) = "ondeactivate" Then
         ResetEvents ActiveForm
     End If

End Function


Public Function TimerLooping()
    On Error Resume Next
    Dim DateToCompare As Date
    DateToCompare = DateAdd("n", IdleMinuts, MyTime)
    If Now() >= DateToCompare Then DoCmd.Quit
    If True Then
        Dim M As Integer, S As Integer, lpCaption As String
        S = DateDiff("s", Now, DateToCompare)
        M = Int(S / 60)
        S = S Mod 60
        ActiveForm.Caption = "Time Left = " & Format(M, "00") & ":" & Format(S, "00")
   End If
End Function

و ضع هذا الكود فى النماذج

Private Sub Form_Activate()
       ResetEvents ActiveForm
       AddEventsHandlerr Me
End Sub

لاحظ ان المدة تستطيع التحكم بها من خلال هذا السطر بالوحدة النمطية

Const IdleMinuts = 2

تم تعديل هذه المشاركة بواسطة Abo_Yossof في 7 ديسمبر 2010 في 20:40

مدونتى:-

احترف الأكسس مع أبو يوسف

متغيب حاليا لانشغالى الشديد

#7

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

شكراً لك أخي أبو يوسف على إهتمامك

وجاري التطبيق على قاعدة البيانات

#8

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

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

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

ولك خالص الشكر والتقدير

#9

للرفع

#10

للرفع

#11

.::: ( مشكور على الموضوع ) :::.

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

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

الفريق العربي للبرمجة

arab2000.png

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…