السلام عليكم
ها قد عدت من جديد.
الآن سنأخذ القسم الثاني من أوامر البرنامج وهو "استدعاء صندوق الفتح والحفظ"
أولا: سأبدأ بتعريف صندوق الفتح والحفظ، والغاية منه ولم يكون هو أفضل من غيره.
ثانيا: سأشرح كيف يتم استدعاؤه وكيف يتم التعامل مع معطياته.
فلنبدأ على بركة الله.
1 :
أ - ما هو صندوق الفتح والحفظ أو ما يُعرف بالإنجليزية باسم "CommonDialog"؟
- في أي برنامج يُوجد على حاسوبك اذهب إلى قائمة "File" ثم اضغط على "Save As..." سيظهر لك صندوق يطلب منك تحديد مكان لحفظ ما ترغب بحفظه.
- في أي برنامج يُوجد على حاسوبك اذهب إلى قائمة "File" ثم اضغط على "Open" سيظهر لك صندوق يطلب منك تحديد الشيء الذي تريد فتحه.
ذلك الصندوق الذي يظهر هو ما يُعرف ب "Common Dialog" أو "صندوق الفتح والحفظ".
تنبيه (صندوق الفتح والحفظ ليس ترجمة ل "CommonDialog")
ب - الغاية من هذا الصندوق واضحة جدا فهو يُساعدك على تحديد المكان الذي تريد أن تحفظ به شيئا ما وكذلك يُساعدك على تحديد مكان ملف ما لفتحه.
ج - بالنسبة لنا نحن كمبرمجين، لم هو أفضل من طرق أخرى؟
هناك طرق أخرى لكي نجعل مستخدِم برنامجنا يُحدد الملف الذي يُريد فتح أو المجلد الذي يُريد الحفظ فيه، لكنها كلها تقتضي منا المزيد من العمل وطبعا من يرغب في أن يُكثر العمل على نفسه إذا كانت هناك طريقة أسرع للحصول على نفس الغاية؟!!
من ناحية هناك من يُريد أن يُتعب نفسه والسبب هو أن يكون البرنامج متناسقا ويُظهر براعة المصمم...
ومن ناحية أخرى هناك من يرغب فقط في أن يتم العمل والسلام.
ولهذا الأخير وُجد ال "CommonDialog".
ال "CommonDialog" هو صندوق يُوجد مع نظام الحاسوب وهو عبارة عن "مكتبة ربط ديناميكية" "DLL" وهو يُوجد تحت المسار التالي: "C:\Windows\System32" باسم "comdlg32.dll".
وكل برامج النظام أو أي برامج خارجية يُمكنها استدعاؤه في نفس الوقت، وكذلك برنامجي هذا الذي بين أيديكم، وطبعا أي برنامج ستصممونه وتحتاجون فيه لهذا الصندوق، ستقومون باستدعائه للعمل به، بعد أن تعرفوا بعد قليل كيف يتم ذلك.
ملحوظة:
ادخلوا موقع "http://www.google.com" واكتبوا "مكتبات الربط الديناميكية"، وستجدون عدة مواقع ستشرح لكم معناها والذي لا يُمكن أن أقوم به أنا هنا وإلا سأبتعد عن غاية كتابتي هنا وهي شرح أوامر برنامجي فقط.
وطبعا هذا لمن يُريد الاستزادة من المعرفة لا غير، أو من يُريد أن يُصبح محترفا.
2 :
كيف يتم استدعاء ال "CommonDialog"؟ وكيف يتم التعامل معه؟
أ - يتم التصريح في أعلى صفحة الأوامر بالتصريحين التاليين على أننا سنستخدم مكتبة الربط الديناميكية "comdlg32".
Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
Private Declare Function GetSaveFileName Lib "comdlg32.dll" Alias "GetSaveFileNameA" (pOpenfilename As OPENFILENAME) As Long
كما تلاحظون فإني وضعت تصريحين فحسب الأول هو "GetOpenFileName" الخاص بالفتح، والثاني هو"GetSaveFileName" الخاص بالحفظ.
ثلاث ملحوظات:
- لفهم الهيكلية التي يتم بها استدعاء "API" معينة مثل "GetOpenFileName" من داخل "comdlg32.dll" حاولوا قراءة عدة مواضيع عن "DLL" وقد تجدون شيئا يتحدث عن ذلك.
لكن بشكل عام فإن ذلك غير مفيد للمبرمج العادي بغنى عن مستواه، وذلك لأنه لكي تستدعي "API" معينة بنفسك عليك أن تكون على معرفة تامة بأوامر ال"DLL" المراد استدعاء "API" منه.
ولا أظن أي مبرمج عادي سيرغب في ذلك بما في ذلك أنا أيضا. (رغم أن الرغبة تُداعبني أحيانا).
- استدعاء ال"API" من "DLL" معين يتم بالنسبة للأغلبية الساحقة من المبرمجين على اختلاف مستوياتهم عن طريق الإنترنت أو عن طريق قاعدة بيانات تحتوي على كل ال "API" والغاية منها وحتى طريقة استخدامها أحيانا.
هذا يعني: استخدموا الطريقة السحرية الرائعة التي تُحقق كل الأمنيات وهي البحث في "Google".
على فكرة (هذا ليس إعلان

ل "Google" فعملاق مثله لا يحتاج لدعاية).
- هناك "API" ثالث على الأقل في المكتبة "comdlg32" وهو ال"API" الخاص بتحديد مجلد. وقد يكون هناك "API" غير ذلك. (لكن هذا هو كل ما أعلمه من الموجود فيها).
ب - بعد التصريح نقوم بتحديد "نوع" "Type"
Private Type OPENFILENAME
lStructSize As Long
hwndOwner As Long
hInstance As Long
lpstrFilter As String
lpstrCustomFilter As String
nMaxCustFilter As Long
nFilterIndex As Long
lpstrFile As String
nMaxFile As Long
lpstrFileTitle As String
nMaxFileTitle As Long
lpstrInitialDir As String
lpstrTitle As String
flags As Long
nFileOffset As Integer
nFileExtension As Integer
lpstrDefExt As String
lCustData As Long
lpfnHook As Long
lpTemplateName As String
End Type
ما هو ال"Type"؟
الحقيقة لا أدري بالضبط :crying: فأنا لم أتعلم ال"VB" عن طريق مدرسة، وإنما لوحدي بأسلوب التجربة والخطأ، وتحليل الأوامر الجاهزة.
لكن يُمكن أن نقول إنه أشبه بتكوين أداة ما.
حيث يكون اسم الأداة هو "OPENFILENAME" في السطر التالي: Private Type OPENFILENAME
وتكون خواص الأداة هي المتغيرات المعرفة بين:
Private Type OPENFILENAME
و
End Type
وكما نقوم باستخدام خواص الأداة (مثلا) بالشكل التالي:
label1.Property = Value
فإننا نستخدم ال"نوع" "Type" بنفس الشكل:
OPENFILENAME.Property = Value
لكن في استخدام ال "Type" هناك شيء إضافي حيث أننا لا نقوم باستخدامه مباشرة كما فعلت في هذا السطر أعلاه وإنما نقوم باسناده إلى متغير قبل ذلك ويكون هذا عبر الشكل التالي:
Dim ofn As OPENFILENAME
حيث "ofn" هو المتغير الذي سيكون بمثابة اسم الأداة، وبهذا يكون استخدام ال "Type" هكذا
ofn.Property = Value
ج - اسناد النوع "OPENFILENAME" إلى متغير، وذلك يكون بهذا الشكل:
Dim ofn As OPENFILENAME
ملحوظة:
ofn و OPENFILENAME هي مجرد متغيرات ما يعني أنه يُمكنك استخدام أي اسم مكانها، فقط استخدم الأسماء التي ستختارها حسب نفس الهيكلية.
د - استدعاء صندوق الفتح أو الحفظ.
يتم ذلك بهذا الشكل:
On Error Resume Next
ofn.lStructSize = Len(ofn)
ofn.hwndOwner = Me.hWnd
ofn.hInstance = 1
ofn.lpstrFilter = "Icon Files (*.ico)" + Chr$(0) + "*.ico" + Chr$(0)
ofn.lpstrFile = Space$(254)
ofn.nMaxFile = 255
ofn.lpstrFileTitle = Space$(254)
ofn.nMaxFileTitle = 255
ofn.lpstrInitialDir = "c:\"
ofn.lpstrTitle = "ÇÎÊÑ ÇáÃíÞæäÉ ÇáÊí ÊÑíÏ"
ofn.flags = 0
Dim a
a = GetOpenFileName(ofn)
If (a) Then
MsgBox Trim$(ofn.lpstrFile)
End If
- On Error Resume Next
هذه العبارة يضعها المبرمجون بعد الانتهاء من تصميم برنامجهم هي مهمة للغاية كي لا ينهار البرنامج في حال حدوث خطئ ما، لم يظهر عند عملية البرمجة.
ومعناها هو: في حال حدوث خطأ تجاوزه وتابع باقي الأوامر.
- باقي الأسطر سأتجاوز بعضها لأنه لن يُفيدكم معرفته بشيء (على الأقل حاليا).
وما يهمنا على أي حال هو الثلاثة أسطر التالية:
ofn.lpstrFilter = "Icon Files (*.ico)" + Chr$(0) + "*.ico" + Chr$(0)
ofn.lpstrInitialDir = "c:\"
ofn.lpstrTitle = "اختر الملف الذي تريد الحفظ فيه"
الأول نقوم في بتحديد نوع الملفات التي نريدها أن تظهر.
الثاني نحدد فيه المسار الافتراضي الذي نريد لصندوق الفتح أو الحفظ أن يعرض لنا محتوياته.
الثالث هو عنوان الصندوق وهو يظهر في شريط العنوان للصندوق.
- أخيرا هذا الجزء:
Dim a As String
a = GetSaveFileName(ofn)
If (a) Then
MsgBox Trim$(ofn.lpstrFile)
End If
ما تقدم أوامر يتم استخدامه بشكل مشترك سواء لاستدعاء الصندوق للفتح أو للحفظ، وهذا الجزء الأخير هو الذي نحدد فيه ما إذا كنا نريد صندوق الفتح أو صندوق الحفظ وكذلك نحصل فيه على المسار الذي سنتعامل معه حسبما نشاء.
السطر الأول واضح إنه تعريف لمتغير من نوع نصي وهو المتغير الذي سيحمل رد صندوق النص (سأتجاوز شرح نقطة الردود هنا لأنها درس في حد ذاتها)
السطر الثاني نقوم باستدعاء الصندوق إما بهيئة الحفظ وذلك باستخدام "GetSaveFileName" كما هو موجود في السطر أعلاه أو بهيئة الفتح وذلك باستبدال "GetSaveFileName" ب "GetOpenFileName"
أخيرا نقوم بوضع شرط مفاده:
إذا أعاد صندوق الحفظ أو الفتح شيئا (بمعنى أنه تم اختيار ملف ما) فاعرض لنا مسار واسم الملف الذي تم اختياره.
هذا كل شيء. :sweatingb
بقليل من النباهة يُمكنك عزيزي القارئ أن تستغل هذا الصندوق بشكل مدهش للغاية فقط فكر.
وأي سؤال أنا في الخدمة.
هذا مثال جاهز لمن لا يُريد أن يًصدع رأسه بالكلام، ويريد الفعل.
المثال في المرفقات
صلاح الدين بن شبيبة
The MP