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

jjafferr

أوفيسنا
  • Posts

    10009
  • تاريخ الانضمام

  • تاريخ اخر زياره

  • Days Won

    408

كل منشورات العضو jjafferr

  1. السلام عليكم 🙂 اسمح لي ارد على هذا الاقتراح ، وبالتفصيل ، فنيا ، وبالتجربة : 1. انا اعتبر تصفح ملف pdf الذي به صور ، كأني اتصفح ملف الموظف الورقي ، لا يمكنني البحث فيه ، فأقلبه صورة صورة ، حتى اصل الى الصورة اللي اريدها ، واذا اريد مقارنة/النظر في صورة اخرى ، فأتصفح زيادة الى ان اصل الى الصورة الثانية ، وهنا لا استطيع مقارنة هذه الصورة بالصورة السابقة!! يمكن استعمال ملف pdf في حال: انك لن تبحث عن صورة/رسالة/كتاب/شهادة معينة ، اي انك لا تحتاج الوصول الى صورة معينة من الملف ، وفي حال: انك لن تحتاج الى اضافة صورة جديدة وسط محتواه ، 2. ملف pdf يحتفظ بالصور بصيغة مضغوطة ، وهذه الصيغة تعتمد على نوع بيانات الصورة ، وهذا الضغط هو الذي يقلل من حجم ملف pdf ، مثلا انظر في مواصفات هذا البرنامج الذي يحفظ الصور في ملف pdf : . او حتى لما تريد تصدر التقرير بصيغة pdf ، عندك خيار الضغط (ولكن بطريقة اخرى) : . الضغط على الصورة يجعلها تفقد بعض وضوحها ، وخصوصا اذا كان الضغط كبير (حتى تصبح الصورة صغيرة) ، وتتجه المؤسسات الى الاعتماد على هذه المستندات للارشفة ، مع التخلص من الاوراق الاصليه (بعد مدة من الزمن) ، هناك ISO خاص لأرشفة الصور ، وفيها يجب ان تكون دقة الصور 300 ، 600 (الموصى به) ، او 2100 DPI ، والنقاوة يجب ان تكون اقصاها او اقل بقليل (يعني بدون ضغط او ضغط قليل) ، وصار مع احد المؤسسات التي اتعامل معها ، اشتروا سكانر جديد واستعملوه مباشرة وبدون ضبط اعداداته ، وتم استعماله في ارشفة الوثائق ، وبعد مدة طُلب منهم التحقق في الاسم الرابع لأحد الموظفين , كانت وثيقته بخط اليد ، ولم يتمكنوا من التأكد اذا كان الاسم تامر او ثامر ، بسبب ان دقة الصورة كانت صغيرة والضغط كبير ، فاضطروا لطلب نسخة ورقية اخرى من الموظف (كانت فترة الابقاء على النسخة الورقية للملف قد انتهت وتم تلفها). . 3. نعم اسهل في عمل ملف pdf واحد من السكانر يحتوي على مجموعة وثائق ، ولكن هناك صعوبة للوصول الى الوثيقة المطلوبة ، وبسرعة في ملف pdf (انظر ملاحظتي اعلاه) ، بينما الطريقة التي اتبعتها لبرنامج شؤون الموظفين ، هو نسخ الوثائق وحفظها صورة صورة بصيغة jpg ، برقم مسلسل ، والبرنامج لما يفتح النموذج الخاص بالموظف ، فتلقائيا النموذج يبحث في مجلد الموظف عن جميع الوثائق الموجودة ، وعليه نرى مثل هذه الواجهة : و فمسمى الحقل يتحول لونه الى اللون الازرق الفاتح اذا كانت هناك وثيقة/وثائق تخص هذا الحقل ، وعند النقر على المسمى ، تظهر لنا جميع الوثائق التي تخص هذا الحقل فقط : . (وهنا تجد نسخه من النموذج اعلاه لتصفح الصور : https://www.officena.net/ib/topic/84228-هدية-العيد-استعراض-صورصورة-بأحجام-مختلفة/ ) وهذا لا يمكن عمله مع ملف pdf ، فإذن استخدام ملف pdf ليس اسهل للوضول الى المعلومة مباشرة . 4. وحتى اسهل عليك ، اليك الدالة التي عملتها ، لتعمل اسم الملف بالتسلسل : Public Function Biggest_Value_in_Folder(ByVal Fldr As String, Pttrn As String, Digts As Integer, fle_Type As String) 'usage: 'Call Biggest_Value_in_Folder("D:\Temp", "EM_New_Section_Letter_Number_", 6, "jpg") Dim strFile As String If Len(fle_Type & "") = 0 Then fle_Type = "*" strFile = Dir(Fldr & "\" & Pttrn & "*." & fle_Type) 'Debug.Print strFile Do Until strFile = "" 'NumberOfFiles = NumberOfFiles + 1 If Val(right(strFile, Digts)) > Biggest_Value_in_Folder Then Biggest_Value_in_Folder = Val(right(strFile, Digts)) End If strFile = Dir() Loop End Function . وهكذا استعملها . 'the folder path newpathANDname = BE_Path & "\Scanned_Files\" & Me.Employee_ID 'if the Employee_ID Dir dose not exist, creat it If Dir(newpathANDname, vbDirectory) = "" Then MkDir newpathANDname End If 'get the Biggest Seq io this file type Biggest_Value = Biggest_Value_in_Folder(newpathANDname, "EM_New_Section_Letter_Number_", 6, "jpg") newpathANDname = newpathANDname & "\" & "EM_New_Section_Letter_Number_" x = Split(Me.Selected_Files, vbCrLf) For j = LBound(x) To UBound(x) If Len(x(j)) <> 0 Then 'existing jpg file path and name oldpathANDname = x(j) NumberOfFiles = NumberOfFiles + 1 Biggest_Value = Biggest_Value + 1 'copy the jpg file to the correct directory FileCopy oldpathANDname, newpathANDname & Format(Biggest_Value, "000000") & ".jpg" End If 'Len(x(j)) <> 0 Next j . جعفر
  2. وعليكم السلام اخي وليد 🙂 من تجربتي في المنتدى ، اذا يبقى السؤال بدون جواب لعدة ايام ، معناه ان هناك مشكلة في السؤال !! قرأت الموضوع ، ثم انزلت المرفق ، ثم اصبحت . . . . قلت الحمدلله ، لقينا طرف الخيط ، النموذج Form1 ، واذا به من كثرة الكائنات التي به وكثرة النماذج الفرعية ملاحظاتي على الموضوع: اتمنى انك عرفت الآن سبب وجود قانون في المنتدى: 8. يجب ذكر كافة المعلومات التي من الممكن أن تُسأل عنها، مع الشرح الوافي للمشكلة لأن الشخص الذي تكتب له ليس ملما بالمشكلة مثلك. ويحبذ وضع مثال للنتيجة التي تريدها (سواء كملف مرفق باستخدام البرنامج المطلوب كالاكسيل او الأكسيس مثلا، او صورة توضيحية، أو تفصيل المطلوب بشرح وافي)، ويجب ان تكون بيانات المثال نابعة من نفس بيانات المرفق كي بمكن الربط و الفهم بسهولة. 11. ممنوع طرح أكثر من سؤال في موضوع واحد واليك شرح المشكلة: 1. قرأت جميع مشاركاتك ، قلت الحمدلله ، لقينا طرف الخيط ، النموذج Form1 ، واذا به كم هائل من الكائنات النماذج الفرعية ، وهذا معناه انه يجب عليك اعادة النظر في التصميم ، وخصوصا انك قلت انك ستستخدمه كنموذج فرعي !! 15 زر 5 كمبوبوكس 4 نماذج فرعية ، و النماذج الفرعية فيها: 10 كومبوبوكس 4 نماذج فرعية هذا معناه ان النموذج يأخذ بياناته (يزور الجداول) = 5 + 4 + 10 + 4 = 23 مرة ، فالسؤال الذي يدور في بالي هو: لو كان هذا برنامجك على الشبكة ، فهل هذا النموذج سيفتح اصلا ، او الاكسس سيتوقف عن العمل ويصير له Hang !! 2. بغض النظر عن ما قلته في النقطة 1 اعلاه ، صرت انظر يمين وشمال في النموذج ، طيب اي زر من الـ 15 زر اللي فيه المشكلة؟ 3. وبسبب انه عندك اكثر من سؤال في المشاركة ، فصعب تحصل على العضو الذي يوجد لديه الوقت الكافي للإجابة عليها !! 4. ملاحظاتي اعلاه هي فقط عن النموذج Form1 ، ولم يكن لدي الجرأة النظر في اي نموذج آخر اقتراحي: 1. الحق على نفسك قبل فوات الاوان ، وقم بتبسيط هذا النموذج الى الحد الادنى من الكائنات ، 2. اعمل موضوع جديد ، وضع فيه سؤال واحد فقط ، وتخبرنا فيه اين المشكلة ، في اي نموذج ، واسم الكائن الذي به حدث كود ، وكيف تريد ان تكون النتيجة ، وبالتفصيل . هذا الموضوع مخالف ، فرجاء من الاعضاء عدم اضافة اجابة هنا ، وسأتركه مفتوحا حتى اتناقش فيه مع الاخ وليد ، حتى يتهيأ لعمل موضوع جديد جعفر للذي سيسأل عن هذه الاشكال ، اخذتها من هنا : https://emojis.wiki/telegram/
  3. اخي احمد ، اخر مشاركة قي هذا الموضوع كانت في 2016 ، فالافضل لك عمل موضوع جديد !! جعفر
  4. السلام عليكم 🙂 يتشرف منتدى الاكسس بالنيابة عن موقع اوفسينا وجميع الاعضاء ، ان نزف رتبة خبير الى الاخ موسى @Moosak ، والذي ذاع صيته كخبير من مشاركاته 🙂 اتمنى لك اخوي موسى دوام التقدم ، ولا تمد رجولك قد لحافك ، فلا تقبل بالارتقاء غير النجوم بدلا 🙂 جعفر
  5. وعليكم السلام 🙂 جميل اخوي الخبير موسى 🙂 جعفر
  6. وعليكم السلام 🙂 ما قادر ابلع ريقي من كثرتهم 🙂 جعفر
  7. السلام عليكم 🙂 اذن ، هذا هو الشرط : علشان نقدر نقارن نتائجنا: 1. رجاء تغيير الاختيار الى المواد التالية ، فالمواد السابقة مو كل شخص ماخذها ، فالحصر جزئي . 2. خلينا نستعمل التواريخ التالية في العمل: 15/7/2021 الى 13/3/2022 ، لأن فيها نتائج مناسبة 🙂 طريقتي فيها 3 استعلامات : 1. المواد التي تم اختيارها : . 2. جميع الاشخاص الذين استلموا المواد اعلاه خلال التاريخين اعلاه . ونلاحظ ان بعض الاشخاص مكرر اسمهم ، لأنهم ماخذين اكثر من مادة خلال هذه الفترة : . 3. واخيرا ، نربط بين جميع اسماء المستفيدين ، والاسماء الموجودة بين التالريخين ، ولكن نطلب الاسماء الغير موجودة بين التاريخين (BenId is Null) . والنتيجة ، 759 شخص يستحقون : . للتأكد : عدد جميع الاشخاص tbl_beneficiaries = 982 نزيل الاسماء المتكررة في الاستعلام qry_2_Between_Dates ، فيكون الاشخاص بين الفترتين = 223 . . اذن 982 - 223 = 759 شخص يستحقون 🙂 جعفر 1487.2.NotExists.accdb.zip
  8. السلام عليكم 🙂 تفضل : بالنسبة للبحث ، اضفت هذا الحقل بالحقول المطلوبة ، فتقدر تضيف وتنقص منها اللي يناسبك : . وهذه الاكواد: Private Sub cmd_New_Student_Click() 'عمل سجل جديد DoCmd.GoToRecord , , acNewRec Me.namestudent.SetFocus End Sub Private Sub SearchList_DblClick(Cancel As Integer) 'عند النقر مرتين، الانتقال الى اسم الطالب Me.Recordset.FindFirst "codestudint=" & Me.SearchList Me.Bookmark = Me.Recordset.Bookmark Me.namestudent.SetFocus End Sub Private Sub srch_txt_AfterUpdate() 'البحث في Listbox Me.SearchList.Requery End Sub . اما زر حفظ ، وحفظ التعديل ، فلم يتم استعمالهم 🙂 جعفر 1488.Microsoft.accdb.zip
  9. وعليكم السلام 🙂 هذه المعلومة اللي اعطيتنا ، تكفي فقط لكي يكون جوابي: لا لم تمر عليّ مثل هذه الحاله. جعفر
  10. السلام عليكم دكتور حسنين 🙂 انت قلت في البداية : بينما لاحقا قلت: فأيهما ؟ وبعدين ، خلينا نتفق على بعض الامور ، علشان نقدر نقارن نتائجنا: 1. رجاء تغيير الاختيار الى المواد التالية ، فالمواد السابقة لا يوجد شخص ماخذها معا ، فلا نقدر نحصر الاشخاص بها . 2. خلينا نستعمل التواريخ التالية في العمل: 15/7/2021 الى 13/3/2022 ، وهو مجرد تاريخ ، ولكن فيه نتائج انا قاصدها 🙂 اذا قمنا بالعمل على الطريقة الاولى ، فيكون هناك 3 اشخاص فقط حصلوا على المواد اعلاه معا ، في الفترة بين التاريخين ، وارقامهم 17 و 73 و 364 ، ويكون عدد الشخاص الذين لم يستلموا هو: 982 - 3 = 979 🙂 ومن هنا نقدر نبدأ نشتغل ونقارن النتائج 🙂 جعفر
  11. هلا والله بالغاليين 🙂 جعفر
  12. جرب ، هذا بريدك: qat**@l**.com جعفر
  13. طريقة تفكيك الجدول الى عدة جداول : 1. هناك حقل اساسي واحد يربط جميع البيانات ، فهذا الحقل يجب ان يكون في كل الجداول ، 2. يجب ان تقسم/توزع الحقول بطريقة ، بحيث كل مجموعة متجانسة من نفس النوع يكون لها جدول خاص ، 3. وبعدين تقدر تجمع احد/بعض/كل الجداول في استعلام ، ويكون هذا الاستعلام مصدر بيانات النموذج 🙂 وبما ان هذا السؤال خارج عن موضوع السؤال ، فرجاء تعمل له سؤال جديد ، وان شاء الله تحصل على مساعدة فيه 🙂 جعفر
  14. انت اصبر دورك جاي🙂 في الواقع كتبت عدة اسطر في المشاركة السابقة ، بعدين اختصرتها في كلمتين 🙂 جعفر
  15. السلام عليكم اخوي ابوخليل 🙂 الهدف من هذا الموضوع: 1. عند عمل المبرمج واجهة برنامجه FE ، فيحتاج الى عمل ربط لجداوله BE في جهازه ، 2. عند ارسال الواجهة للمستخدم ، فيجب ان يعمل البرنامج بدون تدخل المستخدم بإختيار مسار قاعدة البيانات ، 1. عند استلام المبرمج واجهة البرنامج للتعديل/الاضافة ، فيحتاج الى عمل ربط لجداوله BE في جهازه ، 2. عند ارجاع الواجهة للمستخدم ، فيجب ان يعمل البرنامج بدون تدخل المستخدم بإختيار مسار قاعدة البيانات. وهناك تشابه كبير بين طريقتي وطريقتك ، وهناك نقاط قوة وضعف في الطريقتين 🙂 جعفر
  16. انا اعتذر عن اعطائك ملف جاهز ، وارجو من الجميع ذلك ايضا 🙂 اخي الفاضل ، انت تحصل على نصيحة افضل الخبراء ، فقم بعمل الخطوات اللي يعطوك ، وانت قم بالعمل ، شو صعوبة عمل الملف اللي شرحه اخونا Moosak ، اما اذا ما تعرف تعمله ، فانت في المكان الخطأ للحصول على شرح/جواب !! جعفر
  17. السلام عليكم 🙂 المشكلة ليست في تصدير البيانات الى اكسل ، وانما الصعوبة في عمل مجاميع كل عمود في الاكسل ، وهناك طريقتين لعمل هذا: أ. تصدير البيانات والتعامل مع بيئة الاكسل (Excel Object) برمجيا ، ب. عمل مجاميع الاعمدة من الاكسس وتصديرها جاهزة للاكسل ، وانا اتبعت هذه الطريقة 🙂 عملت 4 طرق ، وانت تختار الافضل لك: . بسبب انه في الاستعلام export_selfa ممكن يكون عندك الاسم مكرر اكثر من مرة () ، فكان لازم نعمل استعلام المجاميع qry_Sum_export_selfa ، بحيث يجمع قيم الموظف في سجل واحد : . الطريقة 3. من هنا عملنا التقرير rpt_Sum_export_selfa والذي مصدر بياناته الاستعلام اعلاه ، وعملنا تجميع الاعمدة في التقرير: . الفكرة الاخرى ، ان نعمل مجموع الاعمدة في الاستعلام نفسه ، والطريقة اللي توصلت لها ، هي عمل استعلام مجاميع الاعمدة فقط qry_Sum_export_selfa_2 : . وتكون نتيجتها . ثم نعمل استعلام توحيد qry_Sum_export_selfa_3 فيه الاستعلام الاول qry_Sum_export_selfa والثاني qry_Sum_export_selfa_2 . فتصبح النتيجة . الطريقة 1. بتصدير الاستعلام qry_Sum_export_selfa_3 الى اكسل عن طريق الامر TransferSpreadsheet ، الطريقة 2. بتصدير الاستعلام qry_Sum_export_selfa_3 الى اكسل عن طريق الامر OutputTo ، الطريقة 4. عمل تقرير من الاستعلام qry_Sum_export_selfa_3 وتصدير التقرير الى اكسل عن طريق الامر OutputTo : . وهذه اكواد الطرق اعلاه: Private Sub cmd_Transffer_Query_Click() '1 Dim File_Name As String File_Name = CurrentProject.path & "\" & "تفصيل سلفة متنوعة" & Format(Date, "---DDDD-DD-mmmm-yyyy") & ".xlsx" DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "qry_Sum_export_selfa_3", File_Name, True End Sub Private Sub cmd_Output_qry_Click() '2 Dim File_Name As String File_Name = CurrentProject.path & "\" & "تفصيل سلفة متنوعة" & Format(Date, "---DDDD-DD-mmmm-yyyy") & ".xls" DoCmd.OutputTo acOutputQuery, "qry_Sum_export_selfa_3", acFormatXLS, File_Name, True, , , acExportQualityPrint End Sub Private Sub cmd_Output_rpt_Click() '3 Dim File_Name As String File_Name = CurrentProject.path & "\" & "تفصيل سلفة متنوعة" & Format(Date, "---DDDD-DD-mmmm-yyyy") & ".xls" DoCmd.OutputTo acOutputReport, "rpt_Sum_export_selfa", acFormatXLS, File_Name End Sub Private Sub cmd_Output_rpt_3_Click() '4 Dim File_Name As String File_Name = CurrentProject.path & "\" & "تفصيل سلفة متنوعة" & Format(Date, "---DDDD-DD-mmmm-yyyy") & ".xls" DoCmd.OutputTo acOutputReport, "rpt_Sum_export_selfa_3", acFormatXLS, File_Name End Sub ونصيحة: انت مستعمل 160 حقل في الجدول FILE-1 ، ويجب عليك تفكيكه الى على الاقل 3 جداول ، وتربط بينهم برقم الموظف ، ثم في استعلام تجمعهم جميعا !! جعفر 1486.Database1 (2).accdb.zip
  18. وعليكم السلام اخوي qathi 🙂 تواصلت مع الادارة ، وان شاء الله نحصل على رد في هذه المشاركة 🙂 جعفر
  19. وعليكم السلام 🙂 هذا الرابط به الطرق الصحيحة للتخاطب بين كائنات الاكسس وحتى لمثل حالتك: http://access.mvps.org/Access/forms/frm0031.htm وارفق هنا الملف من الرابط اعلاه. الامر DoCmd.GoToControl قديم (طبعا لا يزال يعمل) ، وتم استبداله بالامر SetFocus. لحصول التركيز على الحقل في النموذج الفرعي الثاني ، يجب ان تبدأ بالتدرج الهرمي في اعطاء التركيز ، هكذا (على اعتبار انك الان في النموذج الرئيسي Form1 ) : me.Form2.setfocus me.Form2!Form3.setfocus me.Form2!Form3!ImagesSubform2.setfocus جعفر Syntax_for_subs (1).zip
  20. شكرا جزيلا اخوي ابوخليل 🙂 بكرة الصباح اشوف الموضوع من اول وجديد ان شاء الله 🙂 جعفر
  21. موقع الشركة هو افضل مكان علشان تحصل على جميع ما تريد ان تعرفه عن منتجها: http://www.ammara.com/ جعفر
  22. اذا تشوف صورة الاكسل في مشاركتي اعلاه ، تشوف انها جمعت مبالغ السجلات الثلاثة في سجل واحد. هل هذا اللي تريده؟
  23. وعليكم السلام 🙂 اللي فهمته هو ، اذا عندك نفس الاسم مكرر اكثر من مرة ، مثل ازهار مثلا : . ففي الاكسل تريد قيمها مجموعة هكذا : . هل هذا قصدك ؟ جعفر
  24. السلام عليكم 🙂 الحل اللي توصلت اليه هو: 1. حفظ الصورة في مجلد الوندوز المؤقت ، 2. ثم قراءته وحفظه في الذاكرة ، وعن طريق Ctrl + V تستطيع لصقه في معظم البرامج (هناك برنامج لم يقبل اللصق فيه) . والاكواد : 1. Public Function Export_Attached_Pictures(TQ_Name As String, Record_ID, fld_Name As String, img_Name As String, Export_Folder_Name As String) On Error GoTo err_Export_Attached_Pictures ' TQ_Name = Table or Query Name ' fld_Name = Attachement field name ' Export_Folder_Name = where to export the picture Dim db As dao.Database Dim rst_TQ As dao.Recordset Dim rst_Pictures As dao.Recordset Dim mySQL As String Set db = CurrentDb ' the parent recordset. mySQL = "Select " mySQL = mySQL & fld_Name mySQL = mySQL & " From " mySQL = mySQL & TQ_Name mySQL = mySQL & " Where ID=" & Record_ID Set rst_TQ = db.OpenRecordset(mySQL) ' loop through it While Not rst_TQ.EOF ' the child recordset. Set rst_Pictures = rst_TQ.Fields(fld_Name).Value ' Loop through the attachments. While Not rst_Pictures.EOF If rst_Pictures.Fields("FileName") = img_Name Then ' Save current attachment to disk, with their original names rst_Pictures.Fields("FileData").SaveToFile Export_Folder_Name GoTo Exit_Export_Attached_Pictures End If rst_Pictures.MoveNext Wend rst_TQ.MoveNext Wend Exit_Export_Attached_Pictures: rst_TQ.Close: Set rst_TQ = Nothing rst_Pictures.Close: Set rst_Pictures = Nothing Exit Function err_Export_Attached_Pictures: If err.Number = 3839 Then 'file exists Resume Next ElseIf err.Number = 91 Or err.Number = 3420 Then Resume Next Else MsgBox err.Number & vbCrLf & err.Description Resume Exit_Export_Attached_Pictures End If End Function . 2. Option Compare Database Option Explicit ' Required data structures Private Type POINTAPI x As Long y As Long End Type #If Win64 And VBA7 Then ' Clipboard Manager Functions Private Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long Private Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hwnd As LongPtr) As Long Private Declare PtrSafe Function CloseClipboard Lib "user32" () As Long Private Declare PtrSafe Function SetClipboardData Lib "user32" (ByVal wFormat As Long, ByVal hMem As LongPtr) As LongPtr Private Declare PtrSafe Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As LongPtr Private Declare PtrSafe Function IsClipboardFormatAvailable Lib "user32" (ByVal wFormat As Long) As Long ' Other required Win32 APIs Private Declare PtrSafe Function DragQueryFile Lib "shell32.dll" Alias "DragQueryFileA" (ByVal HDROP As LongPtr, ByVal UINT As Long, ByVal lpStr As String, ByVal ch As Long) As Long Private Declare PtrSafe Function DragQueryPoint Lib "shell32.dll" (ByVal HDROP As LongPtr, lpPoint As POINTAPI) As Long Private Declare PtrSafe Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As LongPtr) As LongPtr Private Declare PtrSafe Function GlobalFree Lib "kernel32" (ByVal hMem As LongPtr) As LongPtr Private Declare PtrSafe Function GlobalLock Lib "kernel32" (ByVal hMem As LongPtr) As LongPtr Private Declare PtrSafe Function GlobalUnlock Lib "kernel32" (ByVal hMem As LongPtr) As Long Private Declare PtrSafe Sub CopyMem Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As LongPtr) Dim hGlobal As LongPtr Dim lpGlobal As LongPtr Dim HDROP As LongPtr #Else ' Clipboard Manager Functions Private Declare Function EmptyClipboard Lib "user32" () As Long Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long Private Declare Function CloseClipboard Lib "user32" () As Long Private Declare Function SetClipboardData Lib "user32" (ByVal wFormat As Long, ByVal hMem As Long) As Long Private Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long Private Declare Function IsClipboardFormatAvailable Lib "user32" (ByVal wFormat As Long) As Long ' Other required Win32 APIs Private Declare Function DragQueryFile Lib "shell32.dll" Alias "DragQueryFileA" (ByVal HDROP As Long, ByVal UINT As Long, ByVal lpStr As String, ByVal ch As Long) As Long Private Declare Function DragQueryPoint Lib "shell32.dll" (ByVal HDROP As Long, lpPoint As POINTAPI) As Long Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long Private Declare Sub CopyMem Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) Dim hGlobal As Long Dim lpGlobal As Long Dim HDROP As Long #End If ' Predefined Clipboard Formats Private Const CF_TEXT = 1 Private Const CF_BITMAP = 2 Private Const CF_METAFILEPICT = 3 Private Const CF_SYLK = 4 Private Const CF_DIF = 5 Private Const CF_TIFF = 6 Private Const CF_OEMTEXT = 7 Private Const CF_DIB = 8 Private Const CF_PALETTE = 9 Private Const CF_PENDATA = 10 Private Const CF_RIFF = 11 Private Const CF_WAVE = 12 Private Const CF_UNICODETEXT = 13 Private Const CF_ENHMETAFILE = 14 Private Const CF_HDROP = 15 Private Const CF_LOCALE = 16 Private Const CF_MAX = 17 ' New shell-oriented clipboard formats Private Const CFSTR_SHELLIDLIST As String = "Shell IDList Array" Private Const CFSTR_SHELLIDLISTOFFSET As String = "Shell Object Offsets" Private Const CFSTR_NETRESOURCES As String = "Net Resource" Private Const CFSTR_FILEDESCRIPTOR As String = "FileGroupDescriptor" Private Const CFSTR_FILECONTENTS As String = "FileContents" Private Const CFSTR_FILENAME As String = "FileName" Private Const CFSTR_PRINTERGROUP As String = "PrinterFriendlyName" Private Const CFSTR_FILENAMEMAP As String = "FileNameMap" ' Global Memory Flags Private Const GMEM_FIXED = &H0 Private Const GMEM_MOVEABLE = &H2 Private Const GMEM_NOCOMPACT = &H10 Private Const GMEM_NODISCARD = &H20 Private Const GMEM_ZEROINIT = &H40 Private Const GMEM_MODIFY = &H80 Private Const GMEM_DISCARDABLE = &H100 Private Const GMEM_NOT_BANKED = &H1000 Private Const GMEM_SHARE = &H2000 Private Const GMEM_DDESHARE = &H2000 Private Const GMEM_NOTIFY = &H4000 Private Const GMEM_LOWER = GMEM_NOT_BANKED Private Const GMEM_VALID_FLAGS = &H7F72 Private Const GMEM_INVALID_HANDLE = &H8000 Private Const GHND = (GMEM_MOVEABLE Or GMEM_ZEROINIT) Private Const GPTR = (GMEM_FIXED Or GMEM_ZEROINIT) Private Type DROPFILES pFiles As Long pt As POINTAPI fNC As Long fWide As Long End Type Public Function ClipboardCopyFiles(File As String) As Boolean ' 'From: https://www.developerfusion.com/code/224/copy-files-to-clipboard/ ' 'modified by jjafferr 'Copy one file to clipboad 'call it like this: ClipboardCopyFiles("D:\Les-fruits.jpg") ' Dim data As String Dim df As DROPFILES 'Dim hGlobal As Long 'Dim lpGlobal As Long Dim i As Long ' Open and clear existing crud off clipboard. If OpenClipboard(0&) Then Call EmptyClipboard ' Build double-null terminated list of files. data = File & vbNullChar ' Allocate and get pointer to global memory, ' then copy file list to it. hGlobal = GlobalAlloc(GHND, Len(df) + Len(data)) If hGlobal Then lpGlobal = GlobalLock(hGlobal) ' Build DROPFILES structure in global memory. df.pFiles = Len(df) Call CopyMem(ByVal lpGlobal, df, Len(df)) Call CopyMem(ByVal (lpGlobal + Len(df)), ByVal data, Len(data)) Call GlobalUnlock(hGlobal) ' Copy data to clipboard, and return success. If SetClipboardData(CF_HDROP, hGlobal) Then ClipboardCopyFiles = True End If End If ' Clean up Call CloseClipboard End If End Function Public Function ClipboardPasteFiles(Files() As String) As Long 'Dim HDROP As Long Dim nFiles As Long Dim i As Long Dim desc As String Dim filename As String Dim pt As POINTAPI Const MAX_PATH As Long = 260 ' Insure desired format is there, and open clipboard. If IsClipboardFormatAvailable(CF_HDROP) Then If OpenClipboard(0&) Then ' Get handle to Dropped Filelist data, and number of files. HDROP = GetClipboardData(CF_HDROP) nFiles = DragQueryFile(HDROP, -1&, "", 0) ' Allocate space for return and working variables. ReDim Files(0 To nFiles - 1) As String filename = Space(MAX_PATH) ' Retrieve each filename in Dropped Filelist. For i = 0 To nFiles - 1 Call DragQueryFile(HDROP, i, filename, Len(filename)) Files(i) = TrimNull(filename) Next ' Clean up Call CloseClipboard End If ' Assign return value equal to number of files dropped. ClipboardPasteFiles = nFiles End If End Function Private Function TrimNull(ByVal sTmp As String) As String Dim nNul As Long ' ' Truncate input sTmpg at first Null. ' If no Nulls, perform ordinary Trim. ' nNul = InStr(sTmp, vbNullChar) Select Case nNul Case Is > 1 TrimNull = Left(sTmp, nNul - 1) Case 1 TrimNull = "" Case 0 TrimNull = Trim(sTmp) End Select End Function . والحدث على نقر الزر : Private Sub cmd_Attachment_image_to_Clipboard_Click() Dim myFile As String 'make folder tmp_File in Windows TEMP Directory myFile = Environ("TEMP") & "\tmp_File\" If Dir(myFile) = "" Then MkDir myFile End If 'Save the image to folder Call Export_Attached_Pictures("Query1", Me.ID, "img", Me.img.filename, myFile) 'Copy the image to Clipboard Call ClipboardCopyFiles(myFile & Me.img.filename) End Sub Private Sub cmd_Copy_file_to_Clipboard_with_irfan_view_Click() 'use irfan view to copy the picture in clipboard Dim IV_Path As String, Source_File As String IV_Path = "C:\Program Files\IrfanView\" 'location of i_view32.exe file Source_File = "D:\Les-fruits.jpg" 'Source_File = Me.img.Picture Shell (IV_Path & "i_view64.exe " & Source_File & "/ClipCopy /killmesoftly") MsgBox "This image is copied in the clipboard, you can paste it in any program" End Sub جعفر 1484.Copy attached image to clipboard.accdb.zip
×
×
  • اضف...

Important Information