في عملية تطوير البرمجيات، هناك بعض المشكلات التي تبدو بسيطة، ولكن يتم تجاهلها بسهولة من قبل المطورين العاديين. ويؤثر وجود هذه "الأخطاء" على تسويق برامجنا. فيما يلي قائمة بالعديد من المشكلات التي واجهها المؤلف عند استخدام Visual Basic لتطوير البرامج، وقد تم تقديم الحلول هنا ليتمكن الجميع من مناقشتها وتبادلها.
1. منع التطبيق من التحميل مرتين
عندما يتم تشغيل تطبيقنا ضمن Windows، أثناء العملية، نقوم أحيانًا بتصغيره وإخفائه، أو التبديل إلى مدير البرنامج لعمليات أخرى، ثم نريد إدخال التطبيق الأصلي إذا نسينا إذا قمت بإعادة تشغيل التطبيق الذي بدأته للتو، سيتم تحميل نسختين من نفس التطبيق في الذاكرة في نفس الوقت، وهذا لا يشغل مساحة الذاكرة فحسب، بل يؤدي أيضًا إلى سوء التشغيل وفقدان البيانات. ولمنع حدوث ذلك، يجب أن يكون البرنامج قادرًا على إعطاء رسالة "تم تحميله بالفعل" أو الدخول مباشرة إلى التطبيق الذي تم تحميله لأول مرة. يبدو أن هذه المشكلة صعبة الحل، وفي الواقع، طالما أننا نفهم آلية تطبيقات إدارة Windows، فيمكن حلها بسهولة.
نحن نعلم أنه لكل تطبيق قيد التشغيل، يقوم Windows بتعيين "مقبض" فريد ورمز الوحدة النمطية (الوحدة النمطية). عندما يتم تشغيل نسختين من نفس البرنامج في نفس الوقت، فإن رموز الوحدة للبرنامجين هي نفسها، لذلك، طالما وجدنا رمزين متطابقين للوحدة في الذاكرة، فإننا نعلم أنه يتم تشغيل نسختين من البرنامج ويمكن السيطرة عليه. يمكن لوظيفتي الواجهة GetModuleHandle وGetModuleUsage التي يوفرها Windows إكمال هذه المهمة. الطريقة المحددة هي كما يلي أولاً، قم بتعريف وظيفة API في ملف وحدة نمطية جديد (*.Bas).
DeclareFunctionGetModuleHandleLibKernel(ByVallpPRogName$)
DeclareFunctionGetModuleUsageLibKernel(ByValhModule)
وفي الوقت نفسه، قم بإنشاء عملية فرعية تسمى main. ويكون الكود الموجود في العملية الفرعية كما يلي:
فرعي ()
معالجة الأخطاء OnErrorGoToerrMain
مقبض الوحدة النمطية DimhModule
DimAppCount'عدد التطبيقات
appPath$=app.Path /'مسار بدء تشغيل التطبيق
hModule=GetModuleHandle(appPath$ app.EXEName .exe)'احصل على مقبض البرنامج.
AppCount=GetModuleUsage(hModule)'يحصل على رمز الوحدة، أي عدد التطبيقات قيد التشغيل.
lfAppCount>1 ثم يكون رقم التطبيق نفسه أكبر من 1
تم تحميل برنامج MsgBox، 64
End' ينهي التطبيق الذي بدأ حاليًا
إلسك
mainForm.Show'mainForm هو الشكل الرئيسي للبرنامج
نهاية
ExitSub
يخطئ:
lfErr<>0ثم
MsgBox حدث خطأ أثناء بدء تشغيل البرنامج 64
ExitSub
نهاية
EndSub
بعد اكتمال العملية، ضمن القائمة الرئيسية [خيارات] VB3.0، حدد عنصر القائمة [Project] وقم بتعيين عنصر [StartupFrom] على Submain، أي أنه عند تشغيل البرنامج، يبدأ من الروتين الفرعي Submain أولاً. وهذا يضمن أنه سيتم تنفيذ التعليمات البرمجية أعلاه. Submain هو اسم العملية الفرعية المتفق عليه في VB3.0 ولا يمكن استبداله بأسماء أخرى.
قم بإعادة إنشاء ملف EXE، وابدأ تشغيل التطبيق ضمن مدير البرنامج، ثم قم بتصغير النموذج الذي تم إنشاؤه، ثم قم بتشغيله من مدير البرنامج. سيرى المستخدم مربع رسالة يخبره أنه تم إنهاء التطبيق بعد التحميل تنفيذ. يتم استخدام البرنامج أعلاه فقط لمنع تحميل البرنامج الثاني، ولكنه لا يدخل تلقائيًا إلى البرنامج الأول عندما لا يمكن بدء تشغيل البرنامج الثاني. ولتحقيق ذلك، فإن الإجراءات المتبعة معقدة نسبيًا ولن يتم عرضها بالتفصيل هنا.
2. تحديد مسار تثبيت Windows
في البرنامج الذي نقوم بتطويره، نستدعي أحيانًا بشكل مباشر التطبيقات الصغيرة التي يوفرها Windows، مثل الآلات الحاسبة والمخططات وما إلى ذلك؛ أو نحتاج إلى وضع بعض الملفات الخاصة في Windows أو مسار النظام. عادة، يتم تثبيت Windows في الدليل C:WINDOWS، ولكن يمكن للمستخدمين تعديل اسم الدليل الرئيسي لنظام Windows حسب الرغبة، لذلك، في برنامجنا، نحتاج إلى تحديد مسار تثبيت Windows. بالنسبة لهذه المشكلة، يوفر Windows وظيفتين لواجهة برمجة التطبيقات: GetWindowsDirectory وGetSystemDirectory، والتي يمكنها إرجاع أسماء دليل Windows ودليل SYSTEM.
تحقيقا لهذه الغاية، قم بإعداد وظيفة عامة GetWinDir، والتي تقوم بإرجاع اسم دليل تثبيت Windows. وبالمثل، يمكنك كتابة GetSysDir، محذوفة.
قم بتعريف وظائف API في ملفات الوحدة النمطية *.BAS
DeclareFunctionGetWindowsDirectoryLibKernel(ByValipBufferAsString,ByValnSizeAsInteger)asIntegerFunctionGetWinDir()AsStringDimWindir$Windir$=Space$(144)'144 هو الحد الأقصى النظري لطول اسم دليل WINDOWS.
lfGetWindowsDirectory(Windir$,144)=0ثم
لا يمكن لـ MsgBox تحديد مسار تثبيت WINDOWS، 16
GetWinDir=
آخر
Windir$=ALLTrim$(Windir$)
ifRight$(Windir$,1)<>"/"thenWindir$=Windir$ "/"
'أضف شرطة مائلة عكسية
GetWinDir=Windir$
نهاية
وظيفة النهاية
ALLTRIM هي دالة تستخدم لإزالة الأحرف الفارغة في السلسلة.
FunctionALLTrim(FatStr$)AsString
'هذه الوظيفةحذف SpacecharinstringofFatStr$
ديم سليمستر $، آي
SlimStr$=FatStr$
I=lnStr(SlimStr$,Chr$(0))'موضع المسافة
IfIThenSlimStr$=Left$(SlimStr$,I-1)
SlimStr$=Ltrim$(Rtrim$)(SlimStr$))
AIITrim$=SlimStr$
وظيفة النهاية
3. المطالبة بحفظ البيانات قبل إغلاق النموذج
بشكل عام، هناك عادة 5 طرق لإغلاق التطبيق:
1. يقوم المستخدم بتحديد الأمر [إغلاق] في ControlBox الخاص بالنموذج الحالي.
2. تحفيز كود أمر الإنهاء في البرنامج (مثل End، Unload)
3. اخرج من نظام Windows
4. أغلق التطبيق في قائمة مهام Windows.
5. أثناء تشغيل المستندات المتعددة، سيؤدي إغلاق نموذج MDI الرئيسي إلى إغلاق نموذج MDI الفرعي.
قبل إغلاق التطبيق، نحتاج إلى منح المستخدم فرصة للمطالبة "هل تريد حفظ البيانات" أو إلغاء عملية "الإغلاق؟" في VB، يؤدي إغلاق النموذج إلى تشغيل حدث Form-Unload. يمكننا برمجة هذا الحدث للتحكم في عملية "الإغلاق". على افتراض أن هناك بالفعل إجراء يستخدمه FileSave لحفظ الملفات، يمكنك كتابة البرنامج مثل هذا.
SubForm_Unload(CancelAslnteger)
SelectcastMsagbox("حفظ البيانات؟"، 3 32)
'نعم، لا، Cnacel ثلاثة خيارات
الحالة 6' نعم
FileSave' حفظ البيانات
case2'cancel
إلغاء = TRUE'إلغاء عملية الإغلاق
caseelse'NO' لا يحفظ، قم بإجراء عملية إيقاف التشغيل
إنهاء التحديد
EndSub
يعد المتغير Cancel الموجود في الكود أعلاه متغيرًا صادرًا متأصلًا في حدث Form_unload نفسه، فهو يقوم بتسليم الرسائل إلى عملية التحكم في Windows للتحكم في اتجاه البرنامج.
الأمثلة الثلاثة المذكورة أعلاه ليست سوى بعض المشاكل البسيطة في عملية تحسين البرامج لجعل البرنامج مستقرًا وموثوقًا، يجب القيام بالكثير من العمل الدقيق والدقيق. يمكن حل بعض المشكلات من خلال استكشاف إمكانات VB نفسها وإتقان مهارات تشغيل بعض العمليات بشكل عميق؛ بينما تتضمن بعض المشكلات الأكثر تعقيدًا العمليات الأساسية لنظام Windows ويمكن تحقيقها بسهولة باستخدام وظائف Windows API. بالطبع، هذا يتطلب فهمًا معينًا لوظائف وآليات Windows. مع تحسن مستوى برمجة Windows، سنتعلم تدريجيًا ونرغب في استخدام وظائف واجهة برمجة التطبيقات (API) للمساعدة في إكمال ترميز البرنامج. ->