VFP ·R¥ÎªÌªÀ°Ï ­º­¶ VFP ·R¥ÎªÌªÀ°Ï
¥»°Q½×°Ï¬° Visual Foxpro ·R¥ÎªÌ¸gÅç¥æ¬yªº¦a¤è, ½Ð¦h¦h§Q¥Î"·j´M"ªº¥\¯à, ¥ý¬d¬Ý¬Ý¦³µL«e¨Ò¥i´`, ¦pªGÁÙ¦³¤£À´ªº¦Aµo°Ý. ³¡¥÷¥DÃD¦³ªþ¥[ÀÉ®×, ¶·¥ýµù¥U¦¨¬°ªÀ°Ï©~¥Á¤~¥i¥H¤U¸ü.
 
 ±`¨£°ÝÃD±`¨£°ÝÃD   ·j´M·j´M   ·|­û¦Cªí·|­û¦Cªí   ·|­û¸s²Õ·|­û¸s²Õ   ·|­ûµù¥U·|­ûµù¥U 
 ­Ó¤H¸ê®Æ­Ó¤H¸ê®Æ   µn¤JÀˬd±zªº¨p¤H°T®§µn¤JÀˬd±zªº¨p¤H°T®§   µn¤Jµn¤J

Visual FoxPro ¤¤ªº¿ù»~³B²z(Âà¶K)

 
µoªí·s¥DÃD   ¦^ÂÐ¥DÃD    VFP ·R¥ÎªÌªÀ°Ï ­º­¶ -> VFP °Q½×°Ï
¤W¤@½g¥DÃD :: ¤U¤@½g¥DÃD  
µoªí¤H ¤º®e
Ruey



µù¥U®É¶¡: 2003-03-12
¤å³¹: 1698
¨Ó¦Û: tunglo

²Ä 1 ¼Ó

µoªíµoªí©ó: ¬P´Á¤T ¤Q¤ë 29, 2003 3:28 pm    ¤å³¹¥DÃD: Visual FoxPro ¤¤ªº¿ù»~³B²z(Âà¶K) ¤Þ¨¥¦^ÂÐ

Visual FoxPro ¤¤ªº¿ù»~³B²z


§@ªÌ¡GDoug Hennig
½Ķ¡GRMH

²¤¶
»PFoxPro 2.x¬Û¤ñ¡AVisual FoxPro¹ï¿ù»~ªº³B²z§ó¬°ÆF¬¡¦ý¤]§ó¬°½ÆÂø¡C·íª«¥ó¨ã¦³Error¤èªk¨Ó³B²z§½³¡¿ù»~®É¡A«ç¼Ë¬°§AªºÀ³¥Îµ{¦¡´£¨Ñ¤½¦@ªº¡B¥þ§½¿ù»~³B²zªA°È?·íµo¥Í¿ù»~®É¦p¦ó«ì´_?³oùØ´£¨Ñ¤@ºØ¸gÃÒ©ú¬O¦æ¤§¦³®Äªº¤èªk¨Ó¹ê²{Visual FoxProÀ³¥Îµ{¦¡ªº¿ù»~³B²z ¡V ¶}©l©ó³æ¿Wªº±±¨î¶µ¡Aµ²§ô©ó¤@­Ó¥þ§½ªº¿ù»~³B²zª«¥ó¡C
¿ù»~³B²z°ò¦
¦b¿ù»~³B²z¤¤¦³³\¦h§xÃøªº°ÝÃD¡G³]¸m¿ù»~³B²z¾¹¡AÀˬd¿ù»~ªº±¡ªp¡A´£¥Ü¥Î¤áµo¥Í¤F¤°»ò±¡ªp(¨Ã¥i¯à±N¨ä¼g¤J¤@­ÓÀɨѥH«á¤ÀªR)¡A¨Ã¸Ñ¨M°ÝÃD(¸ÕµÛ¦A¦¸°õ¦æ©R¥O¡AÄ~Äò¥X¿ùªº»y¥yªº¤U¤@±ø»y¥y¡A°h¥X¨t²Îµ¥µ¥)¡C
³]¸m¿ù»~³B²z
»PFoxPro 2.x¤¤ªº³]¸m¿ù»~³B²z¬Û¦P¡AVFP¤¤­n³]¸m¥þ§½¿ù»~³B²z¤´µM¨Ï¥Îon error©R¥O¡CÁ|¨Ò¦p¤U¡G

on error do ERR_PROC with error()¡A sys(16)¡A lineno()

³o¨Ç°Ñ¼Æ§i¶D¿ù»~³B²zµ{¦¡¡G¿ù»~¸¹¡Aµo¥Í¿ù»~ªºµ{¦¡ªº¦W¦r¡A¦æ¸¹¡C§A¥i¥H«ö§Aªº»Ý­n¶Ç»¼¥ô·N°Ñ¼Æ¨ì¿ù»~³B²zµ{¦¡¡C
VFP¥H¦Uª«¥óªºERROR¨Æ¥óªº¤è¦¡¡A´£¨Ñ¤F¹ï¥þ§½¿ù»~³B²zªº¯à¤O¡C¦bVFP¤¤¨C¤@­Óª«¥óªº¨Æ¥ó¼Ò²Õ³£¨ã¦³Error¨Æ¥ó¡C·íµM¡A¨Ã«D¨C¤@­Óª«¥ó³£¦³Error¤èªk¡C¦pªG§A¤£²M·¡³oºØ®t§O¡A°O¦í¡A¨Æ¥ó¬O³Q¥Î¤á©Î¨t²Îªº¬Y¨Ç°Ê§@IJµoªº(À»Áä¡A·Æ¹«³æÀ»¡A©ÎªÌ¤@¨ÇVisual FoxPro»{¬°¬O¿ù»~ªºªF¦è)¡A·í¨Æ¥óµo¥Í®É¤èªk½s½X³Q°õ¦æ¡C·í¤@­Ó®ø®§¶Ç»¼¨ì¤@­Óª«¥ó³qª¾¥¦°õ¦æ¤èªk®É¡A¤èªk¥N½X¤]·|³Q°õ¦æ¡C¦b«Ü¦h¨Æ¥ó¤¤¡A¦p·Æ¹«³æÀ»¡A¦pªGª«¥óªº¤èªk¤¤¨S¦³¥N½X¡A¨Æ¥ó³Q©¿²¤©Î°õ¦æÀq»{ªº°Ê§@¡C¥i¬O¡A·í¿ù»~¥X²{®É¡A±N·|µo¥Í¤°»ò¨ú¨M©ó¤@¨t¦Cªº¨Æ±¡¡C
·í¤@­Óª«¥ó½Õ¥Î¥t¤@ª«¥ó©Î¤@­Ó«Dª«¥óµ{¦¡(¦pPRGÀÉ)®É¥X²{¿ù»~¡B¥B¸Óª«¥ó¦s¦bError¤èªk®É¡Aª«¥óªºError¤èªk±N³Q½Õ¥Î¡C¦pªG¸Óª«¥ó¨S¦³Error¤èªk±N·|µo¥Í¤°»ò±¡ªp©O?·í§Ú²Ä¤@¦¸¨Ï¥ÎVFP®É¡A§Ú°²³]¸Óª«¥óªº¤÷®e¾¹(¦pForm)ªºError¤èªk±N³Q½Õ¥Î¡CµM¦Ó¡A±¡ªp¨Ã«D¦p¦¹¡C¹ê»Ú±¡ªp¬O¡A¦pªG¥ô¦ó¦b½Õ¥Î°ïÅ|¤Wªºª«¥ó¦s¦bµÛError¤èªk¡A¸Ó¤èªk±N³Q½Õ¥Î;¦pªG¨S¦³¡Aon error±`¦¡(¦pªG¦³ªº¸Ü)³Q½Õ¥Î¡C¦pªG¨S¦³on error±`¦¡¡AVisual FoxPro°õ¦æ¥¦¦Û¤vªº¿ù»~³B²z(´N¬O¨º­ÓÁn¦W¯TÄyªº¨ú®ø/©¿²¤¹ï¸Ü¤è¶ô)¡AµM«áµ{¦¡±Y¼ì¡C
Àˬd¿ù»~±¡ªp
FoxPro 2.x¤¤ªº¤@¨t¦Cªº¨ç¼Æ©MVFP³£¦³§U©óÀˬd¿ù»~µo¥Íªº­ì¦]¡A¥]¬Aerror()¡Amessage()¡Alineno()¡Asys(16)¡A©Msys(2018)¡CVFPÁÙ´£¨Ñ¤@­Óaerror()¨ç¼Æ¡A¥Î©ó´£¨Ñ³Ìªñµo¥Íªº¿ù»~ªº¸ê°T¨Ã±N³o¨Ç¸ê°T¦s¤J¤@­Ó°}¦C¡CÁöµM¸Ó°}¦C¤¤ªº¤@¨Ç¸ê°T¤]¥i±q¨ä¥L¨ç¼ÆÀò±o¡A¹ï©ó¬Y¨ÇÃþ«¬ªº¿ù»~(¦pOLE¡AOBDC¡A©MIJµo¾¹)¡Aaerror()¨ä¥L¨ç¼Æ«h¤£¯à±o¨ì¿ù»~¸ê°T(¨Ò¦p¦óºØIJµo¾¹³y¦¨¤F¿ù»~)¡C
´£¥Ü¥Î¤áµo¥Í¤F¤°»ò
©Z²v¦a§i¶D¥Î¤áµo¥Í¤F¿ù»~¡A¨Ã¤¹³\¥Î¤á¨M©w¦p¦ó³B²z¿ù»~¡C¥D­n¯A¤Î¨ì­n§i¶D¥Î¤á¤°»ò¡B¨Ã´£¨Ñµ¹¥Î¤á¤°»ò¼Ëªº¿ï¾Ü¡C¹ï­nÅã¥Üªº¿ù»~¸ê°T¶i¦æ¾A·í­×§ï¡A¨Ã¥HºÉ¥i¯à¥­ÀRªº¤è¦¡±¹µü¡A¥H¨¾¤îÅå·W¥¢±¹ªº¥Î¤á¦P®É«ö¤U¡§Ctrl-Alt-Delete¡¨¡C¥¦¤]À³´£¨Ñ¦p¦ó³B²z¿ù»~ªº¸ê°T¡C¨Ò¦p¡A¤@¨Ç²³æªº¿ù»~¦p¦Lªí¾÷¥¼Áp±µ¥i¥H¸ß°Ý¥Î¤á½T«H¦Lªí¾÷¥¿½T¦aÁp±µ¨Ã¸Ë¦n¤F¯È¡C³o¼Ë¥Î¤á¥i¥H¦b¦C¦L©M¨ú®ø¦C¦L¤§¶¡§@¥X¿ï¾Ü¡C¦pªG¤@­Ó¥Î¤á¸Õ¹Ï­×§ï¤@­Ó³Q§Oªº¥Î¤áÂê©wªº°O¿ý¡A§A¥i¥H§i¶D¥Î¤á·í«e¥¿¦³¥t¤@¥Î¤á¦b­×§ï¸Ó°O¿ý¡A¨Ãµ¹¥X¦A¸Õ¤@¦¸©Î¨ú®ø­×§ïªº¿ï¾Ü¡C
¦bVFP¤¤¥i¯à¥X²{ªº¿ù»~¦h¹F600ºØ¥H¤W¡A§A¥i¯à·|¥O¤H¤ß±ª¦a·Q¬°¨C¤@­Ó¿ù»~µ¹¥X¦³·N¸qªº¸ê°T¡C©¯¹Bªº¬O¡A¦pªG§A¬d¬ÝVFPªºÀ°§U¤¤Ãö©ó¿ù»~¸ê°Tªº¥DÃD¡A§A·|µo²{¥¦­Ì¤¤ªº¤j¦h¼Æ¶ÈÂkÃþ©ó¤U¦C¤Ö¼ÆªººØÃþ¡G
• ¨M¤£·|µo¥Í
• ¦pªGµ{¦¡®v¦b¼gµ{¦¡«e¥¼³Ü°s¡A´N¤£·|µo¥Í
• ¤@­Ó¥H¤Wªº¥Î¤á¦P®É¨Ï¥Î¸Ó¨t²Î®É·|µo¥Í
• »Ý­n­Ó§O³B²zªº¿ù»~
¦b²Ä¤@ºØÃþ§O¤¤¡A§Aªºµ{¦¡°£¤F°h¥X¤§¥~¨S¦³§Oªº¿ï¾Ü¡C²Ä¤GºØ¿ù»~¥i¥H¦b´ú¸Õ¤¤³Qµo²{¡A¦ý­Y¥¼µo²{¡A§AªºÀ³¥Îµ{¦¡±N³ø§i¨Ãµn¿ý¸Ó¿ù»~¡AµM«áÃö³¬¡C²Ä¤TºØÃþ«¬ªº¿ù»~¤]¥i¥H¦b´ú¸Õ¤¤³Qµo²{¡A¦ý¬O¶È¥X²{¤@­Ó²³æªºÃþ¦ü©ó¡§§A²{¦b¤£¯à¾Þ§@¡¨ªº¿ù»~¸ê°T¡C¯u¥¿»Ý­n§A³B²zªº¥u¬O²Ä¥|ºØÃþ«¬ªº¿ù»~¡C³oºØÃþ«¬¿ù»~ªº¨Ò¤l¬OÄæ¦ì©ÎªíÅçÃÒ³W«h¥¢±Ñ¡A¥DÃöÁä¦r¥¢±Ñ(¦pªG§A¨Ï¥Î¤F¨t²Î«ü©wªº¥N²zÃöÁä¦r¡A³oºØ±¡ªp«Ü¤Öµo¥Í)¡AIJµo¾¹¥¢±Ñ¡A©MÀÉ¥¼§ä¨ì¡C
¦bÅã¥Ü¿ù»~¸ê°Tµ¹¥Î¤á¤§«e¡A³\¦h¶}µoªÌ³ßÅwµn¿ý¿ù»~¨ì¤@­Ó¿ù»~µn¿ýÀÉ¡C³o¤w³QÃÒ©ú¤F¬O·¥¦³»ù­Èªº¡A¦]¬°¥Î¤á±`±`·|§t½kªº¦V§A³ø§i¿ù»~µo¥Íªº²Ó¸`¡C¿ù»~µn¿ýÀÉ¥i¥H¬O¤@­Ó¤å¦rÀɮסA¦ý¬O§Ú¨Ï¥Î¤@­Óªí¤¤ªºÄæ¦ì¨Ó«O¦s¿ù»~µo¥Íªº¤é´Á©M®É¶¡(¥i¥H¬OVFP¤¤ªºDateTimeÄæ¦ì)¡A¥Î¤á¦W¡A¿ù»~¸¹©M¸ê°T¡A¦æ¸¹©M¿ù»~¥X²{³Bªº¥N½X¡A¤@­Ó³Æµù«¬Äæ¦ì¥Î©ó¥]§t·í«eªº°O¾ÐÅéÅܼơC
¸Ñ¨M¿ù»~
¸Ñ¨M¿ù»~¬O½ÆÂøªº¨Æ±¡¡Cretry©R¥O¸ÕµÛ¦A¦¸°õ¦æµo¥Í¿ù»~ªº©R¥O¡A¦ý¬O¹ï©ó«Ü¦h¿ù»~¦Ó¨¥¡A¥Ñ©ó¥Î¤á¦Û¤v³B²z¿ù»~ªº¯à¤O©Ò­­¡A¸Ó©R¥O¹ï¥Î¤á³B²z¿ù»~¨S¦³¦h¤jÀ°§U¡Creturn«hÄ~Äò°õ¦æµo¥Í¿ù»~ªº©R¥Oªº«á­±¤@¦æµ{¦¡¡A¦ý¥Ñ©ó³y¦¨¿ù»~ªºµ{¦¡¦C¨Ã¨S¦³°õ¦æ¡A©Ò¥H¦]¦¹¦Ó³y¦¨ªº¤G¯Å¿ù»~¸ê°T¥i¯à·|±µ¿æ¦Ó¦Ü¡A¦pÅܼƨS¦³«Ø¥ß(²¦³º¡A¦pªG¥i¥H©¿²¤³y¦¨¿ù»~ªºµ{¦¡¥B¤£·|±a¨Ó¥ô¦ó°ÝÃDªº¸Ü¡A¥¦¬O°µ¤°»ò¥Îªº©O?)¡Ccancel¤£¬O¤@ºØ²{¹êªº¿ï¾Ü¡A¦]¬°¥¦²×¤îÀ³¥Îµ{¦¡¡A³o¼Ë´N¨S¦³¾÷·|¨Ó¾A·í¦a¶i¦æ°h¥X«eªº¨t²Î²M²z¡C¥H³Q¬ù§ôªº¤è¦¡Ãö³¬À³¥Îµ{¦¡¬O¤@­Ó¥¿½Tªº¿ï¶µ¡A¦]¬°«Ü¦h¿ù»~¬O¥Ñ©ó½sµ{¤H­û©Î§@·~¨t²Î³y¦¨ªº¡A¦b°ÝÃD³Q¸Ñ¨M«e¨S¦³§ó¦hªº¿ï¾Ü¡C§@¬°¤@­Ó¶}µoªÌ¡A§A¥i¯à¤]Ä@·N¿ï¾Ü¨ú®øÀ³¥Îµ{¦¡¨Ãªð¦^¨ì©R¥Oµøµ¡¡C³o¼Ë°µªº¥N½X±NºÉ¥i¯à¦a²M°£Àô¹Ò¡C
¥t¤@­Ó¿ï¶µ¬O¨Ï¥Îreturn to master©Îreturn to ¨Ó°h¥Xµo¥Í¿ù»~ªºµ{¦¡¦Óªð¦^¨ì¥D±±µ{¦¡©Î«ü©wªºµ{¦¡¡C­n¤p¤ß³B²z³oºØ¿ï¶µ¡A¦]¬°³o¼Ë·|¨Ï¨t²Î¶i¤J¤@ºØ²V¶Ãª¬ºA¡Gªí³æ©Mµøµ¡¤´µM¦s¦b¡Aªí©Î´å¼Ð¥ôµM¬O¥´¶}ªº¡Aµ¥µ¥¡C¦b¨Ï¥Îreturn to©R¥O«e¡AºÉ¥i¯à¦a²M°£³o¨ÇªF¦è¬O¤@­Ó¦nªº¿ìªk¡C
³]­p¿ù»~³B²z¤è®×
¥þ§½Error ³B²z©Mª«¥óªºError¤èªk¥Nªí¤F¤@­Ó¨Æª«ªº¨â­Ó¤è­±¡G
• ·íError¤èªk¬O³y¦¨¿ù»~ªºª«¥óªº¤@³¡¤À®É¡A¥þ§½¿ù»~³B²z¾¹»Pµo¥Í¿ù»~ªº®Ú·½¬Û¶Z¸û»·¡C³o¼Ë¡AError¤èªkª¾¹D¥¦¦Û¤v©Ò³BªºÀô¹Ò¡A¨º¨Ç¿ù»~¥i¯à·|µo¥Í¡A¦p¦ó¸Ñ¨M¿ù»~¡C¨Ò¦p¡ACommonDialogs ActiveX±±¨î¶µ(Åã¥ÜÀÉ¡A¦C¦L¡A¦â±m©M¦Lªí¾÷ªº¹ï¸Ü¤è¶ô)¦b¥Î¤á¿ï¾Ü¨ú®ø®É¡A±N·|³y­P¿ù»~¡C¥¦·|µLÁn¦aÅý¥þ§½¿ù»~³B²z¾¹³B²z¿ù»~¡A¥Ñ©ó¥¦¥uª¾¹D¨º¬O¤@­Ó¬YºØÃþ«¬ªºOLE¿ù»~¨Ã¤£ª¾¹D«ç¼Ë¥h³B²z¥¦¡C¥u¯à¦bCommonDialogs±±¨î¶µªºError¤èªk¤¤©ñ¤J¥N½X¨Ó³B²z¥Î¤á¿ï¾Ü¨ú®øªº±¡ªp¡C
• ¥þ§½¿ù»~³B²z¾¹¦bVFPªº¨Æ¥ó³B²z¾¹¤§¥~¡A¥ÎFoxProªº¦Ñªº¡§ON¡¨¨Æ¥ó¤èªk¶i¦æ½Õ¥Î(¸Ó¤è®×¤´³Q¥Î©ó¥\¯àªí©Mon key label©R¥O)¡C³o·N¨ýµÛ¡A§A¤£¯à¨Ï¥Î¶HThisform¤@¼Ëªºª«¥ó»yªk¡A©Îµo§G¶Hprivate datasessions³o¼Ëªº·|¨Ï¿ù»~³B²zÅܱo½ÆÂøªº©R¥O¡C
• ¥þ§½¿ù»~³B²z¾¹¥i¥H¦³®Äªº§â¿ù»~³B²zªA°È©ñ¤J¦P¤@­Ó¦a¤è(¦p¿ù»~µn¿ý©MÅã¥Ü)¡C¦ý¦b§AªºÀ³¥Îµ{¦¡¤¤ªº¨C¤@­Óª«¥óªºError¤èªk¤¤¡A¥¦³B²z¦hºØ¤£¥i¹w´Áªº¿ù»~®É½T¬O§C®Ä²vªº(¦pºô¸ô³s±µÂ_½u)¡C
Åý§Ú­Ì¬Ý¬Ý³]­p¤@­Ó±N¨â­Ó¥@¬É¶i¦æ³Ì¦nªº¤@Åé¤Æªº¿ù»~³B²z¤è®×¡C§Ú­Ì§Æ±æ¥HºÉ¥i¯à¦³®Äªº¤è¦¡³B²z¿ù»~¡A¦P®ÉÁÙ´£¨Ñ­Ó§Oª«¥ó³B²z¥¦­Ì¦Û¤v¯S®í¿ù»~ªº¯à¤O¡C³oùجO§Ú­Ì¨Ï¥Îªºµ¦²¤¡G
• ´N¶H¤@­Óª±¯º¤¤©Ò»¡ªº¨º¼Ë¡A¤@­Óª«¥ó¤ñ¨ä¤÷Ãþ§ó²M·¡¥¦¥¿¦b°µ¤°»ò¡A¦]¦¹¤@­Óª«¥óªºError¤èªk±N³B²z¥¦¦Û¤v©Ò¯à³B²zªº¤@¤Á¿ù»~¡C¨Ã±N¥¦©Ò¤£¯à³B²zªº³¡¤À¥Îdodefault()©R¥O¶Ç»¼µ¹¥¦ªº¤÷Ãþ¡C¦b¸ÓÃþ¼h¦¸¤¤ªº¦U­Ó¤lÃþ³£³o¼Ë°µ¡C¦pªG¤@­Ó¤lÃþ©Î¤@­ÓÃþªº¹ê¨Ò¤£»Ý­n³B²z¥ô¦ó¯S®íªº¿ù»~¡A«h¨äError¤èªk¤¤¤£·|©ñ¸m¥ô¦ó¥N½X¡A¥H«P¦¨¨ä¤÷Ãþ¥N½X¦Û°Ê°õ¦æ¡C³o¼Ë¡ASFDeepSubClassTextBox.Error½Õ¥ÎSFSubClassTextBox.Error¦A½Õ¥ÎSFTextBox.Error¡C
• ª«¥óªº³Ì³»¼h¤÷ÃþªºError¤èªk±N³B²z¥ô¦ó¥¦¯à³B²zªº¿ù»~¡C¥¦¥ÎThis.Parent.Error¶Ç»¼¨º¨Ç¸g¤£¯à³B²z¿ù»~¨ì¥¦ªº®e¾¹¡C
• ¥Ñ©ó®e¾¹Ãþ»P±±¨î¶µ¤@¼Ë¤u§@(¥¦­Ì¶Ç»¼¤£¥i³B²zªº¿ù»~¨ì¥¦­Ìªº¤÷Ãþ¡A³Ì³»¼h¤÷Ãþ¶Ç»¼¿ù»~¨ì¥¦­Ìªº®e¾¹Ãþ)¡A¹ê»Ú®ÄªG¬O§Ú­Ì¤W²¾¤@­ÓÃþ¼h¦¸¦Ó¶i¤J¨ì®e¾¹Ãþªº¿ù»~³B²z¾¹¡C
• ³Ì³»¼h¤÷Ãþªº³Ì¥~³¡®e¾¹ªºError¤èªk±N³B²z¥¦¥i³B²zªº¥ô¦ó¿ù»~¡C¥¦·|¶Ç»¼¨º¨Ç¥¦¤£¯à³B²zªº¿ù»~¨ì¥þ§½¿ù»~³B²z¾¹¡C
¥H¤U¬O¤@­Ó³]­p¬yµ{¹Ï¡G¦bÃ줤ªº¨C¤@­Óª«¥ó³B²z¿ù»~©Î±N¥¦¶Ç»¼¨ìÃ줤ªº¤U¤@­Óª«¥ó¡C¦b³o­Ó¦h¼h¤è®×¤¤¡A·í§A±qª«¥ó¨ì¥þ§½¿ù»~³B²z¾¹®É¡A¿ù»~³B²zÀò¨ú¸û¤Öªº²Ó¸`©M¸û¦hªº¤@¯ë¸ê°T¡A¤¹³\¿ù»~¦b¦U­Ó¤£¦Pµ¥¯Å¶i¦æ³B²z¡C¹Ï 1 ªí©ú¤F³oºØµ¦²¤¡C

¹Ï 1. ¿ù»~³B²zµ¦²¤¡C
§Ú­Ì¦bÀ³¥Îµ{¦¡±Ò°Ê®É±qSFErrorMgr¹ê¨Ò¤Æ¤@­Óª«¥ó¨ì¤@­ÓÁ`ÅéÅܼÆoError¡C¥¦ªº¤@­Ó¤èªk(ErrorHandler)¬J¥i¥H¶H¤W­z¤@¼Ë³Qª«¥óª½±µ½Õ¥Î¤]¥i¥H¥Îon error©R¥O½Õ¥Î¡C¿ù»~³B²zª«¥ó¦³¤@­Ó²³æªº¤¶­±(¹ï½sµ{¦Ó¨¥)¡A¦]¦¹SFErrorMgr±µ¨ü»PError¤èªk¬Û¦Pªº°Ñ¼Æ(¿ù»~¸¹¡A¤èªk¦W¡A¦æ¸¹)¨Ãªð¦^¤@­Ó»¡©ú¥Î¤á¿ï¾Üªº¦êµ¹¥Î¤á(©Îª«¥ó)¥H«K³B²z¿ù»~¡C¿ù»~ª«¥ó³B©ó³B²zÃ쪺¥½ºÝ¡A¦]¦¹¥¦¤£ª¾¹D½Õ¥Î¥¦ªº¦a¤èªºÀô¹Ò(¥i¯à¸g¾ú¤F¤@¨t¦Cªº¶Ç»¼¡A¦b¤£¦Pªº¸ê®Æ¤u§@´Á¤¤µ¥)¡C§@¬°¤@­Óµ²ªG¡A¥¦¤£¯à¯u¥¿¦a§@§ó¦hªº¡§³B²z¡¨(À³¸Ó¬O¡G¸Ñ¨M)¡C¥¦ªº¥Î³~¬OÅã¥Ü¤@¸ê°Tµ¹¥Î¤á¡Aµn¿ý¿ù»~¥H³Æ«á¥Î¡A¨Ã¨M©w¤U¤@¨Bªº¦æ°Ê(¦b¥i¾aªº¥i¹wª¾±ø¥ó¤U)©Î§ó¦hªº¡A¥i¾aªº¡A±N«ç¼Ë°µªº¸ß°Ý¡C³o¼Ë¡A¿ù»~³B²zª«¥ó±N¯u¥¿¦a¥Î©ó³B²z§A¨S¦³¹w®Æ¨ìªº¥i¹wª¾ªº¿ù»~(¤@¦ý¥¦­Ì¥X²{¡A§A·|­×§ï³y¦¨¿ù»~ªºª«¥ó¡AÃþ¡A©Î¹Lµ{)©M¤£¥i¹wª¾¿ù»~(¯u¥¿ªºbugs©Î¥¼¹w®ÆªºÀô¹Ò±ø¥ó)¡C
¥þ§½¿ù»~³B²z¾¹¦Û¤v·|§@¥X¤@­Ó¥þ§½©Êªº¨M©w(½Õ¥XVFPªºDebugger©ÎÃö³¬À³¥Îµ{¦¡)©Î¤¹³\ª«¥ó¤Þµo¿ù»~¨Ó§@¥X³Ì«áªº¨M©w¡C­n¤¹³\«áªÌ¡A¦b¿ù»~³B²zÃ줤ªº¨C¤@¨Bªð¦^¤@­Ó¨M©w½X¨ì¤W¤@¯Å¡C¬°Â²«K°_¨£¡A§Ú¨M©wªð¦^¤@­Ó¦ê¨Ó»¡©ú¥Î¤á¿ï¾Ü¤F¨º¤@¨M©w¡G¡§­«¸Õ¡¨­«·s°õ¦æ¤Þ°_¿ù»~ªº©R¥O¡A¡§Ä~Äò¡¨«h±q¤Þµo¿ù»~ªºµ{¦¡ªº¤U¤@¦æÄ~Äò¹B¦æµ{¦¡¡A©Î¡§Ãö³¬ªí³æ¡¨¥Î©óÃö³¬·í«e°_±±¨î§@¥Îªºªí³æ¡C¦Uª«¥ó¨Ìªð¦^ªº¸ê°T°õ¦æ¬ÛÀ³ªº¦æ°Ê¡C¥Ñ©ó®e¾¹ÃþªºError¤èªk¥i¯à¤w¸g³Q¨ä¦¨­ûª«¥ó©Î¥¦¦Û¤vªº¬Y­Ó¤èªk½Õ¥Î¡A®e¾¹Ãþ¥²¶·¨M©w¬O¦V¤W¶Ç»¼ªð¦^¸ê°TÁÙ¬O¥Ñ¥¦¦Û¤v³B²z¡C¦bµy«á¡A§Ú­Ì±N·|¬Ý¨£³o¨Ç¥N½X¡C
¸Ó¤è®×¦³¤@­Ó°ÝÃD¡G±±¨î¶µ¸m©óVFPªºPage¡AColumn¡A©Î¨ä¥L¨S¦³Error¤èªk¥N½Xªº®e¾¹°òÃþ¤W®É¡A¥Ñ©ó¥¦­Ì½Õ¥Î¤@­ÓªÅªº¤èªk¡A©Ò¥H¥¦­Ì¹ê½è¤W¨S¦³¿ù»~®·®»!¸Ñ¨M¿ìªk¬O¦bÃþ¼h¦¸¤¤¦V¤W²¾°Êª½¨ì§ä¨ì¤@­Ó¨ã¦³Error¤èªk¥N½Xªº¤÷Ãþ¡C¦pªG§Ú­Ì¤£¯à§ä¨ì³o¼Ëªº¤÷Ãþ¡A«hÅã¥Ü¤@­Ó¤@¯ë©Êªº¿ù»~¸ê°T(³o¨Ã¤£¥i¾a¡A¥Ñ©ó©Ò¦³ªºªí³æÃþ³£¬O¥HSFFormÃþ¬°°òÃþ¡A¦ÓSFForm¨S¦³Error¤èªk¥N½X)¡C
­nª`·Nªº¨Æ¬O§¹¾ãªº¿ù»~³B²zÃ쥲¶·¬O§AªºÀ³¥Îµ{¦¡¤¤³Ì¨S¦³Bugªº(¸g¹ý©³½Õ¸Õªº)³¡¥÷¡A¦]¬°¦b¿ù»~ª¬ºA¤U¦A¦¸¥X²{¿ù»~®É¡A°ß¤@¥i¨Ì¾aªº´N¬O¨ú®ø/©¿²¤¹ï¸Ü¤è¶ô¤F¡C©¯¹Bªº¬O¡A¥Ñ©ó§A¥i¥H±N¿ù»~³B²z¥N½X©ñ¤J§Aªº¤j¦h¼Æ¤u§@®Ø¬[¤¤¡A¤@¦ý§A¨Ï¥¦­Ì¤u§@¡A¥¦­Ì¤£·|¨ü¨ì§ó¦hªºÃöª`(ÁöµM»P²³¤£¦PªºÀô¹Ò±ø¥ó¤´·|¨Ï¿ù»~³B²z¾¹¦Û¨­¥¢±Ñ)¡C¤£­n¸ÕµÛ¦b¿ù»~³B²zª«¥ó¤¤«Ø¥ß¤@­Ó¿ù»~³B²z¤èªk¡G·í¿ù»~³B²z¾¹¦Û¨­¥X¿ù®É¡A¥¦¤£·|³Q½Õ¥Î¡C
Error¤èªk
Åý§Ú­Ìª`·N¿ù»~³B²zµ¦²¤ªº§ó¦hªº²Ó¸`¡C·í¤@­Óª«¥óµo¥Í¿ù»~®É¶}©lÂI¬O¦b¸Óª«¥ó©Ò¨ã¦³ªºError¤èªk¡A¦]¦¹§Ú­Ì±q³oùض}©l¡C
¦b§ÚªºÀ³¥Îµ{¦¡ªº°òÃþ¤¤¡A¤j¦h¼ÆÃþªºError¤èªk¥N½X¡A¥]§t¦bSFCTRLS.VCX¤¤¡A²M³æ¦p¤U(¥]¬AccMSG_RETRY©w¸q¦bERRORS.H¤¤¡A¥]§t©óSFCTRLS.H¤¤¡A¨C¤@­ÓÃþªºincludeÀÉ)¡C§Ú»¡¡§¤j¦h¼ÆÃþ¡¨¡A¬O¦]¬°³»¯Å®e¾¹¦pform©Mtoolbarªº¤u§@¤è¦¡¦³¤@¤pÂI¤£¦P¡C³o¬O§Úªº¤Ö¼Æªº§Æ±æVFP¤ä«ù¦h­«Ä~©Óªº²z¥Ñ¤§¤@;¦b³o©M±¡ªp¤U¡A§A»Ý­n¶H¦bVB¤¤¨º¼Ë¡A±N¬Û¦Pªº¥N½X©ñ¤J©Ò¦³ÃþªºError¤èªk¤¤(±Ä¥Î½Æ»s-Ö߶Kªº¤èªk)¡C

lparameters tnError¡A
tcMethod¡A
tnLine
local loParent¡A
lcMethod¡A
lcReturn¡A
lcError

* ¦V¤W²¾°Ê¤@­Ó¼h¦¸ª½¨ì§Ú­Ì§ä¨ì¤@­Ó¨ã¦³Error ¤èªkªº¤÷Ãþ

if type('Thisform') = 'O'
loParent = iif(pemstatus(Thisform¡A 'FindErrorHandler'¡A
5)¡A Thisform.FindErrorHandler(This)¡A .NULL.)
else
loParent = .NULL.
endif type('Thisform') = 'O'
lcMethod = This.Name + '.' + tcMethod
do case

* §Ú­Ì¦³¤@­Ó¥i¥H³B²z¿ù»~ªº¤÷Ãþ¡C

case not isnull(loParent)
lcReturn = loParent.Error(tnError¡A lcMethod¡A tnLine)

* §Ú­Ì¦³¤@­Ó¿ù»~³B²zª«¥ó¡A ¦]¦¹½Õ¥Î¥¦ªº ErrorHandler()¤èªk¡C

case type('oError') = 'O' and not isnull(oError)
lcReturn = oError.ErrorHandler(tnError¡A lcMethod¡A
tnLine)

* ¤@­Ó¥þ§½¿ù»~³B²z¾¹¦b°_§@¥Î¡A ¦]¦¹Åý§Ú­Ì¶Ç»¼¿ù»~¸ê°Tµ¹¥¦¡C
* ¥H¾A·íªº­È´À´«¥i¾aªº°Ñ¼Æ¥H¶Ç»¼¨ì¿ù»~³B²z¾¹(µ{¦¡¦W¡A ¿ù»~¸¹¥H¤Î¦æ¸¹)¡C

case not empty(on('ERROR'))
lcError = strtran(strtran(strtran(strtran(upper(on('ERROR'))¡A
'SYS(16)'¡A lcMethod)¡A
'PROGRAM()'¡A lcMethod)¡A
'ERROR()'¡A 'tnError')¡A
'LINENO()'¡A 'tnLine')

* ¦pªG¿ù»~³B²z¾¹¬O¥H DO ©R¥O½Õ¥Î¡A ¶i¦æ§»ÂX®i¨Ã°²³]ªð¦^­È¬O"Ä~Äò"¡C¦pªG¿ù»~³B²z¾¹¬O
* ³Q¤@­Ó¨ç¼Æ½Õ¥Î (¤ñ¦p¤@­Óª«¥óªº¤èªk)¡A ½Õ¥Î¥¦¨ÃÀò±oªð¦^­È¡C

if left(lcError¡A 3) = 'DO '
&lcError
lcReturn = ccMSG_CONTINUE
else
lcReturn = &lcError
endif left(lcError¡A 3) = 'DO '

* Åã¥Ü¤@­Ó¤@¯ëªº¹ï¸Ü¤è¶ô¡C

otherwise
messagebox('¿ù»~¸¹' + ltrim(str(tnError)) +
'¹ï¶H ' + This.Name +
'¤èªk '+ tcMethod +
'¦æ¸¹ '+ ltrim(str(tnLine))¡A 0¡A
_VFP.Caption)
endcase

* ½T«Hªð¦^¸ê°T¬O¥i±µ¨üªº¡C§_«h¡A °²©w¬°
* "Ä~Äò"¡C

lcReturn = iif(type('lcReturn') <> 'C' or
empty(lcReturn) or not lcReturn $ ccMSG_CONTINUE +
ccMSG_RETRY + ccMSG_CANCEL¡A ccMSG_CONTINUE¡A lcReturn)

* ³B²zªð¦^­È¡C

do case
case '.' $ tcMethod
return lcReturn
case lcReturn = ccMSG_RETRY
retry
case lcReturn = ccMSG_CANCEL
cancel
otherwise
return
endcase
¥H¤W¥N½XÀˬdªí³æ±±¨î¶µ¬O§_¨ã¦³FindErrorHandler¤èªk¡A¦pªG¦³¡A½Õ¥Î¥¦¨Ó©w¦ì¨ì±±¨î¶µªº²Ä¤@­Ó¤÷®e¾¹(¤£­n³Q³o­Ó¥N½X°g´b;§A¥i¥H¦b¨Ñ´£¨Ñªº·½¥N½X¤¤¬d¬Ý¥¦­Ì)¡C³o¼Ë°µ¨¾¤î¤F³o¼Ë¤@ºØ±¡§Î¡G¥Ñ©óPage¡AColumn¡A©Î¨ä¥L®e¾¹Ãþ¨S¦³Error¤èªk¥N½X¦Ó­P¨Ï¿ù»~°±¯d¦b³o¨ÇÃþ¤¤¡C¦pªG¤@­Ó¥i¶i¦æ¿ù»~³B²zªº¤÷®e¾¹§ä¨ì¤F¡A¥¦ªºError¤èªk¥H¬Û¦Pªº°Ñ¼Æ³Q½Õ¥Î¡A°£«Dª«¥óªº¦W¦r³Q¥[¨ì¤FtcMethod¡A¦]¦¹§Ú­Ìªº¿ù»~³B²zªA°Èµ{¦¡¯à°÷ª¾¹D¿ù»~¬Oµo¥Í¦b¨º¤@ª«¥ó¡C¦pªG¤÷®e¾¹¥¼§ä¨ì¦ý¦s¦b¤@­Ó¥þ§½¿ù»~³B²z¾¹(µy«á§Ú­Ì¦A½Í¥þ§½¿ù»~³B²zµ{¦¡)¡A¥¦ªºErrorHandler¤èªk³Q½Õ¥Î¡C¦pªG¤@­ÓON ERROR±`¦¡¦s¦b¡A§Ú­Ì±N½Õ¥Î¥¦(­º¥ý±N§Ú­Ìª¾¹Dªº­È½Õ¾ã¬°¥¦¥i±µ¨üªº°Ñ¼Æ)¡AµL½×¥¦¬O¤@­Ó¨ç¼ÆÁÙ¬O¤@­Ó¹Lµ{¡C¦pªG§Ú­Ì¨S¦³ªF¦è¥i¶Ç»¼¡A´N¨Ï¥Îmessagebox()¨ÓÅã¥Ü¤@±ø¸ê°T¡C
¿ù»~³B²z¾¹ªð¦^ªº­È±N¨M©w«ç¼Ë³B²z¿ù»~¡C­º¥ý¡A¦pªG¸Ó¿ù»~¤£¬Oµo¥Í¦b¥»¦a¡A§Ú­Ì¥²¶·ªð¦^¨M©w¸ê°T¦Ó¤£¬O¦Û¦æ³B²z¡C§Ú­Ì±N¥ÎÀˬdµo¥Í¿ù»~ªº¤èªkªº¦W¦rªº¥yÂI¸¹(.)¨ÓÀˬd³o¤@ÂI;¦pªG¿ù»~¥X²{¦b¤@­ÓÃþªº¤èªk¤¤¡AVFP¥u¶Ç»¼¤èªk¦W¡A¦ýª«¥ó¦¨­û¶Ç»¼ª«¥ó©M¤èªk¦W¡A³o´N´£¨Ñ¤F¤@ºØ§Ö³tªº¤èªk¥Îª«¥ó¦Û¤v©Îª«¥ó¦W¨Ó°Ï§O¿ù»~­ì¦]¡C¦pªG¤£¬O³oºØ±¡ªp¡A«h¬O§Ú­Ìªº¿ù»~¡A¦]¦¹§Ú­Ì±N¡¥­«¸Õ¡¦¡A¡¥¨ú®ø¡¦¡A©Î¡¥ªð¦^¡¦¡C
¥Ñ©ó¥¦­Ì¬O¡§³»¯Å¡¨®e¾¹(§Ú¨S¦³¨Ï¥Îªí³æ¶°Formsets)¡ASFForm©MSFToolbarÃþªºError¤èªk»P¨ä¥Lª«¥ó¤£¦P¡C¸Ó¤èªk¨Ï¥Î¦Û©w¸qªºSetError¤èªk¨Ó²Õ´¤@¨Ç¦Û©w¸qÄݩʧΦ¨Ãö©ó¿ù»~ªº¸ê°T¡A¨Ã¥B¥ÎHandleError¤èªk¨Ó³B²z¿ù»~¡C³Ì«á¥¦³B²zªð¦^­È¡A¥¦¦Û¤v­n»ò°õ¦æ¤@­Ó¦æ°Ê(¤ñ¦pÃö³¬ªí³æ)­n»òªð¦^¨ì½Õ¥Î³o­Ó¤èªkªºª«¥ó¡Cª`·N¦pªGª«¥ó¬ODataEnvironment¥B¥¦¦Û¤v´À´«³B²z³o¨Ç¿ù»~¡A¥¦±N¤£ªð¦^­È¡C§A¥i¯à·Q§ïÅܳo¤@¦æ¬°¡C¦P®É¤]À³ª`·N¨Ï¥Îreturn to;µy«á§Ú­Ì±N°Q½×³o¤@°ÝÃDªº§ó¦h²Ó¸`¡C

lparameters tnError¡A
tcMethod¡A
tnLine
local lcReturn¡A
lcReturnToOnCancel

* ¨Ï¥Î SetError() ©M HandleError() ¨Ó¨ú±o¿ù»~¸ê°T¨Ã³B²z¥¦¡C

with This
.SetError(tnError¡A tcMethod¡A tnLine)
lcReturn = .HandleError()

* ¦pªG¥Î¤á¿ï¾Ü¤F¡¨¨ú®ø¡¨¡A«ü©ú¨ì¨ºùØ¥h¡C

do case
case type('oError') = 'O' and not isnull(oError)
lcReturnToOnCancel = oError.cReturnToOnCancel
case type('.oError') = 'O' and not
isnull(.oError)
lcReturnToOnCancel = .oError.cReturnToOnCancel
otherwise
lcReturnToOnCancel = 'MASTER'
endcase
endwith

* ³B²zªð¦^­È¡A ¨ú¨M©ó¿ù»~¬O "ours" ©Î¨Ó¦Û¤@­Ó¦¨­û.

do case
case lcReturn = ccMSG_CLOSEFORM
This.Release()
return to &lcReturnToOnCancel
case '.' $ tcMethod and
not 'DATAENVIRONMENT' $ upper(tcMethod)
return lcReturn
case lcReturn = ccMSG_RETRY
retry
case lcReturn = ccMSG_CANCEL
return to &lcReturnToOnCancel
otherwise
return
endcase
§Ú­Ì¤£¯à¶ÈµÛ²´©óSetError ¤èªk(§A¥i¥H¦b´£¨Ñªº·½¥N½X¤¤¦Û¤vÀËÅç³o¤@ÂI) ¦ý¥H¤U¬OHandleError ¤èªk¥N½X¡G
local lnError¡A
lcMethod¡A
lnLine¡A
loError¡A
lcMessage¡A
lcReturn
with This
lnError = .aErrorInfo[.nLastError¡A cnAERR_NUMBER]
lcMethod = .Name + '.' +
.aErrorInfo[.nLastError¡A cnAERR_METHOD]
lnLine = .aErrorInfo[.nLastError¡A cnAERR_LINE]

* ¦pªG¦s¦bµÛ¿ù»~³B²zª«¥ó¡A¨ú±o¤@­Ó¤Þ¥Î¨ì§Ú­Ìªº¿ù»~³B²zª«¥ó¡C
* ¥¦¥i¯à¬Oªí³æ¸¹¤]¥i¯à¬O¤@­Ó¥þ§½ª«¥ó¡C

do case
case type('.oError') = 'O' and not isnull(.oError)
loError = .oError
case type('oError') = 'O' and not isnull(oError)
loError = oError
otherwise
loError = .NULL.
endcase
lcMessage = ccMSG_ERROR_NUM + ltrim(str(lnError)) +
ccCR + ccMSG_MESSAGE +
.aErrorInfo[.nLastError¡A cnAERR_MESSAGE] + ccCR +
iif(empty(.aErrorInfo[.nLastError¡A cnAERR_SOURCE])¡A
''¡A ccMSG_CODE +
.aErrorInfo[.nLastError¡A cnAERR_SOURCE] + ccCR) +
iif(lnLine = 0¡A ''¡A ccMSG_LINE_NUM +
ltrim(str(lnLine)) + ccCR) + ccMSG_METHOD + lcMethod
do case

* ¦s¦bµÛ¤@­Ó¿ù»~³B²zª«¥ó¡A ¦]¦¹½Õ¥Î¥¦ªº
* ErrorHandler() ¤èªk¡C

case not isnull(loError)
lcReturn = loError.ErrorHandler(lnError¡A lcMethod¡A
lnLine)

* ¤@­Ó¥þ§½¿ù»~³B²zµ{¦¡¥¿¦b°_§@¥Î¡A ¦]¦¹§Ú­Ì±N¿ù»~¶Ç»¼µ¹¥¦¡C¥H¾A·íªº
* ­È¬°¿ù»~³B²zµ{¦¡´À´«¥i¾aªº°Ñ¼Æ(µ{¦¡¦W¡A ¿ù»~¸¹¡A©M¦æ¸¹)¡C

case not empty(on('ERROR'))
lcError = strtran(strtran(strtran(strtran(upper(on('ERROR'))¡A
'SYS(16)'¡A lcMethod)¡A
'PROGRAM()'¡A lcMethod)¡A
'ERROR()'¡A 'tnError')¡A
'LINENO()'¡A 'tnLine')

* If the error handler is called with DO¡A macro expand it
* and assume the return value is "CONTINUE"¡CIf the error
* handler is called as a function (such as an object
* method)¡A call it and grab the return value if there is
* one¡C

if left(lcError¡A 3) = 'DO '
&lcError
lcReturn = ccMSG_CONTINUE
else
lcReturn = &lcError
endif left(lcError¡A 3) = 'DO '

* We don't have an error handling object¡A so display a
* dialog box¡C

otherwise
lcReturn = iif(messagebox(lcMessage¡A
MB_ICONEXCLAMATION + MB_OKCANCEL¡A
_screen.Caption) = IDCANCEL¡A ccMSG_CANCEL¡A
ccMSG_CONTINUE)
endcase
endwith
lcReturn = iif(type('lcReturn') <> 'C' or empty(lcReturn) or
not lcReturn $ ccMSG_CONTINUE + ccMSG_RETRY + ccMSG_CANCEL +
ccMSG_CLOSEFORM¡A ccMSG_CONTINUE¡A lcReturn)
return lcReturn

HandleError¸ÕµÛ³q¹L¤@­Ó¥þ§½¿ù»~ÅܼÆoError©Îªí³æªºoErrorÄݩʶǻ¼¿ù»~¨ì¥þ§½¿ù»~³B²zª«¥ó¡C¸Ó¤è®×¤¹³\§A¦b¥i¯àªº±¡ªp¤U¡A¾Ö¦³¤@­Ó©w¨îª©¥»ªº»Pªí³æÃöÁpªº¥þ§½¿ù»~³B²z¾¹¡C¦pªG¤@­ÓON ERROR±`¦¡¦s¦b¡A§Ú­Ì½Õ¥Î¥¦(­º¥ý±N§Ú­Ìª¾¹Dªº­È½Õ¾ã¬°¥¦¥i±µ¨üªº°Ñ¼Æ)¡AµL½×¥¦¬O¤@­Ó¨ç¼ÆÁÙ¬O¤@­Ó¹Lµ{¡C¦pªG§Ú­Ì¨S¦³ªF¦è¥i¶Ç»¼¡A´N¨Ï¥Îmessagebox()¨ÓÅã¥Ü¤@±ø¸ê°T¡CµM«á±q¿ù»~³B²z¾¹ªð¦^ªº­È¦^¶Ç¨ìError¤èªk¡C
¥þ§½¿ù»~³B²z
SFErrorMgr¬O¤@­Ó¬£¥Í©óSFCustomªº«D¥iµøÃþ¡C¥¦¥]§t¦bSFMGRS.VCX¤¤¨Ã¨Ï¥ÎSFERRORMGR.H¥]§t¤å¥ó¤¤©w¸qªº¤@¨Ç±`¶q¡C¦bÀ³¥Îµ{¦¡±Ò°Ê®É¡A¥¦³Q¹ê¨Ò¶iÁ`ÅéÅܼÆoError¤¤(°Ñ¨£SYSMAIN.PRG)¡C§Ú­Ì¤£¥²¬d¬Ý¸ÓÃþªº¥þ³¡·½¥N½X¡A¥u»Ý¬d¬Ý¹ï§Ú­Ìªº¿ù»~³B²z¤è®×¦³Ãöªº¤èªk¥N½X¡C§A¦Û¤v¥i¤w¬d¬Ý¥ô¦ó¨ä¥Lªº¤èªk¡C
Init¤èªk±µ¨ü¤T­Ó°Ñ¼Æ¡G·í¿ù»~¥X²{®ÉÅã¥Üµ¹¥Î¤áªº¹ï¸Ü¤è¶ôªº¼ÐÃD(«O¦s©ócTitleÄݩʤ¤)¡A¤@­Ó«ü©úInit¬O§_±N«O¦s·í«eªºon error³B²z¾¹¨Ã§ïÅÜ¥¦¨ì¥¦¦Û¤vªºErrorHandler¤èªk¡A¥H¤ÎÃþ¹ê¨Ò¤Æ¬°ª«¥ó®Éªº¦WºÙ(³o¹ï©óon error©R¥O¬O¥²»Ýªº¡A¦]¬°§Ú­Ì¤£¯à¨Ï¥ÎÃþ¦WµüThis)¡C
¤@¯ë»¡¨Ó¡ADestroy¤èªk·|²M°£¤w³QÃþ§ïÅܤFªºªF¦è;¦b³oºØ±¡ªp¤U¡A¥¦­«¸mVFPªº¿ù»~³B²zµ{¦¡¨ìª«¥ó³Q¹ê¨Ò¤Æ¥H«e¡C
ErrorHandler¤èªk³Q¿ù»~³B²zÃ줤³Ì«áªºª«¥óª½±µ½Õ¥Î¡A¨Ã¥Ñ©ó¥¦¤]¬Oon error¿ù»~³B²z¾¹¬G¤]³Q¶¡±µ½Õ¥Î¡C¥H¤U¬O¸Ó¤èªkªº¥N½X¡G
lparameters tnError¡A
tcMethod¡A
tnLine
local lcCurrTalk¡A
lcChoice¡A
lcProgram
with This

* Ensure TALK is off¡C

if set('TALK') = 'ON'
set talk off
lcCurrTalk = 'ON'
else
lcCurrTalk = 'OFF'
endif set('TALK') = 'ON'

* Put the error into the aErrorInfo array and set the
* lErrorOccurred flag¡C

.GetErrorInfo(tcMethod¡A tnLine)

* If errors aren't being suppressed¡A display the error
* and get the user's choice of action¡C

lcChoice = ccMSG_CONTINUE
if not .lSuppressErrors

* Log the error if necessary¡C

if .lLogErrors
.LogError()
endif .lLogErrors

* Display the error and get the user's choice if desired¡C

if .lDisplayErrors
lcChoice = .DisplayError()
do case

* Cancel or Quit in development environment¡G remove any
* WAIT window¡A revert all open cursors and issue a CLEAR
* EVENTS (in the case of Quit)¡A and then return to the
* top-level program¡C

case lcChoice = ccMSG_CANCEL or
(lcChoice = ccMSG_QUIT and version(2) <> 0)
wait clear
if lcChoice = ccMSG_QUIT
.lQuit = .T.
.RevertAllTables()
clear events
endif lcChoice = ccMSG_QUIT
lcProgram = .cReturnToOnCancel
return to &lcProgram

* Display the debugger (development environment)¡G activate
* the Trace and Debug windows¡C

case lcChoice = ccMSG_DEBUG and version(2) <> 0
activate window debug
set step on

* Retry programmatic code¡G we must do the retry here¡A
* since nothing will receive the RETRY message (as is the
* case with an object)¡C

case lcChoice = ccMSG_RETRY
lcMethod = upper(tcMethod)
if at('.'¡A lcMethod) = 0 or
inlist(right(lcMethod¡A 4)¡A '.FXP'¡A '.PRG'¡A
'.MPR'¡A '.MPX')
if lcCurrTalk = 'ON'
set talk on
endif lcCurrTalk = 'ON'
retry
endif at('.'¡A lcMethod) = 0 ...

* Quit¡G revert all open cursors¡A then quit¡C

case lcChoice = ccMSG_QUIT
.lQuit = .T.
.RevertAllTables()
on shutdown
quit
endcase
endif .lDisplayErrors
endif not .lSuppressErrors

* Restore TALK¡C

if lcCurrTalk = 'ON'
set talk on
endif lcCurrTalk = 'ON'
endwith
return lcChoice
·í¿ù»~µo¥Í®É¡A¤T­Ó°Ñ¼Æ¶Ç»¼¨ìErrorHandler¡G¿ù»~¸¹¡Aµo¥Í¿ù»~ªºµ{¦¡¦W¡Aµo¥Í¿ù»~ªº¦æ¸¹¡CErrorHandler¨Ï¥ÎGetErrorInfo¤èªk¨Ó³]¸mlErrorOccurredÄݩʬ°.T.¨Ã³]¸mÃö©ó¿ù»~ªº¸ê°T¨ìaErrorInfoÄÝ©Ê¡C¦pªGlSuppressErrorsÄݩʭȬ°.T.¡A¤£µn¿ý¿ù»~¥B¤£Åã¥Ü¿ù»~¸ê°T(³o¥Î©ó·í§A·Q®·®»¿ù»~¡A¦ý¤S¤£·Qµn¿ý©MÅã¥Ü¿ù»~¸ê°Tµ¹¥Î¤á®É)¡C§_«h¡ALogError¤èªk³Q½Õ¥Î¨Óµn¿ý¿ù»~¨Ã¥BDisplayError¤èªk¥Î©óÅã¥ÜÃö©ó¿ù»~ªº¸ê°T¨Ã¨ú±o¥Î¤áªº¿ï¾Ü¡C³o¨Ç¿ï¾Ü¬O¡G
• ½Õ¸Õ¡G¸Ó¿ï¶µ¶È·ílShowDebug³]¸m¬°.T.¥B§Ú­Ì¬O¹B¦æ¤_VFPªº¶}µoª©¤¤®É¥i¿ï¡A½Õ¥X¸òÂÜ©M½Õ¸Õµøµ¡¡C¶È·í¶}µoªÌ¨Ï¥Î®É¡AlShowDebug³Q³]¸m¬°.T.(³o¤@ÂI¥i¥H¦b¥Î¤áªí¤¤©ÎWindowsµù¥Uªí¤¤Àˬd¨ì)¡C
• Ä~Äò¡Gªð¦^¨ì³y¦¨¿ù»~ªºµ{¦¡ªº«á­±¤@¦æ¡A¨ÃÄ~Äò°õ¦æµ{¦¡¡C
• ­«¸Õ¡G­«·s°õ¦æ¥X¿ùªºµ{¦¡¡C³oùبϥΤF¤@¤pÂI§Þ¥©¡G¦pªGErrorHandler¤w¸g³Q©ú½T¦a½Õ¥Î¤F(´N¬O»¡¡A±q¤@­Óª«¥óªºError¤èªk)¡A«h¤£¯àª½±µµo§Gretry©R¥O¡A¥Ñ©ó¨º¼Ë°µ·|§â±±¨îªð¦^¨ì½Õ¥Î¥¦ªº¤èªk¡A¦Ó¤£¬O³y¦¨¿ù»~ªº¤èªk¡C¦b³oºØ±¡ªp¤U¡A§Ú­Ì±N¶Èªð¦^¤@­Ó¸ê°T¡§­«¸Õ¡¨¡CµM¦Ó¡A¦pªG¿ù»~¥X²{¦bµ{¦¡Àɤ¤(PRG©ÎMPRÀɤ¤)¡AErrorHandler±N¥Hon error¤èªk³Q½Õ¥Î¡A¦]¦¹¥uªð¦^¸Ó¸ê°TÁÙ¤£°÷¡C¦b³oºØ±¡ªp¤U¡AErrorHandler¥²¶·¦Û¤vª½±µµo§Gretry©R¥O¡C
• ¨ú®ø¡G¦bCompuServe¤W¡A¤@­Ó±`¨£ªº°ÝÃD¬O¡G¦p¦óÁקKµ{¦¡©Î¤èªk¤¤ªº¨ä¾l¥N½X¦b°õ¦æ®É³y¦¨¿ù»~?§A¤£¯à¨Ï¥Îcancel¡A¦]¬°¨º¼Ë¨ú®ø¤F¾ã­ÓÀ³¥Îµ{¦¡¡Creturnªð¦^¨ì¦P¤@¤èªk¤¤¦]¦¹¨º¼Ë°µ¨ÃµL¦n³B¡C¸Ñ¨M¿ìªk¬Oªð¦^¨ì¨ì§AªºÀ³¥Îµ{¦¡ªºread events»y¥y©Ò¦bªºµ{¦¡(¦b¤@¯ë±¡ªp¤U¡A·í§Aªº¤èªk¥N½X©|¥¼°õ¦æ®É¡A§A´Nµo§G¤F¸Ó©R¥O)¡C¥Ñ©ó¸Ó¹Lµ{¥i¯à¤£¬O§AªºÀ³¥Îµ{¦¡ªº²Ä¤@­Ó°õ¦æªºµ{¦¡¡A§Ú­Ì±N±±¨îªð¦^¨ìÄÝ©ÊcReturnToOnCancel¤¤«ü©wªºµ{¦¡¤¤­n¤ñ¨Ï¥Îreturn to master­n¦n¡C·í§A¹ê¨Ò¤ÆSFErrorMgr®É¡A§A¥i¥H¾A·íªº³]¸m¸ÓÄݩʪº­È(§A¥i¥H³]¸m¥¦ªº­È¬°¡§MASTER¡¨¦pªGÀ³¥Îµ{¦¡ªº²Ä¤@­Ó¹Lµ{¥]§t¤Fread events)¡C¦pªG§Aªºread events»y¥y¬O¦b¤@­Óª«¥óªº¤èªk¤¤¡A³]¸m¬°¸Óª«¥óªº¦W¦r;¨Ò¦p¡A¦pªG§Aªºread events»y¥y¬O¦boApp.EventHandler¤¤¡A§â¡§EventHander¡¨©ñ¤JcReturnToOnCancelÄݩʤ¤¡C
• °h¥X¡G°h¥XÀ³¥Îµ{¦¡¡C®Ú¾Ú§Ú­Ì¬O§_¨Ï¥Îªº¬OVFPªº¶}µoª©¡A¦Ó¥i¯à¤£¦Pªº»Ý¨D¡C¦b¶}µo¼Ò¦¡¤U¡A·í§A¤£±o¤£­«·s±Ò°ÊVFP®É¨C¤@¦¸³£±o¨ì¤@±ø¿ù»~¸ê°TµLºÃ¬O¤@¥óµh­Wªº¨Æ±¡¡A¦]¦¹¦b¨ººØ±¡ªp¤U¡A³o¤@¿ï¶µ±N¬Oclear events¨Ãªð¦^¨ì¥Dµ{§Ç¡A¦]¦¹À³¥Îµ{¦¡¯à°÷¥H¦³§Çªº¤è¦¡Ãö³¬¨Ãªð¦^©R¥Oµøµ¡¡C¦pªG³o¬O¤@­ÓVFPªº¹B¦æ®Éª©¥»¡A§Ú­Ì±N¥u²M²z¨Ã°h¥X¡C¦b¤W­z¨âºØ±¡ªp¤¤¡A¦b©Ò¦³ªº¸ê®Æ¤u§@´Áªº©Ò¦³´å¼Ð¤W¡A§Ú­Ì³£¦³±N¨Ï¥Î¦Û©w¸qªºRevertTables¤èªk¨Ó°õ¦æ¤@­Ótablerevert(.T.)¡C¦]¦¹¡A¥H³oºØ¤èªk°h¥X¡A§Ú­Ì¤£·|±o¨ì¤@­Óªþ¥[ªº¿ù»~(¤ñ¦p¨º­Ó¯ä¦W»·´­ªº¡§uncommitted changes¡¨¿ù»~)¡C
³B²z¯S®íªº¿ù»~
¨ì¥Ø«e¬°¤î¡A§Ú­Ì¤w¸g°Q½×¤FÃö©ó¿ù»~³B²z¤è®×ªº¤@¯ë©Êªº°ÝÃD¡G¨C¤@­Ó¿ù»~³£·|³y­P¡§¨ú®ø¡AÄ~Äò¡A­«¸Õ¡A°h¥X¡¨¹ï¸Ü¤è¶ôªº¥X²{¡C³o¹ï©ó¥i¹wª¾ªº¿ù»~¬O¤£¾A·íªº¡A¥¦¶È¾A¥Î©ó¤£¥i¹wª¾©Êªº¿ù»~¡C¥i¹wª¾ªº¿ù»~±N¦b¥i¯à³y­P¿ù»~ªºª«¥óªºError¤èªk¤¤³B²z¡C
§@¬°³B²z¯S®í¿ù»~ªº¤@­Ó¨Ò¤l¡A§Ú­Ì±N¦Ò¼{¬Ý¤@¬ÝSFMaintFormÃþ(¦bSFFORMS.VCX¤¤)¡A³o¬O¤@­Ó¯S§O¬°¸ê®Æµn¿ýªí³æ³]­pªºSFFormÃþªº¤@­Ó¤lÃþ¡C³o¬O¤@­ÓÃö©ó¤@­Óª«¥ó¦p¦ó³B²zÀô¹Ò©M¥i¹wª¾¿ù»~ªº¦n¨Ò¤l¡C
¥Ñ©óSFFormªºError¤èªk¥H²³æªº¶Ç»¼¿ù»~¨ìSFErrorMgrªºErrorHandler¤è¦¡½Õ¥ÎHandleError¤èªk¡A§Ú­Ì±N¤£¦Ò¼{¥ÎSFMaintForm¤¤ªºHandleError¨Ó³B²z¯S®íªº°ò©ó¸ê®Æªº¿ù»~¡C¥H¤U¬OHandleErrorªº¥N½X¡G

local lnError¡A
lcMethod¡A
lcReturn¡A
loObject
with This

* Get the error number and method¡C

lnError = .aErrorInfo[.nLastError¡A cnAERR_NUMBER]
lcMethod = upper(.aErrorInfo[.nLastError¡A
cnAERR_METHOD])
do case

* Handle "DataEnvironment already unloaded" by not
* displaying anything¡C

case lnError = cnERR_DE_UNLOADED
lcReturn = ccMSG_CONTINUE

* Handle a problem in the DataEnvironment¡C

case 'DATAENVIRONMENT' $ lcMethod
lcReturn = .ErrDataEnvironment(lnError)

* Handle a trigger failed¡C

case lnError = cnERR_TRIGGER_FAILED
lcReturn = .ErrTriggerFailed()

* Handle a field rule failed by calling
* ErrFieldRuleFailed()¡CIf it returns an object
* reference¡A we'll set focus to that object so the
* user can correct the problem¡C

case lnError = cnERR_FIELD_RULE_FAILED
loObject = .ErrFieldRuleFailed()
if not isnull(loObject)
.ActivateObjectPage(loObject)
loObject.SetFocus()
endif not isnull(loObject)
lcReturn = ccMSG_CONTINUE

* Handle a table rule failed¡C

case lnError = cnERR_TABLE_RULE_FAILED
lcReturn = .ErrTableRuleFailed()

* Handle a primary/candidate index violation¡C

case lnError = cnERR_DUPLKEY
lcReturn = .ErrDuplicatekey()

* Handle the case where someone else has the record
* locked¡C

case lnError = cnERR_RECINUSE
lcReturn = .ErrRecordInUse()

* Handle the case where the record was modified by
* another user during a delete¡C

case lnError = cnERR_RECMODIFIED and
lcMethod = 'DeleteRecord'
messagebox(ccERR_REC_MODIFIED¡A MB_ICONSTOP¡A
_screen.Caption)
.Refresh()
lcReturn = ccMSG_CONTINUE

* Handle the case where the record was modified by
* another user during an edit¡C

case lnError = cnERR_RECMODIFIED
lcReturn = .ErrRecChangedByAnother()

* Otherwise use the default error handler¡C

otherwise
lcReturn = dodefault()
endcase
endwith
return lcReturn
§A¥i¯à·|»{¬°¡A¤@­Ó³B²z¯S®í¿ù»~ªº°Æµ{¦¡±N¥i¯à¥Ñ¤@²Õcase»y¥y²Õ¦¨¡A¥H³B²z©Ò¦³¥i¹wª¾ªº¿ù»~©M¤@­Óotherwise»y¥y¶Ç»¼©Ò¦³¤£¥i³B²zªº¿ù»~¨ìSFErrorMgr¡C¦bSFMaintFormªº±¡ªp¤¤¡A§Ú­Ì±N³B²z¥H¤U¿ù»~¡G
• DataEnvironment¿ù»~©ÎIJµo¾¹¿ù»~©ÎÄæ¦ì³W«h¥¢±Ñ¡G¦b³oùØ¡A§Ú­Ì±Nª`·N³o¨Ç¿ù»~ªº§ó¦h²Ó¸`¡C
• ªí³W«h¥¢±Ñ¡A°ò¥»/­Ô¿ï¯Á¤Þ¹H¤Ï¡A©Î¨ä¥L¤HÂê¦í¤F°O¿ý¡G¨ä¥Lªº¦b¨t²Î³]­p®ÉÀ³¦Ò¼{ªº°ÝÃD(¨Ò¦p¨Ï¥Î¨t²Î«ü©wªºÃöÁä¦r©M¨Ï¥Î¼ÖÆ[©Î´dÆ[Âê)¡AÃö©ó³o¨Ç¡A§Ú­Ì¨S¦³§ó¦hªº¿ï¾Ü;¥u¯à´£¥æµ¹¥Î¤á¡A¥Ñ¥Î¤á³B²z³o¨Ç°ÝÃD¡C¦]¦¹§Ú­Ì¥u½Õ¥Î¯S©wªº¤èªkÅã¥Ü¾A·íªº¸ê°Tµ¹¥Î¤á§Y¥i¡C
• ·í§Ú­Ì¸ÕµÛ§R°£¤@­Ó°O¿ý®É¡A¥¦¤w³Q¨ä¥L¥Î¤á­×§ï¤F¡G§Ú­Ì±NÅã¥Ü¤@±ø¸ê°Tµ¹¥Î¤á¨Ã­«·sÅã¥Üªí³æ¤º®e¬°­×§ï«áªº¤º®e¡C
• ·í§Ú­Ì·Q­×§ï¤@±ø°O¿ý®É¡A¥¦¤w³Q¨ä¥L¥Î¤á­×§ï¤F¡G§Ú­Ì±N¨Ï¥Î¸Ñ¨M½Ä¬ðªº¥N½X¨Ó¸Ñ¨M³oºØ°ÝÃD(¦b³oùØ¡A§Ú­Ì¤£¦A¦C¥X³o¨Ç¥N½X;§A¥i¥H¦Û¤v¬d¬ÝErrRecChangedByAnother¤èªk¤¤ªº¥N½X)¡C
·íµM¡A³o¤£¬O¥þ³¡ªº¥i®·®»ªº¿ù»~¡A¦ý¬O¤@­Ó¦nªº¨å«¬¨Ò¤l¡C
¸ê®ÆÀô¹Ò
¾¨ºÞDataEnvironment¦³¦Û¤vªºError¤èªk¡A¦ýÃþ¨S¦³DE¡A¦]¦¹§Ú­Ì¥²¶·¤H¬°ªº©ñ¸m¥N½X¨ì§Ú­Ì©Ò«Ø¥ßªº¨C¤@­Ó¸ê®Æªí³æªºDataEnvironment.Error¤¤¡C¦³½ìªº¬O¡A¦pªGDEªºError¤èªk¤¤¨S¦³¥N½X¡A¥¦±N¦Û°Ê½Õ¥Î¨äªí³æªºError¤èªk¡C³o¼Ë§Ú­Ì±N¦bSFMaintFormªºErrDataEnvironment¤èªk¤¤³B²zDEªº¿ù»~¡C³o¨Ç³B²z¥]¬A¤F¡§ªí©Î¸ê®Æ®w¥¼§ä¨ì¡¨¡A¡§ªí³X°Ý©Úµ´¡¨¡A¡§ªí¦b¨Ï¥Î¤¤¡¨¡A©M¡§¥DÃöÁä¦rµL®Ä¡¨µ¥¿ù»~¡C¦b¤@¯ë±¡ªp¤U¡A°£¤FÅã¥Ü¿ù»~¸ê°T©MÃö³¬ªí³æ¥~§Ú­Ì¨S¦³§Oªº¿ï¾Ü¡CµM¦Ó¡A§Ú­ÌÁ٧Ʊæ±o¨ì¤@¨Ç¿ù»~³B²zªA°È¡A¦]¦¹§Ú­Ì¦b³]¸m¤FlDisplayErrorsÄݩʬ°.F.«á¡A½Õ¥ÎoError.ErrorHandler¡C³o·|¨Ï¿ù»~³Qµn¿ý¦ý¤£Åã¥Ü¿ù»~¸ê°T¡C§Ú­Ì±N·|¦b¹B¦æ¡§Ãö³¬ªí³æ¡¨«eÅã¥Ü§Ú­Ì¦Û¤vªº¿ù»~¸ê°T¡C
­nª`·Nªº¤@ÂI¬O¡§DataEnvironment already unloaded¡¨¿ù»~¡C³o¬O¥Ñ©ó¦­´Áªº¿ù»~¦Ó¨Ïªí³æ¤wÃö³¬¡A¦]¦¹·í§Ú­Ì±µ¦¬¨ì¸Ó¸ê°T®É¤°»ò¤]¤£¥²°µ¡C
IJµo
¦pªGIJµo¾¹¥¢±Ñ¡A­P¨ÏIJµo¾¹¥¢±Ñªºª«¥óªºError¤èªk³Q±Ò°Ê¡A¦Ó¤£¬O³QIJµo¾¹(RIError procedure)³]¸mªºon error°Æµ{¦¡¡C³o¬O¤@­Ó¤j°ÝÃD¡GRIError³]¸m¤½¦@ÅܼÆpnError¬°¤@­Ó«D¹sªº­È¡A³o¬O¤@­Ó³Q¨ä¥L±`¦¡¨Ï¥Îªº¡A¥H«Kª¾¹DIJµo¾¹¤w¸g¥¢±ÑªºÅܼơC³]·Q¥H¤U±¡§Î¡G¥Î¤á¦b¤@­Óªí³æ¤¤°µ¤F¬Y¨Ç¨Æ±¡¡A¤ñ¦p§R°£¤@­Ó°O¿ý¨ÏIJµo¾¹¥¢±Ñ¦Ó­P¨Ï¿ù»~³B²zµ{¦¡³Q½Õ¥Î¡A¦ý¥Ñ©óIJµo¾¹¬O¦b¤@­Óª«¥óªºError¤èªk¤¤³Q¤Þµo¡A¸Ó¤èªk³Q½Õ¥Î­n¤ñ½Õ¥Î«O¦s¦b¸ê®Æ®w¤¤ªºRIError±`¦¡­n¦n¡C·íError¤èªk³Q°õ¦æ®É¡A°õ¦æªð¦^¨ìIJµo¾¹¡C¦ý¬O¡A¥Ñ©ópnErrorªº­È¤´µM¬O¹s(¨S¦³§ïÅÜ)¡AIJµo¾¹¥N½X¤£ª¾¹Dµo¥Í¤F¿ù»~¡A¦]¦¹¥¦Ä~Äò°õ¦æ¡C³Ì²×µ²ªG¬O¡AIJµo¾¹¥i¯à³¡¥÷¥¢±Ñ¡C
³oùجO¤@­Ó¨ãÅ骺¨Ò¤l¡C·íORDERS¹ï©óORDITEMS¨ã¦³¤@­Ó­­¨î§R°£³W«h®É¡ACUSTOMER¹ï©óORDERS¨ã¦³¤@­Ó¯ÅÁp§R°£³W«h¡C·í«eªºCUSTOMER°O¿ý¦³¨â±ø¬ÛÃöªºORDERS°O¿ý¡A²Ä¤@±ø¨S¦³ÃöÁpªºORDITEMS°O¿ý¡A²Ä¤G±ø¦³¤@±ø¬ÛÃöªºORDITEMS°O¿ý¡C·í§A§R°£CUSTOMER°O¿ý®É¡A§A·Q·|µo¥Í¤°»ò±¡ªp?§A·|±o¨ì¤@±øIJµo¥¢±Ñªº¿ù»~¸ê°T¡A¦ý§A·|µo²{CUSTOMER°O¿ýªº²Ä¤@±øORDERS°O¿ý¤w³Q§R°£¡C¶È²Ä¤G±øORDERS°O¿ýÁÙ¦s¦b¡A·íµM¡A²{¦b¥¦¦¨¬°¤@­Ó¨S¦³¤÷°O¿ýªº°O¿ý¡C
(§A¥i¯à·|»{¬°³o¬O¤@­Ó¤£¥i«äijªº¨Ò¤l¡A§Ú¦b¹ê»Ú¤¤½T¹êµo¥Í¤F³o¼Ëªº°ÝÃD¡C)
¸Ñ¨Mªº¿ìªk¬O¡A¥²¶·¦b¿ù»~³B²zµ{¦¡¤¤±NpnError³]¸m¬°«D¹sªº­È;¦pªG§A¬d¬ÝSFMaintFormªºErrTriggerFailed¤èªk¥N½X¡A§A·|µo²{¥¦¥u°µ¤F³o¤@ÂI¡CµM¦Ó¡A¨º¼Ë°µ¨Ã¨S¦³§¹¥þ¸Ñ¨M³o¤@°ÝÃD¡GVFP¤Þ¥Î§¹¾ã©Ê(RI)¥Í¦¨¾¹¥Í¦¨ªºRIDelete©MRIUpdate¹Lµ{¤¤ªº¤@­ÓBUG(§R°£©M§ó·s¤@­Ó¤l°O¿ý)¤]¥²¶·§ï¥¿(°Ñ¨£¤U­±ªºÃö©óRIDeleteªº¥N½X)¡C¦pªGpnError«D¹s¡A³o¨Ç±`¦¡³]¸mllRetValªº­È(ªð¦^­È)¬°.F.¡A¥H§i¶D¨ä¥L±`¦¡Ä²µo¥¢±Ñ¡CµM¦Ó¡A¥Ñ©óRIOpen±`¦¡³Q½Õ¥Î¨Ó¦b«D½w½Ä¤è¦¡¤U¥´¶}¤lªí¥HÀˬd»P¤÷ªí¬ÛÃöªº°O¿ý¡A¤U¤@¯ÅªºÄ²µo¾¹(¦p¡AÀˬd¤lªíªº¤lªí)¦b¥¼¹J¨ìunlock»y¥y®É¤£·|³Q±Ò°Ê¡A³o¥X²{¦bllRetVal³]¸m¤§«á¡C³o¼Ë¡A·í¸ÕµÛ§R°£©Î§ó·s®]°O¿ý(­P¨ÏIJµo¿ù»~¸ê°T¥X²{ªº°O¿ý)®Éµo¥Íªº¿ù»~±N¤£·|³y¦¨llRetVal³Q³]¸m¬°.F.¡A¦]¦¹¸Óµ¥¯ÅªºÄ²µo¾¹¤£·|¥¢±Ñ(§Y¨Ï¥¦½T¹ê¥¢±Ñ¤F)¡C¸Ñ¨M³o¤@°ÝÃDªº¿ìªk¬O¶H¤U­±¨º¼Ë¡A²¾°ÊllRetVal»y¥y¨ìunlock©R¥O¥H«á¡C¥Ñ©óRIDelete©MRIUpdate¬O´¶³qªº±`¦¡¡A§A¥i¥H±q¸ê®Æ®wªºÀx¦s¥N½X¤¤½Æ»s³o¨Ç¥N½X¡AÖ߶K¥¦­Ì¨ì¸ê®Æ®wªºÀx¦s¥N½Xªºµ²§ô³¡¥÷(¦bRIµù¸}¦æ«á)¨Ã¦b³oùحקï¡C±Ä¥Î³oºØ¤èªk¡A§A¤£¥²¦b¨C¦¸­«·s¥Í¦¨RI¥N½X«á¡A³£¶i¦æ¬Û¦Pªº­×§ï¡C

procedure RIDELETE
local llRetVal
llRetVal=.t.
IF (ISRLOCKED() and !deleted()) OR !RLOCK()
llRetVal=.F.
ELSE
IF !deleted()
DELETE
IF CURSORGETPROP('BUFFERING') > 1
=TABLEUPDATE()
ENDIF

*** °Å¤Á¤UÄѤ@¦æ...
* llRetVal=pnerror=0
ENDIF not already deleted
ENDIF
UNLOCK RECORD (RECNO())
*** ... §â¥¦Ö߶K¨ì³oùØ

llRetVal=pnerror=0
RETURN llRetVal
¹H¤ÏÄæ¦ì³W«h
¦bVFP 5(¥]¬A5.0a)¤¤ªº¨ç¼Æsys(2018)©Maerror()¤¤¦s¦b¤@­ÓBUG¡A·í¤@­ÓÄæ¦ì³W«h¹H¤Ï®É¡A¹ê»ÚªºÄæ¦ì¦W±N¤£¥i¥Î¡C¬Û¤Ï¡A§A±o¨ì¨â­Ó¦r¦ê¤§¤@¡G­n»ò¬OÄæ¦ìªºRuleTextÄÝ©Ê(¦pªG¥¦¬O¶ñ¼g¤Fªº)¡A­n»ò¬O¤@­Ó¤@¯ëªº¸ê°T¡§Äæ¦ìÅçÃÒ³W«h½Ä¬ð¡¨¡C
«ç»ò·|¬O³o¼Ë?¨º»ò¡A«ç¼Ë¤~¯à¶H§A§Æ±æªº¨º¼Ë¡G¦b¸ÓÄæ¦ì¨S¦³RuleText®É¡AÅã¥Ü¤@±ø¸ê°T¡§½Ð¬°Äæ¦ì<Äæ¦ì¼ÐµP>¿é¤J¤@­Ó¦Xªkªº­È¡¨?°ÝÃD¬O¦pªG§A¤£ª¾¹D¨º¤@­ÓÄæ¦ìªº³W«h³Q¹H¤Ï¡A§A¤S¦p¦óª¾¹D¥Î¨º¤@­ÓÄæ¦ìªº¼ÐµP©O?°²¦p§A·Q³]¸mµJÂI¨ìµo¥Í¿ù»~ªºÄæ¦ìµM«áÅã¥Ü¿ù»~¸ê°T¡A§ó¥[¤è«K¥Î¤á­×§ï¥X°ÝÃDªºÄæ¦ìªº­È?°²¦p§A·Q§ïÅܨº­Ó±±¨î¶µªº­I¹ÒÃC¦â¡A«ç¼ËÅã¦Ó©ö¨£ªº§i¶D¥Î¤á­þ¤@Äæ¦ìµo¥Í¤F¿ù»~©O?
¦bVFP 5.0(¤£¬O5.0a)¤¤¡A­n§ï¥¿³o¤@°ÝÃD¡A§Ú­Ì»Ý­n°µ¨â¥ó¨Æ¤¤ªº¤@¥ó¡G¦pªG³o­Ó¦ê¬O¡§Äæ¦ìÅçÃÒ³W«h½Ä¬ð¡¨¡A§Ú­Ì±N±q¦ê¤¤«õ¥X¸ÓÄæ¦ì¡C¦pªG¨º¤£¬O¤@­Ó¦ê¡A§Ú­Ì¥²¶·¦b¸ê®Æ®w¤¤§ä¨ìµ¹¥XRuleTextÄݩʪºÄæ¦ì¡C©¯¹Bªº¬O¡A¦bVFP 5.0a¡A¤@­Ó¥¼½sÀɨç¼Æaerror()¡A¥¦¥i¥H«Ø¥ß¤@­Ó5­Ó¤¸¯Àªº°}¦C¡A¨ä¤¤¥]§t¤FÄæ¦ì¸¹¡A§Q¥Î¥¦§Ú­Ì¥i¥H§ä¨ì§Ú­Ì­n§äªºÄæ¦ì¦W¡C
SFMaintForm.ErrFieldRuleFailed¤èªk³B²z³oºØbehavior;¥N½X¦p¤U¡G
local loObject¡A
lcAlias¡A
lcTable¡A
lcMessage¡A
lcField¡A
lnSpace1¡A
lnSpace2¡A
lnI¡A
lcText

* If the field rule was checked and failed because
* the user clicked on a button with the Cancel
* property set to .T. or if the button has an lCancel
* property (which is part of the SFCommandButton base
* class) and it's .T.¡A don't bother doing anything
* else¡C

loObject = sys(1270)
if lastkey() = 27 or (type('loObject') = 'O' and
type('loObject.lCancel') = 'L' and loObject.lCancel)
return .NULL.
endif lastkey() = 27 ...
with This

* Figure out which field failed¡C

lcAlias = alias(.aErrorInfo[.nLastError¡A
cnAERR_WORKAREA])
lcTable = cursorgetprop('SourceName'¡A lcAlias)
lcMessage = .aErrorInfo[.nLastError¡A cnAERR_MESSAGE]
lcField = lower(lcAlias + '.' +
field(.aErrorInfo[.nLastError¡A cnAERR_TRIGGER]¡A lcAlias))

* Display the error message and find the object whose
* ControlSource is the field¡C

messagebox(lcMessage¡A MB_ICONSTOP¡A _screen.Caption)
loObject = .FindControlSourceObject(lcField)

* Set the lFieldRuleFailed flag to .T.

.lFieldRuleFailed = .T.
endwith
return loObject
ErrFieldRuleFailed­n°µªº²Ä¤@¥ó¨Æ¬OÀˬd¥Î¤á¬O§_³æÀ»¤Fªí³æ¤¤ªº¡§¨ú®ø¡¨«ö¶s¡A¨Ã¸ÕµÛ³]¸mµJÂI¨ì¸Ó«ö¶s¡A¥H±Ò°Ê·í«e±±¨î¶µªºÄæ¦ìªºÅçÃÒ³W«h¡C¥Ñ©ó¦b¦¹±¡ªp¤U¡A¥¦¤£¥²¦AÅã¥Ü¿ù»~¸ê°T¡A¦]¦¹ErrFieldRuleFailed°£¦¹¤§¥~¤£°µ¥ô¦ó¨Æ±¡¡A²³æªð¦^¡C
¦pªG¥Î¤á¨S¦³¿ï¾Ü¡¨¨ú®ø¡¨¡AErrFieldRuleFailed«ü¥X¨º¤@Äæ¦ìµo¥Í¤F°ÝÃD¡A¥¦½Õ¥ÎFindControlSourceObject¤èªk¨Ó§ä¥Xªí³æ¤¤ªº¨º¤@¹ï¹³¬O¸j©w¨ì¸ÓÄæ¦ì¡C¦pªG§ä¨ì¸Óª«¥ó¡A¥¦ªð¦^¤@­Ó¤Þ¥Î¨ìª«¥ó¡A¦]¦¹HandleError¥i¥H³]¸mµJÂI¨ì¥¦¡C
ErrFieldRuleFailed¤]³]¸m¤@­Ó¥slFieldRuleFailedªºªí³æÄݩʬ°.T.¡A¥¦¥i¥Î©ó·íÄæ¦ì³W«h¥¢±Ñ®É¡A±±¨î¶µªºValid¤èªk¨ÓÁקK±±¨î¶µ¥¢¥hµJÂI¡C»Ý­n¥¦ªº­ì¦]¬O¦]¬°Äæ¦ìÅçÃÒ³W«h¹H¤Ïµ{¦¡¦b±±¨î¶µªºValid¤§«e³Q±Ò°Ê¡C·í¿ù»~³Q³B²z«á¡AValid¤èªk±Ò°Ê¡A¥¿±`¦aªð¦^.T.¡A¤¹³\±±¨î¶µ¥¢¥hµJÂI(§Y¨Ï¥¦¥]§t¤F¤@­Ó¿ù»~ªº­È)¡C¥H¤U¬OÁקK³o¤@±¡ªpªºSFTextBoxªºValid¤èªk¥N½X¡G
if type('Thisform.lFieldRuleFailed') = 'L' and
Thisform.lFieldRuleFailed
Thisform.lFieldRuleFailed = .F.
return 0
endif type('Thisform.lFieldRuleFailed') = 'L' ...
¨Ò¤l
­n¬d¬Ýexamples¬O¦p¦ó¦b³o­Ó¿ù»~³B²z¾÷¨î¤¤³B²z¹w®Æ¤£¨ìªº¿ù»~©M³B²zªº²Ó¸`¡A¹B¦æ¥Ü¨ÒÀɤ¤ªºMYAPP.APP¡C±qÀÉ¥\¯àªí¤¤¿ï¾Ü¡§¿ù»~ªí³æ¤@¡¨¨Ã³æÀ»¡§³o±N³y¦¨¤@­Ó¿ù»~¡¨«ö¶s¡C¸Ó«ö¶sªºClick¤èªk¥]§t¤F¨â­Ó¿ù»~¡A¦]¦¹§A¦b²Ä¤@­Ó¿ù»~¥X²{®Éªº¹ï¸Ü¤è¶ô¤¤¿ï¾ÜÄ~Äò®É¡A²Ä¤G­Ó¿ù»~±N¥X²{¨Ã¥B¿ù»~¹ï¸Ü¤è¶ô±N¦A¦¸¥X²{¡C¦pªG³o¦¸§A¿ï¾Ü¨ú®ø¡A²Ä¤G­Ó¿ù»~¤£·|¥X²{¡A¦ýµ{¦¡°±¯d¦b¹B¦æª¬ºA¥Bªí³æ¤´µM¬O¥´¶}ªº¡C¿ï¾Ü°h¥X¨Ó°®²b¦a°h¥Xµ{¦¡¡A«ì´_¥\¯àªí±ø¡AÃö³¬ªí³æ¡A¨Ã­«·s³]¸mÀô¹Ò¨ì¹B¦æ«eªºª¬ºA¡C­«¸Õ¡A·íµM¡A³y¦¨¬Û¦Pªº¿ù»~¸ê°T¥X²{¡A¥Ñ©ó¸Ó°ÝÃD¤w¸g§ï¥¿¡C
­n¬d¬Ý¯S®íªº¿ù»~¬O¦p¦ó³B²zªº¡A±qÀÉ¥\¯àªí¤¤¿ï¾ÜCustomerªí³æ¡C±qÀÉ¥\¯àªí¤¤¿ï¾Ü·s«Ø¡A¦bCustomer ID¤¤¿é¤J¡§ALFKI¡¨¡AµM«á±qÀÉ¥\¯àªí¤¤¿ï¾Ü¿ï¾Ü«O¦s¡C§A·|±o¤@±ø¿ù»~¸ê°T¡§Customer ID ¤w¸g¦s¦b¡¨;¥Ñ©ó¸ÓÄæ¦ì¬O¸Óªíªº¥DÃöÁä¦r¨Ã¥B¤w¸gªº¤@­Ó¦W¬°ALFKIªº°O¿ý¦s¦b©ó¸ÓÄæ¦ì¤¤¡A¤@±ø¥DÃöÁä¦r¹H¤Ïªº¿ù»~±Nµo¥Í¨Ã±N¶H®i¥Üªº¨º¼Ë³Q³B²z¡C­n¬d¬ÝÄæ¦ì³W«h¥¢±Ñªºµ²ªG¡A¦bCompanyÄæ¦ì¤¤¿é¤J¡§Test¡¨;¸ÓÄæ¦ì¦³¤@­Ó³W«hÁקK¿é¤J¸Ó­È¡C·í§A·QÂ÷¶}¸ÓÄæ¦ì®É¡A§A·|¬Ý¨ìÄæ¦ì³W«h¥¢±Ñªº¿ù»~¸ê°T¡C²MªÅCompanyÄæ¦ì¡C²¾¹B´å¼Ð¨ìCityÄæ¦ì¨Ã¿é¤J¡§Regina¡¨¡AµM«á±qÀÉ¥\¯àªí¤¤¿ï¾Ü«O¦s¡C§A·|±o¨ì¤@±øªí³W«h¥¢±Ñªº¿ù»~¸ê°T;¸Óªí¦³¤@­Ó³W«h©Úµ´±µ¨üCityÄæ¦ìªº­È¬°¡§Regina¡¨(³Ì«á¡A½Ö·Q¥Í¬¡¦b³oùØ)¡C±qÀÉ¥\¯àªí¤¤¿ï¾ÜºM¾P¨Ó²¾¥h·s¼W¥[ªº°O¿ý¡C
­n¬d¬Ý·í¡¨¨ú®ø¡¨«ö¶s³Q«ö¤U®É¡ASFMaintForm¬O¦p¦óÁקK¤@­ÓÄæ¦ì³W«h¥¢±Ñ¸ê°T¡A¦bCompanyÄæ¦ì¤W¿é¤J¡¨test¡¨¨Ã¦bÂ÷¶}¸ÓÄæ¦ì«e³æÀ»¡§ºM¾P¡¨«ö¶s¡C
­n¬d¬ÝDE°ÝÃD¬O«ç¼Ë³B²zªº¡A¦b¤å¥óºÞ²z¾¹¤¤±NCUSTOMER.DBF§ï¦W¬°CUST.DBF¡A¹B¦æMYAPP¨Ã¥´¶}Customerªí³æ¡Cª`·N¦b§A¦^À³©Ò¥X²{ªº¿ù»~¸ê°T«á¡Aªí³æÃö³¬¤F¡C±NCUST.DBFªº¦W¦r§ï¦^¨ìCUSTOMER.DBF¡C
­n¬d¬ÝIJµo¾¹¥¢±Ñ°ÝÃD¡A°h¥XÀ³¥Îµ{¦¡¡A¥´¶}TESTDATA¸ê®Æ®w¡A¬yÄýCUST_ORDERSµø¹Ï¡C¸Óµø¹ÏÅã¥ÜªíCUSTOMER¡AORDERS¡A©MORDITEMS¤¤ªº°O¿ý¸ê°T¡Cª`·NALFKI«È¤á¦³¤@¨Ç­q³f¦ý²Ä¤@­Ó(ORDER_ID=10062)¨S¦³­q³f²Ó¸`(LINE_NO¬O.NULL.)¡C¹B¦æMYAPP¡A¥´¶}Customerªí³æ¡A±qÀÉ¥\¯àªí¤¤¿ï¾Ü§R°£¡A·í½T»{µøµ¡¥X²{®É¿ï¾Ü½T»{½T»{§R°£¡Cª`·NIJµo¥¢±Ñ¸ê°T±N¥X²{;³o¬O¥Ñ©ó¦bªíORDERS»PORDITEMS¶¡¦s¦b­­¨î§R°£ªº³W«h¡CµM¦Ó¡Aª`·N¦h¦¸±o¨ì³o¤@¸ê°T¡A¨Ã¦b³Ì«á¤@¦¸¤ÏÀ³«á¡AALFKI«È¤á³Q§R°£¤F¡C°h¥Xµ{¦¡¡A¥´¶}CUSTOMERS¡Aª`·NALFKI¯uªº¤w¸g³Q§R°£¤F¡C²{¦b
USE ORDERS ORDER CUST_ID
¨Ãª`·N«Ü¦h«È¤áALFKIªº­q³æ°O¿ý¤´µM¦s¦b;·íµM¡A¥¦­Ì³£¦¨¤F¨S¦³¤÷°O¿ýªº©t°O¿ý¡C
­n­×´_³o¤@°ÝÃD¡A«ö¥H¤U¨BÆJ¡G
• CLOSE ALL
• ¸ÑÀ£DATA.ZIP(§Ú­Ì§Ë¶Ã¤F¸ê®Æ¡A¦]¦¹§Ú­Ì»Ý­n«ì´_¥¦­Ì)¡C
• OPEN DATABASE TESTDATA
• MODIFY PROCEDURES
• ¶H«e­±´y­zªº¨º¼Ë¡A±NRIDelete¹Lµ{¤¤ªºllRetVal²¾¨ìUNLOCK»y¥y«á¡C«O¦s¨ÃÃö³¬¥N½Xµøµ¡¡C
• MODIFY PROJECT MYAPP
• ¥´¶}Ãþ®wSFForms¤¤ªºSFMaintFormÃþ¡A¶i¤JErrTriggerFailed¤èªkªº¥N½Xµøµ¡¡A¨ì¥N½X§À³¡¡A¥h±¼pnErrorªºª`ÄÀ¡C¦sÀɨÃÃö³¬¥N½Xµøµ¡¡C
• ­««ØMYAPP¨Ã¹B¦æ¥¦¡C
• ¥´¶}Customerªí³æ¡A±qÀÉ¥\¯àªí¤¤¿ï¾Ü§R°£¡A·í³Q¸ß°Ý½T»{§R°£®É¿ï¾Ü½T»{½T»{§R°£¡C
¦¹®É¡A§A·|±o¨ì¤@±ø³æ¤@ªºÄ²µo¾¹¥¢±Ñ¸ê°T¡A¨Ã¥BALFKI«È¤á¥ôµM¦s¦b¡C¿ù»~³Q±±¨î¤F!
­nÀˬdªº¨ä¥LªF¦è¡G
• ­n¬d¬ÝSFErrorMgr¬O¦p¦óµn¿ý¿ù»~ªº¡A¥´¶}ERRORLOGªí¨Ã¬yÄý¥¦¡C¯S§Oª`·NMEMVARSÄæ¦ì;¥¦¥]§t¤Fµo¥Í¿ù»~®É¦b½Õ¥Î°ïÅ|¤Wªº¨C¤@­Ó¹Lµ{¤¤ªº¨C¤@­ÓÅܼƪº­È¡C
• ­×§ïAPPLIC.INI¤å¥ó¤¤ªºDeveloper¬°Yes¡C¸Ó­È³Q¹Lµ{STARTUP.PRG¥Î©ó³]¸moErrorªºlDeveloperÄÝ©Ê¡C¥´¶}¸ê·½ºÞ²z¾¹¨Ã«ö¤UF5(³o¬O¥²­nªº¡A³o¼ËVFP¤~ª¾¹DINIÀɳQ­×§ï¤F)¡AµM«á¹B¦æMYAPP¡C±qÀÉ¥\¯àªí¿ï¾Ü¡§¿ù»~ªí³æ1¡¨¨Ã³æÀ»ÀÉÀY«ö¶s¡Cª`·N¤@­Ó½Õ¸Õ¿ï¶µ¥X²{¦b¿ù»~¹ï¸Ü¤è¶ô¤¤¡C³o¹ï©ó½Õ¸Õ¤@­Ó¹B¦æ¤¤ªºµ{¦¡¨Ó»¡¬O¯u¥¿¦³¥Îªº¡C·íµM¡A¸òÂܵøµ¡Åã¥ÜSFErrorMgrÃþªº¬OErrorHandler¤èªk¥N½X¡A¥Ñ©ó¨º¬OSET STEP ON©R¥O°õ¦æªº¦a¤è¡C­nªð¦^¨ì¯u¥¿³y¦¨¿ù»~ªº¥N½X¤¤¡A§A¥²¶·¬°¿ù»~³B²zÃ줤ªº¨C¤@±`¦¡³æÀ»Debuggerªº¤u¨ã±ø¤¤ªº¸õ¥X«ö¶s¤@¦¸¡C
• ¦b¡§¿ù»~ªí³æ1¡¨¤¤ªº¡§³o±N³y­P¤@­Ó¿ù»~¦ý¤£·|µo¥Í¤°»ò¡¨«ö¶s¥¿¶H¥¦©Ò»¡ªº¨º¼Ë°µ¡G³æÀ»¥¦¤£·|µo¥Í¤°»ò¡C¦pªG§A¬d¬Ý¥¦ªºClick¤èªk¡A¬Ý°_¨Ó·|¥O¤HÅå§r¡A¦]¬°¦b¨ä¤¤¦³¨â­Ó¿ù»~¡CµM¦Ó¡A¬d¬ÝError¤èªk¨Ãª`·N»P¨ä¥Lª«¥ó¤£¦Pªº¦a¤è¡A¥¦ª½±µ½Õ¥Î¨ä¤÷®e¾¹ªºError¤èªk¡C³o¬O¤@­Ó°ÝÃD¡G¸Ó«ö¶s¬O©ñ¸m¦b¤@­ÓPageFrameªº­¶­±¤¤¡A¨Ã¥B¸Ó­¶¬O¤@­ÓVFPªº°òÃþ­¶¡A¥¦¨S¦³Error¤èªk¥N½X¡A³o·N¨ýµÛ·í¤@­Ó¿ù»~¥X²{®É¤°»ò¤]¤£·|µo¥Í¡C´N¶HON ERROR*¤@¼Ë¡A³o¬O¤@­Ó¨Ï§Aªºµ{¦¡¤£¥X²{¿ù»~¦í³Bªº¦n¤èªk¡C¤£¬O¨S¦³¿ù»~¡A¥u¬O¤£Åã¥Ü¿ù»~¸ê°T¡C³o´N¬O¬°¤°»ò©Ò¦³SFCTRLS.VCX¤¤ªº°òÃþ­n¦V¤W¯Å®e¾¹Ãþ¬d§äª½¨ì§ä¨ì²Ä¤@­Ó¨ã¦³Error¤èªk¥N½XªºÃþ¡C
¦h¼Ëªº¿ù»~¸ê°T
³oùجO¤@¨ÇÃö©óVFP¿ù»~³B²z®É¡A§AÀ³ª¾¹DªºªF¦è¡C
• ¦bVFP 6¥H«eªºª©¥»¤¤¡AVFP¦Û°Ê¦øªA¾¹¤£¯à¾A·í¦aªð¦^¿ù»~±ø¥ó¨ì¥¦ªº½Õ¥Îµ{¦¡¡C¥¦­Ì³Qªþ¥[ªºcomreturnerror()¨ç¼Æ­×§ï¤F¡C¸Ó¨ç¼Æ²¾°ÊCOM¨Ò¥~µ²ºc¥Î¿ù»~µo¥Í¸ê°T¡C¥¦±µ¨ü¨â­Ó°Ñ¼Æ¡GcExceptionSource¡A¦øªA¾¹ªº¦W¦r¡A©McExceptionText¡A§A·Qªð¦^ªº¸ê°T¡CMYAPP.APP¤¤ªºform1½Õ¥Î¦W¬°MyServerªº¦Û°ÊªA°Èµ{¦¡Test()¤èªkºt¥Ü¤F³o¤@ÂI(MyServer±M®×¥]§t¦bsampleÀɤ¤)¡C
• ¦pªGtype()¦b¿ù»~³B²zÃ줤ªº¥ô¦ó¦a¤è³Q¨Ï¥Î¡A§A¤£·|Á`¬O±o¨ì¥¿½Tªº¿ù»~¸ê°T¡C²z¥Ñ¬Otype()¨Ï¥Î¤F¬Y¨ÇVFPªº¿ù»~³B²z¤º®Ö¡A§@¬°µ²ªG¡A·í³Qtype()®§ÀË´úªºÅܼƩÎÄݩʤ£¦s¦b®É¡Amessage()ªº¤º®e¥i¯à³Q½Æ¼g¡C³o´N¬O¬°¤°»ò¦³®É§Aªº¿ù»~³B²zµ{¦¡·|³ø§i¡§Åܼƥ¼§ä¨ì¡¨¸ê°T¡C¦bVFP 98¤¤¡AºÉ¥i¯à¦a¨Ï¥Îvartype();¥¦¤ñtype()§ó§Ö¥BÁקK¤F¥H¤W°ÝÃD¡C
• ¦bVFP 5¤¤¡A·í¸j©w±±¨î¶µªº¸ê®Æ·½Äæ¦ìªºÅçÃÒ³W«h¹H¤Ï®É¸Ó±±¨î¶µªºError¤èªk³Q½Õ¥Î¡C³o¤¹³\§A±±¨îÅã¥Ü¤°»ò¼Ëªº¿ù»~¸ê°T©M«ç¼ËÅã¥Ü¥¦­Ì¡C¦bVFP 3¤¤¡A³o¨Ç¿ù»~¬O¤£¥i®·®»;VFP¾A·í¦a¬°Äæ¦ìÅã¥ÜRule¤å¥»(­YRule¤å¥»¬°ªÅ¡A«hÅã¥Ü¤@­ÓÃø¬Ýªº¤å¦r¸ê°T)¦b¤@­Ó§A¤£¯à±±¨îªºmessagebox()¹ï¸Ü¤è¶ô¤¤¡C
• ¾¨ºÞ§@¬°local©w¸qªºÅܼƦb©w¸q¥¦ªº¹Lµ{¥H¥~¬O¤£¥i¨£ªº¡A¦ýlist memory©R¥O¥i¥H¬Ý¨£½Õ¥Î°ïÅ|¤¤¥þ³¡±`¦¡¤¤©w¸qªº¥þ³¡ÅܼơC³o¬O¤@¥ó¦n¨Æ±¡¡A¦]¬°¥¦¤¹³\§A¦bµo¥Í¿ù»~®É¡A¨ú±o¥þ³¡Åܼƪº¤@­Ó¸ê°T¨Ã±N¨äµn¿ý¨ì¤@­ÓÀÉ¡CSFErrorMgrªºLogError¤èªk®i¥Ü¤F«ç¼Ë°µ¡C
• list status©R¥O¹ï¿ù»~³B²zªºÀ°§U¨Ã¤£¬O«Ü¤j¡G¥¦¥u¯à¬Ý¨£·í«e¸ê®Æ·|¸Ü°Ï¤¤ªºªF¦è(¨Ò¦p¥´¶}ªºªí©MSET©R¥Oªº³]¸m)¡A¦]¦¹¡A¦pªG¿ù»~³B²zµ{¦¡¬O¦bÀq»{¸ê®Æ¤u§@´Á¡A¥¦¤£¯àµo²{¨p¦³¸ê®Æ¤u§@´Á¤¤ªºªí³æµo¥Íªº¿ù»~¡C¦pªG³o¹ï§A«Ü­«­n¡A§A¥i¥H¦b¨Ï¥Î¸Ó©R¥O«eÂà´«¨ìªí³æªº¸ê®Æ¤u§@´Á©Î§A¥i¥H¬£¥ÍSFErrorMgrªº¤@­Ó¤lÃþ¶i¤Jªí³æªºoErrorÄÝ©Ê¡A³o¼Ë§@¬°ªí³æ´N³£¦b¬Û¦Pªº¸ê®Æ¤u§@´Á¤F¡C
• ¥X©ó©Ê¯à¤è­±ªº­ì¦]¡A·í¿ù»~µo¥Í®É¡A§A¥i¯à¤£·Q¤@¦¸¤@¨B¦a½Õ¥Î¤÷Ãþªº¥N½X¡A¦]¦¹§A¥i¥Hª½±µ±q¤@­Óª«¥óÂà¸õ¨ìªí³æ¯ÅªºError¤èªk©ÎSFErrorMgr.ErrorHandler¡C§Úªº·N¨£¬O¡Aµo¥Í¿ù»~®É¡A©Ê¯à¤£¬O¦Ò¼{¦]¯À¡A¦]¦¹§Ú¦b¥»¤å¤¤«O«ù¤FÃþ³]­p²M´·©M±ø²z¡C
• error©R¥O¬O¦³½ìªº¡G¥¦­P¨Ï¥Î¤@­Ó¿ù»~³QIJµo¡C¦pªG§A·Q¹³VFP¤@¼Ë³B²z¬Y¨ÇÃþ«¬ªº¡§³n¡¨¿ù»~®É¡A¨Ï¥Î¥¦¬O«Ü¤è«Kªº¡C¨Ò¦p¡A¦pªGfile()ªð¦^¤F.F.«ü¥XÀɤ£¦s¦b¡A§A¥i¥H¨Ï¥Îerror©R¥O±j¨î¿ù»~³B²z¾¹±Ò°Ê³o¼Ë§A¥i¥H±o¨ì¤@¯ë¿ù»~ªA°È(µn¿ý¡AÅã¥Ü¡Aµ¥)¡C§ÚÁͦV©ó¾¨¶q¤Ö¥Î³oºØ¤èªk;²¦³º¡A·í§A¥¿¦b³B²z¤@­Óµw¿ù»~®É¡AÁÙ·|¨ü¨ì³n¿ù»~Àˬdªº¤zÂZ¡C¦P®É¡A³oÁÙ¨ú¨M©ó§A¦b¨ºùبϥÎerror©R¥O¡A§A¥i¯à¤£·|Àò±o¥¿½Tªº¤èªk¦WºÙ©M¦æ¸¹¸ê°T¡A¦]¬°¥¦­Ì±N¤Ï¬Merror©R¥O¬O¦b¨ºùسQ¨Ï¥Î¦Ó¤£¬O§A¦b¨ºùصo²{ªº°ÝÃD¡C
• ·íª«¥ó¤èªk½Õ¥Îªºµ{¦¡µo¥Í¿ù»~®É¡Aª«¥óªºError¤èªk¥ý©óon error±Ò°Ê¡C³o·N¨ýµÛ¥i¥H¦b½sµ{¤¤¥Î¨âºØ¤£¦Pªº¾÷¨î¨Ó³B²z¤@­Ó¿ù»~¡A³o­n¬Ýµ{¦¡¬O³Q¦p¦ó½Õ¥Îªº¡C³o¼Ë¡A¦b½s½X¤¤ªº¿ù»~³B²z¤£¶H¦bª«¥ó¤¤¨º»ò²³æ¡C³o¬O§â¥¦­Ì±qPRG®w¤¤²¾¨ìª«¥ó®w¤¤ªº¥t¤@­Ó²z¥Ñ¡C
• ¥H¤WÆ[ÂIÁÙ¦³¥t¤@­Ó¦³½ìªº¤è­±¡G¦pªG§Aªºread events»y¥y¦b¤@­Ó¥þ§½ª«¥óªº¤èªk¤¤(¨Ò¦p¤@­Óapplicationª«¥ó)¡A¸Óª«¥óªºError¤èªkªº®ÄªG´N¬Û·í©ó¤@­Ó¥þ§½¿ù»~³B²z¾¹¡A¦]¬°¸Óª«¥óÁ`¬O¦b½Õ¥Î°ïÅ|¤W¡C§A¥i¥H¥Îon errorµ²§ô³oºØ±¡ªp¡A³o¼Ë¥¦±N¥u³B²z¤£±qª«¥ó¤¤½Õ¥Îªº¡APRG¥N½X¤¤ªº¿ù»~¡C
• §A¤£¯à¥¿±`¦a®·®»¥H¤U±¡ªp¡G·í¥Î¤á¦bTextBox¤¤¿é¤J¤@­ÓµL®Äªº¤é´Á­È®É;VFPÅã¥Ü¡§Invalid Date¡¨¨Ã¤£·|±Ò°Ê¸Ó±±¨î¶µªºValid¤èªk¡C§A¥i¥H¥Îset notify off©R¥OÃö³¬¡§Invalid Date¡¨¸ê°T¡A¦ý¬O§A¦pªG·Q±Ò°Ê±±¨î¶µªºValid¤èªk(¨Ò¦p¡A­nµ¹¥X¤@±ø¤£¦Pªº¸ê°T©Î±a¥X¤é¾ä±±¨î¶µ)¡A§A¥²¶·³]¸m±±¨î¶µªºStrictDateEntryÄݩʬ°0¡C³oùØ­nª`·Nªº¬O¡G¦pªG¥Î¤á¿é¤J¤F¤£¥i¥Îªº¤é´Á¡A¥¦±N·|³Q¸m¬°ªÅ®æ¡A¦]¦¹¦pªG§A·Q­«·sÅã¥Ü¶ñ¤Jªº­È¡A§A¥²¶·¦b±±¨î¶µªºGotFocus¤èªk¤¤«O¦s¥¦¨Ã¦bValid¤¤«ì´_¥¦¡C
• on error¤£®·®»³øªí¤¤ªº©M¥\¯àªí©R¥Oªºskip for¤l¥y¤¤ªº¿ù»~;³o¨Ç¿ù»~¬O¤£¥i®·®»ªº¡A¦]¦¹½T«H§Aªº³øªí©M¥\¯àªí¤¤ªºskip for¤l¥y¤¤ªº±ø¥ó¹Bºâ¦¡¬O¸g¹L¹ý©³´ú¸Õªº¡C­n½T»{³o¤@ÂI¡A½s¿èAPPLIC.INI¨Ã³]¸mNoSuchVariable¤J¤f¬°No¡C¥´¶}Windows Explorer¨Ã«ö¤UF5(³o¬O¥²­nªº¡A³o¼ËVFP·|µo²{INIÀɤw¸g³Q­×§ï)¡AµM«á¹B¦æMYAPP¡C¦b¥\¯àªí¤W³æÀ»¡A¨Ãª`·NVFP¿ù»~ªº¥X²{¡C
µ²½×
¦b¥»¤å¤¤¡A±´°Q¤F¨âºØ³Ì¨Î¿ù»~³B²z¤è®×(§½³¡³B²z¤j¦h¼Æ¿ù»~¤Î³Ñ¤Uªº¥Ñ¥þ§½³B²z)¡C¦¹¤è®×¤w¦¨¥\¦a¹B¥Î¤_¤@¨t¦CªºÀ³¥Îµ{¦¡¤¤¡A¾¨ºÞ§Ú­Ì¤´¦b¤£Â_¦a§¹µ½¥¦¡C§Ú§Æ±æ§A¯à§ä¨ì¹ï§A¦³¥Îªº¦a¤è¡C¦pªG§A¹ï¥¦¦³¥ô¦ó§ï¶i©Î¦³¥ô¦ó§ï¶i«Øij¡A½Ð³qª¾§Ú¡C

_________________
#############################
§Ö¼Ö¶ý«}¨t¦C©¯ºÖ¦v°t,³Ü¤Q¥þÂû´ö~­ì¨Ó©¯ºÖ¨º»ò²³æ!!

¾Ç·|VFP¨Ï¥ÎªÌªÀ°Ïªº·j´M,Code¤~·|§ó¦³½ì~
#############################
¦^³»ºÝ
À˵ø·|­û­Ó¤H¸ê®Æ µo°e¨p¤H°T®§
±q¤§«eªº¤å³¹¶}©lÅã¥Ü:   
µoªí·s¥DÃD   ¦^ÂÐ¥DÃD    VFP ·R¥ÎªÌªÀ°Ï ­º­¶ -> VFP °Q½×°Ï ©Ò¦³ªº®É¶¡§¡¬° ¥x¥_®É¶¡ (GMT + 8 ¤p®É)
²Ä1­¶(¦@1­¶)

 
«e©¹:  
±z µLªk ¦b³o­Óª©­±µoªí¤å³¹
±z µLªk ¦b³o­Óª©­±¦^ÂФ峹
±z µLªk ¦b³o­Óª©­±½s¿è¤å³¹
±z µLªk ¦b³o­Óª©­±§R°£¤å³¹
±z µLªk ¦b³o­Óª©­±¶i¦æ§ë²¼
±z µLªk ¦b³o­Óª©­±ªþ¥[ÀÉ®×
±z µLªk ¦b³o­Óª©­±¤U¸üÀÉ®×


Powered by phpBB © 2001, 2005 phpBB Group
¥¿Å餤¤å»y¨t¥Ñ phpbb-tw ºûÅ@»s§@