اذهب الي المحتوي
أوفيسنا

مثال يعمل على اكسس 32 بت و 64 بت


jjafferr

الردود الموصى بها

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

 

هذا الموضوع اُثير اكثر من مرة في الآونة الاخيرة ، ورأيت من الافضل ان اضع مثال ليقتدي به الجميع :rol:

وقبل ان نبدأ ، اود ان اشير الى انني اعمل على اكسس 32 بت ، ولا املك نسخة من اكسس 64 بت :rol:

 

احب ان اشير الى الرابط الذي شرحت فيه ان مايكروسوفت توصي بتنصيب الاوفيس / اكسس 32 بت ، بغض النظر عن نوع الوندوز المنصّب على الكمبيوتر ، سواء كان 32 بت او 64 بت:

http://www.officena.net/ib/topic/64036-هل-استخدم-اوفيس-32-بت-او-64-بت/

 

ولكن ، ماذا نفعل اذا عملنا برنامجنا على اكسس 32 بت ، واتضح ان الزبون عنده جهاز فيه اكسس 64 بت :blink:

المثال التالي يشتغل على 32 بت و 64 بت ، ونستطيع ان نستفيد منه لعمل برنامجنا :rol:

 

البرنامج المرفق ، بعد فك الضغط ، سيحتوي على 3 برامج:

238.Clipboard01.thumb.jpg.4754da076d1694

.

هذا برنامج No_Password_BE.accdb ، وبه جدول واحد ، ولا يحتاج الى كلمة سر لفتحه:

238.Clipboard02.thumb.jpg.e9227a82df2f27

.

هذا برنامج Password_is_jj_BE.accdb ، وبه جدول واحد ، وكلمة السر لفتحه هي jj:

238.Clipboard03.thumb.jpg.22a2c2f84baa3d

.

البرنامج: JStreetAccessRelinker2.accdb من الرابط http://www.jstreettech.com/downloads.aspx ، وبه ماكرو ووحدات نمطية تعمل على 32 بت و 64 بت (فالفضل في هذا المثال يعود للبرنامج وليس لي :rol:) ،

وقد قمت بإضافة نموذج لربطه مع احد برنامج الجداول اعلاه ، ومبدئيا فهو مرتبط مع البرنامج No_Password_BE.accdb ،

238.Clipboard04.thumb.jpg.d4e909f1e7b95d

.

وعند فتح البرنامج لأول مرة ، سوف يفتح نافذة تطلب معرفة مكان برنامج الجداول No_Password_BE.accdb ،

وتستطيع ان تنقر على الزر Link Another BE ، وستفتح لك نافذة تطلب منك معرفة مكان برنامج الجداول الجديد الذي تريد ان تربطه (بدل البرنامج No_Password_BE.accdb) :

238.Clipboard05.thumb.jpg.8cd58907958d0d

.

وبما ان البرنامج هذا محمي بكلمة سر ، فسوف تظهر لك نافذة لإدخال كلمة السر (لاحظ ان الادخال مشفر) :

238.Clipboard06.thumb.jpg.56962e3308741f

.

وعندما يتم الربط ، سترى رسالة التاكيد:

238.Clipboard07.thumb.jpg.e50eacb3fea3a0

.

 

الرجاء من الشباب الذين لديهم نسخة من الاكسس 64 بت ، التاكد من ان البرنامج يشتغل على كمبيوترهم بدون اخطاء.
 

عندما نريد ان نعمل برنامج يشتغل على النسختين 32 و 64 بت ، فكود النماذج هو نفسه بين نسختي 32 بت و 64 بت ، والشئ الوحيد الذي يتغير هو دوال الوحدات النمطية API ، والكود الذي ينادي هذه الوحدات (بغض النظر سواء كان في نموذج او في وحدة نمطية مستقلة) ،

 

هنا سوف اعطي مثال واحد من الكود عن طريقة العمل للنسختين 32 و 64 بت:

 

الكود التالي يستعمل دالة API فتح نافذة اختيار ملف ، والدالة هي 32 بت (لاحظ comdlg32.dll ) :

    Private Declare Function GetOpenFileName Lib "comdlg32.dll" _
        Alias "GetOpenFileNameA" (OPENFILENAME As tagOPENFILENAME) As Long

 

الان اذا اردنا ان نجعل هذه الداله API تعمل على 64 بت كذلك ، فالكود يجب ان يكون:

#If VBA7 Then
    'هذه لنسخة 64 بت
    Private Declare PtrSafe Function GetOpenFileName Lib "comdlg32.dll" _
        Alias "GetOpenFileNameA" (OPENFILENAME As tagOPENFILENAME) As Boolean
#Else
    'وهذه لنسخة 32 بت
    Private Declare Function GetOpenFileName Lib "comdlg32.dll" _
        Alias "GetOpenFileNameA" (OPENFILENAME As tagOPENFILENAME) As Long
#End If

 

ولاحظ في كود البرنامج ، انه تم جمع جميع الدوال مع بعض ، وجمعها في if# و else# و end if# واحدة.

 

وهناك اصدار جديد لكود الربط ، ويمكن انزاله من هنا:

http://www.jstreettech.com/files/JStreetAccessRelinker2.zip

 

جعفر

238.Work_on_32Bits_and_64Bits.zip

  • Like 6
  • Thanks 2
رابط هذا التعليق
شارك

  • 2 weeks later...

ممكن مثال يشرح الاكواد

أي مثال بعيد عن ربط قاعدة البيانات بقاعدة أخرى او جداول

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

لاني قمت باستخدام الكود التالي

#If VBA7 Then
    'هذه لنسخة 64 بت
    Private Declare PtrSafe Function GetOpenFileName Lib "comdlg32.dll" _
        Alias "GetOpenFileNameA" (OPENFILENAME As tagOPENFILENAME) As Boolean
#Else
    'وهذه لنسخة 32 بت
    Private Declare Function GetOpenFileName Lib "comdlg32.dll" _
        Alias "GetOpenFileNameA" (OPENFILENAME As tagOPENFILENAME) As Long
#End If

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

فرجاء مثال يوضح استخدام الاكواد

 

هل الكود يبقى كما هو ام يتم إزالة علامة الهاش #

 

رابط هذا التعليق
شارك

  • 3 weeks later...

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

 

هذا الرابط يحتوي على الكثير من الدوال والتي تم تضبيطها للعمل على الاكسس 32بت و 64بت:

http://www.jkp-ads.com/articles/apideclarations.asp

فقط ابحث عن الدالة ، واعمل نسخ/لصق للكود :rol:

 

وهذا رابط آخر فقط لدوال 64بت (المعدّلة من 32بت):

http://www.utteraccess.com/wiki/index.php/Category:API



جعفر

تم تعديل بواسطه jjafferr
  • Like 1
رابط هذا التعليق
شارك

 


في 10/31/2015, 1:29:05, علي المصري said:

ممكن مثال يشرح الاكواد

أي مثال بعيد عن ربط قاعدة البيانات بقاعدة أخرى او جداول

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

لاني قمت باستخدام الكود التالي


#If VBA7 Then
    'هذه لنسخة 64 بت
    Private Declare PtrSafe Function GetOpenFileName Lib "comdlg32.dll" _
        Alias "GetOpenFileNameA" (OPENFILENAME As tagOPENFILENAME) As Boolean
#Else
    'وهذه لنسخة 32 بت
    Private Declare Function GetOpenFileName Lib "comdlg32.dll" _
        Alias "GetOpenFileNameA" (OPENFILENAME As tagOPENFILENAME) As Long
#End If

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

فرجاء مثال يوضح استخدام الاكواد

 

هل الكود يبقى كما هو ام يتم إزالة علامة الهاش #

 

.

انا اعتذر منك أستاذ علي على عدم الرد ، فلم الحظه الا قبل قليل :blink:

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

 

 

في 10/21/2015, 12:31:26, karrar sabry said:

مع اني مبتدئ في البرمجة ( ما فهمت الي صار ) ... 

لكن الاكسس عندي 64 و شغال بدون اخطاء ...

.

شكرا جزيلا على التأكيد :rol:

 

جعفر

تم تعديل بواسطه jjafferr
رابط هذا التعليق
شارك

  • 1 month later...
في ١٩‏/١٠‏/٢٠١٥ at 00:13, jjafferr said:

 


#If VBA7 Then
    'هذه لنسخة 64 بت
    Private Declare PtrSafe Function GetOpenFileName Lib "comdlg32.dll" _
        Alias "GetOpenFileNameA" (OPENFILENAME As tagOPENFILENAME) As Boolean
#Else
    'وهذه لنسخة 32 بت
    Private Declare Function GetOpenFileName Lib "comdlg32.dll" _
        Alias "GetOpenFileNameA" (OPENFILENAME As tagOPENFILENAME) As Long
#End If

 

 

حبيت انبه اخي جعفر بان المسؤول عن كشف نوع الاوفيس من ناحية 32 بت او 64 بت هو التعبير التالي :

#If Win64 Then
' Win64
#Else
' win 32
#End If

وليس vba7  فهذه لكشف اصدار محرر الفيجول بيسك والذي سيعتبر لكشف اصدار الاوفيس حيث 7 تشير لاوفيس 2010 وما فوق !

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

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

  • Like 1
  • Thanks 1
رابط هذا التعليق
شارك

47 دقائق مضت, رمهان said:

المسؤول عن كشف نوع الاوفيس من ناحية 32 بت او 64 

وليس vba7

 

شكرا على التصحيح الفني :rol:

ولكني اللي فهمته ان

#If VBA7 Then
    'هذه لنسخة 64 بت
    Private Declare PtrSafe Function GetOpenFileName Lib "comdlg32.dll" _
        Alias "GetOpenFileNameA" (OPENFILENAME As tagOPENFILENAME) As Boolean
#Else
    'وهذه لنسخة 32 بت
    Private Declare Function GetOpenFileName Lib "comdlg32.dll" _
        Alias "GetOpenFileNameA" (OPENFILENAME As tagOPENFILENAME) As Long
#End If

سيجعل الكود يعمل على 32بت (والذي يعمل عندي) و 64بت (كما اكده الاخ كرار karrar sabry).

 

ورجوعا الى رابط تعديل الكود بين 32بت و64بت ، وجدت هذه الملاحظة :

 

'This is one of the few API functions that requires the Win64 compile constant:

#If VBA7 Then
    #If Win64 Then
        Private Declare PtrSafe Function GetWindowLongPtr Lib "USER32" Alias "GetWindowLongPtrA" (ByVal hWnd As LongPtr, ByVal nIndex As Long) As LongPtr
    #Else
        Private Declare PtrSafe Function GetWindowLongPtr Lib "USER32" Alias "GetWindowLongA" (ByVal hWnd As LongPtr, ByVal nIndex As Long) As LongPtr
    #End If
#Else
    Private Declare Function GetWindowLongPtr Lib "USER32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long 
#End If

 

جعفر

  • Like 1
رابط هذا التعليق
شارك

  • 2 years later...

#If VBA7 Then
    'هذه لنسخة 64 بت
    Private Declare PtrSafe Function GetOpenFileName Lib "comdlg32.dll" _
        Alias "GetOpenFileNameA" (OPENFILENAME As tagOPENFILENAME) As Boolean
#Else
    'وهذه لنسخة 32 بت
    Private Declare Function GetOpenFileName Lib "comdlg32.dll" _
        Alias "GetOpenFileNameA" (OPENFILENAME As tagOPENFILENAME) As Long
#End If

 

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

Declare  Function

وتكون كاتالي

 

Declare PtrSafe Function
رابط هذا التعليق
شارك

  • 1 year later...

Your VBA code uses Declare statements Most VBA code doesn’t need to change when using in 64-bit or 32-bit, unless you use Declare statements to call Windows API using 32-bit data types like long, for pointers and handles. In most cases, adding PtrSafe to the Declare and replacing long with LongPtr will make the Declare statement compatible with both 32- and 64-bit. However this might not be possible in rare cases where there is no 64-bit API to Declare

رابط هذا التعليق
شارك

  • 11 months later...

السلام عليكم 🙂

 

هذه جميع مكتبات مايكروسوفت ، بصيغة نواة 32bit ومقابلها نواة 64bit ، في ملف Win32API_PtrSafe.TXT

https://www.microsoft.com/en-us/download/details.aspx?id=9970

 

وقد ارفقت الملف لسهولة الوصل اليه 🙂

 

جعفر

Win32API_PtrSafe.zip

  • Like 2
  • Thanks 1
رابط هذا التعليق
شارك

8 ساعات مضت, jjafferr said:

السلام عليكم 🙂

 

هذه جميع مكتبات مايكروسوفت ، بصيغة نواة 32bit ومقابلها نواة 64bit ، في ملف Win32API_PtrSafe.TXT

https://www.microsoft.com/en-us/download/details.aspx?id=9970

 

وقد ارفقت الملف لسهولة الوصل اليه 🙂

 

جعفر

Win32API_PtrSafe.zip 137.81 kB · 1 تنزيلات

جزاك الله خيرا اخى واستاذى ووالدنا الحبيب @jjafferr واسمح لى بان اقول والدى حبا فالله :fff:

  • Like 1
رابط هذا التعليق
شارك

  • 2 months later...
On 11/18/2015 at 12:39 PM, jjafferr said:

#If VBA7 Then 'هذه لنسخة 64 بت Private Declare PtrSafe Function GetOpenFileName Lib "comdlg32.dll" _ Alias "GetOpenFileNameA" (OPENFILENAME As tagOPENFILENAME) As Boolean #Else 'وهذه لنسخة 32 بت Private Declare Function GetOpenFileName Lib "comdlg32.dll" _ Alias "GetOpenFileNameA" (OPENFILENAME As tagOPENFILENAME) As Long #End If

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

تقبل الله طاعاتكم بهذا الشهر الكريم

 

طبقت هذا الكود وفعال

ويعمل على 32 و 64

دون مشاكل

 

شكرا سيد جعفر

  • Like 1
رابط هذا التعليق
شارك

  • 7 months later...

السلام عليكم 

اليوم واجهة هذه المشكلة احد الأجهزة عندي فيه office 64 bit  حاولت استعمل هذا التعديل 

#If VBA7 Then
    'هذه لنسخة 64 بت
    Private Declare PtrSafe Function GetOpenFileName Lib "comdlg32.dll" _
        Alias "GetOpenFileNameA" (OPENFILENAME As tagOPENFILENAME) As Boolean
#Else
    'وهذه لنسخة 32 بت
    Private Declare Function GetOpenFileName Lib "comdlg32.dll" _
        Alias "GetOpenFileNameA" (OPENFILENAME As tagOPENFILENAME) As Long
#End If

 

اللي لاحظته ان اسطر 32 بت تبقى باللون الأحمر ويعمل الملف اذا فتحته بدو ن الشفت 

 

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

رابط هذا التعليق
شارك

وعليكم السلام اخوي ابو احمد 🙂

 

بالنسبة لفتح نافذة الوندوز إختيار الملفات ، فهناك طريقة اخرى لا تحتاج الى الكود اعلاه Windows API ، وتجده هنا مثلا:

https://www.officena.net/ib/applications/core/interface/file/attachment.php?id=189174

ولكن اذا اردت النظر في الكود الذي ارفقه انت ، فهذه الاسطر من الكود لا تكفي للنظر في المشكلة ، فأنا محتاج الى مثال يعمل ، علشان اضبطه للنواتين 32 و 64بت 🙂

 

جعفر

  • Thanks 1
رابط هذا التعليق
شارك

شكرا استاذ جعفر 

 

بالنسبة للمشكلة فهي ليست في هذا الكود وحسب ولكن اي كود يحتوي على 

Declare Function

فانه اذا تم استخدام #If لكي يعمل على النواتين فان اسطر ٣٢ بت تتلون بالاحمر اذا كان الاوفس ٦٤ بت 

ويحدث ذلك لها كلها ولا يعمل الملف بطريقة صحيحة

رابط هذا التعليق
شارك

  • 4 weeks later...
  • 2 years later...

مرحبا بكم🖐️ و بكل الاشخاص المشاركين في هذا الموضوع المهم جدا 💥

في بادية الامر😅 اريد ان اوضح ان هذا الشرح في هذا النوع  في مستوى افراد الخبراء 😎بالاكسس و ليس اقل , اما بالنسبة الى المبتدئين و المتوسطين🙄 فلا اعتقد انهم سيطبقون هذه الافكار بالصورة الصحيحة😤 , وانا عن نفسي:power: اسال عن كيفية تطبيق هذه الاكواد في برامجنا :wallbash:, هل هي وحدة نمطية ننسخ و نلصق في برنامجنا :wavetowel:؟؟ اين نضعها ؟؟:dance1: كيف نستدعيها ؟؟ فاذا كان بالامكان لاي عضو ان يشرح ماتم شرحه بصورة بدائية جدا لكم نفهم الموضوع بشكل مبسط , و ما اردت قوله هو لاستفادة الاعضاء و المنتدى الرائع , مرة اخرى تحياتي لكم ايها الابطال🙏

رابط هذا التعليق
شارك

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

زائر
اضف رد علي هذا الموضوع....

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • تصفح هذا الموضوع مؤخراً   0 اعضاء متواجدين الان

    • لايوجد اعضاء مسجلون يتصفحون هذه الصفحه
×
×
  • اضف...

Important Information