• 0
lordring

Declare statements on 64-bit

سؤال

السلام عليكم

 

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

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

 

Declare statements on 64-bit

 

 

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

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

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

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

 

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

لن يعمل معي 

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

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

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

 

 

 

 

 

 

 

 

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

17 إجابة على هذا السؤال .

  • -1

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

 

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

 

#If Win64 ThenPrivate Declare PtrSafe Function DisplaySize Lib "user32" Alias "GetSystemMetrics" (ByVal nIndex As Long) As Long#ElsePrivate Declare Function DisplaySize Lib "user32" Alias "GetSystemMetrics" (ByVal nIndex As Long) As Long#End If

 

 

 

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

 

 

Option Compare Database #If Win64 ThenPrivate Declare PtrSafe Function DisplaySize Lib "user32" Alias "GetSystemMetrics" (ByVal nIndex As Long) As Long#ElsePrivate 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 Nextwrate = DisplaySize(0) / bestwhrate = DisplaySize(1) / besthfrm.InsideWidth = frm.InsideWidth * wratefrm.InsideHeight = frm.InsideHeight * hrateDim fc As ControlFor Each fc In frm.Controlsfc.Top = fc.Top * hratefc.Left = fc.Left * wratefc.Width = fc.Width * wratefc.Height = fc.Height * hratefc.FontSize = fc.FontSize * wrateNextEnd Function
 
اما الوحدات النمطية التي ليس بها Declare فتبقى كما هي بدون اي تغيير
 
ملاحظة هامة للفهم
 
عند اضافة  PtrSafe فإنها تحتاج ايضا الى تعديل بعض المؤشرات
 
Long  تتغير الى  LongPtr
 
مثال
 
Dim lStructSize As LongPtr
 
 
 
 
دالة ()Len  تتغير الى  ()LenB حتى يتم قبولها في نظام 64 فقط
 
مثال
 
tsFN.lStructSize = LenB(tsFN)
 
 
بقية المؤشرات مثل  String  و  Boolean  فإنها تبقى كما هي بدون تغيير
 
راجع المصدر
 

بالتوفيق

تم تعديل بواسطه zahrah
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 1

اخي الفاضل

 

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

 

لا تحتاج الى تقسيم البرنامج ولكن تحتاج الى وظيفة عامه لتحدد لك نوع النظام هل هو 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 infoEnd Function
 
الآن نضع في اول نموذج يتم فتحه في القاعدة هذه الأكواد البرمجية
 
Dim OSOS = IsWin32OrWin64()if  OS= "64-bit" then'دالة التصريح للنظام 64 بت   Private Declare PtrSafe FunctionElse'دالة التصريح للنظام 32 بت   Private Declare FunctionEnd if
 
 
Private Sub Form_Open(Cancel As Integer) Me.TimerInterval = 3000Dim OSOS = IsWin32OrWin64() Select Case OSCase Is = "32-bit"  ' ضع الكود او الأكواد البرمجية المطلوبة هنا     Case Is = "64-bit"  ' ضع الكود او الأكواد البرمجية المطلوبة هنا        End SelectEnd Sub
 
الآن برنامج الأكسيس عند فتحه يتم اختيار النسخة المناسبة لفتح قاعدة البيانات يواء على النظام  64 بت او 32 بت
 
 
بالتوفيق
تم تعديل بواسطه zahrah
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 1

اختي الكريمة

 

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

 

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

 

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

 

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

 

 

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

 

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

 

 

وشكرا 

 

Database11.rar

تم تعديل بواسطه lordring
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 1

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

 

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

 

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

 

 

za-Database32-64bit.rar

 

 

بالتوفيق

3

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 1

شكرا اختي  

 

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

 

8.jpg

 

 

 

 

تحياتي 

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 1

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

 

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

 

شكرا مرة اخرى 

 

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

 

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

 

بالتوفيق

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 1

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

 

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 1

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

 

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

 

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

 

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

 

 

za-Database32-64bit-UP.rar

 

 

وشكرا 

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 1

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

 

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

 

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

 

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

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

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

 

وشكرا 

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 1

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

 

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

 

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

 

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

 

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

 

 

باتلوفيق

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • -1

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

 

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

 

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

 

11.jpg

 

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

 

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

 

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

 

 

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

 

 

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

 

 

وشكرا 

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • -1

اخي الفاضل

 

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

 

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

 

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

 

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

 

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

 

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

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

 

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

 

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

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • -1

اخي الفاضل

 

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

 

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

 

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

 

بالتوفيق

2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • -1

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

 

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

 

شكرا مرة اخرى 

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • -1

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

 

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

 

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

 

 

za-Database32-64bit-UP.rar

 

 

بالتوفيق

تم تعديل بواسطه zahrah
4

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • -1

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • -1

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

 

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .