9. ¶i¶¥¨Ï¥Îªí³æ¤Î¹ï¸Ü¤è¶ô
ªí³æªº¼Ð·Ç¥Îªk
¡@
¦b
²Ä¤G³¹ §Ṳ́w¸gÁ¿¸Ñ¤F³\¦h¦³Ãöªí³æªºÄÝ©Ê¡B¤èªk¡B¤Î¨Æ¥ó¡C¦b³o¤@³¹¡A§Ú̱N»¡©ú¦p¦ó±Nª«¥ó¾É¦Vµ{¦¡³]pÀ³¥Î¦bªí³æ¤W¡A±Ð±z¦p¦ó§Q¥Î³oÓ§Þ¥©¨Ó¼g¥X¦³®Ä²v¡B¨S¦³¿ù»~(Bug-Free)ªºµ{¦¡¡C
§âªí³æ·í§@ª«¥ó
¡@
º¥ý¡A§ÚÌ¥²»ÝÁA¸Ñ¦bVisual Basic¤¤¡A¤°»ò¬Oªí³æ¡C¨Æ¹ê¤W¡A±qª©¥»4.0¥H«á¡Aªí³æ´N¬O¤@Óª«¥ó¼Ò²Õ¥[¤W¤@Ó³]p®v(Designer)¡C±z¥i¥H¦^·Q²Ä¤G³¹©ÒÁ¿ªº¡A³]p®v¬O¤@Ó¾ã¦Xªºµo®iÀô¹Ò¼Ò²Õ¡A¥i¥HÅýµ{¦¡³]p¤Hû§Q¥Îµøı¤Æªº¬É±¥h³]©wª«¥ó°õ¦æ®É´ÁªºªºÄÝ©Ê¡C
§Q¥Îªí³æ³]p®v¡A±z¥iÂǥѩì©Ô±±¨î¶µ¡A³]©wªí³æ¤W±±¨î¶µªº¦UºØÄÝ©Ê¡AÅý±z¦b³]p®É´Á¡A¥h©w¸q¤@Óªí³æªº¥~Æ[¡C·íÀ³¥Îµ{¦¡°õ¦æ®É¡AVisual Basic§Y®Éªº§â³o¨Ç¸ê°TÂàĶ¦¨¹ïÀ³ªºWindow API¨Ó²£¥Í¥Dµøµ¡¡A¥H¤Î¨º¨Ç¦b¤W±ªº±±¨î¶µ¡C¦Ó¤@Ө嫬ªºVisual Basic±±¨î¶µ¡AnÂàĶ¦¨¬Û¹ïÀ³ªºC©ÎC++µ{¦¡½X¡A¥i¯à³£nªø¹F¦n´X¦Ê¦æ¡A©Î³\±z¤w¸gÁA¸Ñ¬°¤°»òVisual Basic¯à¦bµu®É¶¡¤º¦¨¬°³]pWindowµ{¦¡³Ì¨üÅwªïªº»y¨¥¡C
§ÚÌ¥i¥H«Ü®e©ö¦aÃÒ©úªí³æ¥u¬O¤@Ө㦳¨Ï¥ÎªÌ¤¶±ªºª«¥ó¡C°²³]¦b±zªºÀ³¥Îµ{¦¡¤¤¦³¤@Ó¥s°µ frnDetails ªºªí³æ¡A±z¥i¥H§Q¥Îª«¥óªºNew¤èªk¨Ó²£¥Í¤@Óª«¥ó¹êÅé¡G
Dim frm As frmDetails Set frm = New frmDetails frm.Show
nÃÒ©úªí³æ¬O¤@Óª«¥ó¡A«Ü«nªº¤@ÂI¡A´N¬On¹³¤@¯ëª«¥ó¨ã¦³ÄÝ©Ê¡B¤èªk¡B¤Î¨Æ¥ó¡CÁ|¨Ò¨Ó»¡¡A±z¥i·s¼W¤@ӬƦܦhÓªºPublicÄÝ©Ê¡A±Nªí³æ¤Wªº±±¨î¶µ°µ«Ê¸Ë¡A½Ð¬Ý©³¤U³o¬qµ{¦¡¡G
' Inside the frmDetails form Public Property Get Total() As Currency Total = CCur(txtTotal.Text) End Property
¬Û¦P¦a¡A±z¤]¥i·s¼W¤@¨ÇPulbic ªº¤èªk¡AÅý¥Dµ{¦¡¯à°÷³z¹L©I¥s³o¨Ç¤èªk¡A¨ÓÅýªí³æ§¹¦¨¤@¨Ç¤u§@¡A¨Ò¦pÅý¥¦¦C¦L¥X¦Û¤vªº¤º®e¡G
' Note that Sub, Function, and Property procs are Public by default. Sub PrintOrders() ' Here you place the code that prints the form's contents. End Sub
¦bªí³æ¼Ò²Õ¥~¡A±z¥i¥H¹³¤@¯ëªºª«¥ó¤@¼Ë¨ú±o¥¦ªºÄÝ©Ê¡G
Dim Total As Currency Total = frm.Total() frm.PrintOrders
ªí³æ»P¤@¯ëª«¥ó³Ì«nªº¤£¦PÂI¬Oªí³æ¤£¯à³Q«Å§i¦¨Public¡AÅý¨ä¥¦ªºÀ³¥Îµ{¦¡³z¹LCOMªº¤è¦¡¨Ó¦s¨ú¡C
¦bªí³æ¤¤ÁôÂ꺥þ°ìÅܼÆ
¡@
«Ü¥Ù¬Þ¦a¡A´N¹³§Ú̪¾¹Dn¨Ï¥Îª«¥ó«e¥²¶·¥ýn±Ò©l(initialize)¥¦¡A¹ï¦¹¦Ó¨¥¡A§ÚÌ¥²»Ý§âªí³æ¬Ý°µ¬O¤@Ó¡u¯S®í¡v«¬ºAªºª«¥ó¡C¦]¬°±z¥i¥Hª½±µ¨Ï¥Î¤@Óªí³æ¡A¦Ó¤£¥Î¥ý°µ±Ò©lªº°Ê§@¡C¨Ò¦p¦b¤U±ªºµ{¦¡¤ù¬q¡A±z¤£¥Î¥ý©ú½Tªº«Ø¥ßfrmDrails ªí³æ¡G
Private Sub cmdDetails_Click() frmDetails.Show End Sub
¬JµM§ÚÌ»¡ªí³æ¬O¤@Óª«¥ó¡A¬°¤°»ò¤W±ªºµ{¦¡¤£·|²£¥Íerror 91: "Object variable or With block variable not set"¡H¨ä¹ê³oÓ°ÝÃD¤w¸g¦s¦b¤@¬q®É¶¡¤F¡C·íª©¥»4.0µoªí®É¡A·L³n¤uµ{®v¥²»Ý½T«O¦bª©¥»3.0¡A¬Æ¦Ü¤§«eª©¥»µo®iªºµ{¦¡¡A¯à°÷¦b·sª©¥»¤W¥¿½T¦a°õ¦æ¡C²³æªº»¡¡AY¦bª©¥»3.0©Ò¶}µoªº±M®×¡AµLªk¦bª©¥»4.0¤W¨Ï¥Î¡A¨ºª©¥»4.0«K¬O¤@Ó¥¢±Ñªºª©¥»¡C©ó¬O¤uµ{®vÌ·Q¥X¤@Ó¬J²³æ¤SÀu¶®ªº¸Ñ¨M¤èªk¡C¦b¥Ø«eªºÀ³¥Îµ{¦¡¤¤¡A½sĶµ{¦¡²£¥Í¤F¤@Ó»Pªí³æ¬Û¦P¦WºÙªº¥þ°ìÅܼơA¦Ó³oÓÅܼƬOÁôÂð_¨Óªº¡G
' (Note: you will never actually see these declarations.) Public frmDetails As New frmDetails Public frmOrders As New frmOrders ' (Same for every other form in the application)
·í±zªºµ{¦¡½X°Ñ¦Ò¨ì³oÓªí³æªº¹êÅé®É¡A¨Ã¤£¬Oª½±µ¤Þ¥Î¨ìfmDetailªºªí³æª«¥ó¡A¦Ó¬O¤Þ¥Î¨ì»P³oÓªí³æ¦P¦Wªº¥þ°ìÅܼơC¥¿¦]¬°³oÓÅܼƬO¦Û°Ê²£¥Íªº¡AVisual Basic¦b±z¤Þ¥Î¨ì³oÓÅܼƮɡA¥ß¨è·|«Ø¥ß·sªºªí³æª«¥ó¡C³oÓ§Q¥ÎÁôÂÃ¥þ°ìÅܼƪºÁo©ú§Þ¥©¡A¦¨¥\ªºÅýµ{¦¡µo®i¤Hû¯à°÷»´ÃPªº§â¦bª©¥»3.0¤¤µo®iªºµ{¦¡¡A¨Ï¥Î¦bª©¥»4.0©Î§ó·sªºª©¥»¤W¡C¦ý¬O¡Aµy«á±z¤]·|¬Ý¨ì³o¨ÇÁôÂêºÅܼƷ|³y¦¨¼ç¦bªº°ÝÃD¡A³o¬O±z¥²¶·nª`·Nªº¡C
²M°£ªí³æ¹êÅ骺°ÝÃD
¡@
¬°¤F´yz³oÓ¤w³QÃÒ©ú±`¦b¨Ï¥Îªí³æ¤W¸I¨ìªº°ÝÃD¡A§Ú̫إߤ@Ó²³æªºfrmLoginªí³æ¡A¥¦·|«Âи߰ݨϥΪ̩m¦W¤Î±K½X¡Aª½¨ì¨âªÌ³£¥¿½T¬°¤î¡C³oÓªí³æ¾Ö¦³¨âÓPublicªºÄÝ©Ê¡A UserName¤ÎPassword¡A¥¦Ì·|¦b Unload ¨Æ¥ó¤¤¡A¤À§O³Q«ü©w¬°¦btxtUserName¤ÎtxtPassword±±¨î¶µªºÈ¡G
Public UserName As String Public Password As String Private Sub cmdOK_Click() ' Unload this form only if password is OK. If LCase$(txtPassword) = "balena" Then Unload Me End Sub Private Sub Form_Load() ' Move property values into form fields. txtUserName = UserName txtPassword = Password End Sub Private Sub Form_Unload(Cancel As Integer) ' Move field contents back into public properties. UserName = txtUserName Password = txtPassword End Sub
±z¥i¥HÅýfrmLoginªí³æÅã¥Ü¥X¨Ï¥ÎªÌ©Ò¿é¤JªºÈ¡G
' Code in frmMain form Private Sub cmdShowLogin_Click() frmLogin.Show vbModal ' Execution gets here only if password is OK. MsgBox frmLogin.UserName & " logged in." End Sub
n´ú¸Õªí³æ¬O§_¥¿±`¹B§@¡A¥ý°õ¦æ¥Dªí³æ¡AÂI¿ïcmdShowLogin«öÁä¡AµM«á¿é¤J¨Ï¥ÎªÌ¦WºÙ¤Î±K½X(¦p¹Ï9-1)¡C·ífrmMain¥Dªí³æ¦A«×¨ú±o±±¨îÅv®É¡A¥¦·|Åã¥Ü¤@Ó°T®§¹ï¸Ü¤è¶ô¡Cªí±¤W¦ü¥G¤@¤Á¹B§@¥¿±`¡A°²¦p±z¦A¦¸«ö¤ULogin«ö¶s¡AfrmLoginªí³æ±N¦A³Q±a¥X¡A¦ý¬O³o¤@¦¸¡A¤§«e¨Ï¥ÎªÌªº¦WºÙ¤Î±K½X«o·|ª½±µÅã¥Ü¦bªí³æ¤W¡C³o¥i¤£¬O§Ú̩ҧƱ檺«O±K¤è¦¡¡I
¡@
¹Ï9-1 Login ½d¨Òµ{¦¡ |
nÁA¸Ñ°ÝÃDµo¥Í¦bþ¸Ì¡A½Ð§â¤U±³o¬qµ{¦¡½X¥[¤Jªí³æ¼Ò²Õ¤¤¡G
Private Sub Form_Initialize() Debug.Print "Initialize event" End Sub Private Sub Form_Terminate() Debug.Print "Terminate event" End Sub
²{¦b¡A°²¦p±z«ÂЦa¨Ì·Ó§ÚÌè¤~ªº¨BÆJ¥h°õ¦æµ{¦¡¡A±z·|µo²{¡A¦bµ{¦¡°Ñ¦Ò¨ì frmLogin ªº®ÉÔ·|¥ß¨èµo¥Í Initialize ¨Æ¥ó¡A¤Ï¤§¡ATerminate ¨Æ¥ó«o±q¥¼µo¥Í¡C´«¥y¸Ü»¡¡A±z²Ä¤G¦¸©ÒÅã¥ÜªºfrmLoginªí³æ¡A¬O¦b±z²Ä¤@¦¸°õ¦æ®É©Ò«Ø¥ßªº¹êÅé¡C³oÓªí³æ³Q¥¿±`ªºUnload¡A¦ýVisual Basic«o¨S¦³ÄÀ©ñªí³æ¹êÅ骺¸ê®Æ°Ï(Data area)¡A¤]´N¬O»¡¡A¤£ºÞ¬OPrivate©ÎPublicÅܼơA³£¤´µM¦s¦b©ó°O¾ÐÅ餤¡C¦]¬°³oÓì¦]¡A²Ä¤@¦¸¿é¤Jªº¨Ï¥ÎªÌ©m¦W¤Î±K½X·|¥Ã»·¦s¦b©ó°O¾ÐÅ餤¡A´N¹³¨âÓTextBox±±¨î¶µ¤¤©ÒÅã¥Üªº¡C¦b¯u¥¿¶}µoÀ³¥Îµ{¦¡®É¡A³oÓ¯S©Ê±N¥i¯à³y¦¨¤@¨Ç«ÜÃø³Qµo²{ªº¿ù»~¡A¦]¬°³oºØÃþ«¬ªº¿ù»~©ó¨Ï¥ÎªÌ¤¶±¤W¬O¬Ý¤£¨ìªº¡C
nÅý¤W±ªºµ{¦¡¥¿±`¹B§@¡A¥i¥H±j¢Visual BasicÄÀ©ñªºªí³æ¹êÅé¥H½T«O¤U¦¸·|¦A«Ø¥ß¤@Ó¥þ·sªº¹êÅé¡C¦³¨âÓ¤èªk¥i¥H¨Ó¹F¦¨¡A³Ì±`¥Îªº´N¬O¦bShow¤èªk«á¡A§âªí³æÅܼƳ]¬°Nothing¡G
Private Sub cmdShowLogin_Click() frmLogin.Show vbModal MsgBox frmLogin.UserName & " logged in." ' Set the hidden global form variable to Nothing. Set frmLogin = Nothing End Sub
¥t¥~´N¬O¨Ï¥Î¤ñ¸ûÃþ¦üª«¥ó¾É¦VÆ[©Àªº¤è¦¡¡C±z¥un²³æªº«Å§i¤@Ó»Pªí³æ¦WºÙ¬Û¦Pªº°Ï°ìÅܼơA³o¼Ë«K¯à¨ú¥N¥þ°ìÅܼơG
Private Sub cmdShowLogin_Click() Dim frmLogin As New frmLogin frmLogin.Show vbModal MsgBox frmLogin.UserName & " logged in." End Sub
²{¦b±z°õ¦æ³o¤äµ{¦¡¡A±N·|µo²{Visual Basic¤w¸g¥¿½Tªºµo¥Í Form_Terminate ªº¨Æ¥ó¡A¦]¦¹§ÚÌ¥i¥H½T»{ªí³æ¤w¸g³Q§¹¥þÄÀ©ñ¡C±q³oÓ§Þ¥©¡A¥i¥Hµo²{¦³½ìªº¤@ÂI¡A±z¥i¥H¤@¦¸¦P®É«Ø¥ß¦hÓªí³æ¹êÅé¡A¦p¹Ï 9-2¡C
Private Sub cmdShowDocument_Click() Dim TextBrowser As New TextBrowser TextBrowser.Filename = txtFilename.Text ' Show the form, making it a child form of this one. TextBrowser.Show, Me End Sub
¡@
¹Ï9-2 ¨Ï¥Î©ú½Tªºªí³æÅܼơA±z¥i¥H«Ø¥ß¨ÃÅã¥Ü¦hÓ¬Û¦Pªºªí³æ¹êÅé¡C©Ò¦³ªº¤lªí³æ³£·|Åã¥Ü¦b¤÷ªí³æªº¤W¼h¡A§Y¨Ï¤÷ªí³æ¤w¸g±o¨ì¾nÂI(focus) ¡C |
¤p¯µ³Z
ªí³æ Show ¤èªk´£¨Ñ¤F²Ä¤GÓ¿ï¾Ü¶µ¤Þ¼Æ¡AÅý±z«ü©w©ÒÅã¥Üªí³æªº¤÷ªí³æ¬°¦ó¡C·í±z¶Ç¤JȨì³oӤ޼ơA·|µo¥Í¨â¥ó¦³½ìªº¨Æ±¡¡G¤lªí³æ¤@©wÅã¥Ü¦b¤÷ªí³æªº¤W¼h¡A§Y¨Ï¤÷ªí³æ¤w¸gÀò±o¾nÂI¡C¨ä¦¸¡A·í¤÷ªí³æÃö³¬©Î³Ì¤p¤Æ®É¡A¤lªí³æ¤]¦Û°ÊªºÃö³¬©Î³Ì¤p¤Æ¡C±z¥i¥H§Q¥Î³oÓ¯S©Ê«Ø¥ß¤@Ó¥iÂ\¤u¨ã¦C¡B½Õ¦â½L©Î¬O¤@²Õ¹Ï¥Üµ¥ªº¯B°Ê¦¡¤lªí³æ¡C¦¹®É±z¥i±N¤lªí³æ BorderStyle ³]¬°4-Fixed ToolWindow ©Î¬O5-Sizable ToolWindow¡C
±z¥i¥H¦bÀH®ÑCD¤¤§ä¨ì§¹¾ãªºfrmTextBrowserªí³æ¼Ò²Õªºµ{¦¡½X¡C½Ðª`·N³oÓ¨Ò¤l³£¬O¨Ï¥Î«D¿W¦û¦¡ªºªí³æ¡C
·íªí³æÅܼƪº¥Í©R¶g´Áµ²§ô«á¡A±z¤´µM¥i¥H¬Ý¨ì¥¦ªºµe±¡A¦¹®ÉVisual Basic¤£·|ÄÀ©ñªí³æªº¸ê®Æ°Ï¡Cª½¨ì¨Ï¥ÎªÌUnload³oÓªí³æ¡AVisual Basic¦b Form_Unload ¨Æ¥ó«á¡A¥ß¨èIJµo Form_Terminate ªº¨Æ¥ó¡A¦¹®É¡A¸ê®Æ°Ï¤~·|³QÄÀ©ñ¡C³oÓ¯S©Ê¦n¹³¹H¤Ï¤F¡u·íª«¥ó¤£¦A³Q¤Þ¥Î®É¡A´NÀ³¸Ó³Q¾P·´¡vªº³W«h¡A±µ¤U¨Óµ§ªÌ±N»¡©ú¨Æ¹ê¤W¡A§Ų́䣬O§¹¥þ¤£¦A°Ñ·Ó³oÓªí³æ¡C
ªí³æ¶°¦X
¡@
ªí³æ¶°¦X(Forms collection) ¬O¤@Ó¥þ°ì©Êªº¶°¦X¡A¥¦¥]§t©Ò¦³¤w¸g³Q¸ü¤Jªºªí³æ¡C¤]´N¬O»¡©Ò¦³¤w¸g³Q¸ü¤Jªºªí³æ³£·|³Q³oÓ¶°¦X¤Þ¥Î¨ì¡A¦]¦¹´Nºâµ{¦¡¤¤¤w¤£¦A¦³¥ô¦ó¹ïªí³æªº¤Þ¥Î¡A¥¦Ì¨ÌµM¤£·|³QÄÀ©ñ¡C³z¹L©³¤Uªº¨ç¦¡¡A±z¥i¥H±qªí³æ¶°¦X¨ú±o¹ï¥ô¦ó¤@Óªí³æªº¤Þ¥Î(reference)¡G
Function GetForm(formName As String) As Form Dim frm As Form For Each frm In Forms If StrComp(frm.Name, formName, vbTextCompare) = 0 Then Set GetForm = frm Exit Function End If Next End Function
°²¦p¦b¶°¦X¤¤¦³¬Û¦P¦WºÙªºªí³æ¡A«h¶Ç¦^¦WºÙ¬Û²Å¦Xªº²Ä¤@Ó¡A±z¥i¥H¥Î©³¤Uªºµ{¦¡¡A³z¹Lªí³æªº¦WºÙ¨Ó¨ú±o¸Óªí³æªº¤Þ¥Î¡G
GetForm("frmLogin").Caption = "Login Form"
±z¥i¯à»Ýnª`·Nªº¬O¡AGetForm ¨ç¼Æ©Ò¶Ç¦^ªº¬Oformªº«¬ºA¡C¤]´N¬O¶Ç¦^ªºªí³æ¥u¯à¨Ï¥Î¨ì¤@¯ëformÀ³¦³ªº¤èªk¤ÎÄÝ©Ê¡A¨Ò¦p Caption ¤Î ForeColor ÄݩʩάO Move »P Show ªº¤èªk¡AY±zn¨Ï¥Î¦ÛqªºÄݩʩΤèªk¡A±z¥²»Ý©w¸q¤@Ó«ü¨ì¬Y¤@¯S©wªí³æª«¥óªºÅܼơA¦A§â GetForm ¶Ç¦^ªºªí³æÂ૬(Cast)¦s¨ì¸ÓÅܼƤ¤¡G
Dim frm As frmLogin Set frm = GetForm("frmLogin") = "Login Form" username = frm.UserName
¥i«½Æ¨Ï¥Îªºªí³æ
¡@
´N¹³ª«¥ó¼Ò²Õ¤@¼Ë¡AY§âªí³æ·í¦¨¬O¤@Óª«¥ó¡A¨º´NÀ³¸Ó¨ã¦³¥i«ÂШϥΪº¯S©Ê¡C¥i«ÂШϥΪºªí³æ¥i¥HÀ³¥Î¨ì«Ü¦h¦a¤è¡A³Ì²³æªº´N¬O§Ú̦b ²Ä¤G³¹ ©ÒÁ¿ªº¡A§âªí³æ·í§@¬O¤@Ӽ˪©¡CµM¦ÓY¦Aµy¥[¤@ÂI§Þ¥©¡A§Ú̱N¥i³]p¥X§ó¨ã¼u©Ê¡B¥i¥Î©Êªºªí³æª«¥ó¡C¦b¤U±ªº´X¸`¤¤¡A§Ú̱N§ó¶i¤@¨B´yz³o¨Ç§Þ¥©¡C
¨Ï¥Î¦ÛqªºÄݩʤΤèªk
¡@
«Ü¦h°Ó·~À³¥Îµ{¦¡·|Åã¥Ü¥X¤é¾äÅý¨Ï¥ÎªÌ¦b¤W±ª½±µ¿ï¾Ü¤é´Á¡CVisual Basic¤]´£¨Ñ¤@ÓMonthView Micsrosoft ActiveX±±¨î¶µ(½Ð¬Ý ²Ä11³¹ )¡A¦ý¬OY¨Ï¥Î¦Û¤v³]pªºªí³æ«h¥i¥H¦³¥H¤U´XÂI¦n³B¡GÁ|¨Ò¨Ó»¡¡A¥i¥HÅý§Ú̦Ûq¤j¤p(size)¡B¤é´ÁªºÅã¥Ü¤è¦¡¥H¤Î¥Nªí°²¤éªºÃC¦âµ¥µ¥¡C¤@¯ë¨Ó»¡¡A¦b¨Ï¥ÎªÌ¤¶±¤W¨Ï¥Î¦Ûqªºªí³æ¥i¥H±a¨Ó³Ì¤jªº¼u©Ê¡A¦bÀH®Ñ¥úºÐ¤¤¡A±z¥i¥H¨ú±o¹Ï9-3¤¤frmCalendarªí³æªº§¹¾ãªºµ{¦¡½X¡C³o¨Ç¤é´Áªº«ö¶s¡A¬O¤@²Õ¥Ñ¦W¬°OptionButtonªº±±¨î¶µ°}¦C©Ò±Æ¦C¦Ó¦¨ªº¡A¨CÓ«ö¶sªºStyleÄݩʳ£³]¬°1-Graphical¡C
¡@
¹Ï9-3 ¦Ûqªº¤é¾äªí³æ¡A³z¹L¦ÛqªºÄÝ©Ê¡A¤èªk¤Î¨Æ¥ó»P¥Dµ{¦¡°µ·¾³q¡C |
frmCalendar ´£¨Ñ´XÓÄÝ©ÊÅý±z¦Ûq¥¦ªº¤¶±¡A¨Ò¦p DialogTitle (³]©w¹ï¸Ü¤è¶ôªº¼ÐÃD)¡BFirstDayOfWeek ¤Î SaturdayIsHoliday (¦b³]©w¤é¾ä¥~Æ[«Ü¦³¥Î)¡C¤]´£¨Ñ¤@²ÕÄݩʨӨú±o¨Ï¥ÎªÌ©Ò¿ï¾Üªº¤é´Á¡GCancelPressed (·í¨Ï¥ÎªÌ¥¼°µ¥ô¦ó¿ï¾Ü®É¶Ç¦^True)¡BSelectedDate (¥iŪ¼g¤é´Á)¡BDay¡BMonth¤ÎYear (°ßŪ¡A¥i¶Ç¦^©Ò¿ï¾Üªº¤é¡B¤ë¡B¦~)¡C³oÓ¼Ò²Õ¥u¦³¤@Ó¦W¬° ShowMonth ªº¤èªk¡A¥¦¥i¥H¨Ì¾Ú©Ò¶Ç¤Jªº¤ë¥÷¡AÅã¥Ü¥X¸Ó¤ë¥÷ªº¤é¾ä¡A¤]¥i¥H±N¬Y¤@¯S©wªº¤é´Á°µ¼Ð°O¡G
Private Sub cmdCalendar_Click() Dim Calendar As New frmCalendar Calendar.DialogTitle = "Select a new date for the appointment" ' Highlight the current day/month/year. Calendar.ShowMonth Year(Now), Month(Now), Day(Now) ' Show the calendar as a modal dialog. Calendar.Show vbModal ' Get the result if the user didn't press Cancel. If Not Calendar.CancelPressed Then AppointmentDate = Calendar.SelectedDate End If End Sub
¤@¯ë¦Ó¨¥¡An§âªí³æ·í¦¨¤@Óª«¥ó¨Ï¥Î¡A¨º´NÀ³¸Ó´£¨Ñ¤@²Õ¤¶±Åý¨Ï¥ÎªÌ¨Ó¦s¨úªí³æªºì¥Í(native)ÄÝ©Ê¡C¨Ò¦p¡AfrmCalendar ªí³æ¼Ò²Õ´£¨Ñ¤@Ó DialogTitle ªº¦ÛqÄÝ©Ê¡A¨Ó¨ú¥N쥻ªí³æªº Caption ÄÝ©Ê¡C¨Ï¥Î³oÓ¤èªk¡A¥Î¤áºÝ´N¤£·|¯}Ãaªí³æª«¥óªº«Ê¸Ë(encapsulation)¡AÅý±z½T«Oª«¥ó¤º³¡ªº¥¿½T¹B§@¡C«Ü¿ò¾Ñ¦a¡A¦bªí³æª«¥ó¤¤¡A±z¨S¦³¿ìªk¥hÁקK¨ä¥¦À³¥Îµ{¦¡ª½±µ©I¥sªí³æ©Îªí³æ¤W±±¨î¶µªºì¥ÍÄÝ©Ê¡A©Î³\³o´N¬O¨É¨üªí³æª«¥ó©Ò±a¨Óªº¦n³B®É¦P®É»Ý¥I¥Xªº¥N»ù§a¡C
¼W¥[¦Ûqªº¨Æ¥ó
¡@
¦b¤W±ªºµ{¦¡½X¤¤¡AfrmCalenderªí³æ¬O¥H¿W¦û¦¡ªº¤è¦¡Åã¥Ü¹ï¸Ü¤è¶ô¡A¤]´N¬Oµ{¦¡¤@ª½nµ¥¨ì¹ï¸Ü¤è¶ô³QÃö³¬«á¡A¤~·|Ä~Äò°õ¦æ¤U¥h¡C·í¹ï¸Ü¤è¶ôÃö³¬®É¡A±µ¤U¨Óªºµ{¦¡½X´N·|Àˬdªí³æªºÄÝ©Ê¡A¨ú±o¨Ï¥ÎªÌ¿ï¾Ü¤é´Á¡CµM¦Ó¡A¦b¤j¦h¼Æ±¡ªp¤U¡A±z¥i¯à¶·n¨Ï¥Î«D¿W¦û¦¡ªº¤è¦¡¨ÓÅã¥Ü¹ï¸Ü¤è¶ô¡C¦¹®É¡A±z¥²»Ý¾Ç²ß¤@Ó¤èªk¨Ó±oª¾¨Ï¥ÎªÌ¦ó®ÉÃö³¬¹ï¸Ü¤è¶ô¡AµM«á¤~¥h¬d¸ß SelectedDate ÄÝ©Ê¡C±z¥i¥HÂǥѷs¼W¤@¹ï¦Ûqªº¨Æ¥ó¨Ó¹F¨ì¤Wzªº¥Øªº¡G
Event DateChanged(newDate As Date) Event Unload(CancelPressed As Boolean)
¦Ûq¨Æ¥ó¼W¥[¤FfrmCalendar¼Ò²Õªº¥i¥Î©Ê¡C´N¹³¤@¯ëªºª«¥ó¤@¼Ë¡An®·®»³o¨Ç¨Æ¥ó¡A±z¥²¶·¦bÅã¥Ü¤é¾ä¹ï¸Ü¤è¶ôªº¼Ò²Õ¶¥¼h(module-level)¼W¥[¤@Ó WithEvents ÅܼơG
' In the frmMain form Dim WithEvents Calendar As New frmCalendar Private Sub cmdCalendar_Click() Set Calendar = New frmCalendar Calendar.DialogTitle = "Select a new date for the appointment" Calendar.ShowMonth Year(Now), Month(Now), Day(Now) Calendar.Show ' Show as a modeless dialog box. End Sub Private Sub Calendar_DateChanged(newDate As Date) ' Show the date currently selected on a Label control. lblStatus.Caption = Format(newDate, "Long Date") End Sub Private Sub Calendar_Unload(CancelPressed As Boolean) If CancelPressed Then MsgBox "Command canceled", vbInformation Else MsgBox "Selected date: " & Format$(Calendar.SelectedDate, _ "Long Date"), vbInformation End If ' We don't need this variable any longer. Set Calendar = Nothing End Sub
»¡©ú
ŪªÌ¥i¯à·|°Ý¬°¤°»ò»Ýn¤@Ó¦Ûqªº Unload ¨Æ¥ó¡A±z¥i¯à¥H¬°·íÅܼÆCalendar ¤Þ¥ÎfrmCalendarªí³æ®É¡A¤]¤@¼Ë¥i¥H®·®»frmCalendarªº Unload ¨Æ¥ó¡C³oÓ°²³]¨Ã¤£¥¿½T¡A¨Æ¹ê¤W¡ACalenader Åܼƥu¬O³æ¯Â«ü¦VfrmCalendarªº¦Ûq¤¶±¦Ó¤w¡C¹³¼Ð·Çªí³æ©Ò¨ã³Æªº Unload¡BResize¡BLoad¡BPaint µ¥¨Æ¥ó¡A¨Ã¤£¯àÂǥѫ¬ºA¬° frmCalendar ªºÅܼƩҮ·®»¡Cn¯à®·®»³o¨Ç¨Æ¥ó¡A´N¥²¶·n«Å§i¤@Ó«¬§O¬° Form ªºÅܼơA¦b³oÓ¨Ò¤l¤¤¡A§Ų́ϥΦÛqªº Unload ¨Æ¥ó¡A¹ê§@±N·|¤ñ¸û²¤Æ¡C
´N¹³¤@¯ëªº¼Ð·Çª«¥ó¼Ò²Õ¤@¼Ë¡A¨Ï¥Î¦Ûqªº¨Æ¥ó¡A±N·|¬°ªí³æ¼Ò²Õ±a¨Ó§ó¦hªº¼u©Ê¡C¼W¥[¤@ÓChange-Likeªº¨Æ¥ó¡A´N¹³¦bfrmCalendar¼Ò²Õ¤¤ªº DataChanged ¨Æ¥ó¡A¥iÅý¨Ï¥ÎªÌ©¼¦¹¶¡ªº¤é´Á«O«ù¤@P¡C±z¤]¥i¦Ûq¤@Ó Progress ¨Æ¥ó¡A·íµ{¦¡³B²z®É¶¡¹Lªø®É¡A¥i¥Î¨ÓÅã¥Ü¶i«×¡A¦³Ãö¨Æ¥óªº¨Ï¥Î¡A½Ð°Ñ¦Ò ²Ä¤C³¹ ¡C
°Ñ¼Æ¤Æªºªí³æ
¡@
¤@Óªí³æ¦b°õ¦æ®É´Á´£¨Ñ¤@²Õ¤èªk¤ÎÄÝ©Ê¡A¥i¥HÅý¥Dµ{¦¡¥Î¨Ó¨M©wªí³æÅã¥Üªº¥~Æ[¡A§Ú̺٤§¬°°Ñ¼Æ¤Æªºªí³æ¡A³z¹L°Ñ¼Æ¤Æ¥i¥HÅýªí³æ§ó¨ã«ÂШϥΩʡC½Ð¬Ý¹Ï9-4¥i¥H§óÁA¸Ñµ§ªÌªº·N«ä¡Q¹Ï¤¤¨âӨ㦳¿ï¶µ«ö¶sªºªí³æ¡A¹ê»Ú¤W¬O¬Û¦Pªºªí³æ¼Ò²Õ¡A¥¦Ì¨Ì¾Ú¥Dµ{¦¡ªº»Ýn¡A¦ÓÅã¥Ü¤£¦Pªº¥~Æ[¡C
°Ñ¼Æ¤Æªºªí³æ»s§@¤W¤ñ¸û§xÃø¡Aº¥ý¡A±z¥²¶·©w¸q¥X¤@²Õ¤èªk¤ÎÄݩʨÓÅý¨Ï¥ÎªÌ¨M©wÅã¥Üªí³æªº¥~Æ[¡C¨ä¦¸¡A±z¥i¯àn¼g«Üªøªºµ{¦¡½X¨ÓÅýªí³æ¤W©Ò¦³ªº±±¨î¶µ¯à°÷¦b°õ¦æ®É´Á¡A¦Û°Ê±N¦Û¤vÅã¥Ü©óµe±¥¿½Tªº¦ì¸m¤W¡C
¡@
frmOptionsªí³æ´£¨Ñ¤TÓÃöÁä¤èªkÅý±z·s¼W®Ø¬[(Frame Control)¡B®Ö¨ú¤è¶ô(CheckBox Control)¤Î¿ï¶µ«ö¶s(OptionButton)±±¨î¶µ¡G
Private Sub cdmOptionsOne_Click() Dim frm As New frmOptions ' Add a Frame control _ the first argument to this and following ' methods is a unique ID code for the control being created. frm.AddFrame "F1", "First Group" ' Each subsequent AddOption and AddCheck method adds ' a control inside the current frame, until another AddFrame ' method is issued. frm.AddOption "O1", "&1. First", True ' Set the value to True. frm.AddOption "O2", "&2. Second" frm.AddOption "O3", "&3. Third" ' Add a second frame, with three radio buttons and two check boxes. frm.AddFrame "F2", "Second Group" frm.AddOption "O4", "&4. Fourth", True ' Set the value to True. frm.AddOption "O5", "&5. Fifth" frm.AddOption "O6", "&6. Sixth" ' Tick this check box control. frm.AddCheck "C1", "&7. Check one", True frm.AddCheck "C2", "&8. Check two" ' Show the form as a modal dialog. frm.Show vbModal
frmOptionsªí³æ¼Ò²Õªº Value ¤èªk·|¶Ç¦^±±¨î¶µªºIDÈ¡C±z¥i¥H¨Ï¥ÎIDȨӨú±oCheckBox©Î¬OOptionButtonsªº Value È¡A¤]¥i¥Hª¾¹DOptionButton±±¨î¶µ¬O§_³Q¿ï¨ú¡G
' Continuing the cmdOptionsOne_Click procedure... If frm.CancelPressed Then MsgBox "Command canceled", vbInformation Else MsgBox "Option button in first frame: " & frm.Value("F1") _ & vbCr & "Option button in second frame: " _ & frm.Value("F2") & vbCr _ & "First checkbox : " & frm.Value("C1") & vbCr _ & "Second checkbox: " & frm.Value("C2") & vbCr, _ vbInformation, "Result of Options form" End If End Sub
½Ð°Ñ¦Òì©l½X¡A¬Ý¬ÝfrmOptionsªí³æ¤¤ªº®Ø¬[(Frame)§ïÅܤj¤p(Resize)®É¡A¦p¦ó«·s±Æ¦C©Ò¥]§tªº±±¨î¶µ¡C¤]¥i¬Ý¨ì·íªí³æ§ïÅܤj¤p®É¡A¦p¦ó¤@¨Ö§ïÅܮج[ªº¤j¤p¡C±z¥i¥H«Ø¥ß«Ü¦h¹³frmOptionsªº°Ñ¼Æ¤Æªí³æ¡A¨Ò¦p«Ø¥ß¨ã¦³«Ü¦hºØ«ö¶s¡B¹Ï¥Ü¡B¦r«¬ªº°T®§¤è¶ô¡C°Ñ¼Æ¤Æªºªí³æ³Ì¤jªº¦n³B¦b©ó¨ä¥i¥H«½Æ¨Ï¥Î©Ê¡AÁa¨ÏÅã¥Ü¥~Æ[¤£¦P¡A¦ý¨ä¨Ï¥Î¤èªk³£¬O¬Û¦Pªº¡C³oºØ§Þ¥©¥i¥H¸`¬ÙEXEÀɮתº¤j¤p¤Î°õ¦æ®É©Ò¶·ªº°O¾ÐÅé¡C
§âªí³æ·í§@ª«¥óÂsÄý¾¹
¡@
±z¥i¥H§âªí³æ§@¥t¤@ºØ¹B¥Î¡C°²¦p±zªºÀ³¥Îµ{¦¡¼sªx¨Ï¥Îª«¥ó¼Ò²Õ¨ÓÀx¦s¡B³B²z¸ê®Æ¡A±z¥i¯à»Ýn¤@Ó¯S®íªº¸ê®Æª«¥óÂsÄý¾¹¡CÁ|¨Ò¨Ó»¡¡A°²¦p±z¨Ï¥Î¤@Ó¦W¬°Cpersonªºª«¥ó¼Ò²Õ¨Ó¦s©ñÓ¤H¸ê®Æ¡A±z¥i¥H«Ø¥ß¤@ÓfrmPersonªí³æ¼Ò²Õ¡A¥¦¨ã¦³¤@Ó«¬ºA¬°CpersonªºPersonÄÝ©Ê¡C³o¼Ë¥i¤j´T²¤Æ¥Î¤áºÝªºµ{¦¡¡A¦]¬°¥¦¥un«ü©w¤@Óª«¥ó¡A¦Ó¤£»Ý«ü©w¦UºØ¤£¦PªºÄÝ©Ê (¦p¥»¨Ò¤¤ªº Name¡BAddress¡BCity¤ÎMarried )¡G
' The client code that uses the frmPerson form Dim Person1 As New CPerson ' Initialize properties for this instance. Person1.Name = "John Smith" Person1.Address = "12345 West Road" ... ' Display it on screen. Dim frm As New frmPerson Set frm.Person = Person1 frm.Show
frmPersonªí³æ¥²¶·¥¿½Tªº§â Person ÄÝ©Ê«ü©wµ¹¹ïÀ³ªºÄæ¦ì¡A¦p¹Ï9-5¤Î¥H¤Uªºµ{¦¡½X¡C
¡@
¹Ï9-5 ¨Ï¥Îªí³æ¨Ó·í§@ª«¥óÂsÄý¾¹¡C³o¨âÓªí³æ¹êÅéÅã¥Ü¦P¤@ÓCpersonª«¥ó¡A¨Ã¥B·|¦Û°Ê¦P¨B¤Æ¡C |
' Inside the frmPerson form module Private WithEvents ThisPerson As CPerson Property Get Person() As CPerson Set Person = ThisPerson End Property Property Set Person(newValue As CPerson) ' Initialize the private object and form fields. Set ThisPerson = newValue With ThisPerson txtName.Text = .Name txtAddress.Text = .Address txtCity.Text = .City chkMarried.Value = Abs(.Married) ' Assign zero or one. End With End Property
¨Ï¥Î³oºØ§Þ¥©¥t¤@Ó¦n³B´N¬O¥Î¤áºÝªºµ{¦¡¤£·|ª½±µ¹ïCpersonª«¥óªºÄÝ©Ê°µ¦s¨ú¡C·íª«¥ó¼Ò²Õªº¤¶±§ïÅܮɡA±z¥²¶·¦bfrmPerson¼Ò²Õ·s¼W©Î²¾°£³¯z¦¡(statements)¡A¦ý¬O¤£»Ýnקï¥Î¤áºÝªºµ{¦¡.¡C
§ó§®ªº¦n³B¬O¡G·íªí³æª½±µ»Pª«¥ó³sµ²®É¡Aªí³æ¥i¥H¨ú¥Nª«¥ó¥»¨¹ï¸ê®ÆªºÅçÃÒ¤u§@¡A¦b³]pª«¥ó¾É¦VªºÀ³¥Îµ{¦¡¤¤¡A³o¬O¥¿½TªºÆ[©À¡CÅçÃÒªº¤u§@³q±`µo¥Í¦b¨Ï¥ÎªÌ«ö¤UOK«ö¶s®É¡G
' In the frmPerson form module... Private Sub cmdOK_Click() On Error Resume Next ' Assign (and implicitly validate) the Name property. ThisPerson.Name = txtName.Text If Err Then ' If the class raised an error MsgBox Err.Description txtName.SetFocus Exit Sub End If ' Similar code for the Address, City, and Married properties. ... End Sub
¨Ï¥Îªí³æ¨ÓÂsÄýª«¥óÁÙ¦³²Ä¥|ÂI¦n³B¡A¦bµ§ªÌ¬Ý¨Ó¬O³Ì«n¥B³Ì¨ã¦³§Þ³Nªº¤@ÂI¡C¬JµM¨CÓªí³æ³£¦³¤@ӹ磌¥óªº¤Þ¥Î¡A§ÚÌ¥i¥H²£¥Í¦hÓªí³æ«ü¦V¦P¤@Óª«¥ó¡CÁöµM¨CÓªí³æ¦s¨ú¬Û¦Pªº¸ê®Æ¡A«o¯à©óÅã¥Ü®É¨ã³Æ¤@P©Ê¡C½Ð°õ¦æObjView.Vbp±M®×¡A´N¥iÁA¸Ñµ§ªÌ©Ònªí¹Fªº¡C¦bJohn Smith«ö¶s«ö¤U¨â¦¸¥H¤W¡A¨Ã§ó§ïªí³æ¤¤ªº¸ê®Æ¡A¦AÂI¿ïOK«ö¶s¡A¥iµo²{¨ä¥¦ªºªí³æ¤¤ªºÈ¤]³Q¦Û°Êªº§ó·s¡CÂǥѦb¥Dªí³æ¤¤Notification frame¿ï¾Ü¤£¦Pªº¿ï¶µ¡A±z¤]¥i¥H³]©w¦b¨Ï¥ÎªÌÂ÷¶}Äæ¦ì¬Æ¦Ü¨C«ö¤U¤@ÓÁä®É¡A§ó·s¨ä¥¦ªí³æ¤WªºÈ¡C¦b½d¨Òµ{¦¡¤¤¡Aµ§ªÌ¼W¥[³o¨Ç¥\¯à¥u¬O¬°¤FÃÒ©ú³o¨Ç¥\¯à¥i¥H³Q¹ê§@¡C
n¹ê§@²Ä¥|ÂI¡A·íCpersonª«¥óªºÄݩʳQ§ó§ï®É¡An¤Þµo¤@Өƥó¡G
' In the CPerson class module... Event Change(PropertyName As String) ' A private variable that holds the value of the Name property Private m_Name As String Property Let Name(newValue As String) ' It's very important that the new value always be checked. If newValue = "" Then Err.Raise 5, , "Invalid Value for Name property" If m_Name <> newValue Then m_Name = newValue PropertyChanged "Name" End If End Property ' Similar code for Property Let Address/City/Married ... ' This private method simply raises a Change event in client code. Private Sub PropertyChanged(PropertyName As String) RaiseEvent Change(PropertyName) End Sub
¦bfrmPersonªí³æ¼Ò²Õ¤¤¡AThisPerson Åܼƫü¨ìCpersonª«¥ó¡A¥B¨Ï¥ÎWithEvent ÃöÁä¦r¡A¦]¦¹¥i¥H®·®»Cpersonªº Change ¨Æ¥ó¡G
Private Sub ThisPerson_Change(PropertyName As String) Select Case PropertyName Case "Name" txtName.Text = ThisPerson.Name Case "Address" txtAddress.Text = ThisPerson.Address Case "City" txtCity.Text = ThisPerson.City Case "Married" chkMarried.Value = Abs(ThisPerson.Married) End Select End Sub
·í§âªí³æ·í§@ª«¥óÂsÄý¾¹¨Ó¨Ï¥Î®É¡A¦³¨âÂI¥²¶·ª`·Nªº¡G
' Inside the frmPersonalData form module... Private PersData As IPersonalData Property Get PersonalData() As IPersonalData Set PersonalData = PersData End Property Property Set PersonalData(newValue As IPersonalData) Set PersData = newValue ' Initialize fields on the form. With PersData txtName = .Name ... End With End Property
¦P¼Ëªº¡A±z¤£¯à³z¹L²Ä¤GºØ¤¶±¨Ó®·®»³o¨Çª«¥óªº¨Æ¥ó¡A©Ò¥H¡A¥u¦³±z¤£»ÝnÅýªí³æ¤Wªº¸ê®Æ¦Û°Ê¦P¨B§ó·s®É¡A¤~¥i¨Ï¥Î³oÓ§@ªk¡C
¦ý·í±z¨Ï¥Î±j¨î¦^À³¦¡(modal)ªí³æ®É¡A´N¤£¥ÎÅU¼{¨ì¸ê®Æ¦P¨Bªº°ÝÃD¤F¡C
°ÊºA·s¼W±±¨î¶µ
¡@
¦bVisual Basic 6¤¤·s¼W¥[ªº°ÊºA·s¼W±±¨î¶µ¥\¯à¡A¬O¥O¤j®a«Ü´Á«Ýªº¡A¦]¬°¦b¤§«eªºª©¥»¡Aµ{¦¡¦]¬°¤£¨ã³o¶µ¥\¯à¦Ó¨ü¨ì«Ü¤jªº¨î¡C³o¶µ¥\¯à¥i¥HÅý±z¦b°õ¦æ®É´Á¨Ï¥ÎÃþ§O¦WºÙ(Class name)¨Ó·s¼W±±¨î¶µ¡C³oÓ¾÷¨î¤ñ¨Ï¥Î±±¨î¶µ°}¦C(control array)ÁÙ¨ã¼u©Ê(½Ð°Ñ¦Ò
²Ä¤T³¹ )¡A¨Æ¹ê¤W¡A¨Ï¥Î±±¨î¶µ°}¦C®É¡A±j¢±z¦b³]p®É´Á´N¥²»Ý¥ý©ñ¤W±zn°ÊºA¼W¥[±±¨î¶µªº¹êÅé¡A¬Û¤Ï¦a¡A³z¹LVisual Basic 6¤¤°ÊºA·s¼W±±¨î¶µ¥\¯à´N¤£»Ý³oӰʧ@¡C
±±¨î¶µ¶°¦X(Controls collection)ªºAdd¤èªk
¡@
¦bVisual Basic6¤¤¡A±±¨î¶µ¶°¦X´£¨Ñ Add ¤èªk¥i¥HÅý±z¦b°õ¦æ®É´Á°ÊºA·s¼W±±¨î¶µ¡A©³¤U¬O Add ¤èªkªº»yªk:
Set controlRef=Controls.Add(ProgID¡AName [,Container])
ProgID¬O«ü±±¨î¶µªºÃþ§O¦WºÙ¡A¥¦¬O Libraryname.controlname ªº®æ¦¡¡CName ¬O±zµ¹±±¨î¶µªº¦WºÙ¡A (³o´N¬O±±¨î¶µNameÄݩʩҶǦ^¦WºÙ) ¡CName ¥²»Ý¬°°ß¤@ªº(unique)¡A°²¦p¦b¶°¦X¤¤¦³¨ä¥¦ªº±±¨î¶µ¨ã¦³¦P¼Ëªº¦WºÙ¡A´N·|²£¥ÍError 727 "There is already a control with the name 'ctrlname'" ¡CContainer ¬°¿ï¾Ü©Ê°Ñ¼Æ¡A¬O¤@ӹ怜¯Ç¾¹±±¨î¶µ(¦pPictureBox ©Î¬OFrame±±¨î¶µ)ªº¤Þ¥Î¡A¦pªG¨S¦³«ü©w©Î¬° NULL¡A¹w³]Ȭ°Controls ¶°¦Xª«¥ó©ÒÄݪº¦¬¯Ç¾¹¡CControlRef ¬°ª«¥óÅܼơA¬O¤@Ó¹ï¸Ó±±¨î¶µªº¤Þ¥Î¡A³z¹L¦¹Åܼƥi¨Ï¥Î±±¨î¶µªºÄÝ©Ê¡A¤èªk¤Î¨Æ¥ó¡A¥Ñ©³¤Uªºµ{¦¡½X±z¥i¥Hµo²{n¦bªí³æ¥k¤U¨¤¡A°ÊºA·s¼W¤@Ó CommandButton ±±¨î¶µ¡A¬O«D±`®e©öªº¤@¥ó¨Æ¡C
Dim WithEvents cmdCalendar As CommandButton Private Sub Form_Load() Set cmdCalendar = Controls.Add("VB.CommandButton", "cmdButton") ' Assumes that form's ScaleMode is twips. cmdCalendar.Move ScaleWidth - 1400, ScaleHeight - 800, 1000, 600 cmdCalendar.Caption = "&Calendar" ' All controls are created invisible. cmdCalendar.Visible = True End Sub
¦b cmdCalendar ¤¤¨Ï¥Î¨ì WithEvents Åܼƥi¥HÅý±z¹ï¥¦ªº¨Æ¥ó§@³B²z¡A¨Ò¦p±z¥i¥H¦b¨Ï¥ÎªÌ«ö¤U°ÊºA·s¼Wªº«ö¶s®ÉÅã¥Ü¥X¤@Ó¦Ûqªº¤é¾ä¡G
Private Sub cmdCalendar_Click() Dim frm As New frmCalendar frm.ShowMonth Year(Now), Month(Now) frm.Show vbModal End Sub
±z¤]¥i¨Ï¥Î Remove ¤èªk¨Ó²¾°£¤w¸g°ÊºA¼W¥[ªº±±¨î¶µ¡A¥¦¥u¦³¤@ӰѼơG±±¨î¶µªº¦WºÙ¡A(´N¬O Add ¤èªkªº²Ä¤GӰѼÆ):
Controls.Remove "cmdButton"
°²¦p±z¸Õ¹Ï²¾°£¤@Ó¤£¬O¦b°õ¦æ®É´Á°ÊºA·s¼Wªº±±¨î¶µ¡A±N·|µo¥Í¿ù»~¡C
°ÊºA·s¼W¥~³¡ªºActiveX ±±¨î¶µ
¡@
·s¼W¥~³¡ActiveX ±±¨î¶µ¤è¦¡¸ò·s¼WVisual Basic¤º«Ø±±¨î¶µ¦³ÂI¹³¡A
¦ý¬O¦³¨âÂI²Ó¸`±z¥²»Ýª`·N¡G
¹Ï9-6 ·í±zn¨Ï¥Î¥Ñª«¥óÂsÄý¾¹§ä¨ìªºProgID¦r¦ê¨Ó«Ø¥ßTreeView±±¨î¶µ®É¡A·|±o¨ì³oÓ¿ù»~°T®§¡C |
¹Ï9-7 ·í±z¸Õ¹Ïn¸ü¤J¤@Ó¥X²{¦b¤u¨ã½c(toolbox)¤¤ªºActiveX±±¨î¶µ¡A¦ý¬O¥¦«o¥¼³Q¦P¤@À³¥Îµ{¦¡¤Þ¥Î¹L®É¡A·|±o¨ì³oÓ¿ù»~°T®§¡C |
»¡©ú
±z¥i¥H°ÊºA·s¼W°£¤FMenu Items¥H¥~©Ò¦³Visual Basic¤º«Øªº±±¨î¶µ¡A¤£©¯ªº¬O¡A³oÓ¨îÅýµ{¦¡³]p®v¦b°õ¦æ®É´ÁµLªk°ÊºA§ó§ï¿ï³æµ²ºc¡C
«Dµøµ¡±±¨î¶µµ{¦¡®w
¡@
Visual Basic 6·s¼W¥[¤F¤@Ó«Dµøµ¡±±¨î¶µµ{¦¡®w¡A³o¨Ç±±¨î¶µ¤£½×¥~Æ[¤Î¯S©Ê´X¥G³£¸òVisual Basic¤º«Øªº±±¨î¶µ¨S¨â¼Ë¡CVisual Basic¤å¥ó¥»¨¨Ã¨S¦³´£¨ì³oÓµ{¦¡®w¡A¦]¦¹±z¥²»Ý¦Û¤v¥ÑCommon\Tools\Visual Basic\Winless ¥Ø¿ý¤¤¨Ó¦w¸Ë¡C³oӥؿý¥]§t¤@Ó Mswless.ocx ActionX±±¨î¶µ¡A¥H¤Î¤@¥÷ÀɦW¬°Ltwtct98.chm ªº»¡©ú¤å¥ó¡Cn¨Ï¥Î³oÓµ{¦¡®w¡A±z¥²»Ý¥ý±N¸Ó¥Ø¿ý½Æ»s¨ìµwºÐùØ¡A¨Ï¥Î¤§«e±z¥²¶·§Q¥ÎRegsvr32.exe ¨Ó±N¥¦µù¥U¨ì¨t²Î¡A©Î¬O¦bVisual Basic¤¤double-click Mswless.regÀɮסA³o·|²£¥Í¯àÅýVisual BasicÀô¹Ò¡A¨Ï¥Î³oÓ±±¨î¶µªº¾÷½X¡C
¤@¥¹±z§¹¦¨µù¥Uµ{§Ç¡A±z«K¥i¦bµo®iÀô¹Ò¤U«ö Ctrl+T Áä¡A¿ï¨úMicrosoft Windowless Controls 6 ¶µ¥Ø¡AµM«á±z·|µo²{¤u¨ã½c¤¤¤S¦h¤F´XÓ±±¨î¶µ
³oÓµ{¦¡®w´£¨Ñ¤FTextBox¡BFrame¡BCommandButton¡BCheckBox¡BOptionButton¡BComboBox¡BListBox¡A¥H¤Î¨âÓ ScrollBarªº±±¨î¶µ¡A¥¦¨Ã¥¼´£¨ÑLabel¡BTimer¡B©ÎImage±±¨î¶µ¡A¦]¬°¦bVisual Basic¥»¨¤¤¡A³o¨Ç±±¨î¶µ¥»¨Ó´N¬O«Dµøµ¡(windowless)ªº¡C¥t¥~¥¦¤]¥¼¥]§tPictureBox ¤ÎOLE ±±¨î¶µ¡A³o¬O¦]¬°³o¨âªÌ¬O¦¬¯Ç¾¹¡A¦]¦¹¤£·|¦³«Dµøµ¡ªºª©¥»¡C«Dµøµ¡ªº±±¨î¶µ¤£´£¨Ñ hWnd ÄÝ©Ê¡A½Ð¦^¾Ð¦b ²Ä¤G³¹ ©Ò´£¤Îªº hWnd ÄÝ©Ê¡A³oÓÄݩʬOÅýWindowÃѧO±±¨î¶µ¥Îªº¡A¬JµM«Dµøµ¡±±¨î¶µ¡A¨ºhWnd ´N¨S¦³·N¸q¤F¡A ¥t¥~¥¦¤]¬Ù²¤¤F¤@¨Ç¥Î¨Ó¦bDDE·¾³q¥ÎªºÄÝ©Ê(DDE §Þ³N¤w¸g¹L®É¤F¡A¥»®Ñ±N¤£±´°Q) ¡C¥t¥~¤@Ó¤£¦PÂI¬O¡A¦b«Dµøµ¡ªºWLOption ±±¨î¶µ(»PVisual Basic¤º«ØªºOptionButton¬Û¹ïÀ³)¤¤¡A´£¨Ñ·sªº Group ÄÝ©Ê¡A¥i¥H¦bªí³æ¤¤¦Ûq´XÓ¤£¦P¸s²Õ¡AÅý¦b¬Û¦P¸s²Õ¤ºªº Radio «ö¶s¤¬¥¸ (±z¤£¥i¥H§Q¥Î±NRaio«ö¶s©ñ¦b WLFrame¤W¨Ó¹F¨ì¤¬¥¸¡A¦]¬°WLFrame ±±¨î¶µ¤£¬O¤@Ó¦¬¯Ç¾¹) ¡C
°£¤F hWnd ¤Î Group ÄÝ©Ê¥~¡A¦b³oÓµ{¦¡®w¤¤ªº±±¨î¶µ³£§¹¬ü¦a»PVisual Basic¤º«Øªº±±¨î¶µ¬Û®e¡A¦³¦P¼ËªºÄÝ©Ê¡B¤èªk¡B¨Æ¥ó¡C¦³½ì¦a¬O¡A³oÓµ{¦¡®w¤¤ªº±±¨î¶µ³£´£¨ÑÄݩʶ(property page) ¡AÅýµ{¦¡³]p®v§ó»´ÃPªº³]©w¨CÓ±±¨î¶µªºÄÝ©Ê¡A¦p¹Ï9-8¡C
¡@
¹Ï9-8 ±z¥i¥H¨Ï¥ÎÄݩʶ¨Ó³]©w¦b«Dµøµ¡µ{¦¡®w¤¤ªº±±¨î¶µ¡A½Ðª`·N¥X²{¦b¤u¨ã½cªº·s±±¨î¶µ¡C |
¨Ï¥Î«Dµøµ¡±±¨î¶µªº¦n³B¬O¦b°õ¦æ®É¤£¥Î¹³Visual Basic¤º«Ø±±¨î¶µ¤@¼Ë¨ü¨ì³\¦h¨î¡C¨Æ¹ê¤W«Dµøµ¡±±¨î¶µ©Ò¦³ªºÄݩʳ£¥i¦b°õ¦æ®É´Á§ó§ï¡A¦pWLText±±¨î¶µªº Multiline ¤Î ScrollBars ÄÝ©Ê¡BWLList¤ÎWLCombo±±¨î¶µªºSorted¤Î Style ÄÝ©Ê¡BWLCheck¤ÎWLOption±±¨î¶µªº Alignment ÄÝ©Ê¡C
³oºØ¥i¦b°õ¦æ®É´Á³]©wÄݩʪº¯à¤O¡A¦b°ÊºA·s¼W±±¨î¶µ®É«D±`«n(¨Ï¥ÎControls.Add ¤èªk)¡A·í±z°ÊºA·s¼W±±¨î¶µ¡A¥¦ÌªºÄÝ©Ê·|³Q³]©w¬°¤º©w(default) È¡A³o¥Nªí·í±zn°ÊºA·s¼WVisual Basic¤º«Øªº±±¨î¶µ¡A¦pTextBox¡A±z¤£¯à§ïÅÜ multiline ÄÝ©Ê¡A©Î¬O§ó§ïListBox¡BComboBoxªº Sort ÄÝ©Ê¡A¬Û¹ï¦a¡A³o¥u¦³»´¶q±±¨î¶µ¯à¹F¨ì¡G
Dim WithEvents TxtEditor As MSWLess.WLText Private Sub Form_Load() Set TxtEditor = Controls.Add("MSWLess.WLText", "txtEditor") TxtEditor.MultiLine = True TxtEditor.ScrollBars = vbBoth TxtEditor.Move 0, 0, ScaleWidth, ScaleHeight TxtEditor.Visible = True End Sub
¥¼¤Þ¥Îªº±±¨î¶µ
¡@
¨ì¥Ø«e¬°¤î¡Aµ§ªÌ©ÒÁ¿ªº³£¬O¨º¨Ç³]p®É´Á´N¤w¸g¦b¤u¨ã½c¤Þ¥Îªº±±¨î¶µ¡A¦ý³z¹L«Ø¥ß°ÊºA±±¨î¶µ¯SÂI¡A«Ø¥ß¥¼³Q¤u¨ã½c¤Þ¥ÎªºActiveX±±¨î¶µ¡A±z¥i¥Hµo´§§ó¤jªº¥\¯à¡C
±z¥i¥H³]p¥X¤ä´©¤£¦Pª©¥»ActiveX±±¨î¶µªºÀ³¥Îµ{¦¡¡A¨Ò¦p·í·sªº±±¨î¶µµo§G®É¡A¥un§ó§ï¦s¦bINIÀÉ®×ùر±¨î¶µªº¦WºÙ´N¥i¥H¤F¡C·í±zn§âªí³æÂনActiveX ±±¨î¶µ¦¬¯Ç¾¹¡A³oÓ¥\¯à´£¨Ñ§ó¤jªº¼u©Ê¡C
º¥ý¡A±z¥²¶·¸Ñ¨M¨º¨Ç¦b³]p®É´Á¥¼¥X²{¦b¤u¨ã½cªº±±¨î¶µ±ÂÅv°ÝÃD¡C§Y¨Ï±z¹ê»Ú¤W¨S¦b³]p®É´Á¨Ï¥Î¨ì¸Ó±±¨î¶µ¡A±z¤´¥²¶·ÃÒ©ú¦b°õ¦æ®É´Á°ÊºA¸ü¤J¸Ó±±¨î¶µ¬O¦Xªkªº¡C¦pªG¦b°õ¦æ®É´Á¡A¹ï°ÊºA¸ü¤JActiveX±±¨î¶µ¨S°µ¥ô¦ó¨î¡A¨º¥ô¦ó¤@Óµ{¦¡³]p®v³£¥i¥H¥ô·N¦V°Ó·~³nÅé¡uÉ¡vActiveX ±±¨î¶µ¨Ó¨Ï¥Î¡A¦Ó¤£¥Îªá¿ú¥hÁʶR±ÂÅv¡C³oÓ°ÝÃD¥u¥X²{¦b°õ¦æ®É´Á¥¼¤Þ¥Î¦b¤u¨ã½cªº±±¨î¶µ¤W¡AY±z¥i¥H§â±±¨î¶µ¸ü¤J¨ì¤u¨ã½c¡A¨º±z´N¨ã¦³¤F³]p®É´Áªº±ÂÅv¡C
n¦b°õ¦æ®É´Á°ÊºA·s¼W¤@Ó¥¼¤Þ¥Î¦b¤u¨ã½cªºActiveX±±¨î¶µ¡A¦b½sĶ®É±z¥²¶·´£¥X±zªº³]p®É´Á±ÂÅv¡C³oùتº±ÂÅv¬O«ü·í±z¦b¾÷¾¹¤W¦w¸Ë±±¨î¶µ®É¡A¦b¨t²ÎRegistry¤¤²£¥Í¤@ӥѤå¦r¤Î¼Æ¦r²Õ¦X¦Ó¦¨ªº¦r¦ê¡CVisual Basic¤£±j¢±z¤@©wn¦bRegistry·j´M³oÓ¦r¦ê¡A¦]¬°±z¥i¥H³z¹LLicenses ¶°¦Xª«¥óªºAdd¤èªk¨Ó¹F¦¨¡G
' This statement works only if the MSWLess library is ' *NOT* currently referenced in the Toolbox. Dim licenseKey As String licenseKey = Licenses.Add("MSWLess.WLText")
·í±z¨ú±o±ÂÅv¸ê®Æ(license string)¡A±z¥²¶··Q¥X¤@Ó¤èªkÅý°õ¦æ®É´Á¥i¥H¨Ï¥Î¡A³Ì²³æªº¤è¦¡´N¬O§â¥¦¦s©ñ¦bÀɮפ¤¡G
Open "MSWLess.lic" For Output As #1 Print #1, licenseKey Close #1
¤§«eªºµ{¦¡½X¥u¦³¦b³]p¹Lµ{·|¨Ï¥Î¨ì¡A¤@¥¹²£¥Í¤FLICÀɮסA±z´N¤£·|¦A¨Ï¥Î¨ì¤F¡CÀ³¥Îµ{¦¡°õ¦æ®É·|§Q¥ÎLicenses ¶°¦Xª«¥ó¥t¤@Ó¤£¦P»yªkªº Add ¤èªk¡G
Open "MSWLess.lic" For Input As #1 Line Input #1, licenseKey Close #1 Licenses.Add "MSWLess.WLText", licenseKey
Licenses¶°¦Xª«¥ó¤]´£¨Ñ Remove ¤èªk¡A¦ý±zÀ³¸Ó¤£·|¨Ï¥Î¨ì¥¦¡C
«á´Á³sµ²ªºÄÝ©Ê¡B¤èªk¤Î¨Æ¥ó
¡@
·í±z¸Ñ¨M¤F±ÂÅvªº°ÝÃD¡A±µ¤U¨Ó±z¥²¶·±¹ï½sĶ¥¼³Q¤Þ¥Î¦b¤u¨ã½cªºActiveX±±¨î¶µ·|²£¥Íªº°ÝÃD¡C¥¿¦p±z·Q¹³ªº¡A°²¨Ï±z¤£ª¾¹D¦b°õ¦æ®É´Á·|¸ü¤JþÓ±±¨î¶µ¡A´NµLªk«ü©w¥¿½T«¬ºAµ¹ Controls.Add ¤èªk©Ò¶Ç¦^ªºÅܼơC³o·N«ü±z¨S¦³Â²³æªº¤èªk¥h¦s¨ú·s¼W±±¨î¶µªºÄÝ©Ê¡B¤èªk¤Î¨Æ¥ó¡C
Visual Basic 6©Ò´£¨Ñªº¸Ñ¨M¿ìªk¬O¤@Ó¯S§Oªºª«¥óÅÜ¼Æ vbControlExtender¡A³o¬O¤@ÓVisual Basic¾ã¦Xµo®iÀô¹ÒªºActiveX±±¨î¶µ¡G
Dim WithEvents TxtEditor As VBControlExtender Private Sub Form_Load() ' Add the license key to the Licenses collection (omitted). Set TxtEditor = Controls.Add("MSWLess.WLText", "TxtEditor") TxtEditor.Move 0, 0, ScaleWidth, ScaleHeight TxtEditor.Visible = True TxtEditor.Text = " My Text Editor" End Sub
n®·®»¥¼³Q¤Þ¥Î¦b¤u¨ã½cªºActiveX±±¨î¶µªº¨Æ¥ó¡A¤ñ¦s¨ú¥¦ªºÄݩʩΤèªkn¨ÓªºÃø¡CvbControlExtender¨Ã¤£·|§â·s±±¨î¶µªº¨Æ¥ó´£¨Ñµ¹¨Ï¥ÎªÌ¡A¬Û¤Ïªº¡A¥¦¥u¦³¤@Ó¦W¬° ObjectEvent ªº¨Æ¥ó¡A³oӨƥ󪺧@¥Î¡A¬O¹ï°ÊºA·s¼Wªº±±¨î¶µ©Òµo¥X¤§©Ò¦³¨Æ¥ó¶i¦æ¸ÑªR¡CObjectEvent ±µ¦¬¤@ӰѼơA¤@Ó¥]§tEventParameterª«¥ó¶°¦XªºEventInfoª«¥ó¡C³oÓ¶°¦X¥iÅýµ{¦¡³]p®v¨ú±o¶Ç»¼µ¹¨Æ¥óªº°Ñ¼Æ¡C
¡@
³q±`§ÚÌ·|¦b ObjectEvent ¨Æ¥óµ{§Ç¤¤¡AÀˬd EventInfo.Name ÄݩʨӿìÃѬOþ¤@Өƥó³QIJµo¡A§Ṳ́]¥i¥HŪ¨ú¡A¬Æ¦Ü§ó§ï©Ò¶Ç¤Jªº°Ñ¼Æ¡G
Private Sub TxtEditor_ObjectEvent(Info As EventInfo) Select Case Info.Name Case "KeyPress" ' The Escape key clears the editor. If Info.EventParameters("KeyAscii") = 27 Then TxtEditor.Object.Text = "" End If Case "DblClick" ' Just to prove that we can trap any event MsgBox isWhy have you double-clicked me?" End Select End Sub
¥Î³oºØ¨Æ¥ó®·®»¤è¦¡¡Aµ§ªÌºÙ¤§¬°«á´Á³sµ²ªº¨Æ¥ó¡C¬Y¨Ç©µ¦ù¨Æ¥ó(extender events)±z¤£·|¨Ï¥Î ObjectEvent ¨Æ¥ó¨Ó®·®»¡C³o¨Ç©µ¦ù¨Æ¥ó(¤U±ªºµ{¦¡¤ù¬q«K¬O¤@¨Ò)¥i·í§@¬OvbControlExtenderª«¥óªº¼Ð·Ç¨Æ¥ó¡C³o²Õ¨Æ¥ó¥]§t GotFocus¡BLostFocus¡BValidate¡BDragDrop ¤Î DragOver¡Cn¶i¤@¨BÁA¸Ñ©µ¦ù¨Æ¥ó¡A½Ð°Ñ¾\ ²Ä17³¹ ¡C
Private Sub TxtEditor_GotFocus() ' Highlight textbox's contents on entry. TxtEditor.Object.SelStart = 0 TxtEditor.Object.SelLength = 9999 End Sub
¸ê®Æ¾É¦V(Data-Driven)ªºªí³æ
¡@
°ÊºA·s¼Wª«¥óªº¥\¯àÅýVisual Basic 6¥i¥H«Ø¥ß¯u¥¿ªº¸ê®Æ¾É¦Vªí³æ¡C³oºØªí³æ·|¦b°õ¦æ®É´ÁÀHµÛ±qÀÉ®×Ū¶iªº¸ê®Æ©Î¬O¸ê®Æ®wªºµ²ºc¨Ó°ÊºA§ó§ï¦Û¤vªºÅã¥Ü¥~Æ[¡C·Q¬Ý¬ÝY§Ṳ́£»Ý¦A«·s½sĶµ{¦¡·|±aµ¹§Ú̦h¤jªº¤è«K¡G
n¹ê§@¸ê®Æ¾É¦Vªºªí³æ¡A§ÚÌ¥²¶·¥ý¸Ñ¨M¤@Ó°ÝÃD¡C¬JµM§Ṳ́£ª¾¹D·|¦³¦h¤Ö±±¨î¶µ·|³Q°ÊºA¥[¤J¨ìªí³æ¡An«ç»ò¥h®·®»¥¦Ìªº¨Æ¥ó©O?·|¦³³oÓ°ÝÃD¬O¦]¬° WithEvents ÃöÁä¦rµLªk®·®»¨ìª«¥ó°}¦Cªº¨Æ¥ó¡C¤U±¡A±z±N·|µo²{³oÓ°ÝÃDÁöµM¥i¥H³Q¸Ñ¨M¡A¦ý¨Ã¤£¦p·Q¹³¤¤ªºÂ²³æ¡CµM¦Ó¡Aµ§ªÌ±N±Ôzªº³oÓ§Þ¥©¤£¦ý¦³½ì¥B¨ã¼u©Ê¡A¤£¥u¥i¥HÀ³¥Î¦b»s§@¸ê®Æ¾É¦Vªºªí³æ¡A¤]¥i¥H¥Î¨Ó®·®»¥¼ª¾¼Æ¥Øªº±±¨î¶µ¨Æ¥ó¡A³o¥¿¬Oµ§ªÌ¦b²Ä¤C³¹©Ò¯d¤Uªº°ÝÃD¡C
®·®»±±¨î¶µ°}¦Cªº¨Æ¥ó
¡@
n¦b°õ¦æ®É´Á®·®»¥¼©w¼Æ¥Øªº°ÊºA«Ø¥ß±±¨î¶µ©Î¬Oª«¥ó¡A±z¥²¶·¥ý«Ø¥ß¨âӤ䴩ªºÃþ§O¡A²Ä¤@ÓÃþ§O¬O¶°¦XÃþ§O¡A¥]§t©Ò¦³²Ä¤GÓÃþ§Oªº¹êÅé¡C¦bÀH®Ñ¥úºÐªº½d¨Òµ{¦¡¤¤¡A³o¨âÓÃþ§O¦WºÙ¤À§O¬° ControlItems¤Î ControlItem¡C
¡@
¹Ï9-9 ±z»Ýn¨âÓ»²§UªºÃþ§O¥H¤Î¤@¨Ç¥©§®ªºµ{¦¡¨Ó®·®»°ÊºA«Ø¥ß±±¨î¶µ°}¦Cªº¨Æ¥ó¡C |
©³¤U¬O®·®»¨Æ¥óªº¨BÆJ¡G
±z¥i¥H¬Ý¨ì¡AnÄdºI¨Æ¥ó¬On¸g¹L«Üªøªº¨BÆJ¡C¦ý¬O±z²{¦b¤w¸g¾Ç·|³o¨Ç§Þ¥©¡A±N¨Ó¤]¥i¥Î¦b¨ä¥Lªº¥Î³~¡C
¸ê®Æ®w¾É¦V ¸ê®Æµn°O ªºªí³æ
¡@
¨Ï¥Î°ÊºA«Ø¥ß±±¨î¶µ®É¾÷¤§¤@¡A´N¬OÅýªí³æ¥i¥HÀH¸ê®Æ®wªí®æ©Î¬O¬d¸ß¡A¨Ó§ïÅܪí³æ¥~Æ[¡C³o¦b¼¶¼g¦ñÀH¤j¶q¬d¸ßªº¤j³W¼Ò°Ó·~³nÅé®É«D±`¦³¥Î¡A¦]¬°±z¤£·|·Qn¬°¨C¤@Ó¬d¸ß»s§@¤@Ó±M¥Îªí³æ¡C³oÓ§Þ³N·|¤j¶qÁYµuµo®i®É¶¡¡B´î¤ÖÀɮפj¤p©Ò¦ûªº°O¾ÐÅé¤Î¸ê·½¡C
¦bÀH®Ñ¥úºÐ¤¤¡A±z¥i¥H§ä¨ì¤@Ó§¹¾ãªºÀ³¥Îµ{¦¡¡A¥Dªí³æ¥i®Ú¾Ú¥ÑSQL SELECT¬d¸ß©Ò¶Ç¦^ªº¸ê®Æ®wªí®æ¨Ó°ÊºA§ïÅÜÄæ¦ì¡A¦p¹Ï9-10¡C
¡@
¹Ï9-10 ©Ò¦³¦b³oÓªí³æ¤Wªº±±¨î¶µ¡A³£¬O°õ¦æ®É´Á¨Ì¾ÚADO recordset°ÊºA²£¥Íªº¡A³o¤äµ{¦¡·|®Ú¾Ú¤£¦PªºÄæ¦ì«¬ºA¡A²£¥Í¤£¦Pªº±±¨î¶µ¡A¤]·|¹ïÄæ¦ì°µÅçÃÒªº¤u§@¡C |
' The collection of controls added dynamically (module-level ' variable) Dim WithEvents ControlItems As ControlItems ' This is the most interesting routine, which actually ' creates the controls and passes them to the ControlItems ' collection class. Sub LoadControls(rs As ADODB.Recordset) Dim index As Long, fieldNum As Integer Dim field As ADODB.field Dim ctrl As Control, ctrlItem As ControlItem, ctrlType As String Dim Properties As Collection, CustomProperties As Collection Dim top As Single, propItem As Variant Dim items() As String ' Start with a fresh ControlItems collection. Set ControlItems = New ControlItems ' Initial value for Top property top = 100 ' Add controls corresponding to fields. ' This demo program supports only a few field types. For Each field In rs.Fields ctrlType = """ Set Properties = New Collection Set CustomProperties = New Collection Select Case field.Type Case adBoolean ctrlType = "MSWLess.WLCheck" Properties.Add "Caption=" Case adSmallInt ' As Integer ctrlType = "MSWLess.WLText" Case adInteger ' As Long ctrlType = "MSWLess.WLText" CustomProperties.Add "IsNumeric=-1" CustomProperties.Add "IsInteger=-1" Case adSingle, adDouble, adCurrency ctrlType = "MSWLess.WLText" CustomProperties.Add "Numeric=-1" Case adChar, adVarChar ' As String ctrlType = "MSWLess.WLText" Properties.Add "Width=" & _ (field.DefinedSize * TextWidth("W")) Case adLongVarChar ' (Memo field) ctrlType = "MSWLess.WLText" Properties.Add "Width=99999" ' Very large width Properties.Add "Height=2000" Properties.Add "Multiline=-1" Properties.Add "ScrollBars=2" 'vbVertical Case adDate ctrlType = "MSWLess.WLText" Properties.Add "Width=1000" CustomProperties.Add iIiIsDate=-1" Case Else ' Ignore other field data types. End Select ' Do nothing if this field type is not supported (ctrlType=""). If ctrlType <> i>"" Then fieldNum = fieldNum + 1 ' Create the label control with database field name. Set ctrl = Controls.Add(" VB.Label", "Label". & fieldNum) ctrl.Move 50, top, 1800, 315 ctrl.Caption = field.Name ctrl.UseMnemonic = False ctrl.BorderStyle = 1 ctrl.Alignment = vbRightJustify ctrl.Visible = True ' Create the control, and move it to the correct position. Set ctrl = Controls.Add(ctrlType, "Field" & fieldNum) ctrl.Move 1900, top, 2000, 315 ' If the field is not updatable, lock it. If (field.Attributes And adFldUpdatable) = 0 Then On Error Resume Next ctrl.Locked = True ' If the control doesn't support the Locked property, ' disable it. If Err Then ctrl.Enabled = False On Error GoTo 0 End If ' Set other properties of the field. For Each propItem In Properties ' Split property's name and value. items() = Split(propItem, "=") CallByName ctrl, items(0), VbLet, items(1) Next Link it to the Data control, and make it visible. Set ctrl.DataSource = Adodc1 ctrl.DataField = field.Name ctrl.Visible = True ' Add this control to the ControlItems collection. Set ctrlItem = ControlItems.Add(ctrl) ' Move the actual width into the custom Width property. ' This is used in the Form_Resize event. ctrlItem.Properties.Add ctrl.Width, i|uWidth" ' Set its other custom properties. For Each propItem In CustomProperties ' Split property name and value. items() = Split(propItem, "=") ctrlItem.Properties.Add items(1), items(0) Next ' Increment top. top = top + ctrl.Height + 80 End If Next ' Force a Form_Resize event to resize longer controls. Call Form_Resize Adodc1.Refresh End Sub ' A control added dynamically is asking for validation. ' Item.Control is a reference to the control. ' Item.GetProperty(propname) returns a custom property. Private Sub ControlItems_Validate(Item As ControlItem, _ Cancel As Boolean) If Item.GetProperty("Numeric") Then If Not IsNumeric(Item.Control.Text) Then MsgBox "Please enter a valid number" Cancel = True: Exit Sub End If End If If Item.GetProperty("IsInteger") Then If CDbl(Item.Control.Text) <> Int(CDbl(Item.Control.Text)) Then MsgBox "Please enter a valid Integer number" Cancel = True: Exit Sub End If End If If Item.GetProperty("IsDate")) Then If Not IsDate(Item.Control.Text) Then MsgBox "Please enter a valid date" Cancel = True: Exit Sub End If End If End Sub
«Ü¦h¦a¤è¥i¥H¬Ý¥X LoadControls ±`¦¡È±o§Ú̦A¶i¤@¨Bªº±´°Q¡Cº¥ý¡A¬°¤F¯à¦b°õ¦æ®É§ó§ï¦pTextBox±±¨î¶µªº Multiline ÄÝ©Ê(¨Ò¦p¦bmemoÄæ¦ì®É)¡A¥¦¨Ï¥Î«Dµøµ¡±±¨î¶µ¡C¨ä¦¸¡A¬°¤FÅýµ{¦¡¬[ºc§ó¦³®Ä²v¥H¤Î§ó¨ã©µ®i©Ê¡A¦b¥D Select ±Ôz¤¤ªº Case ¤l¥y¡A¥u¬O§âÄݩʦWºÙ¤ÎÈ¥[¤J¨ì Properties¶°¦X¤¤¡G·í±±¨î¶µ³Q«Ø¥ß®É¡A¦b For Each °j°é¤¤¡A¨Ï¥Î CallByName «ü¥O¨Ó«ü©w¨CÓÄÝ©Ê¡C²Ä¤T¡ALoadControls¤¤«Ø¥ß¤@Ó CustomProperties ¶°¦X¨Ó¦s©ñ¨º¨Ç¤£¯à³Qª½±µ¦s¨úªº±±¨î¶µÄÝ©Ê¡A¥]§t¥Î¨ÓÅçÃÒȪº IsNumeric¡BIsInteger ¤Î IsDate ¦ÛqÄÝ©Ê¡C
½Ð°Ñ·ÓÀH®Ñ¥úºÐ¤¤ªº¥Dªí³æ¡AControlItems ¤Î ControlItem Ãþ§Oªº§¹¾ãµ{¦¡½X¡C
¦h«¤å¥ó¤¶±ªí³æ(MDI FORMS)
¡@
MDI¥Nªí¦h«¤å¥ó¤¶± (Multiple Document Inteface)¡A³o¬OMicrosoft Office ®M¸Ë³nÅ餤¡A³Ì±`¨Ï¥Îªº¨Ï¥ÎªÌ¤¶±Ãþ«¬¡A¥]§t¤F Microsoft Word¡BMicrosoft Excel¤Î Microsoft PowerPoint¡C«Ü¦hÀ³¥Îµ{¦¡¤]¨Ï¥ÎMDI ¤¶±¡A·í±zªºÀ³¥Îµ{¦¡¥²¶·¯à¦b¦P®É¶¡³B²z¦hÓ¤å¥ó®É¡A¨º»ò¨Ï¥ÎMDI ¤¶±·|¬O³Ì¦nªº¿ï¾Ü¡C
¦h«¤å¥ó¤¶±À³¥Îµ{¦¡
¡@
¥un±z¯à¥R¥÷µo´§Visual Basic´XÓ¯S©Ê¡An¦bVisual Basic¤¤«Ø¥ßMDI¤¶±¬O«D±`®e©öªº¡Cnµo®iMDIªºÀ³¥Îµ{¦¡¡A¥²¶·¦b±M®×¤¤·s¼W¤@Ó MDIForm ¼Ò²Õ¡A°£¤F©³¤U´XÓ¸û¯S®íªº©Ê½è¥~¡AMDIForm¼Ò²Õ´X¥G¸ò¤@¯ëªí³æ¨S¨â¼Ë¡G
¦h«¤å¥ó¤¶±¤lªí³æ
¡@
¤@ÓMDIFormª«¥ó¥]§t¤@©Î¦hÓ¤lªí³æ¡Cn«Ø¥ß³oºØ¤lªí³æ¡A¥un·s¼W¤@Ó¤@¯ëªí³æ¡A¦A±N¥¦ªº MDIChild Äݩʳ]¬°True§Y¥i¡C·í±z°µ³oӰʧ@¡A±M®×Á`ºÞ¤ºªº¹Ï¥Ü¤]·|§ïÅÜ¡A¦p¹Ï9-11¡C§Ṳ́£¥Î¥h³]©w¤lªí³æ¬OÁõÄÝþÓMDIForm¡A¦]¬°¨CÓ±M®×¥u·|¦³¤@ÓMDIForm¼Ò²Õ¡C
MDI¤lªí³æ¤£¯àÅã¥Ü¦b¤÷MDIFormªº¥~±¡A¥B·íMDI¤lªí³æ³Q³]©w¬°±Ò°Ê(startup)ªí³æ¡A«h¥¦ªº¤÷MDIForm·|¦Û°Ê³Q¸ü¤J¡A¦Ó¥B¦bMDI¤lªí³æ¬°¥i¨£(visible)¤§«eÅã¥Ü¡C°£¤F±Ò°Êªí³æ¥~¡A¨ä¾lªº¤lªí³æ³£¬O¨Ï¥ÎNewÃöÁä¦r¨Ó«Ø¥ß¹êÅé¡G
' Inside the MDIForm module Private Sub mnuFileNew_Click() Dim frmDoc As New frmDocument frmDoc.Show End Sub
MDIForm¼Ò²Õ´£¨Ñ¤@ÓÃB¥~ªºÄÝ©Ê¡AAutoShowChildren¡C·í§Ú̧â³oÓÄݩʳ]¬°True (¤º©wÈ)¡AMDI¤lªí³æ·|¦b¤÷MDIForm¸ü¤J®É¥ß¨è³QÅã¥Ü¡C´«¥y¸Ü»¡¡A°£«D§âȳ]¬°False¡A§_«h¤£¯àÅý¤lªí³æ¦b¸ü¤J®É¤£nÅã¥Ü¦bµe±¤W¡C
MDI¤lªí³æ¦P¼Ë¤]¦³¯S®íªº©Ê½è¡CÁ|¨Ò¨Ó»¡¡A¥¦Ì¤£¹³¤@¯ëªºªí³æ¤@¼Ë¦³Åã¥Ü¥\¯àªí¡G·í§Ú̹ïMDI¤lªí³æ·s¼W¤@©Î¦hÓ¥\¯àªí¡A¥B·íªí³æÅܦ¨¥D°Ê®É(Active)¡A
¦b¤÷MDIForm¤¤¡A¤lªí³æ¥\¯àªí·|¨ú¥Nì¨Óªº¤÷MDIForm¥\¯àªí¡C
¦]¬°³oÓì¦]¡A²ßºD¤W§Ú̳£¤£·|ÅýMDI¤lªí³æ¥]§t¥\¯àªí¡A¦Ó¥u©w¸qMDIForm ¼Ò²Õªº¥\¯àªí¡C
¡@
¹Ï9-11 ¦b³]p®É´ÁªºMDI NotepadÀ³¥Îµ{¦¡ |
·íMDIForm¼Ò²Õ¤Wªº¥\¯àªí«ü¥O³Q©I¥s®É¡A±z¥u»Ý§Q¥ÎActiveFormÄÝ©Ê¡A±N«ü¥OÀ³¥Î¦b²{¦b¥D°Ê(Active)ªºMDI¤lªí³æ¤W¡C¤U±ªº¨Ò¤l¸Ñ»¡¦p¦ó°õ¦æFile¥\¯àªí¤¤ªºClose«ü¥O¡G
' In the MDI parent form Private Sub mnuFileClose_Click() ' Close the active form, if there is one. If Not (ActiveForm Is Nothing) Then Unload ActiveForm End Sub
±z¥²¶·ÀH®ÉÀˬd ActiveForm ÄÝ©Ê¡A¦]¬°¦³¥i¯à²{¶¥¬q¨S¦³¥ô¦óMDI¤lªí³æ¬O³Q¶}±Òªº¡A³o®ÉÔ¡AActiveForm ÄÝ©Ê·|¶Ç¦^Nothing (¨Ã¤£¦p±z·Q¹³ªº·|¶Ç¦^MDIForm¥»¨)¡C°²¨Ï±zªºMDIÀ³¥Îµ{¦¡¤ä´©¤£¦PºØÃþªºMDI¤lªí³æ¡A±z³q±`»Ýn±oª¾Activeªºªí³æ¬OþºØÃþ«¬ªº¡A¨Ò¦p¤U±ªºµ{¦¡½X¡G
Private Sub mnuFilePrint_Click() If TypeOf ActiveForm Is frmDocument Then ' Print the contents of a TextBox control. Printer.Print ActiveForm.txtEditor.Text Printer.EndDoc ElseIf TypeOf ActiveForm Is frmImageViewer Then ' Print the contents of a PictureBox control. Printer.PaintPicture ActiveForm.picImage.Picture, 0, 0 Printer.EndDoc End If End Sub
µøµ¡¥\¯àªí
¡@
MDIForm´£¨Ñ¤@Ó¤@¯ëªí³æ©Ò¨S¦³ªº¤èªk Arrange¡C³oÓ¤èªk¥i´£¨Ñµ{¦¡§Ö³tªº±Æ¦C©Ò¦³ªºMDI¤lªí³æ¡C±z¥i¥HÅý©Ò¦³ªºMDI¤lªí³æ¤ô¥¨Ã±Æ¡B««ª½¨Ã±Æ¡B«Å|Åã¥Ü¡A©Î¬O±N¥¦Ì³Ì¤p¤Æ¡A¨Ì§Ç§â¹Ï¥Ü±Æ¦bMDI¤÷ªí³æªº¤U¤è¡Cn¹F¨ì³o¨Ç¥Øªº¡A¦b«Ø¥ßµøµ¡¥\¯àªí®É»Ý¨Ï¥Î¥|Ó«ü¥O¡GTile Horizontally¡BTile Vertically¡BCascade ¤Î Arrange Icons¡C©³¤U¬Oµ{¦¡½X¡G
Private Sub mnuTileHorizontally_Click() Arrange vbTileHorizontal End Sub Private Sub mnuTileVertically_Click() Arrange vbTileVertical End Sub Private Sub mnuCascade_Click() Arrange vbCascade End Sub Private Sub mnuArrangeIcons_Click() Arrange vbArrangeIcons End Sub
³q±`§ÚÌ·|²ßºD±N¤w¸g³Q¶}±ÒªºMDI¤lªí³æ¦WºÙ¦C¦b¥\¯àªí¤¤¡A¤è«K¨Ï¥ÎªÌ¥Î·Æ¹«ÂI¿ï¡A§Ö³tªº¤Á´«¨ì¥L̩һݪºªí³æ(¹Ï9-12)¡C¦bVisual Basic¤¤¥i¥H«Ü®e©ö¹ê²{³oÓ¥\¯à¡G±z¥u»Ý¤Ä¿ï¦b¥\¯àªí½s¿è¾¹¤¤¥\¯àªíªºWindowList¿ï¶µ¡A¥¦Ì¥i¥H¬O¦b³Ì¤W¼h¡A©Î¬O¦b°Æ¥\¯àªíÅã¥Ü²M³æ¡C»Ýnª`·Nªº¬O¤£ºÞ±z¬O¿ï¾Üþ¤@ºØ¡A¥u¯à¦³¤@Ó¥\¯àªí¶µ¥ØªºWindowList¿ï¶µ¥i¥H³Q¤Ä¿ï¡C
¡@
¹Ï9-12 Window¥\¯àªíÅý±z±Æ¦C©Ò¦³MDI ¤lªí³æ¨Ã¥B¥i¥H¨Ï¥Î·Æ¹«§Ö³tªº¤Á´«µøµ¡¡C |
¦bMDI¤lªí³æ¤¤·s¼WÄÝ©Ê
¡@
¦bVisual Basicª©¥»3¤¤¡An¼¶¼gMDIªºÀ³¥Îµ{¦¡¨Ã¤£®e©ö¡A±z¥²¶·§Q¥Î¤@ÓUDT«¬ºAªº°}¦C¨Ó°O¸ü¦UMDI¤lªí³æªºª¬ºA¡A¦b¦UMDI¤lªí³æ¶}±Ò©ÎÃö³¬®É¡A±z±N·|¦£©óºûÅ@³oÓ°}¦C¡C¦bVisual Basicª©¥»4«á¡A¨Æ¥óÅܱo²³æ¤F¡A¦]¬°¨CÓªí³æ³£¥i¥H¤ä´©¦ÛqªºÄÝ©Ê¡A¦Ó±z¥i¥H±N¸ê®Æª½±µ¦s©ñ¦b¨CÓMDI¤lªí³æ¼Ò²Õ¤¤¡A¤£»Ýn¨Ï¥Î¤@Ó¥þ°ìªºUDTs°}¦C¡C
¨CÓMDI¤lªí³æ¦Ü¤Ö·|¦³¨âӨ嫬ªº¦ÛqÄÝ©Ê¡GFilename ¤Î IsDirty (·íµM¡A¹ê»Ú¤Wªº¦WºÙ¥i¯à¤£¦P)¡CFilename Äݩʦs©ñªí³æ¸ü¤Jªº¸ê®ÆÀɮצWºÙ¡A¦Ó IsDirty °O¸üÀɮ׬O§_³Q¨Ï¥ÎªÌ§ó§ï¹L¡A¶Ç¦^ªº¬O¤@Ó¥¬ªLÈ¡C©³¤Uµ{¦¡¤¶²ÐMDI Notepad¥Ü½dµ{¦¡¦p¦ó¹ê§@¤Wz¨âÓÄÝ©Ê¡G
' Inside the frmDocument MDI child form Public IsDirty As Boolean Private m_FileName As String Property Get Filename() As String Filename = m_FileName End Property Property Let Filename(ByVal newValue As String) m_FileName = newValue ' Show the filename on the form(tm)s Caption. Caption = IIf(newValue = "", "Untitled", newValue) End Property Private Sub txtEditor_Change() IsDirty = True End Sub
¦³¤F IsDirty ÄÝ©Ê¡A°²³]¨Ï¥ÎªÌ§ïÅܤF¸ê®Æ¡A±z´N¥i¦bÃö³¬ªí³æ®É¸ß°Ý¨Ï¥ÎªÌn¤£n¦sÀÉ¡A³oÓ¤u§@n¦bMDI ¤lªí³æªº Unload ¨Æ¥ó¤¤§¹¦¨¡G
Private Sub Form_Unload(Cancel As Integer) Dim answer As Integer If IsDirty Then answer = MsgBox("This document has been modified. " & vbCr _ & " Do you want to save it?", vbYesNoCancel + vbInformation) Select Case answer Case vbNo ' The form will unload without saving data. Case vbYes ' Delegate to a procedure in the main MDI form. frmMainMDI.SaveToFile Filename Case vbCancel ' Refuse to unload the form. Cancel = True End Select End If End Sub
MDI¦¬¯Ç¾¹ªº¦h«¬(Polymorphic)
¡@
¦b«e¤@¸`ªºMDI Notepad À³¥Îµ{¦¡¡A¥i¥H«Ü¥¿±`ªº¹B§@¡A¦ý¬O¨Ã¤£¯àµø¬°¬O¤@Ó¦nªºª«¥ó¾É¦V³]p¡C¨Æ¹ê¤W¡AMDIForm ª«¥ó¹H¤Ï¤FMDI¤lªí³æªº«Ê¸Ë©Ê¡A¦]¬°¥¦ª½±µ¦s¨úMDI¤lªí³æªºtxtEditor±±¨î¶µÄÝ©Ê¡CÁöµM³o¥u¬OÓ¤p¯ÊÂI¡A¦ý´N¹³±z©Òª¾¹Dªº¡A¦nªº«Ê¸Ë¬O¼g¥X¥i«ÂШϥΡB©ö©óºûÅ@¤Î¨S¦³¿ù»~ªºµ{¦¡(bug-free)ªºÃöÁä©Ò¦b¡Cµ§ªÌ±N¥Î¨âÓ¤èªk¨Ó¥Ü½d³oÓ·§©À¡C
©w¸qparent-child¤¶±
¡@
Y±z¤£·Q¤÷MDI ªí³æª½±µ¦s¨ú¤lªí³æªº±±¨î¶µ¡A¸Ñ¨Mªº¤èªk´N¬O©w¸q¤@²Õ¤¶±¨ÓÅý¨âªÌ°µ·¾³q¡CÁ|¨Ò»¡©ú¡A¤÷MDIªí³æÀ³¸Ón¨D¤lªí³æ¦Û¤v¸ü¤J¡BÀx¦sÀɮסA¦Ó¤£¬Oª½±µ¨Ï¥Î¨ì¤lªí³æªº txtEditorÄÝ©Ê¡C¦P¼Ëªº¡A¤÷MDIªí³æÀ³¸Ó³z¹L©I¥s¤lªí³æªº¤èªk¨Ón¨D¦btxtEditor±±¨î¶µ°Å¤U¡B½Æ»s¤Î¶K¤W¸ê®Æ¡C¤÷MDIªí³æ¤]À³¸Ó¸ß°Ý¤lªí³æ¡Aþ¨Ç¦b¥\¯àªí-½s¿èªº©R¥O¬O¥i¨Ï¥Îªº¡C
¦b¼¶¼gMDI±M®×ªº¸gÅ礤¡Aµ§ªÌ¾ã²z¥X¤@Ó²³æªº¤¶±¡A¥i¥H²Å¦X¤@¯ëMDIÀ³¥Î¡Cµ{¦¡ªºn¨D¡A°£¤F Filename ¤Î IsDirty ÄÝ©Ê¥~¡A³oÓ¤¶±ÁÙ¥]§t¹³ IsEmpty (YMDI¤lªí³æ¨S¦³¥ô¦ó¸ê®Æ¡A¶Ç¦^True)¡BCanSave¡BCanCut¡BCanCopy¡BCanPaste ¤Î CanPrint ÄÝ©Ê¡B
Cut¡BCopy¡BPaste¡BPrintDoc¡BLoadFile¡BSaveFile ¤Î AskFilename(¥Î¦b FileOpen ©Î¬O FileSave ªº¼Ð·Ç¹ï¸Ü¤è¶ô¤¤)¡C³oÓ¤¶±¤¹³\±z¦b«·s§ï¼gMDI NotepadÀ³¥Îµ{¦¡®É¡A¤£·|¯}ÃaMDI¤lªí³æªº«Ê¸Ë©Ê¡C¨Ò¦p¤U±³o¬qµ{¦¡½X¹ê§@¤F¦bMDI¤÷ªí³æ¥\¯àªí¤¤ÀÉ®×Save as©R¥O¡G
Private Sub mnuFileSaveAs_Click() ' Ask the document to show a common dialog, and ' then save the file with the name selected by the user. On Error Resume Next ActiveForm.SaveFile ActiveForm.AskFilename(True) End Sub
©³¤U¬O¹ê§@PrintDoc¤èªkªº¤lMDIªí³æ:
Sub PrintDoc() Printer.NewPage Printer.Print txtEditor.Text Printer.EndDoc End Sub
·Ó¨Ò¡A³oÓµ{¦¡ªº·sª©¥»¤]©ñ¦bÀH®Ñ¥úºÐ¤¤¡A±z·|µo²{¤ñª©¥»ªºµ{¦¡ªø¤F¤@ÂI¡A¦ý±z±N·|¥ß§Y¬Ý¨ì¨Ï¥Î·sµ²ºc©Ò±a¨Óªº¦n³B¡C
»¡©ú
¦b¥Ü½dµ{¦¡¤¤¡Aµ§ªÌ©w¸q¤F¤@²ÕÄݩʤΤèªk¡CµM«áµ§ªÌ§â¥¦Ì©ñ¨ìfrmDocument MDI¤lªí³æªº¥D¤¶±¤¤¡C¦]¬°frmMain MDI¥Dªí³æ¬O§Q¥Î ActiveForm ÄݩʨӦs¨ú¤lªí³æ¡A¦]¦¹³oÓ¤¶±ªºÄݩʤΤèªk¬OÄÝ©ó«á´Á³sµ²¡A³o¥Nªí±z¥²¶·¥Î On Error ±Ôz¨Ó«OÅ@¨CӤޥΡCYn°µ±o§ó§¹¬ü¡A½Ð©w¸q¤@Ó©â¶HÃþ§O·í§@²Ä¤G¤¶±¡A¦Ó¦b©Ò¦³ªºMDI¤lªí³æ¼Ò²Õ³£¹ê§@²Ä¤G¤¶±¡C
§ó§ïClientªí³æªº¹ê§@
¡@
¦]¬°·sª©¥»ªºMDI¤÷ªí³æ¤£·|¯}ÃaMDI¤lªí³æªº«Ê¸Ë©Ê¡A±z¥i¥H¥ô·N§ó§ïMDI¤lªí³æªº¹ê§@¤è¦¡¡A¦Ó¤£·|¤ÞÅT¨ì¥Dµ{¦¡¡C¨Ò¦p¡A±z¥i¥H§âNotepad§ï¦¨¤@ÓMDI§Î¦¡ªº¼v¹³ÂsÄý¾¹¡C¦¹®ÉMDI¤lªí³æ·|©ñ¤@ÓPictureBox±±¨î¶µ¡A¦Ó±z¥²¶·¹ê§@¤¶±©Ò¦³ªºÄݩʤΤèªkÅýparent-child°µ·¾³q¡C§Q¦p¡APrintDoc ¤èªk²{¦b§ï¬°¡G
Sub PrintDoc() Printer.NewPage Printer.PaintPicture picBitmap.Picture, 0, 0 Printer.EndDoc End Sub
¥O¤HÅå³Yªº¬O¡A¥u»Ý§ó§ï¤Ö©ó20¦æªºµ{¦¡½X¡A´N¥i¥H§âMDI Notepad±M®×Âন¤@Ó¼v¹³ÂsÄý¾¹¡C³Ì¥O¤H¿³¾Äªº¤@ÂI´N¬O±zµ·²@¤£¥Î¥h§ó§ïfrmMain ¼Ò²Õªºµ{¦¡¡C´«¥y¸Ü»¡¡A±z«Ø¥ß¤F¤@Ó¥i«ÂШϥΡA¦h«¬ªºMDI¤÷ªí³æ¡I
¬Æ¦Ü¡A§ÚÌ¥unµy·L§ó§ïMDI¤÷ªí³æªºµ{¦¡¡A´N¥i¥HÅý¤£¦P«¬ºAªº¤lªí³æ¦@¦s©ó¤@ÓMDI¦¬¯Ç¾¹¤¤¡A¹Ï9-13¬O·sª©¥»ªº½d¨Òµ{¦¡¡A¥i¥H¦P®É¦s¦b¤å¦r¤å¥ó¤Î¼v¹³¡C¦Ò¼{¨ìÃB¥~»ÝnªºÄݩʤΤèªk¡A±z¥i¥H·s¼W¤lªí³æªº«¬ºA¡A©Î¬OÂX¥R¤¶±¨Ó¸Ñ¨M¡C
¡@
¹Ï9-13 ±z¥i¥H«ÂЧQ¥ÎfrmMain MDIªí³æ¡A¨Ó·f°t¤£¦P¥\¯àªº¤lªí³æ¡A¦p¤p«¬ªº¤å®Ñ³B²z¾¹©Î¼v¹³ÂsÄý¾¹¡C |
À³¥Îµ{¦¡ºëÆF
¡@
Visual Basic 6´£¨Ñ·sª©ªºÀ³¥Îµ{¦¡ºëÆF¡A¥¦¤ñVisual Basic 5´£¨Ñªºª©¥»§ó¨ã¼u©Ê¡A¥B»P¤u¨ã¦CºëÆF¤Îªí³æºëÆF§¹¾ã¦a¾ã¦X¡C
¦b¦w¸ËVisual Basic®É¡A´N¤@¨Ö¦w¸Ë¤FÀ³¥Îµ{¦¡ºëÆF¡A¦]¦¹§ÚÌ¥un²³æªº±q¼W¯q¶°ªº¼W¯q¥\¯àºÞ²zû¤¤¿ï¨ú§Y¥i¡C·í±z°õ¦æ³oÓºëÆF¡A±z¥i¥H¿ï¾Ü¦h«¤å¦r¤¶±(MDI)³æ¤@¤å¦r¤¶±(SDI)©Î¬OÃþ¦üÀÉ®×Á`ºÞªº¤¶± (Windows Explorer-like) ¦p¹Ï 9-14¡C
Y±z¿ï¾Ü¦h«¤å¦r¤¶±¡AºëÆF·|n¨D±z³]©w¥\¯àªí(¹Ï9-15)¡G·í±z»s§@¼Ð·Çªº¥\¯àªí®É¡A¥i¯à·|§Æ±æ¨Ï¥Î¹³³o»ò²³æ¤Îª½Ä±¦¡ªº¤u¨ã¡C
¡@
¹Ï9-14 À³¥Îµ{¦¡ºëÆF¡G¿ï¾Ü¤¶±Ãþ«¬¡C |
¡@
¹Ï9-15 À³¥Îµ{¦¡ºëÆF¡G¿ï¾Ü¥\¯àªí¡C |
¤U¤@¨B¡A§Q¥Î¤º«ØªººëÆF¨Ó¦Ûq¤u¨ã¦C (¹Ï9-16)¡C³oÓÆF¥©ªº¤u¨ã¡A±z¤]¥i¦b¼W¯q¶°¿ï³æ¤º§ä¨ì¦W¬°ToolbarºëÆF¡C
±µ¤U¨Óªº¨BÆJ¡AÀ³¥Îµ{¦¡ºëÆF·|¸ß°Ý±zn¤£n¨Ï¥Î¸ê·½ÀÉ¡A¥H¤Î¬O§_n¦bHelp¿ï³æ¤¤©ñ¤J¤@ӿﶵ¡A¥i¥HÅý¨Ï¥ÎªÌ³sµ²¨ì±zªºWeb¯¸¥x¡C±z¤]¥i¿ï¾Ü¥[¤J¨ä¥¦ªºªí³æ¨ì±M®×¤¤¡A¥]§t¥|ºØ¼Ð·Çªí³æ¡A©Î¬O±z¤§«e©w¸q¹Lªºªí³æ½d¥»¡C³Ì«á¡A±z¥i¥ô·N¼W¥[¸ê®Æªí³æ¡A¦¹®É¡AºëÆF·|©I¥sµ§ªÌ¦b
²Ä¤K³¹ ´yzªº¸ê®Æªí³æºëÆF¡C¦b³Ì«á¤@¨BÆJ¡A±z¥i¥H¨M©w¬O§_n§â³]©wÈÀx¦s¦b¤@Ó²ÕºAÀɤ¤¡A¥H«K¤U¤@¦¸°õ¦æÀ³¥Îµ{¦¡ºëÆF®É¥i¥H¬Ù²¤¤Wz¨BÆJ¡C
¡@
¹Ï9-16 À³¥Îµ{¦¡ºëÆF¡G¦Ûq¤u¨ã¦C¡C |
¡@
¹Ï9-17À³¥Îµ{¦¡ºëÆF¡G¥[¤J¼Ð·Çªí³æ¡C |
ÁöµM¦b±z«Ø¥ßMDIÀ³¥Îµ{¦¡®É¡AÀ³¥Îµ{¦¡ºëÆF©Ò²£¥Íªºµ{¦¡½X¬OÓ¦nªº¥XµoÂI¡A¦ý¦bµ§ªÌªº¬Ýªk¡A³o¨Çµ{¦¡½XÁÙ¬O¦³«Ü¦h»Ýn§ï¶iªº¦a¤è¡CºëÆF©Ò²£¥ÍªºMDIÀ³¥Îµ{¦¡¡A¦s©ñ¤@Ó¥]§tRichTextBox±±¨î¶µªºÂ²³æMDI¤lªí³æ¡A¨Ó«Ø¥ß¤å®Ñ³B²z¾¹«¬ºAªºÀ³¥Îµ{¦¡¡CµM¦Ó¡A¦b¬Y¨Ç³õ¦X¡A¤u¨ã¦C¤Wªº«ö¶s¨Ã¤£¹³´Á±æ¤¤ªº¹B§@¡A¦Ó¥B©Ò¦³Ãö©ó³]©w³q¥Î¹ï¸Ü¤è¶ô(common dialog)ªºµ{¦¡½X¡A¤]¤£·|¦Û°Ê¥¿½T²£¥Í¡A³o¬O¥¦ªº¤@¨Ç¯ÊÂI¡C¤£©¯¦a¡A±zµLªk±±¨îºëÆF¦p¦ó²£¥Íµ{¦¡½X¡A©Ò¥H¨C¦¸°õ¦æ§¹ºëÆF«á¡A±zÁÙ¬O¥²¶·¤â°Ê¦a§ó§ï©Ò²£¥Íªºµ{¦¡¡C
¨Ï¥Î©ì©ñ¥\¯à (DRAG-AND-DROP)
¡@
Visual Basic¦b¦´Áªºª©¥»´N¦³¥]§tdrag-and-dropªº¯à¤O¡A¦ý¥u¦³¦bVisual Basic 5·s¼W¤F¥t¤@²ÕÄÝ©Ê¡B¤èªk¤Î¨Æ¥ó«á¡A¤~¦³¹ê²{OLE-compliant¾÷¨î¤Î¸óÀ³¥Îµ{¦¡(cross-application)ªº©ì©ñ¯à¤O¡C
¦Û°Ê©ì©ñ¼Ò¦¡
¡@
°ò¥»¤W¡A¤@Ó±±¨î¶µ¥i¥H¬O©ì©ñ°Ê§@ªº¨Ó·½©Î¥Øªº¡CVisual Basic´£¨Ñ¨âºØ©ì©ñ¼Ò¦¡¡A¦Û°Ê¼Ò¦¡©Î¤â°Ê¼Ò¦¡¡C¦b¦Û°Ê¼Ò¦¡¤¤¡A±z¥un¦b°õ¦æ®É´Á³]©w¤@ÓÄÝ©Ê¡A°õ¦æ®É¡AVisual Basic·|À°±z¦Û°Ê³B²z¨ä¥¦¸Ó°µªº¡C¬Û¤Ï¦a¡A¦b¤â°Ê¼Ò¦¡¤U¡A±z¥²¶·¹ï©ì¦²¹Lµ{¤¤²£¥Íªº¤@¨t¦C¨Æ¥ó°µ³B²z¡A¦ý´«¨Óªº¬O¹ï©ì©ñ¹Lµ{§ó¦nªº±±¨î¡C
¤j¦h¼ÆVisual Basic¤º«Øªº±±¨î¶µ¤Î¤Ö¼Æªº¥~³¡ActiveX±±¨î¶µ³£¤ä´©¤£¦Pªí³æ¶¡ªºOLE-©ì©ñ¡C¦Ó¤Ö¼Æªº±±¨î¶µ¥u¯à³Q·í§@©ì©ñ§@·~ªº¥Øªº±±¨î¶µ¡C¥t¥~¡A¥u¦³¤Ö¼Æªº¤º«Øª«¥ó¥i¨Ï¥Î¦Û°Ê¼Ò¦¡¡C³]©w OLEDragMode ÄÝ©Ê¥i¥H¨M©w¨Ó·½±±¨î¶µ¦b©ì©ñ§@·~ªº¦æ¬°¡C¦P¼Ëªº¡A³]©w OLEDropMode ÄÝ©Ê¥i¥H¨M©w¥Ø¼Ð±±¨î¶µ¦b©ì©ñ§@·~ªº¦æ¬°¡Cªí9-1²¦C¥X¤º«Ø±±¨î¶µ¡A¤Î¤@¨ÇActiveX±±¨î¶µ¹ï©ì©ñªº¤ä´©µ{«×¡C
Controls | OLEDragMode | OLEDropMode |
---|---|---|
TextBox, PictureBox, Image, | vbManual, | vbNone, vbManual |
RichTextBox, MaskEdBox | vbAutomatic | vbAutomatic |
ComboBox, ListBox, DirListBox, | vbManual, | vbNone, vbManual |
FileListBox, DBCombo, DBList, TreeView, ListView, ImageCombo, DataList, DataCombo | vbAutomatic | |
Form, Label, Frame, | Not supported | vbNone, vbManual |
CommandButton, DriveListBox, Data, MSFlexGrid, SSTab, TabStrip, Toolbar, StatusBar, ProgressBar Slider, Animation, UpDown, MonthView, DateTimePicker, CoolBar |
ªí 9-1 ±z¥i¥H¨Ì·Ó±±¨î¶µ¹ï©ì©ñªº¤ä´©µ{«×¨Ó¤ÀÃþ¡A¦b«Dµøµ¡µ{¦¡®w¤¤ªº±±¨î¶µ¡A»P¤º«Ø±±¨î¶µªº¤ä´©µ{«×¤@¼Ë¡C |
°²¨Ï¤@Ó±±¨î¶µ¤ä´©¦Û°Ê¼Ò¦¡ªº©ì©ñ¡A±z¥un±N¥¦ªº OLEDragMode ©Î¬O OLEDropMove ªºÄݩʳ]¬°vbAutomatic¡C¨Ò¦p¡AY±z§Æ±æµ{¦¡¤¤¤ä´©RTF¤å¦r®æ¦¡ªº©ì©ñ¡A±z¥u¶·©ñ¸m¤@ÓRichTextBox±±¨î¶µ¨ìªí³æ¤W¡A¨Ã¥B§â¥¦ªº OLEDragMode ¤Î OLEDropMode Äݩʳ]¬°1-vbAutomatic¡C¦p¦¹¡A±z«K¥i¥H±q Microsoft Word¡BWordPad¤Î¤j¦h¼Æªº¤å®Ñ³B²z¾¹¤¤©ì¦²³¡¤Àªº¤å¦r¨ìRichTextBox¤¤¡C·íµM¡A±z¤]¥i¥H¹ïµ{¦¡¤¤¨ä¥LªºRichTextBox±±¨î¶µ§@©ì©ñ°Ê§@¡ATextBox¤ÎMaskEdBox±±¨î¶µ¤]¬O¤@¼Ë¡A´N¹³±z¦b¹Ï9-18©Ò¬Ý¨ìªº¡C
¨ä¥¦ªº±±¨î¶µ¤]¤ä´© OLEDragMode Äݩʪº³]©w¡C¦ý¦b¬Y¨Ç±¡ªp¤U¡A³o¨Ç¦Û°Ê©ì©ñ¼Ò¦¡ªº°Ê§@¥i¯à¤£¦p±z¹w´Á¡C¬Ý¬Ý¥i¯àªº±¡ªp¡G±z¥i¥H±q¤@Ó¥i½Æ¿ïªº¶µ¥Ø²M³æ(ListBox)±±¨î¶µ¤¤¡A©ì¦²´XÓ©Ò¿ï¾Üªº¶µ¥Ø¨ì¤@Ó¤¹³\¦h¦æ¤å¦rªº¤å¦r¤è¶ô(TextBox)±±¨î¶µ¤¤¡A«h³o¨Ç¶µ¥Ø·|¦b¤å¦r¤è¶ô¤¤¥HCR-LF¨Ó¤À¹j¡C¥t¤@Ó±¡ªp¬O§âFileListBox±±¨î¶µ¤¤©Ò¿ï¾Üªº¶µ¥Ø©ñ¨ì¨ä¥L¤ä´©³o¨Ç¶µ¥ØªºWindows À³¥Îµ{¦¡¤¤¡C¨Ò¦p¡A¦bÀH®Ñ¥úºÐ¤¤ªº¥Ü½dµ{¦¡¡A±z¥i¥H§âDOC©ÎTXT°ÆÀɦWªº¶µ¥Ø©ñ¨ìMicrosoft Word¤¤¡C½Ðª`·N¤@ÂI¡AÁöµMDirListBox©x¤è¤ä´©¦Û°Ê©ì©ñ¼Ò¦¡ªº OLEDragMode¡A¹ê»Ú¤W¦b¾Þ§@®É¨Ã¤£·|¦³dragªº°Ê§@¡C
¡@
¹Ï9-18 ³oÓµ{¦¡¥Ü½d±z¦p¦ó©ì©ñ¤å¦r©Î¼v¹³¨ì¥t¤@Óµøµ¡µ{¦¡¡C½ÐÆ[¹î¤å¦r¦bRichTextBox¤ÎTextBox±±¨î¶µ¤¤¡AÂà´«¦¨¤£¦Pªº¤è¦¡¨Ó§e²{¡C |
·í¨Ï¥Î¦Û°Ê©ì©ñ¼Ò¦¡®É¡A±zªºÀ³¥Îµ{¦¡¤£·|±µ¦¬¨ì¥ô¦ó¨Æ¥ó¡A¦Ó±z¤]µLªk±±¨î©ì©ñªº¹Lµ{¡C¥u¦³¦b¨Ï¥Î·Æ¹«¥ªÁä¥i¥H¶}©l©ì©ñ§@·~¡A¹w³]ªº®ÄªG¬OMove©R¥O(·N«ü¸ê®Æ·h²¾¨ì¥Øªºª«¥ó¡AµM«á¦b¨Ó·½±±¨î¶µ¤¤§R°£)¡C°²¨Ïn°õ¦æ½Æ»sªº°Ê§@¡A±z¥²¶·¹³¦bWindow Explorer¤@¼Ë¡A«ö·Æ¹«¥ªÁä®É¦P®É«ö¤UCtrlÁä¡C
¤â°Ê©ì©ñ¼Ò¦¡
¡@
ÁöµM¦Û°Ê©ì©ñ¼Ò¦¡¤¤Åý±z¥un²³æªº¦b³]p®É´Á³]©w¤@¨ÇÄÝ©Ê¡A´N¥i¹F¨ì¦³½ìªº©ì©ñ®ÄªG¡C¦ý«ÜÅãµM¦a¡Anµo´§©ì©ñªº§ó¤j«Â¤O¡A´N¥²¶·¨Ï¥Î¤â°Êªº©ì©ñ¼Ò¦¡¡C±µ¤U¨Ó±z±N·|¬Ý¨ì¡An§¹¦¨©ì©ñªº¹Lµ{¡A¤£ºÞ¬O¦b¨Ó·½©Î¬O¥Ø¼Ðª«¥ó¡A§ÚÌ¥²¶·¦b´XÓ¯S©w¨Æ¥ó¤¤¼¶¼gµ{¦¡¡C¹Ï9-19²³æ¦C¥X·í¨Ï¥ÎªÌ°õ¦æ©ì©ñ®É·|²£¥Íªº¨Æ¥ó¡A±z¥i¯à¦b«áÄòªº¤p¸`·|°Ñ¦Ò¨ì³oӹϪí¡C
¡@
¹Ï9-19 ©Ò¦³¦b¤â°Ê¼Ò¦¡¤¤·|²£¥Íªº¨Æ¥ó |
¦b¹Ï9-20¤¤ªº¥Ü½dµ{¦¡¬O¥Ñ¥i§@¬°OLE ©ì©ñ¹Lµ{¤¤¨Ó·½¤Î¥Ø¼ÐªºRichTextBox±±¨î¶µ©Ò²Õ¦¨¡C¦bªí³æ¤W¦P¼ËÁÙ¦³¤@ÓListBox±±¨î¶µ¡A¥¦¥iÅý±z©ñ¸m¥ÑRichTextBox±±¨î¶µ©Î¬O¨ä¥L¨Ó·½(¦pMicrosoft word)ªº¯Â¤å¦r¸ê®Æ¡C·í±z°õ¦æ©ì©ñ°Ê§@®É¡AListBox±±¨î¶µ·|±½´y³o¬q¤å¦r¡A§â©Ò¦³¤£«½Æªº³æ¦r«·s±Æ§ÇÅã¥Üµ¹¨Ï¥ÎªÌ¡C
¡@
¹Ï9-20 ³oӥܽdµ{¦¡±N®i¥Ü¦p¦ó§Q¥ÎVisual BasicªºOLE©ì©ñ¯à¤O¡A¨Ó«Ø¥ß¤@Ó¯à¦Û°Ê¤ÀªR¤å¦r¨Ó§ä¥X¤£«ÂЪº³æ¦r¡A¨Ã¥B«ö¦r¥À±Æ§ÇªºListBox±±¨î¶µ¡C |
±Ò°Ê©ì©ñªº°Ê§@
¡@
¦pªG±z§Æ±æ¯à°÷±Ò°Ê©ì©ñªº°Ê§@¡A´N¥²¶·§â OLEDragMode ªºÄݩʳ]¬° Visual BasicManual (°£¤FRichText¥~¡A©Ò¦³ªº±±¨î¶µ¹w³]ȬҬ°Visual BasicManual)¡AµM«á©I¥s OLEDrag ¤èªk¨Ó¶}©l©ì¦²ªº¹Lµ{¡C³q±`§ÚÌ·|¦b MouseDown ¨Æ¥óµ{§Ç¤¤©I¥s¡G
Private Sub rtfText_MouseDown(Button As Integer, Shift As Integer, _ x As Single, y As Single) ' Start a drag operation if right button is pressed. If Button = 2 Then rtfText.OLEDrag End Sub
·í±z©I¥s OLEDrag ¤èªk®É¡A¦b¨Ó·½±±¨î¶µ·|²£¥Í¤@Ó OLEStartDrag ¨Æ¥ó¡C³oӨƥó·|±µ¦¬¤@ÓDataObject ª«¥ó¡A¥H¤Î¤@Ó AllowEffects °Ñ¼Æ¡C±z¥i¥H§âDataObjectª«¥ó¬Ý°µ¬O¤@Ó®e¾¹¡A¥¦·|¥Î¨Ó¦s©ñ±z·Qn±q¨Ó·½±±¨î¶µ¶Ç»¼¨ì¥Ø¼Ð±±¨î¶µªº¸ê®Æ¡A³oӰʧ@¬O³z¹L SetData ¤èªk¨Ó¹F¦¨¡C³o´N¦n¹³±z¥i¥H§Q¥ÎClipboard¨Ó¦s©ñ¤£¦PºØÃþªº¸ê®Æ¡A¦pªí9-2¡C¨Ò¦p¡ARichTextBox±±¨î¶µ¥i¥H·h²¾¡B½Æ»sRTF©Î¬O¯Â¤å¦r¸ê®Æ¡G
Private Sub rtfText_OLEStartDrag(Data As RichTextLib.DataObject, _ AllowedEffects As Long) ' Use selected text, or all text if no text is currently selected. If rtfText.SelLength Then Data.SetData rtfText.SelRTF, vbCFRTF Data.SetData rtfText.SelText, vbCFText Else Data.SetData rtfText.TextRTF, vbCFRTF Data.SetData rtfText.Text, vbCFText End If AllowedEffects = vbDropEffectMove Or vbDropEffectCopy End Sub
C onstant | Value | Meaning |
---|---|---|
vbCFText | 1 | Text |
vbCFBitmap | 2 | Bitmap (BMP) |
vbCFMetafile | 3 | Metafile (WMF) |
vbCFEMetafile | 14 | Enhanced metafile (.emf) |
vbCFDIB | 8 | Device independent bitmap (dib or bmp) |
vbCFPalette | 9 | Color palette |
vbCFFiles | 15 | List of files |
vbCFRTF | -16639 | Rich Text Format (RTF) |
ªí9-2 DataObject ª«¥ó©Ò¤ä´©ªºÃþ«¬¡C |
±z¥²¶·¦b AllowedEffects °Ñ¼Æ¤¤«ü©w±zn¦b©ì©ñ§@·~¤¤¨Ó·½¤¸¥ó¥i¤ä´©ªº°Ê§@¡C±z¥i¥H«ü©w1-vbDropEffectCopy ©Î¬O 2-vbDropEffectMove¡AY±z»Ýn¦P®É¤ä´©¨âӰʧ@¡A¥i¥H«ü©w¨âÓȪº©M¡A´N¹³«e±ªºµ{¦¡¤ùÂ_¡C
·Ç³Æ©ñ¸m¨ì¨Ó·½±±¨î¶µ
¡@
¦b©ì¦²§@·~¶}©l«á¡A·í·Æ¹«¸g¹L¥ô¦ó¤@Ó±±¨î¶µ®É¡AVisual Basic·|¦b¸Ó±±¨î¶µ²£¥Í OLEDragOver ¨Æ¥ó¡C³oӨƥó·|±µ¦¬°£¤F¨Ó·½ª«¥ó©Ò³]©wªº DataObject ¤Î Effect¡AÁÙ¦³·Æ¹«®y¼Ð¤Î«ö¶sª¬ºA¡Cµ{¦¡¨Ì¾Ú³o¨Ç¸ê®Æ¡A§â Effect °Ñ¼Æ³]©w¬°¨ä¥i¥H°õ¦æªº°Ê§@¤§¤@¡A¥H«K½T©w·í¨Ï¥ÎªÌ±N¨Ó·½ª«¥ó©ì©ñ¨ì¤¸¥ó¤W®É¸Ó°õ¦æþӰʧ@¡C³oÓÈ¥i¥H¬O 0-vbDropEffectNone¡B1-vbDropEffectCopy¡B2-vbDropEffectMove©Î¬O3-vbDropEffectScroll («ü¥Ø¼Ð±±¨î¶µ·|±²°Ê¦Û¤vªº¤º®e¡A¨Ò¦p¡A·í·Æ¹«¦bListBox ±±¨î¶µ¤Wªºscrollbar®É)¡C State °Ñ¼Æ¥Nªí·Æ¹«¥¿n¶i¤J©Î¬OÂ÷¶}±±¨î¶µ¡A¥i¥H¬O©³¤UªºÈ0-vbEnter¡B1-vbLeave ¤Î2-vbOver¡C
Private Sub lstWords_OLEDragOver(Data As DataObject, Effect As Long, _ Button As Integer, Shift As Integer, X As Single, Y As Single, _ State As Integer) If Data.GetFormat(vbCFText) Then Effect = Effect And vbDropEffectCopy Else Effect = vbDropEffectNone End If ' As a demonstration, change the background of this ListBox when ' the mouse is over it. If State = vbLeave Then ' Restore background color on exit. lstWords.BackColor = vbWindowBackground ElseIf Effect <> 0 And State = vbEnter Then ' Change background color on entry. lstWords.BackColor = vbYellow End If End Sub
¥Ø¼Ð±±¨î¶µ¥²¶·Àˬd¦Û¤v¬O§_¤ä´©DataObject ª«¥ó©Ò¥]§tªº¸ê®Æ«¬ºA¡C³oӰʧ@ÂǥѩI¥s DataObject ªº GetFormat ¤èªk¨Ó¹F¦¨¡A´N¹³¤W±ªºµ{¦¡¤ùÂ_¡C¥t¥~±z¥²¶·ª¾¹D Effect °Ñ¼Æ¬O¤@Ӧ줸Äæ¦ì(bit-field)ªº«¬ºA¡C
Effect = Effect And vbDropEffectCopy
¦b«e±ªº¨Ò¤l¡AY¨Ó·½±±¨î¶µ¤£¤ä´©Copy°Ê§@¡A³¯z¦¡ Effect=Effect And vbDropEffectCopy±N·|§âEffect ³]¬°0¡Cè¶}©l¡A±z¥i¯à»{¬°Äµ§i¬O¤Ó¹L«×¤F¡A¦]¬°±zª¾¹DRichTextBox±±¨î¶µ¤ä´©Copyªº°Ê§@¡C¦ý¬O±z¥²¶·°O¦íªº¬O¡A·í±znÅýlstWords±±¨î¶µ¯à¨Ï¥Î©ì©ñ§@·~¡A¥¦¦³¥i¯à¦b©ì©ñ¤¤¡A±µ¦¬¨ì¦UºØ¥i¯àªº¨Ó·½¡A¤£ºÞ¬O±q¥¦¥»¨©ÒÄݪºÀ³¥Îµ{¦¡©Î¬O¥~±ªºÀ³¥Îµ{¦¡¡A¦]¦¹¡A±z¥²¶·ÀH®É·Ç³ÆÀ³¥I¦UºØ¥i¯àªº±¡ªp¡C
¦b¨Ó·½±±¨î¶µ¤¤¡A·í OLEDragOver ¨Æ¥óµo¥Í«áºò¸òµÛµo¥ÍOLEGiveFeedback ¨Æ¥ó¡C¦b³oӨƥ󤤡A¨Ó·½±±¨î¶µ¯àª¾¹D¥Ø¼Ð±±¨î¶µ©Ò¿ï¾Üªº°Ê§@¡A¨Ã¥i¥H§ïÅܷƹ«´å¼Ð¡G
Private Sub lstWords_OLEGiveFeedback(Effect As Long, _ DefaultCursors As Boolean) ' If effect is Copy, use a custom cursor. If Effect = vbDropEffectCopy Then DefaultCursors = False Screen.MousePointer = vbCustom ' imgCopy is an Image control that stores a custom icon. Screen.MouseIcon = imgCopy.Picture Else DefaultCursors = True End If End Sub
Y±zn¨Ï¥Î¤£¦Pªº·Æ¹«´å¼Ð¡A¥²¶·±N DefaultCursors °Ñ¼Æ³]¬°False¡C·í±z¤£»Ý²z·|´å¼Ðªº§Îª¬®É¡A¨Ã¤£»Ýn¹ê§@ OLEGiveFeedback ¨Æ¥ó¡C
©ñ¤U¸ê®Æ
¡@
·í¨Ï¥ÎªÌ¦b¥Ø¼Ð±±¨î¶µ©ñ¶}·Æ¹««öÁä®É¡A·|¦b¥Ø¼Ð±±¨î¶µ²£¥Í OLEDragDrop ¨Æ¥ó¡C°£¤F State °Ñ¼Æ¥~¡A³oӨƥ󱵦¬ªº°Ñ¼Æ¸ò¦b OLEDragOver ¨Æ¥ó¤¤¤@¼Ë¡C¦b³oÓ±¡ªp¤¤¡AEffect °Ñ¼Æªº·N¸q¦³¨Ç¤£¦P¡A ²{¦b¥¦¥Nªí¥Ø¼Ð±±¨î¶µ©Ò¨M©wªº°Ê§@¡C
Private Sub lstWords_OLEDragDrop(Data As DataObject, Effect As Long, _ Button As Integer, Shift As Integer, X As Single, Y As Single) ' Restore the correct background color. lstWords.BackColor = vbWindowBackground ' Select Copy action if possible, otherwise select Move. If Effect And vbDropEffectCopy Then Effect = vbDropEffectCopy ElseIf Effect And vbDropEffectMove Then Effect = vbDropEffectMove End If ' In either case, ask for the data - only plain text is supported. Dim text As String text = Data.GetData(vbCFText) ' Code for processing the text and loading the list of unique ' words in the lstWords listbox (omitted)... End Sub
ºò±µµÛ OLEDragDrop ¨Æ¥ó«á¡A·|¦b¨Ó·½±±¨î¶µ²£¥Í OLECompleteDrag ¨Æ¥ó¡C±z¥²¶·¦b³oӨƥ󤤼¶¼gµ{¦¡½X¡G·í·h²¾°Ê§@®É(vbDropEffectMove)¡A±z¥²¶·§â¨Ó·½±±¨î¶µ¤¤ªº¤Ï¥Õ°Ï§R°£¡A©Î¬OÁÙì¦b©ì©ñ§@·~¤¤±±¨î¶µ©Ò³Q§ó§ïªº¥~Æ[¡G
Private Sub rtfText_OLECompleteDrag(Effect As Long) If Effect = vbDropEffectMove Then ' If this was a Move operation, delete the highlighted text. rtfText.SelText = "" Else ' If it was a Copy command, just clear the selection. rtfText.SelLength = 0 End If End Sub
¦b»Ýn®É¸ü¤J¸ê®Æ
¡@
·í¨Ó·½±±¨î¶µ¤ä´©«Ü¦hªº«¬ºA¡A¦b OLEStartDrag ¨Æ¥óµo¥Í®É¡A§â³o¨Ç«¬ºA¸ê®Æ¤@¦¸³£¸ü¤J¨ìDataObject ª«¥ó¡A¨Ã¤£¬O«Ü¦³®Ä²vªº¸Ñ¨M¿ìªk¡C«Ü©¯¹B¦a¡AVisual Basic´£¨Ñ¤F¥t¤@ºØ¤èªk¡A¦b©ì¦²§@·~¶}©l®É¡A±z¥un«ü©w¨Ó·½±±¨î¶µ±N·|¤ä´©þ¨Ç«¬ºA¡A¨Ó¨ú¥N§â¨Ó·½¸ê®Æ¸ü¤J¨ìDataObject ª«¥ó¤¤¡C
°²¨Ï©ì©ñ§@·~¥¼³Q¨ú®ø¡A¥Ø¼Ð±±¨î¶µ³Ì«á·|©I¥sDataObjectªº GetData ¤èªk¥h¨ú±o¬Û¹ï©Ò»Ý«¬ºAªº¸ê®Æ¡A¦¹®É¡AVisual Basic·|¦b¨Ó·½±±¨î¶µµo¥Í OLESetData ¨Æ¥ó¡G
Private Sub rtfText_OLESetData(Data As RichTextLib.DataObject, _ DataFormat As Integer) ' This event fires only when the target control invokes the ' Data(tm)s GetData method. If DataFormat = vbCFText Then If rtfText.SelLength Then Data.SetData rtfText.SelText, vbCFText Else Data.SetData rtfText.text, vbCFText End If ElseIf DataFormat = vbCFRTF Then If rtfText.SelLength Then Data.SetData rtfText.SelRTF, vbCFRTF Else Data.SetData rtfText.TextRTF, vbCFRTF End If End If End Sub
¦ý»Ýª`·Nªº¬O¡A¦b©ì©ñ§@·~¶}©l¡AY±z§â¸ê®Æ¶Ç¤J SetData ²Ä¤@ӰѼƮɡA¨Ã¤£·|µo¥ÍOLESetData¨Æ¥ó¡C
©ì©ñÀÉ®×
¡@
´N¹³±z©Òª¾¹Dªº¡AWindowsÀÉ®×Á`ºÞ( Windows Explorer) ¥i¥H´£¨ÑÀɮצWºÙªº©ì©ñ¡A¦Ó«Ü¦hµøµ¡À³¥Îµ{¦¡¥i¥H¦bÀÉ®×Á`ºÞ¤¤·í§@¶}©l©ì¦²§@·~ªº¥Ø¼Ð¡C¦b³o¤@¸`¡A§Ú̱N§i¶D±z¦p¦ó¹ê§@³o¨âÓ¥\¯à¡Ð¥i¥H·í§@©ì©ñÀɮתº¨Ó·½©Î¬O¥Ø¼Ðªºµ{¦¡¡C
n§¹¦¨³oÓ¥\¯àªºÃöÁä¡A´N¬ODataObjectªº File ÄÝ©Ê¡CY»Ýn±N±zªºÀ³¥Îµ{¦¡·í§@Àɮשì©ñ§@·~ªº¥Ø¼Ð¡A«h¥²¶·ÀˬdDataObjectª«¥ó¬O§_¦³vbCFFiles®æ¦¡ªº¸ê®Æ¡AµM«á§Q¥Î°j°é±qÀɮ׶°¦X¤¤Åª¨úÀɮצWºÙ¶i¨Ó¡CÁ|¨Ò¨Ó»¡±z¥i¥H¥Î©³¤Uªºµ{¦¡¨ÓŪ¨ú©ì©ñ¨ìListBox±±¨î¶µªºÀɮצWºÙ¡G
If Data.GetFormat(vbCFFiles) Then For i = 1 To Data.Files.Count lstFiles.AddItem Data.Files(i) Next End If
·íµM¡A±z¤]¥i¥H¶}±Ò³oÓÀɮרåBÅã¥Ü¥¦¡C¦b¹Ï9-21ªº½d¨Òµ{¦¡¡A¹ê§@¤F¤Wzªº¥\¯à¡C
¡@
¹Ï9-21 ¤W¼hªºµøµ¡®i¥Ü±qWindows ÀÉ®×Á`ºÞ©ì¨ÓªºAutoDrop.vbpÀɮפº®e |
¦Ó¤U¼hªºµøµ¡®i¥Ü±qÀÉ®×¹ï¸Ü¤è¶ô©Ò©ì¨ÓªºÀɮצWºÙ¡C
n«Ø¥ß¤@Ó¥i·í§@Àɮשì©ñ¨Ó·½ªºÀ³¥Îµ{¦¡¤]¤£§xÃø¡C±z¥u¶·§âÀÉ®×¥[¤J¨ìÀɮ׶°¦X¤¤¡A¨Ã¥B³]©w¬°vbCFFiles«¬ºA¡C½Ð°O±o¡A¥Ø¼Ðª«¥ó»ÝnÀɮ׶°¦X¤¤¦s©ñªº¬OÀɮצWºÙ¥H¤Î§¹¾ãªºÀɮ׸ô®|¡C©³¤Uªºµ{¦¡§i¶D±z¦p¦ó§âFileListBox±±¨î¶µ·í§@©ì¦²§@·~ªº¨Ó·½¡G
Private Sub File1_OLEStartDrag(Data As DataObject, AllowedEffects As Long) Dim i As Integer, path As String path = File1.path & IIf(Right$(File1.path, 1) <> "\", "\", "") ' Add all selected files to the Data.Files collection. Data.Files.Clear For i = 0 To File1.ListCount - 1 If File1.Selected(i) Then Data.Files.Add path & File1.List(i) End If Next If Data.Files.Count Then ' Only if we actually added files Data.SetData , vbCFFiles AllowedEffects = vbDropEffectCopy End If End Sub
¨Ï¥Î¦Ûqªº®æ¦¡
¡@
¹ê»Ú¤WOLE©ì©ñ¾÷¨î¥iµo´§¤ñµ§ªÌ©Ò¥Ü½d¹L§ó¨ã¼u©Êªºµ{¦¡¡A¥¦¤]¥i¤ä´©¦Ûqªº®æ¦¡¡CÁ|¨Ò¨Ó»¡¡A±z¥i¯à»Ýn¤@Óªí³æ¯àÅã¥Üµo²¼¡Bq³æ©Î¬O«È¤áªº¸ê®Æ¡A¦Ó±z§Æ±æ¨ã¦³Åý¨Ï¥ÎªÌ¥i±q¨ä¥Lªí³æ©ì¦²³o¨Ç¸ê®Æªº¯à¤O¡C¨Ï¥Î¦Ûqªº®æ¦¡¤]¥i¥H»´ÃPªºÅý±z¦b¤£¦PªºÀ³¥Îµ{¦¡¹êÅ餤Âà´«¸ê°T¡A¦Ó¦P®ÉÁקK±¼¤£¤p¤ß±N¸ê®Æ©ñ¨ì¨ä¥Lªºµ{¦¡¤¤¡C¨Ï¥Î³oÓ¤èªk¡A±z¥i¥H¦bÀ³¥Îµ{¦¡¶¡·h²¾¾÷±K©Êªº¸ê®Æ¡A¦Ó¤£¥Î¦Ò¼{³Q¥¼±ÂÅv¨Ï¥ÎªÌÀò¨úªº¦MÀI¡C
n¨Ï¥Î¦Ûq®æ¦¡ªº²Ä¤@¨BÆJ¡A´N¬O¥ý¦bWindows¤¤µù¥U¡A±z¥i¥H©I¥sRegisterClipboardFormat API¨ç¦¡¨Ó¹F¦¨¡C¨C¤@ӨϥΨì¦Ûq®æ¦¡¸ê®ÆªºÀ³¥Îµ{¦¡³£¥²¶·n¦³³oÓ¨BÆJ¡CWindows«OÃÒ·í²Ä¤@¦¸©I¥s¨Ã¶Ç¤J¦Ûq®æ¦¡¦WºÙ(¦p¤U±µ{¦¡¤¤ªº PersonalData)µ¹³oӨ禡®É¡A·|¶Ç¦^¤@Ӱߤ@(unique)ªº¾ã¼ÆÈ¡A¦ÓÀH«á§Q¥Î³oӮ榡¦WºÙ·í°Ñ¼Æ¨Ó©I¥s³oÓAPI¨ç¦¡®É·|¶Ç¦^¦P¼ËªºÈ¡A¬Æ¦Ü±q¤£¦PªºÀ³¥Îµ{¦¡¤¤©I¥s³oӨ禡¶Ç¦^ªºÈ¤]¬O¤@¼Ëªº¡C
Private Declare Function RegisterClipboardFormat Lib "user32" _ Alias "RegisterClipboardFormatA" (ByVal lpString As String) As Integer Dim CustomFormat As Integer Private Sub Form_Load() CustomFormat = RegisterClipboardFormat("PersonalData") End Sub
¦¹®É¡A ±z¥i±N¸ê®Æ¥ÎCustomFormat ÃѧO¦r¦s°_¨Ó¡A«ê¦n¸ò¼Ð·Ç®æ¦¡¦pvbCFText ©Î vbCFBitmap°µªk¬Û¦P¡C°ß¤@¤£¦Pªº¬O¡A¦Ûq¸ê®Æ®æ¦¡¦b¶Ç°e¨ìDataObject.SetData ¤èªk«e¡A¥²¶·¥ý¸ü¤J¨ìByte°}¦C¡C¹Ï9-22ªº¥Ü½dµ{¦¡¨Ï¥Î³oÓ§Þ¥©¦b¨âÓªí³æ¶¡·h²¾¤Î½Æ»s¸ê®Æ¡G
' Code in the source application Private Sub imgDrag_OLESetData(Data As DataObject, DataFormat As Integer) Dim i As Integer, text As String, bytes() As Byte ' Build a long string made up of field contents. For i = 0 To txtField.UBound If i > 0 Then text = text & vbNullChar text = text & txtField(i) Next ' Move to a byte array, and then assign it to DataObject. bytes() = text Data.SetData bytes(), CustomFormat End Sub
¡@
¹Ï9-22 ±z¥i¥H¦b¤£¦Pªí³æ¡A¬Æ¦Ü¦b¤£¦PªºÀ³¥Îµ{¦¡¹êÅ鶡·h²¾¦Ûq®æ¦¡ªº¸ê®Æ¡A¦Ó¤£¥Î¾á¤ß§â¾÷±K¸ê®Æ¤£¤p¤ß©ñ¨ì¨ä¥Lªº¦a¤è¡C |
¥Ø¼Ðªí³æ¥²¶·¨ú¥X Byte°}¦C¡A±N¥¦ÌÁÙ즨ì¨Óªº¦r¦ê¡A¨Ã¥B©ñ¨ì¦U¦ÛªºÄæ¦ì¤¤¡G
' Code in the target application Private Sub imgDrag_OLEDragDrop(Data As DataObject, Effect As Long, _ Button As Integer, Shift As Integer, X As Single, Y As Single) Dim bytes() As Byte, text() As String, i As Integer bytes() = Data.GetData(CustomFormat) ' Retrieve individual values, and then assign them to fields. text() = Split(CStr(bytes), vbNullChar) For i = 0 To txtField.UBound txtField(i) = text(i) Next End Sub
±z¥i¥HÂsÄý¦b¡AÀH®Ñ¥úºÐ¤¤ªºì©lµ{¦¡½X¡A¨ú±o§ó¦hÃö©ó³o¶µ§Þ¥©ªº¸ê°T¡C
²{¦b±z¤w´x´¤¤F¦³ÃöSDI¤ÎMDIªí³æ¡B¹ï¸Ü¤è¶ô¡BOLE©ì©ñªº§Þ¥©¡A¨Ã§ó²`¤JÁA¸Ñ¸û½ÆÂøªºVisual Basic¥~³¡ActiveX±±¨î¶µ°µ¦n¤F·Ç³Æ¡C±µ¤U¨Óªº¤T³¹±N±´°Q³o¨Ç¥~³¡ActiveX±±¨î¶µ¡C