|
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¸ü.
|
¤W¤@½g¥DÃD :: ¤U¤@½g¥DÃD |
µoªí¤H |
¤º®e |
Ruey
µù¥U®É¶¡: 2003-03-12 ¤å³¹: 1698 ¨Ó¦Û: tunglo
²Ä 1 ¼Ó
|
µ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¥Dn¯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ªºµ{¦¡¡Cn¤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·|³yP¿ù»~¡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¤Wz¤@¼Ë³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¡Cn¤¹³\«áªÌ¡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¥¦¦Û¤vn»ò°õ¦æ¤@Ó¦æ°Ê(¤ñ¦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 mastern¦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¤@¥óµhWªº¨Æ±¡¡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¤Wz¨âºØ±¡ª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¤@Ó¿ù»~³£·|³yP¡§¨ú®ø¡AÄ~Äò¡A«¸Õ¡A°h¥X¡¨¹ï¸Ü¤è¶ôªº¥X²{¡C³o¹ï©ó¥i¹wª¾ªº¿ù»~¬O¤£¾A·íªº¡A¥¦¶È¾A¥Î©ó¤£¥i¹wª¾©Êªº¿ù»~¡C¥i¹wª¾ªº¿ù»~±N¦b¥i¯à³yP¿ù»~ªºª«¥óªº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¾¹¥¢±Ñ¡AP¨Ï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¦ê¤§¤@¡Gn»ò¬OÄæ¦ìªºRuleTextÄÝ©Ê(¦pªG¥¦¬O¶ñ¼g¤Fªº)¡An»ò¬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)¤¤¡An§ï¥¿³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
ErrFieldRuleFailedn°µªº²Ä¤@¥ó¨Æ¬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¡Cn¬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±´yzªº¨º¼Ë¡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¤è¡Cnªð¦^¨ì¯u¥¿³y¦¨¿ù»~ªº¥N½X¤¤¡A§A¥²¶·¬°¿ù»~³B²zÃ줤ªº¨C¤@±`¦¡³æÀ»Debuggerªº¤u¨ã±ø¤¤ªº¸õ¥X«ö¶s¤@¦¸¡C
• ¦b¡§¿ù»~ªí³æ1¡¨¤¤ªº¡§³o±N³yP¤@Ó¿ù»~¦ý¤£·|µ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³on¬Ýµ{¦¡¬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¡Anµ¹¥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¹ý©³´ú¸Õªº¡Cn½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¤~·|§ó¦³½ì~
############################# |
|
¦^³»ºÝ |
|
|
|
|
±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§@
|