«á¤@¶ «e¤@¶ ¦^¥Ø¿ý ¦^º¶ |
19.2.2 Delphi ³¡¥óµ{¦¡³]p¡@19.2.2.1 «Ø¥ßÄÝ©Ê¡@ ¡@ÄÝ©Ê¡]Property¡^¬O³¡¥ó¤¤³Ì¯S®íªº³¡¤À¡A¥Dn¦]¬°³¡¥ó¥Î¤á¦b³]p®É¥i¥H¬Ý¨£©M¾Þ§@¥¦Ì¡A¨Ã¥B¦b¤¬°Ê¹Lµ{¤¤¯à¥ß§Y±o¨ìªð¦^µ²ªG¡CÄݩʤ]«Ü«n¡A¦]¬°¦pªG±N¥¦Ì³]p¦n«á¡A±N¨Ï¥Î¤á§ó®e©ö¦a¨Ï¥Î¡A¦Û¤vºûÅ@°_¨Ó¤]«Ü®e©ö¡C¡@¡@¬°¤F¨Ï§A¦b³¡¥ó¤¤§ó¦n¦a¨Ï¥ÎÄÝ©Ê¡A¥»³¡¤À±N¤¶²Ð¤U¦C¤º®e¡G ¡@¡´ ¬°¤°»òn«Ø¥ßÄÝ©Ê¡@ ¡´ ÄݩʪººØÃþ ¡@¡´ ¤½§G(publishing)Ä~©ÓªºÄÝ©Ê¡@ ¡´ ©w¸q³¡¥óÄÝ©Ê¡@ ¡´ ½s¼gÄݩʽs¿è¾¹¡@ ¡@¡@ 1. ¬°¤°»òn«Ø¥ßÄÝ©Ê¡@¡@ÄÝ©Ê´£¨Ñ«D±`«nªº¦n³B¡A³Ì©úÅ㪺¦n³B¬OÄݩʦb³]p®É¯à¥X²{¦b Object Inspectorµøµ¡¤¤¡A³o±N²¤Æµ{¦¡³]p¤u§@¡A¦]¬°§A¥u»ÝŪ¥Î¤á©Ò½áªºÈ¡A¦Ó¤£n³B²zºc³yª«¥óªº°Ñ¼Æ¡C¡@¡@±q³¡¥ó¨Ï¥ÎªÌªºÆ[ÂI¬Ý¡AÄݩʶHÅܼơC¥Î¤á¥i¥Hµ¹ÄݩʽáÈ©ÎŪȡA´N¦n¶HÄݩʬOª«¥óªºÄæ¦ì¡C ¡@¡@±q³¡¥ó½s¼gªÌªºÆ[ÂI¬ÝÄݩʤñª«¥óªºÄæ¦ì¦³§ó±jªº¥\¯à¡F ¡@ Æ« ¥Î¤á¥i¥H¦b³]p®É³]©wÄÝ©Ê¡@¡@³o¬O«D±`«nªº¡A¦]¬°¤£¶H¤èªk¡A¥u¯à¦b°õ¦æ®É¦s¨ú¡CÄݩʨϥΤá¦b°õ¦æµ{¦¡¤§«e´N¯à©w¨î³¡¥ó¡A³q±`§Aªº³¡¥ó¤£À³¥]§t«Ü¦hªº¤èªk¡A¥¦Ìªº¥\¯à¥i¥H³q¹LÄݩʨӹê²{¡C ¡@ Ƭ ÄݩʯàÁôÂøԲӪº¹ê²{²Ó¸`¡@ Æ Äݩʯà¤Þ°_²³æ¦a½áȤ§¥~ªºÅTÀ³¡A¦pIJµo¨Æ¥ó¡@¡@Æ® ¥Î©óÄݩʪº¹ê²{¤èªk¥i¥H¬OµêÀÀ¤èªk¡A³o¼Ë¬Ý¦ü²³æªºÄݩʦb¤£¦Pªº³¡¥ó¤¤¡A±N¹ê²{¤£¦Pªº¥\¯à¡C ¡@ ¡@2. Äݩʪº«¬¦¡¡@¡@ÄÝ©Ê¥i¥H¬O¨ç¼Æ¯àªð¦^ªº¥ô¦ó«¬¦¡¡A¦]¬°Äݩʪº¹ê²{¥i¥H¨Ï¥Î¨ç¼Æ¡C©Ò¦³ªº Pascal«¬¦¡¡A¬Û®e©Ê³W«h³£¾A¥ÎÄÝ©Ê¡C¬°ÄÝ©Ê¿ï¾Ü«¬¦¡ªº³Ì«nªº¤è±¬O¤£¦Pªº«¬¦¡¥X²{¦bObject Inspectorµøµ¡¤¤ªº¤è¦¡¤£¦P¡CObject Inspector±N«ö¤£¦Pªº«¬¦¡¨M©w¨ä¥X²{ªº¤è¦¡¡C §A¤]¯à¦bµù¥U³¡¥ó®É´yz¤£¦PªºÄݩʽs¿è¾¹¡C¡@¡@¤Uªí¦C¥XÄÝ©Ê¥X²{¦b Object Inspectorµøµ¡¤¤ªº¤è¦¡ ¡@ ªí19.3 ÄÝ©Ê¥X²{¦bObject Inspectorµøµ¡¤¤ªº¤è¦¡¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w ÄÝ©Ê«¬¦¡¡@¡@¡@¡@¡@¡@¡@³B ²z ¤è ¦¡¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X ²³æ«¬¦¡¡@¡@ Numeric¡BCharacter©M StringÄÝ©Ê¥X²{¦bObject Inspector¤¤¡A¥Î¤á¥i ¥Hª½±µ½s¿è ªTÁ|«¬¦¡ ªTÁ|«¬¦¡ªºÄÝ©ÊÅã¥ÜȪº¤è¦¡©w¸q¦b¥N½X¤¤¡C¿ï¾Ü®É±N¥X²{¤U©Ô¡@¡@ ¦¡¦C¥Ü¤è¶ô¡AÅã¥Ü©Ò¦³ªº¥i¯à¨úÈ¡C ¶°¦X«¬¦¡ ¶°¦X«¬¦¡¥X²{¦bObject Inspectorµøµ¡¤¤®É¥¿¦p¤@Ó¶°¦X¡A®i¶}«á¡A¥Î¡@¡@¡@¡@¡@¡@¡@¡@¡@ ¤á³q¹L±N¶°¦X¤¸¯À³]¬°True©ÎFalse¨Ó¿ï¾Ü¡C ª«¥ó«¬¦¡ §@¬°ª«¥óªºÄÝ©Ê¥»¨¦³Äݩʽs¿è¾¹¡A¦pªGª«¥ó¦³¦Û¤vªºpublishedÄÝ ©Ê¡A¥Î¤á¦bObject Inspector¤¤³q¹L®i¶}ª«¥óÄݩʦC¡A¥i¥H¿W¥ß½s¿è¥¦Ì¡A ª«¥ó«¬¦¡ªºÄÝ©Ê¥²¶·±qTPersistentÄ~©Ó¡C ¼Æ¸s¸s²Õ«¬¦¡ ¼Æ¸s¸s²ÕÄÝ©Ê¥²¶·¦³¥¦Ì¦Û¤vªºÄݩʽs¿è¾¹¡AObject Inspector¨S¦³¤º´O¹ï¼Æ ¸s¸s²ÕÄݩʽs¿èªº¤ä´©¡C¡@¡@¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w ¡@3. ¤½§GÄ~©ÓªºÄÝ©Ê¡@¡@©Ò¦³³¡¥ó³£±q¯ª¥ý«¬¦¡Ä~©ÓÄÝ©Ê¡C·í§A±q¤w¦³³¡¥óÄ~©Ó®É¡A·s³¡¥ó±NÄ~©Ó¯ª¥ý«¬¦¡ªº©Ò¦³ÄÝ©Ê¡C¦pªG§AÄ~©Óªº¬O©â¶HÃþ¡A«hÄ~©ÓªºÄݩʬO protected©Îpublic¡A¦ý¤£¬Opublished¡C¦p·Q¨Ï¥Î¤á¦s¨úprotected©ÎpublicÄÝ©Ê¡A¥i¥H±N¸ÓÄÝ©Ê«©w¸q¬°published¡C¦pªG§A¨Ï¥ÎTWinControlÄ~©Ó¡A¥¦Ä~©Ó¤FCtl3DÄÝ©Ê¡A¦ý¬Oprotectedªº¡A¦]¦¹¥Î¤á¦b³]p©M°õ¦æ®É¤£¯à¦s¨úCtl3D¡A³q¹L¦b·s³¡¥ó¤¤±NCtl3D«Án©ú¬°published¡A´N§ïÅܤFCtl3Dªº¦s¨ú¯Å§O¡C¤U±ªº¥N½Xºt¥Ü¦p¦ó±NCtl3DÁn©ú¬°published¡A¨Ï¤§¦b³]p®É¥i³Q¦s¨ú¡C¡@ ¡@¡@ typeTSampleComponent=class(TWinControl) published property Ctl3D; end; ¡@4. ©w¸q³¡¥óÄÝ©Ê¡@¡@Æ« ÄݩʪºÁn©ú¡@¡@Án©ú³¡¥óªºÄÝ©Ê¡A§An´yz¡G ¡@¡´ ÄݩʦW¡@ ¡´ Äݩʪº«¬¦¡¡@¡@¡´ Ū©M³]©wÄÝ©ÊȪº¤èªk¡@ ¡@¡@¦Ü¤Ö¡A³¡¥óÄÝ©ÊÀ³·í©w¸q¦b³¡¥óª«¥óÁn©úªº public³¡¤À¡A³o¼Ë¥i¥H¦b°õ¦æ®É«Ü¤è«K¦a±q¥~³¡¦s¨ú¡F¬°¤F¯à¦b³]p®É½s¿èÄÝ©Ê¡AÀ³·í±NÄݩʦbpublished³¡¤ÀÁn©ú¡A³o¼ËÄݩʯà¦Û°ÊÅã¥Ü¦bObject Inspectorµøµ¡¤¤¡C¤U±¬O¨å«¬ªºÄÝ©ÊÁn©ú¡G¡@ ¡@¡@ typeTYourComponent=class(TComponent) ¡Kprivate FCount: Integer { ¤º³¡¦sÀxÄæ¦ì }function GetCount: Integer; { Ū¤èªk }procedure SetCount(ACount: Integer); { ¼g¤èªk }pubilic property Count: Integer read GetCount write SetCount; end; ¡@¡@¡@Ƭ ¤º³¡¼Æ¾Ú¦sÀx¡@¡@Ãö©ó¦p¦ó¦sÀxÄݩʪº¼Æ¾ÚÈ¡A Delphi¨S¦³¯S§Oªº³W©w¡A³q±`Delphi³¡¥ó¿í´`¤U¦C³W©w¡G ¡@¡´ ÄݩʼƾڦsÀx¦bª«¥óªº¼Æ¾ÚÄæ¦ì³B¡@ ¡´ Äݩʪ«¥óÄæ¦ìªº¼ÐÃѲťHF¶}ÀY¡A¨Ò¦p©w¸q¦bTControl¤¤ªºÄÝ©ÊFWidth¡@¡@¡´ Äݩʼƾڪºª«¥óÄæ¦ìÀ³Án©ú¦bprivate³¡¤À¡@ ¡@¡@«á¥N³¡¥ó¥uÀ³¨Ï¥ÎÄ~©ÓªºÄݩʦۨ¡A¦Ó¤£¯àª½±µ¦s¨ú¤º³¡ªº¼Æ¾Ú¦sÀx¡C ¡@¡@Æ ª½±µ¦s¨ú¡@¡@¨ÏÄݩʼƾڥi¥Îªº³Ì²³æªº¿ìªk¬Oª½±µ¦s¨ú¡CÄÝ©ÊÁn©úªº read ©Mwrite³¡¤À´yz¤F«ç¼Ë¤£³q¹L©I¥s¦s¨ú¤èªk¨Óµ¹¤º³¡¼Æ¾ÚÄæ¦ì½áÈ¡C¦ý¤@¯ë³£¥Îread¶i¦æª½±µ¦s¨ú¡A¦Ó¥Îwrite¶i¦æ¤èªk¦s¨ú¡A¥H§ïÅܳ¡¥óªºª¬ºA¡C¡@¡@¤U±ªº³¡¥óÁn©úºt¥Ü¤F«ç¼Ë¦bÄÝ©Ê©w¸qªº read ©Mwrite³¡¤À³£±Ä¥Îª½±µ¦s¨ú¡G¡@ ¡@¡@ typeTYourComponent=class(TComponent) ¡Kprivate { ¤º³¡¦sÀx¬O¨p¦³ }FReadOnly: Boolean; { Án©ú¦sÀÉÄÝ©ÊȪºÄæ¦ì }published { ¨ÏÄݩʦb³]p®É¥i¥Î }property ReadOnly: Boolean read FReadOnly write FReadOnly; end; ¡@ ¡@¡@Æ® ¦s¨ú¤èªk¡@¡@ÄݩʪºÁn©ú»yªk¤¹³\ÄÝ©ÊÁn©úªº read©Mwrite³¡¤À¥Î¦s¨ú¤èªk¨ú¥Nª«¥ó¨p¦³¼Æ¾ÚÄæ¦ì¡C¤£ºÞÄݩʬO¦p¦ó¹ê²{¥¦ªºread ©Mwrite³¡¤À¡A¤èªk¹ê²{À³·í¬Oprivate¡A«á¥N³¡¥ó¥u¯à¨Ï¥ÎÄ~©ÓªºÄݩʦs¨ú¡C¡@¡@Æ¡ Ū¤èªk ÄݩʪºÅª¤èªk¬O¤£±a°Ñ¼Æªº¨ç¼Æ¡A¨Ã¥Bªð¦^¦PÄݩʬۦP«¬¦¡ªºÈ¡C³q±`Ū¨ç¼Æªº¦W¦r¬O¡§Get¡¨«á¥[ÄݩʦW¡A¨Ò¦p¡AÄÝ©ÊCountªºÅª¤èªk¬OGetCount¡C¤£±a°Ñ¼Æªº°ß¤@¨Ò¥~¬O¼Æ¸s¸s²ÕÄÝ©Ê¡C¦pªG§A¤£©w¸qread¤èªk¡A«hÄݩʬO¥u¼gªº¡C¡@¡@Æ¢ ¼g¤èªk¡@¡@Äݩʪº¼g¤èªkÁ`¬O¥u±a¤@ӰѼƪº¹Lµ{¡C°Ñ¼Æ¥i¥H¬O¤Þ¥Î©ÎÈ¡C³q±`¹Lµ{¦W¬O "Set"¥[ÄݩʦW¡C¨Ò¦p¡AÄÝ©ÊCountªº¼g¤èªk¦W¬OSetCount¡C°Ñ¼ÆªºÈ±Ä¥Î³]©wÄݩʪº·sÈ¡A¦]¦¹¡A¼g¤èªk»Ýn°õ¦æ¦b¤º³¡¦sÀx¼Æ¾Ú¤¤¼gªº¾Þ§@¡C¡@¡@¦pªG¨S¦³Án©ú¼g¤èªk¡A¨º»òÄݩʬO°ßŪªº¡C ¡@¡@³q±`¦b³]©w·sÈ«en°»´ú·sȬO§_»P¥Ø«eȤ£¦P¡C ¡@¡@¤U±¬O¤@Ó²³æªº¾ã¼ÆÄÝ©Ê Countªº¼g¤èªk¡G¡@ ¡@¡@ procedure TMyComponent.SetCount( value: Integer);begin if value <>FCount then begin FCount := Value; update; end; end; ¡@ Ư ¯Ê¬ÙÄÝ©ÊÈ¡@¡@·íÁn©ú¤@ÓÄÝ©Ê¡A¯à¦³¿ï¾Ü¦aÁn©úÄݩʪº¯Ê¬ÙÈ¡C³¡¥óÄݩʪº¯Ê¬ÙȬO³¡¥óºc³y¤èªk¤¤ªºÄÝ©Êȶ°¡C¨Ò¦p¡A·í±q Component Palette¿ï¾Ü¬Y³¡¥ó¸m©óµ¡Å餤®É¡ADelphi³q¹L©I¥s³¡¥óºc³y¤èªk«Ø¥ß³¡¥ó¡A¨Ã¨M©w³¡¥óÄݩʪì©lÈ¡C¡@¡@ Delphi¨Ï¥ÎÁn©ú¯Ê¬ÙȨM©w¬O§_±NÄÝ©ÊȦs¦bDFM¤å¥ó¤¤¡C¦pªG¤£´yz¯Ê¬ÙÈ¡ADelphi±NÁ`¬O¦sÀɸÓÄÝ©ÊÈ¡CÁn©ú¯Ê¬ÙȪº¤èªk¬O¦bÄÝ©ÊÁn©ú«á¥[default«ü¥O¡A¦A¸ò¯Ê¬ÙÈ¡C¡@¡@·í«Án©ú¤@ÓÄݩʮɡA¯à°÷´yz¨S¦³¯Ê¬ÙȪºÄÝ©Ê¡C¦pªGÄ~©ÓªºÄݩʤw¦³¤@Ó¡A«h³]¥ß¨S¦³¯Ê¬ÙȪºÄݩʪº¤èªk¬O¦bÄÝ©ÊÁn©ú«á¥[ nodefault«ü¥O¡C¦pªG¬O²Ä¤@¦¸Án©úÄÝ©Ê¡A«h¨S¦³¥²n¥[nodefault«ü¥O¡A¦]¬°¨S¦³default«ü¥O§Yªí¥Ü¦p¦¹¡C¡@¡@¤U¨Ò¬O¦W¬° IsTrueªº¥¬º¸«¬¦¡Äݩʳ]©w¯Ê¬ÙÈTrueªº¹Lµ{¡G¡@ ¡@¡@ typeTSampleComponent=class(TComponent) private FIsaTrue: Boolean; pubilic constructor Create (AOwner: TComponent); Overvide; published property Istrue: Boolean read FIsTrue write FIsTrue default True; end; ¡@constructor TSampleComponent.Create (AOwner: TComponent); begin inherited Create ( Aowner); Fistvue := True; { ³]©w¯Ê¬ÙÈ }end; ¡@5. ½s¼gÄݩʽs¿è¾¹Object Inspector ´£¨Ñ©Ò¦³«¬¦¡Äݩʪº¯Ê¬Ù½s¿è¾¹¡ADelphi¤]¤ä´©³q¹L½s¼g©Mµù¥UÄݩʽs¿è¾¹ªº¤èªk¬°Äݩʳ]p¦Û¤vªº½s¿è¾¹¡C¥i¥Hµù¥U±Mªù¬°¦Û©w¸q³¡¥óªºÄݩʳ]pªº½s¿è¾¹¡A¤]¥i³]p¥Î©ó©Ò¦³¬Y«¬¦¡ªºÄÝ©Ê¡C½s¼gÄݩʽs¿è¾¹»Ýn¤U¦C¤Ó¨BÆJ¡G ¡´ Ä~©Ó¤@ÓÄݩʽs¿è¾¹ª«¥ó ¡@¡´ ±NÄݩʧ@¬°¤å¥»½s¿è¡@ ¡´ ±NÄݩʧ@¬°¾ãÅé½s¿è¡@¡@¡´ ´yz½s¿è¾¹ÄÝ©Ê ¡@¡´ µù¥UÄݩʽs¿è¾¹¡@ ¡@¡@Æ« Ä~©ÓÄݩʽs¿è¾¹ª«¥ó¡@¡@ DsgnIntf®w³æ¤¸¤¤©w¸q¤F´XºØÄݩʽs¿è¾¹¡C¥¦Ì³£¬O±qTPropertyEditorÄ~©Ó¦Ó¨Ó¡C·í«Ø¥ßÄݩʽs¿è¾¹®É¡A¥i¥Hª½±µ±qTPropertyEditor¤¤Ä~©Ó©Î±qªí¤¤ªº¥ô¤@Äݩʽs¿è¾¹¤¤Ä~©Ó¡C¡@ ¡@ ªí19.4 Äݩʽs¿è¾¹ªº«¬¦¡ ¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w ¡@¡@«¬¦¡ ½s¿èªºÄÝ©Ê ¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡XTOrdinalProperty ¡@ ¡@ ©Ò¦³¦³§ÇªºÄÝ©Ê¡]¾ã¼Æ¡B¦r¤¸¡BªTÁ|¡^TIntegerProperty ¡@ ¡@ ©Ò¦³¾ã«¬¡A¥]¬A¤l¬É«¬¦¡TCharProperty ¡@¡@ ¡@ ¦r¤¸«¬¦¡©Î¦r¤¸¤l¶°TEnumProperty ¡@¡@ ¥ô¦óªTÁ|«¬¦¡TFloatProperty ¡@¡@ ©Ò¦³¯BÂI¼ÆTStringProperty ¡@¡@ ¦r¤¸¦ê¡A¥]¬A©wªøªº¦r¤¸¦êTSetElementProperty ¶°¦X¤¤ªº¿W¥ß¤¸¯ÀTSetElementProperty ©Ò¦³ªº¶°¦X¡A¨Ã¤£¬Oª½±µ½s¿è¶°¦X«¬¦¡¡A¦Ó¬O®i¶}¦¨¤@¦C ¶°¦X¤¸¯ÀÄÝ©ÊTClassProperty ª«¥ó¡AÅã¥Üª«¥ó¦W¡A¨Ã¤¹³\ª«¥óÄݩʪº®i¶}TMethodPropevty ¤èªk«ü¼Ð¡A¥Dn«ü¨Æ¥óTComponentProperty ¬Û¦Pµ¡Å餤ªº³¡¥ó¡A¥Î¤á¤£¯à½s¿è³¡¥óªºÄÝ©Ê¡A ¦ý¯à«ü¦V¬Û®eªº³¡¥óTColorProperty ¡@¡@¡@ ³¡¥óÃC¦â¡AÅã¥ÜÃC¦â±`¼Æ¡A§_«hÅã¥Ü¤Q¤»¶i¨î¼ÆTFontNameProperty ¦r§Î¼ÐñTFontProperty ¦r§Î¡A¤¹³\®i¶}¦r§ÎªºÄݩʩμu¥X¦r§Î¹ï¸Ü¤è¶ô ¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¡@ ¡@ ¡@ ¤U±¬OTFloatPropertyEditorªº©w¸q¡G ¡@type TFloatProperty=Class(TPropertyEditor) public function AllEqual: Boolean; override; function GetValue: String; override; procedure SetValue ( Const Value: string ); override; end; ¡@ Ƭ ¶H¤å¥»¤@¼Ë½s¿èÄÝ©Ê¡@¡@©Ò¦³ªºÄݩʳ£»Ýn±N¥¦ÌªºÈ¦b Object Inspectorµøµ¡¤¤¥H¤å¥»ªº¤è¦¡Åã¥Ü¡CÄݩʽs¿è¾¹ª«¥ó´£¨Ñ¤F¤å¥»ªí²{©M¹ê»ÚȤ§¶¡Âà´«ªºµê¤èªk¡C³o¨Çµê¤èªk¬OGetValue©MSetValue¡A§AªºÄݩʽs¿è¾¹¤]¯àÄ~©Ó¤F¤@¨t¦Cªº¤èªk¥Î©óŪ©M¼g¤£¦P«¬¦¡ªºÈ¡C¨£¤Uªí¡G ¡@ ªí19.5 Ū¼gÄÝ©ÊȪº¤èªk ¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w ÄÝ©Ê«¬¦¡¡@¡@ "Get"¤èªk "Set"¤èªk ¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X ¯BÂI¼Æ GetFloatValue SetFloatVallue ¤èªk«ü¼Ð GetMethodValue SetMehodValue ¦³§Ç«¬¦¡ GetOrdValue SetOrdValue ¦r¤¸¦ê GetStrValue SetStrValue ¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w ¡@ ·íÂл\GetValue¤èªk®É¡A©I¥s¤@Ó"Get"¤èªk¡F·íÂл\SetValue¤èªk®É©I¥s¤@Ó"Set"¤èªk¡C¡@¡@Äݩʽs¿è¾¹ªº GetValue¤èªkªð¦^¤@Ó¦r¤¸¦ê¥Hªí²{¥Ø«eÄÝ©ÊÈ¡C¯Ê¬Ù±¡ªp¤UGetValueªð¦^"unknown"¡C Äݩʽs¿è¾¹ªºSetValue±µ¦¬Object Inspectorµøµ¡String«¬¦¡ªº°Ñ¼Æ¡A¨Ã±N¨äÂà´«¦¨¦X¾Aªº«¬¦¡¡A¨Ã³]©wÄÝ©ÊÈ¡C¡@¡@¤U±¬O TIntegerPropertyªºGetValue©MSetValueªº¨Ò¤l¡G ¡@function TIntegerProperty GetValue: string; begin Result := IntToStr (GetOrdValue); end; ¡@proceduve TIntegerPropertySetValue (Const Value: string); var L: Longint; begin L := StrToInt(Value); { ±N¦r¤¸¦êÂà´«¬°¼Æ¾Ç }with GetTypeData (GetPropType)^ do if ( L < Minvalue ) or ( L > MaxValue ) then Raise EPropertyError.Create (FmtloadStr(SOutOfRange, [MinValue ¡AMaxValue]));SetOrdValue (L); end; ¡@ Æ ±NÄݩʧ@¬°¤@Ó¾ãÅé¨Ó½s¿è¡@¡@ Delphi¤ä´©´£¨Ñ¥Î¤á¥H¹ï¸Ü¤è¶ôªº¤è¦¡¥iµø¤Æ¦a½s¿èÄÝ©Ê¡C³oºØ±¡ªp±`¥Î©ó¹ïª«¥ó«¬¦¡Äݩʪº½s¿è¡C¤@Ө嫬ªº¨Ò¤l¬OFontÄÝ©Ê¡A¥Î¤á¥i¥H§ä¶}Font¹ï¸Ü¤è¶ô¨Ó¿ï¾Ü¦r§ÎªºÄÝ©Ê¡C¡@¡@´£¨Ñ¾ãÅéÄݩʽs¿è¹ï¸Ü¤è¶ô¡AnÂл\Äݩʽs¿èª«¥óªº Edit¤èªk¡CEdit¤èªk¤]¨Ï¥Î"Get"©M"Set"¤èªk¡C ¡@¦b¤j¦h¼Æ³¡¥ó¤¤¨Ï¥ÎªºColorÄݩʱN¼Ð·ÇªºWindowsÃC¦â¹ï¸Ü¤è¶ô§@¬°Äݩʽs¿è¾¹¡C¤U±¬OTColorPropertyªºEdit¤èªk ¡@procedure TColorProperty.Edit var ColorDialog: TColorDialog; begin ColorDialog := TColorDialog.Create(Application); { «Ø¥ß½s¿è¾¹ }try ColorDialog.Color := GetOrdValue; { ¨Ï¥Î¤w¦³ªºÈ }if ColorDialog.Execute then ¡@ SetOrdValue (ColorDialog.Color);finally ColorDialog.Free; end; ¡@end; ¡@ Æ® ´yz½s¿è¾¹ªºÄÝ©Ê¡@¡@Äݩʽs¿è¥²¶·§i¶D Object Inspectorµøµ¡¦p¦ó±Ä¥Î¦X¾AªºÅã¥Ü¤u¨ã¡C¨Ò¦pObject Inspectorµøµ¡»Ýnª¾¹DÄݩʬO§_¦³¤lÄÝ©Ê¡A©ÎªÌ¬O§_¯àÅã¥Ü¥i¯à¨úȪº²M³æ¡C´yz½s¿è¾¹ªºÄݩʳq±`Âл\Äݩʽs¿è¾¹ªºGetAttributes¤èªk¡CGetAttributes ªð¦^TPropertyAttributes«¬¦¡ªº¶°¦X¡C¶°¦X¤¤¥]¬Aªí¤¤¥ô¦ó©Î©Ò¦³ªºÈ¡G ¡@ ªí19.6 Äݩʽs¿è¾¹¯S©º¼Ð»x ¡@¡@ ¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w ¡@¡@¼Ð»x §t ¸q ¬ÛÃö¤èªk ¡@¡@ ¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡X¡XpaValuelist ½s¿è¾¹¯àµ¹¤©¤@¸s¸s²ÕªTÁ|È GetValuespaSubPropertie Äݩʦ³¤lÄÝ©Ê GetPropertisespaDialog ½s¿è¾¹¯àÅã¥Ü½s¿è¹ï¸Ü¤è¶ô EditPaMultiSelect ·í¥Î¤á¿ï¾Ü¦h©ó¤@Ó³¡¥ó ®É¡AÄÝ©ÊÀ³¯àÅã¥Ü ¢Ü¡þ¢Ï ¡@¡@ ¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w ¡@Color ÄݩʬOÆF¬¡ªº¡A¥¦¤¹³\¦bObject Inspectorµøµ¡¤¤¥H¦hºØ¤è¦¡¿ï¾Ü¥LÌ¡C©ÎªÌÁä¤J¡A©ÎªÌ±q²M³æ¤¤¿ï¾Ü©w½s¿è¾¹¡C¦]¦¹TColorPropertyªºGetAttributes¤èªk¦bªð¦^Ȥ¤¥]§t¦hºØÄÝ©Ê¡C¡@ ¡@¡@ function TColorProperty.GetAttributes: TProrertyAttributes;begin Result := [PaMultiselect, paDialog, paValuelist]; end; ¡@ ¡@Ư µù¥UÄݩʽs¿è¾¹¡@¡@¤@¥¹«Ø¥ßÄݩʽs¿è¾¹¡A¥²¶·¦b Delphi¤¤µù¥U¡Cµù¥UÄݩʽs¿è¾¹®É¡An»P¬YºØÄݩʬÛÁp¡C¡@¡@©I¥s RegisterPropertyEditor¹Lµ{¨Óµù¥UÄݩʽs¿è¾¹¡C¸Ó¹Lµ{±µ¨ü¥|ӰѼơG¡@¡@¡´ n½s¿èªºÄݩʪº«¬¦¡¸ê°Tªº«ü¼Ð¡C³oÁ`¬O³q¹L©I¥s©I¥sTypeInfo¨ç¼Æ±o¨ì¡A¦pTypeInfo ( TMyComponent )¡@¡@¡´ ½s¿è¾¹À³¥Îªº³¡¥ó«¬¦¡¡A¦pªG¸Ó°Ñ¼Æ¬°nil«h½s¿è¾¹À³¥Î©ó©Òµ¹ªº«¬¦¡ªº©Ò¦³ÄÝ©Ê¡@¡@¡´ ÄݩʦW¡A¸Ó°Ñ¼Æ¥u¦³¦b«e¤@°Ñ¼Æ´yz¤F³¡¥óªº±¡ªp¤U¤~¥i¥Î¡@¡@¡´ ¨Ï¥Î¸ÓÄݩʽs¿è¾¹ªºÄݩʪº«¬¦¡¡@ ¡@¡@¤U±¤Þ¥Î¤Fµù¥U¼Ð·Ç³¡¥óªº¹Lµ{¡G ¡@procedure Register; begin RegisterPropertyEditor (TypeInfo(TComponent), nil, TComponentProperty, RegisterPropertyEditor(TypeInfo(TComponentName), TComponent, 'Name', (ComponentNamePropety); RegisterPropertyEditor (TypeInfo(TMenuItem), TMenu, '', TMenuItemProperty); end; ¡@ ¡@¡@³o¤T¥yªí¹F¦¡¨Ï¥ÎRegisterPropertyEditor¤TºØ¤£¦Pªº¥Îªk¡G¡@¡@¡´ ²Ä¤@ºØ³Ì¨å«¬ ¥¦µù¥U¤F¥Î©ó©Ò¦³TComponent«¬¦¡ÄݩʪºÄݩʽs¿è¾¹TComponentProperty¡C³q±`¡A·í¬°¬YºØ«¬¦¡Äݩʵù¥UÄݩʽs¿è¾¹®É¡A¥¦´N¯àÀ³¥Î©ó©Ò¦³³oºØ«¬¦¡ªºÄÝ©Ê¡A¦]¦¹¡A²Ä¤G©M²Ä¤TӰѼƬ°nil¡C¡@¡@¡´ ²Ä¤GÓªí¹F¦¡µù¥U¯S©w«¬¦¡ªºÄݩʽs¿è¾¹ ¥¦¬°¯S©w³¡¥óªº¯S©wÄݩʵù¥UÄݩʽs¿è¾¹¡A¦b³oºØ±¡ªp¤U¡A½s¿è¾¹¥Î©ó©Ò¦³³¡¥óªºNameÄÝ©Ê¡C ¡@¡´ ²Ä¤TÓªí¹F¦¡¤¶©ó²Ä¤@Ó©M²Ä¤GÓªí¹F¦¡¤§¶¡ ¥¦¬°³¡¥óTMenuªºTMenuItem«¬¦¡ªº©Ò¦³Äݩʵù¥U¤FÄݩʽs¿è¾¹¡C ¡@19.2.2.2 «Ø¥ß¨Æ¥ó¡@ ¡@¡@¨Æ¥ó¬O³¡¥óªº«Ü«nªº³¡¤À¡C¨Æ¥ó¬O³¡¥ó¥²¶·ÅTÀ³ªº¨t²Î¨Æ¥ó»PÅTÀ³¨Æ¥óªº¤@¬q¥N½XªºÁp±µ¡CÅTÀ³¥N½X³QºÙ¬°¨Æ¥ó³B²z¹Lµ{¡A¥¦Á`¬O¥Ñ³¡¥ó¥Î¤á¨Ó½s¼g¡C³q¹L¨Ï¥Î¨Æ¥ó¡AÀ³¥Î¶}µoªÌ¤£»Ýn§ïÅܳ¡¥ó¥»¨´N¯à©w¨î³¡¥óªº¦æ¬°¡C§@¬°³¡¥ó½s¼gªÌ¡A¹B¥Î¨Æ¥ó¯à¨ÏÀ³¥ÎµoªÌ©w¨î©Ò¦³ªº¼Ð·Ç Delphi³¡¥ó¡Cn«Ø¥ß¨Æ¥ó¡AÀ³·í²z¸Ñ¡G¡@ ¡´ ¤°»ò¬O¨Æ¥ó¡@ ¡´ «ç¼Ë¹ê²{¼Ð·Ç¨Æ¥ó¡@ ¡´ «ç¼Ë©w¸q¦Û¤vªº¨Æ¥ó ¡@1. ¤°»ò¬O¨Æ¥ó ¨Æ¥ó¬OÁp±µµo¥Íªº¨Æ±¡»P¬Y¨Ç¥N½Xªº¾÷¨î¡A©ÎªÌ»¡¬O¤èªk«ü¼Ð¡A¤@Ó«ü¦V¯S©wª«¥ó¹ê¨Òªº¯S©w¤èªkªº«ü¼Ð¡C±q³¡¥ó¥Î¤áªº¨¤«×¡A¨Æ¥ó¬O»P¨t²Î¨Æ¥ó(¦pOnClick)¦³Ãöªº¼Ðñ¡A¥Î¤á¯àµ¹¸Ó¨Æ¥ó½á¯S©wªº¤èªk¨Ñ©I¥s¡C¨Ò¦p¡A«ö¶sButtonl¦³OnClick¤èªk¡A¯Ê¬Ù±¡ªp¤UDelphi¦b¥]§t¸Ó«ö¶sªºµ¡Å餤²£¥Í¤@Ó¬°ButtonlClickªº¤èªk¡A¨Ã±N¨ä½áµ¹OnClick¡C·í¤@ÓClick¨Æ¥óµo¥Í¦b«ö¶s¤W®É¡A«ö¶s©I¥s½áµ¹OnClickªº¤èªkButtonlClick¡G ³¡¥ó¥Î¤á±N¨Æ¥ó¬Ý§@¬O¥Ñ¥Î¤á½s¼gªº¥N½X¡A¦Ó¨Æ¥óµo¥Í®É¥Ñ¨t²Î©I¥sªº³B²z¿ìªk¡C¡@¡@±q³¡¥ó½s¼gªÌ¨¤«×¨Æ¥ó¦³§ó¦hªº§t¸q¡C³Ì«nªº¬O´£¨Ñ¤F¤@ÓÅý¥Î¤á½s¼g¥N½XÅTÀ³¯S©w¨Æ±¡ªº³õ©Ò¡C ¡@¡@n½s¼g¤@Өƥó¡AÀ³·í²z¸Ñ¡G ¡@¡´ ¨Æ¥ó©M¤èªk«ü¼Ð¡@ ¡´ ¨Æ¥ó¬OÄÝ©Ê¡@¡@¡´ ¨Æ¥ó³B²z¹Lµ{«¬¦¡ ¡@¡´ ¨Æ¥ó³B²z¹Lµ{¬O¥i¿ïªº¡@ ¡@¡@Æ« ¨Æ¥ó¬O¤èªk«ü¼Ð¡@¡@ Delphi¨Ï¥Î¤èªk«ü¼Ð¹ê²{¨Æ¥ó¡C¤@Ó¤èªk«ü¼Ð¬O«ü¦V¯S©wª«¥ó¹ê¨Òªº¯S©w¤èªkªº¯S©w«ü¼Ð¡C§@¬°³¡¥ó½s¼gªÌ¡A¯à±N¤èªk«ü¼Ð§@¬°¤@ºØ®e¾¹¡C§Aªº¥N½X¤@µo²{¨Æ±¡µo¥Í¡A´N©I¥s¥Ñ¥Î¤á©w¸qªº¤èªk¡C¡@¡@¡@¡@¤èªk«ü¼Ðªº¤u§@¤è¦¡´N¶H¨ä¥¦ªº¹Lµ{«¬¦¡¡A¦ý¥¦Ì«O«ù¤@ÓÁô§tªº«ü¦Vª«¥ó¹ê¨Òªº«ü¼Ð¡C©Ò¦³ªº±±¨î³£Ä~©Ó¤F¤@Ó¦W¬° Clickªº¤èªk¡A¥H³B²zClick¨Æ¥ó¡CClick¤èªk©I¥s¥Î¤áªºClick¨Æ¥ó³B²z¹Lµ{¡C¡@ ¡@¡@ procedure TControl.Click;begin if Assigned(OnClick ) then OnClick( Self ); end; ¡@ ¦pªG¥Î¤áµ¹ControlªºOnClick¨Æ¥ó½á¤F³B²z¹Lµ{(Handle)¡A¨º·Æ¹«ÂI«öControl®É±N¾ÉP¤èªk³Q©I¥s¡C¡@¡@Ƭ ¨Æ¥ó¬OÄÝ©Ê¡@¡@³¡¥ó±Ä¥ÎÄݩʪº§Î¦¡¹ê²{¨Æ¥ó¡C¤£¶H¤j¦h¼Æ¨ä¥¦ÄÝ©Ê¡A¨Æ¥ó¤£¨Ï¥Î¤èªk¨Ó¨Ï¹ê²{ read©Mwrite³¡¤À¡C¨Æ¥óÄݩʨϥΤF¬Û¦P«¬¦¡ªº¨p¦³ª«¥óÄæ¦ì§@¬°ÄÝ©Ê¡C«ö¬ù©wºôÄæ¦ì¼Ðñ¦bÄݩʦW«e¥[¡§F¡¨¡C¨Ò¦pOnClick¤èªkªº«ü¼Ð¡A¦s¦bTNotifyEvent«¬¦¡FOnClickÄæ¦ì¤¤¡COnClick¨Æ¥óÄݩʪºÁn©ú¦p¤U¡G ¡@type TControl=class ( TComponent ) private FOnClick: TNofiFyEvent; { Án©ú¦sÀɤèªk«ü¼ÐªºÄæ¦ì }protected property OnClick: TNotifyEvent read FOnClick write FOnClick; end; ¡@ ¡@¶H¨ä¥¦«¬¦¡ªºÄݩʤ@¼Ë¡A§A¯à¦b°õ¦æ®É³]©w©M§ïÅܨƥóªºÈ¡C±N¨Æ¥ó°µ¦¨Äݩʪº¥Dn¦n³B¬O³¡¥ó¥Î¤á¯à¦b³]p®É¨Ï¥ÎObject Inspector³]©w¨Æ¥ó³B²z¹Lµ{¡C¡@¡@Æ ¨Æ¥ó³B²z¹Lµ{«¬¦¡¡@¡@¦]¬°¤@Өƥó¬O«ü¦V¨Æ¥ó³B²z¹Lµ{ªº«ü¼Ð¡A¦]¦¹¨Æ¥óÄÝ©Ê¥²¶·¬O¤èªk«ü¼Ð«¬¦¡¡A³Q¥Î§@¨Æ¥ó³B²z¹Lµ{ªº¥N½X¡A¥²¶·¬O¬ÛÀ³ªºª«¥óªº¤èªk¡C ¡@¡@©Ò¦³ªº¨Æ¥ó¤èªk³£¬O¹Lµ{¡C¬°¤F»P©Òµ¹«¬¦¡ªº¨Æ¥ó¬Û®e¡A¤@Өƥó³B²z¹Lµ{¥²¶·¦³¬Û¦P¼Æ¥Ø©M¬Û¦P«¬¦¡ªº¬Û¦P¶¶§Çªº°Ñ¼Æ¡C Delphi©w¸q¤F©Ò¦³¼Ð·Ç¨Æ¥ó³B²z¹Lµ{ªº¤èªk«¬¦¡¡A·í§A«Ø¥ß¦Û¤vªº¨Æ¥ó®É¡A§A¯à¨Ï¥Î¤w¦³ªº¨Æ¥ó«¬¦¡¡A©Î«Ø¥ß·sªº¡CÁöµM¤£¯à¥Î¨ç¼Æ°µ¨Æ¥ó³B²z¹Lµ{¡A¦ý¥i¥H¥Îvar°Ñ¼Æ±o¨ìªð¦^¸ê°T¡C¡@¡@¦b¨Æ¥ó³B²z¹Lµ{¤¤¶Ç»¼ var°Ñ¼Æªº¨å«¬¨Ò¤l¬OTKeyPressEvent«¬¦¡ªºKeyPressed¨Æ¥ó¡CTKeyPressEvent©w¸q¤¤§t¦³¨âӰѼơC¤@Ó«ü¥ÜþÓª«¥ó²£¥Í¸Ó¨Æ¥ó¡C¥t¤@Ó«ü¥Ü¨ºÓÁä«ö¤U¡G¡@ ¡@¡@ typeTKeyPressEvent=procedure( Sender: TObject; var key: char) of Object; ¡@ ³q±`key°Ñ¼Æ¥]§t¥Î¤á«ö¤UÁ䪺¦r¤¸¡C¦b¬Y¨Ç±¡ªp¤U¡A³¡¥óªº¥Î¤á¥i¯à·Q§ïÅܦr¤¸È¡C¨Ò¦p¦b½s¿è¾¹¤¤±j¨î©Ò¦³¦r¤¸¬°¤j¼g¡A¦b³oºØ±¡ªp¤U¡A¥Î¤á¯à©w¸q¤U¦Cªº¨Æ¥ó³B²z¹Lµ{¡G ¡@ ¡@procedure TForml.EditlKeyPressed( Sender: TObject; var key: char);begin key := Upcase( key ); end; ¡@ ¤]¥i¨Ï¥Îvar°Ñ¼ÆÅý¥Î¤áÂл\¯Ê¬Ùªº³B²z¡C¡@¡@Æ® ¨Æ¥ó³B²z¹Lµ{¬O¥i¿ïªº¡@¡@¦b¬°³¡¥ó«Ø¥ß¨Æ¥ó®Én°O¦í³¡¥ó¥Î¤á¥i¯à¨Ã¤£½s¼g¸Ó¨Æ¥óªº³B²z¹Lµ{¡C³o·N¨ýµÛ§Aªº³¡¥ó¤£¯à¦]¬°³¡¥ó¥Î¤á¨S¦³½s¼g³B²z¥N½X¦Ó¥X¿ù¡C³oºØ¨Æ¥ó³B²z¹Lµ{ªº¥i¿ï©Ê¦³¨âӤ象G ¡@ Æ¡ ³¡¥ó¥Î¤á¨Ã«D¤£±o¤£³B²z¨Æ¥ó ¨Æ¥óÁ`¬O¤£Â_¦aµo¥Í¦bWindowsÀ³¥Îµ{¦¡¤¤¡C¨Ò¦p¡A¦b³¡¥ó¤W¤è²¾°Ê·Æ¹«´N¤Þ°_Windowsµo°e¤j¶qªºMouse-Move°T®§µ¹³¡¥ó¡A³¡¥ó±N·Æ¹«°T®§¶Çµ¹OnMouseMove¨Æ¥ó¡C¦b¤j¦h¼Æ±¡ªp¤U¡A³¡¥ó¥Î¤á¤£»ÝnÃö¤ßMouseMove¨Æ¥ó¡A³o¤£·|²£¥Í°ÝÃD¡A¦]¬°³¡¥ó¤£¨Ì¿à·Æ¹«¨Æ¥óªº³B²z¹Lµ{¡C¦P¼Ë¡A¦Û©w¸q³¡¥ó¤]¤£¯à¨Ì¿à¥Î¤áªº¨Æ¥ó³B²z¹Lµ{¡C¡@ Æ¢ ³¡¥ó¥Î¤á¯à¦b¨Æ¥ó³B²z¹Lµ{¼g¥ô·Nªº¥N½X¡@¡@¤@¯ë»¡¨Ó¡A¹ï¥Î¤á¦b¨Æ¥ó³B²z¹Lµ{¤¤ªº¥N½X¨S¦³¨î¡C Delphi³¡¥ó®wªº³¡¥ó³£¤ä´©³oºØ¤è¦¡¥H¨Ï©Ò¼g¥N½X²£¥Í¿ù»~ªº¥i¯à©Ê³Ì¤p¡CÅãµM¡A¤£¯à¨¾¤î¥Î¤á¥N½X¥X²{ÅÞ¿è¿ù»~¡C¡@¡@ 2. «ç¼Ë¹ê²{¼Ð·Ç¨Æ¥ó¡@¡@ Delphi±aªº©Ò¦³±±¨îÄ~©Ó¤F¤j¦h¼ÆWindows¨Æ¥ó¡A³o¨Ç´N¬O¼Ð·Ç¨Æ¥ó¡C¾¨ºÞ©Ò¦³³o¨Ç¨Æ¥ó³£´O¦b¼Ð·Ç±±¨î¤¤¡A¦ý¥¦Ì¯Ê¬Ù¬Oprotected¡A³o·N¨ýµÛ¥Î¤áµLªk¦s¨ú¥¦Ì¡A·í«Ø¥ß±±¨î®É¡A«h¥i¿ï¾Ü³o¨Ç¨Æ¥ó¨Ï¥Î¤á¥i¥Î¡C±N³o¨Ç¼Ð·Ç¨Æ¥ó´O¤J¦Û©w¸q±±¨î»Ýn¦Ò¼{¦p¤U¡G ¡@ ¡´ ¤°»ò¬O¼Ð·Ç¨Æ¥ó¡@ ¡´ «ç¼Ë¨Ï¨Æ¥ó¥i¨£¡@ ¡´ «ç¼Ëקï¼Ð·Ç¨Æ¥ó³B²z¹Lµ{¡@ ¡@¡@Æ« ¤°»ò¬O¼Ð·Ç¨Æ¥ó¡@¡@¦³¨âºØ¼Ð·Ç¨Æ¥ó¡G¥Î©ó©Ò¦³±±¨î©M¥u¥Î©ó¼Ð·Ç Windows±±¨î¡C¡@¡@³Ì°ò¥»ªº¨Æ¥ó³£©w¸q¦bª«¥ó TControl¤¤¡Cµøµ¡±±¨î¡B¹Ï§Î±±¨î©M¦Û©w¸q±±¨î³£Ä~©Ó¤F³o¨Ç¨Æ¥ó¡A¤U±¦C¥X¥Î©ó©Ò¦³±±¨îªº¨Æ¥ó¡G¡@¡@ OnClick OnDragDrop OnEndDrag OnMouseMove ¡@OnDblClick OnDragOver OnMouseDown OnMouseUp ¡@¡@¡@©Ò¦³¼Ð·Ç¨Æ¥ó¦b TControl¤¤³£©w¸q¤F¬ÛÀ³ªºprotected°ÊºA¤èªk¡A¥u¬O¨S¦³¥[¡§On¡¨¨Ò¦pOnClick¨Æ¥ó©I¥s¦W¬°Clickªº¤èªk¡C¡@¡@¼Ð·Ç±±¨î¡]±q TWinControlÄ~©Ó¡^¨ã¦³¤U¦C¨Æ¥ó¡G ¡@OnEnter OnKeyDown OnkeyPress OnKeyUp OnExit ¡@ ¥¿¦pTControl¤¤ªº¼Ð·Ç¨Æ¥ó¡Aµøµ¡±±¨î¤]¦³¬ÛÀ³protected°ÊºA¤èªk¡C¡@¡@Ƭ «ç¼Ë¨Ï¨Æ¥ó¥i¨£¡@¡@¼Ð·Ç¨Æ¥óªºÁn©ú¬O protected¡A¦pªG·Q¨Ï¥Î¤á¦b°õ¦æ®É©Î³]p®É¯à¦s¨ú¥¦Ì¡A´N»Ýn±N¥¦Ì«Án©ú¬°public©M published¡C«Án©úÄݩʦӤ£´yz¥¦ªº¹ê²{±NÄ~©Ó¬Û¦Pªº¹ê²{¤èªk¡A¥u¬O§ïÅܤF¦s¨ú¯Å§O¡C¨Ò¦p¡A«Ø¥ß¤@Ó³¡¥ó¨Ã¨Ï¥¦ªºOnClick¨Æ¥ó¥X²{¦b°õ¦æ®É¡A§A¥i¼W¥[¤U±ªº³¡¥óÁn©ú¡G ¡@ ¡@ typeTMyControl=class(TCustomControl) published property OnClick; { ¨ÏOnClick¦bobjectinspector¤¤¥i¨£ }end; ¡@ Æ «ç¼Ëקï¼Ð·Ç¨Æ¥ó³B²z¹Lµ{¡@¡@¦pªG·Qקï¦Û©w¸q³¡¥óÅTÀ³¬YºØ¨Æ¥óªº¤èªk¡A¥i¥H«¼g¥N½X¨Ã±N¨ä½áµ¹¨Æ¥ó¡C±NÁp±µ¨CӼзǨƥ󪺤èªkÁn©úªº protected¬O¥X©ó·V±Kªº¦Ò¼{¡C³q¹L¡AÂл\¹ê²{¤èªk¡A¯àק鷺³¡¨Æ¥ó³B²z¹Lµ{¡A³q¹L©I¥sÄ~©Óªº¤èªk¡A¯à«O«ù¼Ð·Ç¨Æ¥ó³B²z¹Lµ{¡C¡@¡@©I¥sÄ~©Óªº¤èªkªº¶¶§Ç¬O«Ü«nªº¡C¤@¯ëº¥ý©I¥sÄ~©Óªº¤èªk¡A¤¹³\¥Î¤áªº¨Æ¥ó³B²z¹Lµ{¥N½X¦b§Aªº©w¨î¥N½X«e°õ¦æ¡CµM¦Ó¤]¦³¦b©I¥sÄ~©Óªº¤èªk¤§«e°õ¦æ¦Û¤vªº¥N½X±¡ªp¥X²{¡C ¡@¡@¤U±¬O¤@ÓÂл\ Click¨Æ¥óªº¨Ò¤l¡G ¡@procedure TMyControl.Click; begin inherited Click; { °õ¦æ¼Ð·Ç³B²z¡A¥]¬A©I¥s¨Æ¥ó³B²z¹Lµ{§A¦Û¤vªº©w¨î¥N½X }end; ¡@3. ©w¸q¦Û¤vªº¨Æ¥ó¡@¡@©w¸q¥þ·sªº¨Æ¥óªº±¡ªp¬O«Ü¤Ö¨£ªº¡C¥u¦³·í³¡¥óªº¦æ¬°§¹¥þ¤£¦P©ó¥ô¦ó¨ä¥¦¨Æ¥ó¤~»Ýn©w¸q·s¨Æ¥ó¡C©w¸q·s¨Æ¥ó¤@¯ë¥]§t¤TÓ¨BÆJ¡G ¡@¡@¡´ IJµo¨Æ¥ó¡@ ¡@¡´ ©w¸q³B²z¹Lµ{«¬¦¡¡@¡@ ¡´ Án©ú¨Æ¥ó ¡@¡@¡´ ©I¥s¨Æ¥ó ¡@ Æ« IJµo¨Æ¥ó¡@¡@©w¸q¦Û¤vªº¨Æ¥ón¹J¨ìªº²Ä¤@ÓÃöÁä¬O¡G·í¨Ï¥Î¼Ð·Ç¨Æ¥ó®É§A¤£»Ýn¦Ò¼{¥Ñ¤°»òIJµo¨Æ¥ó¡C¹ï¬Y¨Ç¨Æ¥ó¡A°ÝÃD¬OÅãµMªº¡C¨Ò¦p¡G¤@Ó MouseDown¨Æ¥ó¬O¦b¥Î¤á«ö¤U·Æ¹«ªº¥ªÁä®Éµo¥Í¡AWindowsµ¹À³¥Îµo°eWM_LBUTTONDOWN°T®§¡C±µ¨ì°T®§«á¡A¤@Ó³¡¥ó©I¥s¥¦ªºMouseDown¤èªk¡A¥¦¨Ì¦¸©I¥s¥Î¤áªºOnMouseDown¨Æ¥ó³B²z¹Lµ{¥N½X¡C¦ý¬O¦³¨Ç¨Æ¥ó«o¤£¬O¨º»ò¥i¥H´yz²M·¡ªº¡C¨Ò¦p¡Gºu¦æºb¦³¤@ÓOnChange¨Æ¥ó¡A¥i³Q¦UºØ±¡ªpIJµo¡A¥]¬A«öÁä¡B·Æ¹«ÂI«ö©Î¨ä¥¦«ö¨î¤¤ªº§ïÅÜ¡C·í©w¸q¨Æ¥ó®É¡A§A¥²¶·¨Ï¦UºØ±¡ªpªºµo¥Í©I¥s¥¿½Tªº¨Æ¥ó¡C¡@¡@³oùئ³ TControl³B²zWM_LBUTTONDOWN°T®§ªº¤èªk¡ADoMouseDown¬O¨p¦³ªº¹ê²{¤èªk¡A¥¦´£¨Ñ¤F¤@¯ëªº³B²z¥ª¡B¥k©M¤¤«ö¶sªº¤èªk¡A¨Ã±NWindows°T®§ªº°Ñ¼ÆÂà´«¬°MouseDown¤èªkªºÈ¡C ¡@type TControl = class(TComponent) private FOnMouseDown: TMouseEvent; procedure DoMouseDown(var Message: TWMMouse; Button: TMouseButton; Shift: TShiftState); procedure WMLButtonDown(var Message: TWMLButtonDown); message M_LBUTTONDOWN; protected procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); dynamic; end; ¡@procedure TControl.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Assigned(FOnMouseDown) then FOnMouseDown(Self, Button, Shift, X, Y); { ©I¥s¨Æ¥ó³B²z¹Lµ{ }end; ¡@procedure TControl.DoMouseDown(var Message: TWMMouse; Button: TMouseButton; Shift: ShiftState); begin with Message do MouseDown(Button, KeysToShiftState(Keys) + Shift, XPos, YPos); { ©I¥s°ÊºA¤èªk }end; ¡@procedure TControl.WMLButtonDown(var Message: TWMLButtonDown); begin inherited; { perform default handling } if csCaptureMouse in ControlStyle then MouseCapture := True; if csClickEvents in ControlStyle then Include(FControlState, csClicked); DoMouseDown(Message, mbLeft, []); { ©I¥s¶Ç²Îªºmouse-down ¤èªk }end; ¡@¡@¡@·í¨âºØ¨Æ±¡¡Ðª¬ºAÅܤƩM¥Î¤á¤¬°Ê??µo¥Í®É¡A³B²z¾÷¨î¬O¬Û¦Pªº¡A¦ý¹Lµ{µy·L¤£¦P¡C¥Î¤á¤¬°Ê¨Æ¥ó±NÁ`¬O¥Ñ Windows°T®§Ä²µo¡Cª¬ºA§ïÅܨƥó¤]»PWindows°T®§¦³Ãö¡A¦ý¥¦Ì¤]¥i¥ÑÄÝ©ÊÅܤƩΨ䥦¥N½X²£¥Í¡C§A¾Ö¦³¹ï¦Û©w¸q¨Æ¥óIJµoªº§¹¥þ±±¨î¡C Ƭ ©w¸q³B²z¹Lµ{«¬¦¡¡@¡@¤@¥¹§A¨M©w²£¥Í¨Æ¥ó¡A´Nn©w¸q¨Æ¥ó¦p¦ó³Q³B²z¡A³o´N¬On¨M©w¨Æ¥ó³B²z¹Lµ{ªº«¬¦¡¡C¦b¤j¦h¼Æ±¡ªp¤U¡A©w¸qªº¨Æ¥ó³B²z¹Lµ{ªº«¬¦¡¬O²³æªº³qª¾«¬¦¡¡] TNotifyEvent¡^©M¤w©w¸qªº¨Æ¥ó«¬¦¡¡C¡@¡@³qª¾¨Æ¥ó¥u¬O§i¶D§A¯S©wªº¨Æ¥óµo¥Í¤F¡A¦Ó¨S¦³´yz¤°»ò®ÉÔ©M¤°»ò¦a¤è¡C³qª¾¨Æ¥ó¨Ï¥Î®É¥u±a¤@Ó TObject«¬¦¡ªº°Ñ¼Æ¡A¸Ó°Ñ¼Æ¬OSender¡CµM¦Ó©Ò¦³³qª¾¨Æ¥óªº³B²z¹Lµ{³£ª¾¹D¬O¤°»ò¼Ëªº¨Æ¥óµo¥Í©Mµo¥Í¦b¨ºÓ³¡¥ó¡C¨Ò¦p¡GClick¨Æ¥ó¬O³qª¾«¬¦¡¡C·í½s¼gClick¨Æ¥óªº³B²z¹Lµ{®É¡A§Aª¾¹Dªº¬OClick¨Æ¥óµo¥Í©MþÓ³¡¥ó³QÂI«ö¤F¡C³qª¾¨Æ¥ó¬O³æ¦V¹Lµ{¡C¨S¦³´£¨Ñ¤ÏõX¾÷¨î¡C¡@¡@¦b¬Y¨Ç±¡ªp¤U¡A¥uª¾¹D¤°»ò¨Æ¥óµo¥Í©Mµo¥Í¦b¨ºÓ³¡¥ó¬O¤£°÷ªº¡C¦pªG«öÁä¨Æ¥óµo¥Í¡A¨Æ¥ó³B²z¹Lµ{©¹©¹nª¾¹D¥Î¤á«ö¤FþÓÁä¡C¦b³oºØ±¡ªp¤U¡A»Ýn¨Æ¥ó³B²z¹Lµ{¥]§t¦³Ãö¨Æ¥óªº¥²n¸ê°Tªº°Ñ¼Æ¡C¦pªG¨Æ¥ó²£¥Í¬O¬°¤FÅTÀ³°T®§¡A¨º»ò¶Ç»¼µ¹¨Æ¥óªº°Ñ¼Æ³Ì¦n¬Oª½±µ¨Ó¦Û°T®§°Ñ¼Æ¡C ¡@¡@¦]¬°©Ò¦³¨Æ¥ó³B²z¹Lµ{³£¬O¹Lµ{¡A©Ò¥H±q¨Æ¥ó³B²z¹Lµ{¤¤ªð¦^¸ê°Tªº°ß¤@¤èªk¬O³q¹L var°Ñ¼Æ¡C¦Û©w¸q³¡¥ó¥i¥H¥Î³o¨Ç¸ê°T¨M©w¦b¥Î¤á¨Æ¥ó³B²z¹Lµ{°õ¦æ«á¬O§_©M«ç¼Ë³B²z¨Æ¥ó¡C¡@¡@¨Ò¦p¡A©Ò¦³ªºÀ»Áä¨Æ¥ó (OnKeyDown¡BOnKeyUp©MOnKeyPressed)³q¹L¦W¬°keyªºvar°Ñ¼Æ¶Ç»¼ÁäÈ¡C¬°¤F¨ÏÀ³¥Îµ{¦¡¬Ý¨£¥]§t¦b¨Æ¥ó¤¤ªº¤£¦PªºÁä¡A¨Æ¥ó³B²z¹Lµ{¥i¥H§ïÅÜkeyÅܼÆÈ¡C ¡@ Æ Án©ú¨Æ¥ó¡@¡@¤@¥¹§A¨M©w¤F¨Æ¥ó³B²z¹Lµ{ªº«¬¦¡¡A§A´Nn·Ç³ÆÁn©ú¨Æ¥óªº¤èªk«ü¼Ð©MÄÝ©Ê¡C¬°¤FÅý¥Î¤á©ö©ó²z¸Ñ¨Æ¥óªº¥\¯à¡AÀ³·íµ¹¨Æ¥ó¤@Ó¦³·N¸qªº¦W¦r¡A¦Ó¥BÁÙn»P³¡¥ó¤¤¬Û¦üªºÄݩʪº¼Ðñ«O«ù¤@P¡C ¡@¡@ Delphi¤¤©Ò¦³¼Ð·Ç¨Æ¥óªº¼Ðñ³£¥H¡§On¡¨¶}ÀY¡C³o¥u¬O¥X©ó¤è«K¡A½sĶ¾¹¨Ã¤£±j¨î¥¦¡CObject Inspector¬O¬ÝÄÝ©Ê«¬¦¡¨Ó¨M©wÄݩʬO§_¬O¨Æ¥ó¡A©Ò¦³ªº¤èªk«ü¼ÐÄݩʳ£³Q¬Ý§@¨Æ¥ó¡A¨Ã¥X²{¦b¨Æ¥ó¶¤¤¡C Æ® ©I¥s¨Æ¥ó¡@¡@¤@¯ë»¡¨Ó¡A³Ì¦n±N©I¥s¶°¤¤¦b¨Æ¥ó¤W¡C´N¬O»¡¦b³¡¥ó¤¤«Ø¥ß¤@Óµê¤èªk¨Ó©I¥s¥Î¤áªº¨Æ¥ó³B²z¹Lµ{©M´£¨Ñ¥ô¦ó¯Ê¬Ù³B²z¡C·í©I¥s¨Æ¥ó®É¡AÀ³¦Ò¼{¥H¤U¨âÂI¡G ¡@¡@¡´ ¥²¶·¤¹³\ªÅ¨Æ¥ó ¡´ ¥Î¤á¯àÂл\¯Ê¬Ù³B²z ¡@ ¤£¯à¤¹³\¨ÏªÅ¨Æ¥ó³B²z¹Lµ{²£¥Í¿ù»~ªº±¡ªp¥X²{¡C´N¬O»¡¡A¦Û©w¸q³¡¥óªº¥¿±`¥\¯à¤£¯à¨Ì¿à¨Ó¦Û¥Î¤á¨Æ¥ó³B²z¹Lµ{ªºÅTÀ³¡C¹ê»Ú¤W¡AªÅ¨Æ¥ó³B²z¹Lµ{À³·í²£¥Í»PµL¨Æ¥ó³B²z¹Lµ{¤@¼Ëªºµ²ªG¡C¡@¡@³¡¥ó¤£À³·ín¨D¥Î¤á¥H¯S®í¤è¦¡¨Ï¥Î¥¦Ì¡C¬JµM¤@ӪŨƥó³B²z¹Lµ{À³·í»PµL¨Æ¥ó³B²z¹Lµ{¤@¼Ë°Ê§@¡A¨º»ò©I¥s¥Î¤á¨Æ¥ó³B²z¹Lµ{ªº¥N½XÀ³·í¶H³o¼Ë¡G ¡@ ¡@¡@ if Assigned(OnClick) then OnClick(Self);{ °õ¦æ¯Ê¬Ù³B²z } ¡@ ¦Ó¤£À³¸Ó¦³³o¼Ëªº¥N½X¡G ¡@if Assigned(OnClick) then OnClick(Self) else ¡K; { °õ¦æ¯Ê¬Ù³B²z } ¡@¡@¡@¹ï©ó¬Y¨ÇºØÃþªº¨Æ¥ó¡A¥Î¤á¥i¯à·Q¨ú¥N¯Ê¬Ù³B²z¬Æ¦Ü¸Ñ°£©Ò¦³ªºÅTÀ³¡C¬°¤ä´©¥Î¤á¹ê²{³oºØ¥\¯à¡A§A»Ýn¶Ç»¼ var°Ñ¼Æµ¹¨Æ¥ó³B²z¹Lµ{¡A¨Ã¦b¨Æ¥ó³B²z¹Lµ{ªð¦^®É°»´ú¬YÓÈ¡CªÅ¨Æ¥ó³B²z¹Lµ{»PµL¨Æ¥ó³B²z¹Lµ{¦³¬Û¦P§@¥Î¡C¦]¬°ªÅ¨Æ¥ó³B²z¹Lµ{¤£·|§ïÅÜ¥ô¦óvar°Ñ¼ÆÈ¡C©Ò¥H¯Ê¬Ù³B²zÁ`¬O¦b©I¥sªÅ¨Æ¥ó³B²z¹Lµ{«áµo¥Í¡C¡@¡@¨Ò¦p¦b³B²z Key-Press¨Æ¥ó¡A¥Î¤á¥i¥H³q¹L±Nvar°Ñ¼ÆkeyªºÈ³]©w¬°ªÅ¦r¤¸(#0)¨ÓÀ£¨î³¡¥óªº¯Ê¬Ù³B²z¡A¥N½X¦p¤U¡G¡@ ¡@¡@ if Assigned(OnkeyPress) then OnkeyPress(Self key);if key <> #0 then { °õ¦æ¯Ê¬Ù³B²z } ; ¡@ ¹ê»Úªº¥N½X±N»P³oµy¦³¤£¦P¡A¦]¬°¥¦¥u³B²zµøµ¡°T®§¡A¦ý³B²zÅÞ¿è¬O¬Û¦Pªº¡C¦b¯Ê¬Ù±¡ªp¤U¡A³¡¥ó¥ý©I¥s¥ô¦ó¥Î¤á½á¤©ªº¨Æ¥ó³B²z¹Lµ{¡AµM«á°õ¦æ¼Ð·Ç³B²z¡C¦pªG¥Î¤áªº¨Æ¥ó³B²z¹Lµ{±Nkey³]¬°ªÅ¡A«h³¡¥ó¸õ¹L¯Ê¬Ù³B²z¡C ¡@19.2.2.3 ³B²z°T®§¡@ ¡@¡@¦b¶Ç²Î Windowsµ{¦¡³]p¤¤¡A¤@Ó«ÜÃöÁ䪺¤è±¬O³B²zWindowsµo°eµ¹À³¥Îµ{¦¡ªº°T®§¡CDelphi¤w¸gÀ°§A³B²z¤F¤j¦h¼Æªº´¶³q°T®§¡A¦ý¬O¦b«Ø¥ß³¡¥óªº¹Lµ{¤¤¦³¥i¯àDelphi¨S¦³³B²z¤èªk¡A±o¥Ñ¦Û¤v³B²z°T®§¡A¤]¥i¯à«Ø¥ß¤F·sªº°T®§»Ýn³B²z¥¦Ì¡C¡@¡@¾Ç²ß´x´¤ Delphiªº°T®§³B²z¡An´x´¤¥H¤U¤TӤ象G ¡@¡´ ²z¸Ñ°T®§³B²z¨t²Î ¡´ קï(§ïÅÜ)°T®§³B²z¤èªk ¡´ «Ø¥ß·sªº°T®§³B²z¤èªk ¡@1. ²z¸Ñ°T®§³B²z¨t²Î¡@¡@©Ò¦³ªº Delphiª«¥ó¤º³¡¨ã¦³³B²z°T®§ªº¾÷¨î¡A¦p©I¥s°T®§³B²z¤èªk©Î°T®§³B²z¹Lµ{¡C°T®§³B²zªº°ò¥»«ä·Q¬Oª«¥ó±µ¦¬¬YºØ°T®§¨Ã¬£°e¥¦Ì¡A³o¬O³q¹L©I¥s»P±µ¦¬ªº°T®§¬ÛÀ³ªº¤èªk¨Ó¹ê²{ªº¡A¦pªG¨S¦³¬ÛÀ³©ó°T®§ªº«ü©wªº¤èªk¡A¨º´N©I¥s¯Ê¬Ù³B²z¡C¤U±ªº¹Ï¸Ñªí¥Ü°T®§¬£°e¨t²Î¡GDelphi ³¡¥ó®w©w¸q¤F±N©Ò¦³Windows°T®§(¥]¬A¥Î¤á¦Û©w¸q°T®§)ª½±µÂà´«¨ìª«¥ó¤èªk©I¥sªº°T®§¬£°e¨t²Î¡C¤@¯ë¨S¦³¥²n§ïÅܳoºØ°T®§¬£°e¨t²Î¡A¥un«Ø¥ß°T®§³B²z¤èªk¡C¡@¡@Æ« Windows°T®§¤¤¦³¤°»ò?Windows °T®§¬O¥]§tY¤z¦³¥ÎªºÄæ¦ìªº¼Æ¾Ú°O¿ý¡C°O¿ý¤¤³Ì«nªº¬O¤@Ӿ㫬¤j¤pªºÈ¡A¸ÓȼÐÃÑ°T®§¡CWindows©w¸q¤F¤j¶qªº°T®§¡C®w³æ¤¸MessagesÁn©ú¤F©Ò¦³°T®§ªº¼ÐÃÑ¡C°T®§¤¤¨ä¥¦ªº¦³¥Î¸ê°T¥]¬A¨âÓÄæ¦ì°Ñ¼Æ©Mµ²ªGÄæ¦ì¡C¨âӰѼƤÀ§O¬O16¦ì©M32¦ìªº¡CWindows¥N½XÁ`¬O¥HwParam©MlParam¨Ó¤Þ¥Î¥¦Ì¡C¡@¡@³Ìªì¡A Windowsµ{¦¡û¤£±o¤£°O¦í¥]§tªº¨C¤@ӰѼơC²{¦b¡A·L³n¤½¥q¤w¸g©R¦W¤F³o°Ñ¼Æ¡C³o¼Ë²z¸Ñ¦ñÀH³o¨Ç°T®§ªº¸ê°T´N§ó²³æ¤F¡C¨Ò¦p¡AWM_KEYDOWN°T®§ªº°Ñ¼Æ³QºÙ¬°vkey©Mkeydata¡A³o´N¤ñwParam©MlParamµ¹¥X¤F§ó¦hªº´yz¸ê°T¡C¡@¡@ Delphi¬°¤£¦P«¬¦¡ªº°T®§©w¸q¤F«ü©wªº°O¿ý«¬¦¡¡C¦p·Æ¹«°T®§¦blong°Ñ¼Æ¤¤¶Ç»¼·Æ¹«¨Æ¥óªºx¡By®y¼Ð¡A¤@Ó¦b°ª¦r¡A¤@Ó¦b§C¦r¡C¨Ï¥Î·Æ¹«°T®§°O¿ý¡A§A¤£»Ýn¦Û¤vÃö¤ßþÓ¦r¬OþÓ®y¼Ð¡A¦]¬°¤Þ¥Î³o¨Ç°Ñ¼Æ®É³q¹L¦W¤lXpos©MYpos¨ú¥N¤FlParamLo©MlParamHi¡C¡@¡@Ƭ ¬£°e¤èªk¡@¡@·íÀ³¥Îµ{¦¡«Ø¥ßµøµ¡®É¡A¦b Windows Kernel¤¤µù¥U¤F¤@Óµøµ¡¹Lµ{¡Cµøµ¡¹Lµ{¬O³B²zµøµ¡°T®§ªº¨ç¼Æ¡C¶Ç²Î¤W¡Aµøµ¡¹Lµ{¥]¬A¤FCaseªí¹F¦¡¡Aªí¹F¦¡ªº¨CÓ¤J¤f¬Oµøµ¡n³B²zªº¨C¤@±ø°T®§¡C·í§A¨C¦¸«Ø¥ßµøµ¡®É¡A¥²¶·«Ø¥ß§¹¾ãªºµøµ¡¹Lµ{¡C¡@¡@ Delphi¦b¤U¦C¤T¤è±Â²¤Æ¤F°T®§¬£°e¡G¡@¡@¡´ ¨CÓ³¡¥óÄ~©Ó¤F§¹¾ãªº°T®§¬£°e¨t²Î ¡´ ¬£°e¨t²Î¨ã¦³¯Ê¬Ù³B²z¡C¥Î¤á¥u»Ý©w¸q·QÅTÀ³ªº°T®§ªº³B²z¤èªk ¡´ ¥i¥Hקï°T®§³B²zªº¤@³¡¤À¡A¨Ì¾aÄ~©Óªº¤èªk§¹¦¨¤j¦h¼Æ³B²z ¡@ ³oºØ°T®§¬£°e¨t²Îªº³Ì¤jÀuÂI¬O¥Î¤á¯à¦b¥ô¦ó®ÉÔ¦w¥þ¦aµo°e¥ô¦ó°T®§µ¹¥ô¦ó³¡¥ó¡C¦pªG³¡¥ó¨S¦³¬°¸Ó°T®§©w¸q³B²z¤èªk¡A¨º¯Ê¬Ù³B²z¤èªk·|¸Ñ¨M³oÓ°ÝÃD¡A³q±`¬O©¿²¤¥¦¡C¡@¡@ Delphi¬°À³¥Îµ{¦¡¨CºØ«¬¦¡ªº³¡¥óµù¥U¤F¦W¬°MainWndProcªº¤èªk§@¬°µøµ¡¹Lµ{¡CMainWndProc¥]§t¤F²§±`³B²z¶ô¡A¥¦§¹¦¨±qWindows¨ì¦W¬°WndProcªºµê¤èªkÂà°e°T®§°O¿ý¡A¨Ã¥B³q¹L©I¥sÀ³¥Îµ{¦¡ª«¥óªºHandleException¤èªk³B²z²§±`¡C¡@¡@ MainWndProc¬OÀRºA¤èªk¡A¨S¦³¥]§t¥ô¦ó°T®§ªº«ü©w³B²z¤èªk¡C©w¨î¹Lµ{µo¥Í¦bWndProc¤¤¡A¦]¬°¨CÓ³¡¥ó«¬¦¡³£¯àÂл\¸Ó¤èªk¥H¾A¦X¯S©wªº»Ýn¡C¡@¡@ WndProc¤èªk¬°¨CÓ¼vÅT¥¦Ì³B²zªº¥ô¦ó±ø¥ó¶i¦æÀˬd¡A¥H®·®»¤£nªº°T®§¡C¨Ò¦p¡A·í³Q©ì°Ê®É¡A³¡¥ó©¿²¤Áä½L¨Æ¥ó¡A¦]¦¹¡ATWinControlªºWndProc¥u¦b¨S¦³©ì°Ê®ÉÂà°eÁä½L¨Æ¥ó¡C³Ì«áWndProc©I¥sDispatch¤èªk¡A¸Ó¤èªk¬O±qTObjectÄ~©Ó¨ÓªºÀRºA¤èªk¡A¨M©w¤°»ò¤èªk¨Ó³B²z°T®§¡C¡@¡@ Dispatch¨Ï¥Î°T®§°O¿ýªºMsgÄæ¦ì¨Ó¨M©w«ç¼Ë¬£°e¯S©w°T®§¡C¦pªG³¡¥ó¤w¸gµ¹¸Ó°T®§©w¸q¤F³B²z¤èªk¡A«hDispatch©I¥s¸Ó¤èªk¡A¤Ï¤§¡ADispatch©I¥s¯Ê¬Ù³B²z¤èªk¡C¡@¡@ 2. §ïÅÜ°T®§³B²z¤èªk¡@¡@¦b§ïÅܦ۩w¸q³¡¥óªº°T®§³B²z¤èªk¤§«e¡A¥ýn§Ë²M·¡§A¯u¥¿·Qn°µ¤°»ò¡C Delphi±N¤j¦h¼ÆªºWindows°T®§Âà´«¦¨³¡¥ó½s¼gªÌ©M³¡¥ó¥Î¤á³£¯à³B²zªº¨Æ¥ó¡C¤@¯ë¨Ó»¡¡A§AÀ³·í§ïÅܨƥó³B²z¦æ¬°¦Ó¤£¬O§ïÅÜ°T®§³B²z¦æ¬°¡C ¬°¤F§ïÅÜ°T®§³B²z¦æ¬°¡AnÂл\°T®§³B²z¤èªk¡C¤]¯à´£¨Ñ®·Àò°T®§¨¾¤î³¡¥ó³B²z¸Ó°T®§¡C Æ« Âл\³B²z¤èªk ¬°¤F§ïÅܳ¡¥ó³B²z¯S©w°T®§ªº¤èªk¡AnÂл\¨ºÓ°T®§ªº³B²z¤èªk¡C¦pªG³¡¥ó¤£³B²z¸Ó°T®§¡A§A´N»ÝnÁn©ú·sªº°T®§³B²z¤èªk¡C ¬°¤FÂл\°T®§³B²z¤èªk¡An¦b³¡¥ó¤¤¥H¬Û¦Pªº°T®§¯Á¤ÞÁn©ú·sªº¤èªk¡C¤£n¨Ï¥Îoverride«ü¥O¡A§A¥²¶·¨Ï¥ÎMessage«ü¥O©M¬ÛÀ³ªº°T®§¯Á¤Þ¡C¡@¡@¨Ò¦p¡A¬°¤FÂл\¤@Ó³B²z WM_PAINT°T®§ªº¤èªk¡A§An«Án©úWMPaint¤èªk: ¡@type TMyComponent=class( ¡K)procedure WMPaint(var Message: TWMPaint); message WM_PAINT; end; ¡@ Ƭ ¨Ï¥Î°T®§°Ñ¼Æ¡@¡@¦b°T®§³B²z¤èªk¤º³¡¡A¦Û©w¸q³¡¥ó¦s¨ú°T®§°O¿ýªº©Ò¦³°Ñ¼Æ¡C¦]¬°°T®§Á`¬O var°Ñ¼Æ¡A¦pªG»Ýnªº¸Ü¡A¨Æ¥ó³B²z¹Lµ{¥i¥H§ïÅܰѼƪºÈ¡CResultÄæ¦ì¬O¸g±`§ïÅܪº°Ñ¼Æ¡CResult¬OWindows¤åÀɤ¤©Ò«üªº°T®§ªºªð¦^È¡G¥ÑSendMessageªð¦^¡C¡@¡@¦]¬°°T®§³B²z¤èªkªº°T®§°Ñ¼Æªº«¬¦¡ÀHµÛ³Q³B²zªº°T®§ªºÅܤƦÓÅܤơA©Ò¥HÀ³·í°Ñ¦Ò Windows°T®§¤åÀɤ¤ªº°Ñ¼Æªº¦W¦r©M§t¸q¡C¦pªG¥X©ó¬YºØì¦]n¨Ï¥Î·®æªº°T®§°Ñ¼Æ(wParam¡BlParam)¡A¥i¥H°t¦X¤@¯ëªº«¬¦¡TMessage¨Ó¨M©wMessage¡C¡@¡@Æ ®·Àò°T®§¡@¡@¦b¬YºØ±¡ªp¤U¡A§A¥i¯à§Æ±æ¦Û©w¸q³¡¥ó¯à©¿²¤¬YºØ°T®§¡C´N¬O»¡¡Aªý¤î³¡¥ó±N¸Ó°T®§¬£°eµ¹¥¦ªº³B²z¤èªk¡C¬°¤F¨º¼Ë¨Ó®·Àò°T®§¡A¥i¥HÂл\µê¤èªk WndProc¡C¡@¡@ WndProc¤èªk¦b±N°T®§¶Çµ¹Dispatch¤èªk«e«Ì½ª¸Ó°T®§¡C¥¦¨Ì¦¸¨M©wþ¤@Ó¤èªk¨Ó³B²z°T®§¡C³q¹LÂл\WndProc¡A³¡¥ó±o¨ì¤F¬£°e°T®§¤§«e¹LÂo¥¦Ìªº¾÷·|¡C¡@¡@³q±`¡A¶H¤U±³o¼ËÂл\ WndProc¡G ¡@procedure TMyControl.WndProc(var Message: TMessage); begin { ¨M©w¬O§_Ä~Äò³B²z¹Lµ{ }inherited WndProc (Message); end; ¡@ ¤U±ªº¥N½X¬OTControlªºWndProcªº¤@³¡¤À¡CTControl©w¸q¾ãÓ½d³ò¤ºªº·Æ¹«°T®§¡A·í¥Î¤á©ì°Ê©M©ñ¸m±±¨î®É¡A¥¦Ì±N³QÂo¹L¡C¡@ ¡@¡@ procedure TControl WndProc(var Message:TMessage);begin if (Message.Msg >= WM_MOVSEFIRST) and (Message.Msg <= WM_MOUSELAST) then if Dragging then DragMouseMsg(TWMMOUSE(Message)) { ³B²z©ì°Ê }else ¡K¡@¡@¡@{ ¥¿±`³B²z¨ä¥¦ } ¡K¡@¡@¡@{ §_«h¥¿±`³B²z }end; |
«á¤@¶ «e¤@¶ ¦^¥Ø¿ý ¦^º¶ |