ในกระบวนการพัฒนาซอฟต์แวร์ มีปัญหาบางอย่างที่ดูเหมือนง่าย แต่นักพัฒนาทั่วไปมักมองข้ามปัญหาเหล่านี้ไปอย่างง่ายดาย การมีอยู่ของ "จุดบกพร่อง" เหล่านี้ส่งผลต่อการนำซอฟต์แวร์ของเราไปใช้ในเชิงพาณิชย์ รายการด้านล่างนี้คือปัญหาหลายประการที่ผู้เขียนพบเมื่อใช้ Visual Basic เพื่อพัฒนาซอฟต์แวร์ มีวิธีแก้ปัญหาให้ทุกคนได้พูดคุยและแลกเปลี่ยนกันที่นี่
1. ป้องกันไม่ให้แอปพลิเคชันโหลดสองครั้ง
เมื่อแอปพลิเคชันของเราทำงานภายใต้ Windows ในระหว่างการดำเนินการ บางครั้งเราจะย่อขนาดและซ่อนมัน หรือเปลี่ยนไปใช้ตัวจัดการโปรแกรมสำหรับการดำเนินการอื่น จากนั้นต้องการเข้าสู่แอปพลิเคชันดั้งเดิม ถ้าเราลืม หากคุณรีสตาร์ทแอปพลิเคชันที่คุณเพิ่งเริ่มต้น แอปพลิเคชันเดียวกันสองชุดจะถูกโหลดลงในหน่วยความจำพร้อมกัน ซึ่งไม่เพียงแต่กินพื้นที่หน่วยความจำเท่านั้น แต่ยังทำให้เกิดการทำงานผิดพลาดและข้อมูลสูญหายได้ง่ายอีกด้วย เพื่อป้องกันไม่ให้สิ่งนี้เกิดขึ้น โปรแกรมจะต้องสามารถแจ้งว่า "โหลดแล้ว" หรือเข้าสู่แอปพลิเคชันที่โหลดเป็นครั้งแรกโดยตรง ปัญหานี้ดูเหมือนแก้ไขได้ยาก จริงๆ แล้วตราบใดที่เราเข้าใจกลไกของแอปพลิเคชันการจัดการ Windows ก็สามารถแก้ไขได้ง่าย
เรารู้ว่าสำหรับแต่ละแอปพลิเคชันที่ทำงานอยู่ Windows จะกำหนด "หมายเลขอ้างอิง" ที่ไม่ซ้ำกันและรหัสโมดูล (โมดูล) เมื่อรันโปรแกรมเดียวกันสองชุดพร้อมกัน รหัสโมดูลของทั้งสองโปรแกรมจะเหมือนกัน ดังนั้น ตราบใดที่เราพบรหัสโมดูลที่เหมือนกันสองชุดในหน่วยความจำ เราก็รู้ว่ามีสำเนาสองชุดของโปรแกรมกำลังทำงานอยู่ และสามารถควบคุมมันได้ ฟังก์ชันอินเทอร์เฟซทั้งสอง GetModuleHandle และ GetModuleUsage ที่ได้รับจาก Windows สามารถทำงานนี้ได้สำเร็จ วิธีการเฉพาะมีดังนี้ ขั้นแรก ให้ประกาศฟังก์ชัน API ในไฟล์โมดูลใหม่ (*.Bas)
ประกาศ FunctionGetModuleHandleLibKernel (ByVallpPRogName$)
ประกาศ FunctionGetModuleUsageLibKernel (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 เป็นรูปแบบหลักของโปรแกรม
เอ็นด์ล์ฟ
ทางออกย่อย
ผิดพลาดหลัก:
lfErr<>0แล้ว
MsgBox เกิดข้อผิดพลาดขณะเริ่มโปรแกรม 64
ทางออกย่อย
เอ็นด์ล์ฟ
สิ้นสุดย่อย
หลังจากกระบวนการเสร็จสิ้น ภายใต้เมนูหลัก VB3.0 [ตัวเลือก] ให้เลือกรายการเมนู [โครงการ] และตั้งค่ารายการ [StartupFrom] เป็น Submain นั่นคือเมื่อโปรแกรมทำงาน โปรแกรมจะเริ่มจากรูทีนย่อย Submain ก่อน เพื่อให้แน่ใจว่าโค้ดข้างต้นจะถูกดำเนินการ Submain คือชื่อกระบวนการย่อยที่ตกลงใน VB3.0 และไม่สามารถแทนที่ด้วยชื่ออื่นได้
สร้างไฟล์ EXE ใหม่ เริ่มแอปพลิเคชันภายใต้ตัวจัดการโปรแกรม จากนั้นย่อขนาดแบบฟอร์มที่สร้างขึ้น จากนั้นเรียกใช้จากตัวจัดการโปรแกรม ผู้ใช้จะเห็นกล่องข้อความแจ้งให้ผู้ใช้ทราบว่าแอปพลิเคชันนั้นได้โหลดแล้ว โปรแกรมที่สองจะยุติลง การดำเนินการ โปรแกรมข้างต้นใช้เพื่อป้องกันไม่ให้โปรแกรมที่สองโหลดเท่านั้น แต่จะไม่เข้าสู่โปรแกรมแรกโดยอัตโนมัติเมื่อไม่สามารถเริ่มโปรแกรมที่สองได้ เพื่อให้บรรลุเป้าหมายนี้ ขั้นตอนที่เกี่ยวข้องจึงค่อนข้างซับซ้อนและจะไม่มีการแนะนำโดยละเอียดที่นี่
2. กำหนดเส้นทางการติดตั้ง Windows
ในซอฟต์แวร์ที่เราพัฒนา บางครั้งเราเรียกแอปพลิเคชันขนาดเล็กที่ Windows ให้มาโดยตรง เช่น เครื่องคิดเลข นักวางแผน ฯลฯ หรือเราจำเป็นต้องใส่ไฟล์พิเศษบางไฟล์ใน Windows หรือเส้นทางของระบบ โดยปกติแล้ว Windows จะถูกติดตั้งในไดเร็กทอรี C:WINDOWS แต่ผู้ใช้สามารถแก้ไขชื่อโฮมไดเร็กทอรีของ Windows ได้ตามต้องการ ดังนั้นในซอฟต์แวร์ของเรา เราจำเป็นต้องกำหนดเส้นทางการติดตั้งของ Windows สำหรับปัญหานี้ Windows มีฟังก์ชัน API สองฟังก์ชัน: 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)<>“/”แล้วWindir$=Windir$ “/”
'เพิ่มแบ็กสแลช
GetWinDir=Windir$
เอ็นด์ล์ฟ
EndFunction
ALLTRIM เป็นฟังก์ชันที่ใช้ในการลบอักขระว่างในสตริง
FunctionALLTrim(FatStr$)AsString
'thisFunctiondeleteSpacecharinstringofFatStr$
DimSlimStr$,I
SlimStr$=FatStr$
I=lnStr(SlimStr$,Chr$(0))'ตำแหน่งของช่องว่าง
ถ้าIThenSlimStr$=ซ้าย$(SlimStr$,I-1)
SlimStr$=Ltrim$(Rtrim$)(SlimStr$))
AIITrim$=SlimStr$
EndFunction
3. แจ้งให้บันทึกข้อมูลก่อนปิดแบบฟอร์ม
โดยทั่วไปแล้ว การปิดแอปพลิเคชันมักจะมี 5 วิธี:
1. ผู้ใช้เลือกคำสั่ง [ปิด] ในกล่องควบคุมของแบบฟอร์มปัจจุบัน
2. กระตุ้นโค้ดคำสั่ง end ในโปรแกรม (เช่น End, Unload)
3. ออกจากวินโดวส์
4. ปิดแอปพลิเคชันในรายการงาน Windows
5. ในระหว่างการดำเนินการหลายเอกสาร การปิดแบบฟอร์ม MDI หลักจะทำให้การปิดแบบฟอร์ม MDI ย่อย
ก่อนที่จะปิดแอปพลิเคชัน เราจำเป็นต้องให้โอกาสผู้ใช้แจ้งว่า "คุณต้องการบันทึกข้อมูลหรือไม่" หรือยกเลิกการดำเนินการ "ปิด" ใน VB การปิดแบบฟอร์มจะทำให้เกิดเหตุการณ์ Form_Unload เราสามารถตั้งโปรแกรมเหตุการณ์นี้เพื่อควบคุมการดำเนินการ "ปิด" สมมติว่ามีขั้นตอน FileSave ที่ใช้ในการบันทึกไฟล์อยู่แล้วก็สามารถเขียนโปรแกรมได้แบบนี้
SubForm_Unload(ยกเลิกจำนวนเต็ม)
selectcastMsagbox("บันทึกข้อมูล?", 3 32)
'ใช่ ไม่ใช่ คานาเซลมีสามตัวเลือก'
กรณีที่ 6'ใช่
FileSave' บันทึกข้อมูล
กรณีที่ 2 'ยกเลิก
Cancel=TRUE'ยกเลิกการดำเนินการปิด
caseelse'NO' ไม่บันทึก ให้ดำเนินการปิดเครื่อง
สิ้นสุดการเลือก
สิ้นสุดย่อย
ตัวแปร Cancel ในโค้ดข้างต้นเป็นตัวแปรขาออกโดยธรรมชาติของเหตุการณ์ Form_unload โดยจะส่งข้อความไปยังกระบวนการควบคุม Windows เพื่อควบคุมทิศทางของโปรแกรม
ตัวอย่างทั้งสามข้างต้นเป็นเพียงปัญหาเล็กๆ น้อยๆ ในกระบวนการปรับปรุงซอฟต์แวร์ เพื่อให้ซอฟต์แวร์มีความเสถียรและเชื่อถือได้ จำเป็นต้องดำเนินการอย่างระมัดระวังและรอบคอบอย่างมาก ปัญหาบางอย่างสามารถแก้ไขได้โดยการสำรวจศักยภาพของ VB และฝึกฝนทักษะการดำเนินงานของกระบวนการบางอย่างอย่างลึกซึ้ง ในขณะที่ปัญหาที่ซับซ้อนบางอย่างเกี่ยวข้องกับการดำเนินการพื้นฐานของ Windows และสามารถรับรู้ได้อย่างง่ายดายโดยใช้ฟังก์ชัน Windows API แน่นอนว่าสิ่งนี้ต้องมีความเข้าใจเกี่ยวกับฟังก์ชั่นและกลไกของ Windows เมื่อระดับการเขียนโปรแกรม Windows ดีขึ้น เราจะค่อยๆ เรียนรู้และชอบใช้ฟังก์ชัน API เพื่อช่วยในการเขียนโค้ดโปรแกรมให้สมบูรณ์ -