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

Declare statements on 64-bit

مغلقمُجاب
بدأه lordring في 24 يناير 2014 · 17 رد · 4,210 مشاهدة · في قواعد بيانات Microsoft Access
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

 

لدي برنامج يعمل بشكل صحيح على الاوفيس 32 

ولكن عند تشغيله على اوفيس 64  تظهر مشكلة

 

Declare statements on 64-bit

 

 

وقد قرات انه باضافة "PtrSafe" بعد "Declare"  سيختفي هذا الخطاء

لكن طبعا بما انه حاليا اعمل على اوفيس 32 فاضافة هذه العبارة تظهر خطاء عندي  اي يجب التعديل في جهاز اوفيس 64

لذلك لااعرف هل هذا هو الحل الوحيد الصحيح

واذا كان هو الحل ..

 

الان عندما اقوم بالتغيرات في البيانات في جهازي ال32 وانقل البرنامج الى حاسبة مديري ال64 لن يعمل البرنامج واذا اعدل الكود

لن يعمل معي 

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

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

فهل هذا يحل المشكلة ؟؟

#2

اخي الفاضل

 

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

 

لا تحتاج الى تقسيم البرنامج ولكن تحتاج الى وظيفة عامه لتحدد لك نوع النظام هل هو bit-32  او  64-bit لكي تضع الأكواد المناسبة لكل منهما

 

الآن نحتاج الى وضع هذه الوظيفة العامة في وحدة نمطية جديده

 

Public Function IsWin32OrWin64() As String
    Dim proc_query As String
    Dim proc_results As Object
    Dim info As Object
    
    proc_query = "SELECT * FROM Win32_Processor"
    Set proc_results = GetObject("Winmgmts:").ExecQuery(proc_query)
    For Each info In proc_results
        IsWin32OrWin64 = info.AddressWidth & "-bit"
    Next info
End Function
 
الآن نضع في اول نموذج يتم فتحه في القاعدة هذه الأكواد البرمجية
 
Dim OS
OS = IsWin32OrWin64()
if  OS= "64-bit" then
'دالة التصريح للنظام 64 بت  
 Private Declare PtrSafe Function
Else
'دالة التصريح للنظام 32 بت
   Private Declare Function
End if
 
 
Private Sub Form_Open(Cancel As Integer)
 Me.TimerInterval = 3000
Dim OS
OS = IsWin32OrWin64()
 
Select Case OS
Case Is = "32-bit"
 
 ' ضع الكود او الأكواد البرمجية المطلوبة هنا   
 
 
Case Is = "64-bit"
 
 ' ضع الكود او الأكواد البرمجية المطلوبة هنا   
     
End Select
End Sub
 
الآن برنامج الأكسيس عند فتحه يتم اختيار النسخة المناسبة لفتح قاعدة البيانات يواء على النظام  64 بت او 32 بت
 
 
بالتوفيق

تم تعديل هذه المشاركة بواسطة zahrah في 24 يناير 2014 في 13:48

1▲ 1
#3

اختي الكريمة  شكرا لك وياليت بعض التوضيحات

 

عملت وحدة نمطية جديدة بها الكود الاول .

 

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

 

11.jpg

 

الكود الثالث  عند حدث عند فتح الفورم الاول   

 

مالمقصود  بوضع 

 

 ' ضع الكود او الأكواد البرمجية المطلوبة هنا   

 

 

اي اكواد بالضبط   انا المشكلة تظهر لي في عدة  وحدات نمطية داخل البرنامج تحتوي العبارة  Declare 

 

 

طبعا انا عندما كان اوفيس 32 على وندوز 64 لم تكن مشكلة  ..المشكلة ظهرت عند تحويل الاوفيس ال 64 

 

 

وشكرا 

▲ -1
#4

اخي الفاضل

 

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

 

الآن انت لديك دالة وتصريح Declare  خاصة بنسخة 32 بت وتعمل لديك جيدا

 

اذا الإضافة للدالة والتصريح هي فقط اضافة  PtrSafe  بعد كلمة Declare

 

بمعنى ان تضع الدالتين والتصريحين اسفل بعضهما البعض تصريح 32 بت وتصريح 64 بت

 

مثال : ( ضع التصريخ الخاص بك بدلا من هذا المثال )

 

Option Compare Database
Option Explicit
Declare PtrSafe Function SHBrowseForFolder Lib "shell32.dll"  Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long
Declare  Function SHBrowseForFolder Lib "shell32.dll"  Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long
 
لاحظ معي انني وضعت نفس التصريحين تحت بعض مع اختلاف اضافة الكلمة  PtrSafe  للأولى وهي خاصة بنسخة 64 بت
 
ففي هذه الحالة عندما يتم فتح قاعدة البيانات سيقوم برنامج الأكسيس بإختيار النظام المناسب سواء 32 بت او 64 بت
 
 

بالنسبة للتعليق الخاص ( ضع الأكواد الخاصة بك هنا ) 

 

الكود الذي تنستخدمه لإجراء الحدث المطلوب سواء فتح او حذف او انشاء او اضافة او اي كود مطلوب لديك عند اختيار النظام  32 بت او 64 بت

 

Dim OS
OS = IsWin32OrWin64()
 
Select Case OS
Case Is = "32-bit"
 
 ' ضع الكود او الأكواد البرمجية المطلوبة هنا   
' اي اضع الأكواد المطلوبة في برنامجي عند اجراء حدث معين سواء فتح او حذف او اضافة  او اي اكواد 
 
Case Is = "64-bit"
 ' ضع الكود او الأكواد البرمجية المطلوبة هنا   
 ' اي اضع الأكواد المطلوبة في برنامجي عند اجراء حدث معين سواء فتح او حذف او اضافة  او اي اكواد 
     
End Select
End Sub
 
 
مثال : لأجراء فتح نموذج معين يجب ان اضعه بهذ الطريقة
 
Private Sub CmdOpenMyForm_Click()
Dim OS
OS = IsWin32OrWin64()
 
Select Case OS
'اذا كانت النسخة 32 بت
Case Is = "32-bit"
DoCmd.OpenForm "frmEMP"
 
' اذا كانت النسخة 64 بت
Case Is = "64-bit"
DoCmd.OpenForm "frmEMP"
 
EndSelect
End Sub
 
 
اتمنى بعد هذا الشرح الوافي انك فهمت الطريقة لتطبيقها على برنامجك
 
بالتوفيق
1▲ -1
#5

اختي الكريمة

 

شكرا على التوضيح

 

انا لاتوجد لدي في النماذج رسالة الخطاء لانه لاتوجد هذه الدالة في نماذجي

 

 تحدث في الوحدات النمطية الموجودة في البرنامج التي وردت فيها  عبارة declare

 

مثال بسيط الملف المرفق نفذت به مافهمته من توضيحك وعذرا انا لم يكن التطبيق صحيح فهذا الي فهمته

 

 

فهل هذا هو التطبيق الصحيح في الوحدة النمطية  بحيث الان اذا اشتغل هذا الملف على اوفيس 64 لن تظهر رسالة الخطا

 

طيب وماذا عندما اعمل debug للمحرر  فانه يظهر لي انه هناك خطاء في السطر المتعلق بال PtrSafe عندما اعمل  debug وانا ي الاوفيس 32

 

 

وشكرا 

 

Database11.rar

تم تعديل هذه المشاركة بواسطة lordring في 24 يناير 2014 في 16:47

▲ 1
#6

تفضل اخي الكريم

 

قم بالتجربة على نسخة اكسيس 32 بت و 64 بت بدون ان تقوم بتغيير اي شيء لا في النموذج ولا في الوحدات النمطية

 

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

 

 

za-Database32-64bit.rar

 

 

بالتوفيق

3▲ 1
#7

شكرا اختي  

 

هذه ما يظهر عند فتح الملف على اوفيس 32 

 

8.jpg

 

 

 

 

تحياتي 

▲ 1
#8

اخي الفاضل

 

اذا ظهرت لك مثل الصورة التي انت وضعتها فهذا يعني انك تستخدم اكسيس 2007

 

ويجب عليك فتح قاعدة البيانات بأكسيس 2010 لأن تعليمة  PtrSafe  خاصة لأكسيس 2010 وما فوق

 

جرب على اكسيس 2010 وسترى الفرق

 

بالتوفيق

2▲ -1
#9

فعلا انا حاليا اجرب في اوفيس 2007

 

ان شاء الله اجربها على وندوز 2010  وارجع لك الخبر

 

شكرا مرة اخرى 

▲ -1
#10
lordring كتب:

فعلا انا حاليا اجرب في اوفيس 2007

 

ان شاء الله اجربها على وندوز 2010  وارجع لك الخبر

 

شكرا مرة اخرى 

 

لم اسمع عن ويندوز 2010 حتى الآن

 

إلا اذا كنت تقصد اكسيس 2010 فهذا ممكن

 

بالتوفيق

▲ 1
#11

اقصد اوفيس 2010  بالتاكيد  .. خرب احوالي هذا الكود

 

طيب في هذه الحالة معناه ان البرنامج لن يعمل في الاوفيس 2007  اذا طبقت الطريقة اعلاه  

فكيف اذا كان لدي برنامج مصمم ب 2007  واريده ان يعمل على 2007 و 2010 او اعلى  وعلى الاوفس سواء 32 او 64 ؟؟

▲ 1
#12

تفضل اخي الكريم

 

تم التعديل  على دالة فتح الملفات لكي تعمل على النظامين 32 بت  و  64 بت واكسيس 2007 و اكسيس 2010 بدون مشاكل

 

اذا ظهرت لديك اسطر حمراء في كود الدالة فلا تعير لها اي اهتمام لأن هناك دالة شرطية في الكود

 

 

za-Database32-64bit-UP.rar

 

 

بالتوفيق

تم تعديل هذه المشاركة بواسطة zahrah في 24 يناير 2014 في 19:05

4▲ -1
#13

وهذه احد روائع اختنا الفاضلة الدكتورة أم عهود حفظها الله تعالى :)

▲ -1
#14

فتحت الملف على الاوفيس 32  شغال تمام 100%

 

قمت بالتخلص من بعض الوحدات النمطية التي في البرنامج لااحتاجها تحتوي على  declare

 

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

 

فهل اقوم باعادة التطبيق عليها  ام لكل دالة تطبيق خاص بحسب عملها

 

 

za-Database32-64bit-UP.rar

 

 

وشكرا 

▲ 1
#15 أفضل إجابة

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

 

على حده لتعمل على النظامين 32 بت و 64 بت وطبعا تختلف التصاريح من وحده نمطية والأخرى عن بعضها البعض

 

#If Win64 Then
Private Declare PtrSafe Function DisplaySize Lib "user32" Alias "GetSystemMetrics" (ByVal nIndex As Long) As Long
#Else
Private Declare Function DisplaySize Lib "user32" Alias "GetSystemMetrics" (ByVal nIndex As Long) As Long
#End If

 

 

 

دالة تحجيم النموذج بعد التعديل

 

 

Option Compare Database
 
#If Win64 Then
Private Declare PtrSafe Function DisplaySize Lib "user32" Alias "GetSystemMetrics" (ByVal nIndex As Long) As Long
#Else
Private Declare Function DisplaySize Lib "user32" Alias "GetSystemMetrics" (ByVal nIndex As Long) As Long
#End If
 
Public Function resizefrom(frm As Form, bestw As Integer, besth As Integer)
On Error Resume Next
wrate = DisplaySize(0) / bestw
hrate = DisplaySize(1) / besth
frm.InsideWidth = frm.InsideWidth * wrate
frm.InsideHeight = frm.InsideHeight * hrate
Dim fc As Control
For Each fc In frm.Controls
fc.Top = fc.Top * hrate
fc.Left = fc.Left * wrate
fc.Width = fc.Width * wrate
fc.Height = fc.Height * hrate
fc.FontSize = fc.FontSize * wrate
Next
End Function
 
اما الوحدات النمطية التي ليس بها Declare فتبقى كما هي بدون اي تغيير
 
ملاحظة هامة للفهم
 
عند اضافة  PtrSafe فإنها تحتاج ايضا الى تعديل بعض المؤشرات
 
Long  تتغير الى  LongPtr
 
مثال
 
Dim lStructSize As LongPtr
 
 
 
 
دالة ()Len  تتغير الى  ()LenB حتى يتم قبولها في نظام 64 فقط
 
مثال
 
tsFN.lStructSize = LenB(tsFN)
 
 
بقية المؤشرات مثل  String  و  Boolean  فإنها تبقى كما هي بدون تغيير
 
راجع المصدر
 

بالتوفيق

تم تعديل هذه المشاركة بواسطة zahrah في 24 يناير 2014 في 22:28

1▲ -1
#16

اختي الكريمة بارك الله بك على هذا الشرح والامثلة الرائعة

 

سؤال وان شاء الله يكون خاتمة للموضوع

 

انا استخدم  دالة التحجيم بكل الامثلة التي اعملها

 

لذلك ساعتتمد ماورد في اخر مشاركة عند استخدامها سواء كان الاوفيس 32 او 64   اليس كذلك.

وهل يحتاج في هذه الحالة ان انشى الوحدة النمطية التي اوردتيها ي اول مشاركة ووضع كود عند الفتح .. 

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

 

وشكرا 

▲ 1
#17

اذا كانت قاعدة البيانات تحتوي فقط على دالة تحجيم النموذج

 

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

 

اما بالنسبة لدالة معرفة نوع نظام الويندوز والأكسيس هل هو 32 بت او 64 بت فلا تحتاجها في برنامحك

 

يكفيك فقط ان تكتب الأكواد البرمجية العادية في النموذج بشكل عادي بدون اي تغييرات

 

كما تستطيع استداعاء دالة تحجيم النموذج بطريقة عادية لأن كل الإجراءات تتم في الوحدة النمطية المسئولة عن معرفة النسخة سواء 32 بت او 64 بت

 

 

باتلوفيق

▲ 1
#18

الف شكر  جعل الله كل كلمة في هذا الموضوع في ميزان حسناتك

 

تحياتي وتقديري 

▲ -1

هذا الموضوع مغلق.

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