أخواني وأساتذتي ومعلمينا ( دون استثناء )
بعد المعاناة التي تواجه كل مبرمج أو هاوي أو محترف في التعامل مع الصور داخل آكسيس ، بوجود الترميش أو الوميض . وكنت قد طرحت تساؤلاً حول آلية تجنب هذه المشكلة عند تعامل آكسيس مع الصور داخل النماذج الحركية . خرجت بهذه الفكرة البسيطة والتي آمل أن تكون الحل الشافي لهذه المعضلة - كما عودناكم دائماً - بإيجاد الحل السحري لها .
الفكرة تم ترجمتها بأسلوب بسيط بحيث نجعل النموذج يقوم برسم الأحداث دفعة واحدة بدلاً من رسم كل حركة بشكل منفصل أثناء التعامل مع الصور .
الدالة المستخدمة :-
'**********************************************
'*** ***
'*** FFFFFF OOO KK KK SSSS HH HH ***
'*** FF O O KK KK SS HH HH ***
'*** FFFFF O O KKK SS HHHHHH ***
'*** FF O O KK KK SS HH HH ***
'*** FF OOO KK KK SSSSS HH HH ***
'*** ***
'********* Anti Flicker By Foksh 2026 *********
Option Compare Database
Option Explicit
#If VBA7 Then
Private Declare PtrSafe Function GetWindowLongPtr Lib "user32" Alias "GetWindowLongPtrA" _
(ByVal hWnd As LongPtr, ByVal nIndex As Long) As LongPtr
Private Declare PtrSafe Function SetWindowLongPtr Lib "user32" Alias "SetWindowLongPtrA" _
(ByVal hWnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
Private Declare PtrSafe Function SetWindowPos Lib "user32" _
(ByVal hWnd As LongPtr, ByVal hWndInsertAfter As LongPtr, _
ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, _
ByVal uFlags As Long) As Long
#Else
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function SetWindowPos Lib "user32" _
(ByVal hWnd As Long, ByVal hWndInsertAfter As Long, _
ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, _
ByVal uFlags As Long) As Long
#End If
Private Const GWL_EXSTYLE As Long = -20
Private Const WS_EX_COMPOSITED As Long = &H2000000
Private Const SWP_NOMOVE As Long = &H2
Private Const SWP_NOSIZE As Long = &H1
Private Const SWP_NOZORDER As Long = &H4
Private Const SWP_FRAMECHANGED As Long = &H20
Public Sub Form_SetComposited(ByVal frm As Access.Form, ByVal EnableIt As Boolean)
On Error Resume Next
#If VBA7 Then
Dim h As LongPtr: h = frm.hWnd
Dim ex As LongPtr: ex = GetWindowLongPtr(h, GWL_EXSTYLE)
If EnableIt Then
If (ex And WS_EX_COMPOSITED) = 0 Then
Call SetWindowLongPtr(h, GWL_EXSTYLE, (ex Or WS_EX_COMPOSITED))
End If
Else
If (ex And WS_EX_COMPOSITED) <> 0 Then
Call SetWindowLongPtr(h, GWL_EXSTYLE, (ex And Not WS_EX_COMPOSITED))
End If
End If
Call SetWindowPos(h, 0, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOZORDER Or SWP_FRAMECHANGED)
#Else
Dim h32 As Long: h32 = frm.hWnd
Dim ex32 As Long: ex32 = GetWindowLong(h32, GWL_EXSTYLE)
If EnableIt Then
If (ex32 And WS_EX_COMPOSITED) = 0 Then
Call SetWindowLong(h32, GWL_EXSTYLE, (ex32 Or WS_EX_COMPOSITED))
End If
Else
If (ex32 And WS_EX_COMPOSITED) <> 0 Then
Call SetWindowLong(h32, GWL_EXSTYLE, (ex32 And Not WS_EX_COMPOSITED))
End If
End If
Call SetWindowPos(h32, 0, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOZORDER Or SWP_FRAMECHANGED)
#End If
End Sub
مع ترك المساحة بالتفعيل أو التعطيل حسب الحاجة .
بحيث يتم الاستدعاء لها في حدث عند التحميل للنموذج بهذا الأسلوب البسيط :-
Form_SetComposited Me, True
أو التعطيل بهذا الشكل :-
Form_SetComposited Me, False
الملف مفتوح المصدر . لمن يرغب بالتجربة على مشروعه ، فضلاً وكرماً منه بإخباري بالنتيجة أن كانت ناجحة أم لا . علماً أنه تم استخدام الفكرة نفسها في إنشاء لعبة الأونو في هذا الموضوع مسبقاً ، والنتيجة كما شاهدتموها في أداء اللعبة والتعامل مع الصور بشكل دقيق لتخرج اللعبة كتجربة دون أي ترميش أو وميض عند حركة الصور داخل النماذج .
Anti Flicker.accdb