«á¤@­¶
«e¤@­¶
¦^¥Ø¿ý
¦^­º­¶
²Ä¤Q¤E³¹¡@Delphi¦Û©w¸q³¡¥ó¶}µo¡]¤G¡^

19.2.2 Delphi³¡¥óµ{¦¡³]­p¡@

19.2.2.1 «Ø¥ßÄÝ©Ê¡@

¡@ÄÝ©Ê¡]Property¡^¬O³¡¥ó¤¤³Ì¯S®íªº³¡¤À¡A¥D­n¦]¬°³¡¥ó¥Î¤á¦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²{¦bObject 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³¡¥ó®É´y­z¤£¦PªºÄݩʽs¿è¾¹¡C

¡@¡@¤Uªí¦C¥XÄÝ©Ê¥X²{¦bObject 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Ä~©ÓªºÄݩʬOprotected©Î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

¡@

¡@¡@type

TSampleComponent=class(TWinControl)

published

property Ctl3D;

end;

¡@

4. ©w¸q³¡¥óÄÝ©Ê

¡@¡@Æ« ÄݩʪºÁn©ú

¡@¡@Án©ú³¡¥óªºÄÝ©Ê¡A§A­n´y­z¡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

¡@

¡@¡@type

TYourComponent=class(TComponent)

¡K

private

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Äݩʪº¼Æ¾Ú­È¡ADelphi¨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³¡¤À´y­z¤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

¡@

¡@¡@type

TYourComponent=class(TComponent)

¡K

private { ¤º³¡¦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­È«e­n°»´ú·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·í±qComponent 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¤£´y­z¯Ê¬Ù­È¡ADelphi±NÁ`¬O¦sÀɸÓÄÝ©Ê­È¡CÁn©ú¯Ê¬Ù­Èªº¤èªk¬O¦bÄÝ©ÊÁn©ú«á¥[default«ü¥O¡A¦A¸ò¯Ê¬Ù­È¡C

¡@¡@·í­«Án©ú¤@­ÓÄݩʮɡA¯à°÷´y­z¨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

¡@

¡@¡@type

TSampleComponent=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¿è

¡@¡@¡´ ´y­z½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¡X

TOrdinalProperty¡@ ¡@ ©Ò¦³¦³§ÇªºÄÝ©Ê¡]¾ã¼Æ¡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¥D­n«ü¨Æ¥ó

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¥¦­Ìªº­È¦bObject 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­±¬OTIntegerPropertyªº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¿è¹ï¸Ü¤è¶ô¡A­nÂл\Äݩʽ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;

¡@

Æ® ´y­z½s¿è¾¹ªºÄÝ©Ê

¡@¡@Äݩʽs¿è¥²¶·§i¶DObject Inspectorµøµ¡¦p¦ó±Ä¥Î¦X¾AªºÅã¥Ü¤u¨ã¡C¨Ò¦pObject Inspectorµøµ¡»Ý­nª¾¹DÄݩʬO§_¦³¤lÄÝ©Ê¡A©ÎªÌ¬O§_¯àÅã¥Ü¥i¯à¨ú­Èªº²M³æ¡C´y­z½s¿è¾¹ªºÄݩʳq±`Âл\Äݩʽs¿è¾¹ªºGetAttributes¤èªk¡C

GetAttributesªð¦^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¡X

paValuelist ½s¿è¾¹¯àµ¹¤©¤@¸s¸s²ÕªTÁ|­È GetValues

paSubPropertie Äݩʦ³¤lÄÝ©Ê GetPropertises

paDialog ½s¿è¾¹¯àÅã¥Ü½s¿è¹ï¸Ü¤è¶ô Edit

PaMultiSelect ·í¥Î¤á¿ï¾Ü¦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¥²¶·¦bDelphi¤¤µù¥U¡Cµù¥UÄݩʽs¿è¾¹®É¡A­n»P¬YºØÄݩʬÛÁp¡C

¡@¡@©I¥sRegisterPropertyEditor¹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¤@°Ñ¼Æ´y­z¤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³¡¥ó¡C­n«Ø¥ß¨Æ¥ó¡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¨Æ¥ó°µ¦¨Äݩʪº¥D­n¦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¶¶§Çªº°Ñ¼Æ¡CDelphi©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

¡@

¡@¡@type

TKeyPressEvent=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¦³­­¨î¡CDelphi³¡¥ó®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

¡@

¡@¡@©Ò¦³¼Ð·Ç¨Æ¥ó¦bTControl¤¤³£©w¸q¤F¬ÛÀ³ªºprotected°ÊºA¤èªk¡A¥u¬O¨S¦³¥[¡§On¡¨¨Ò¦pOnClick¨Æ¥ó©I¥s¦W¬°Clickªº¤èªk¡C

¡@¡@¼Ð·Ç±±¨î¡]±qTWinControlÄ~©Ó¡^¨ã¦³¤U¦C¨Æ¥ó¡G

¡@OnEnter OnKeyDown OnkeyPress OnKeyUp OnExit

¡@

¥¿¦pTControl¤¤ªº¼Ð·Ç¨Æ¥ó¡Aµøµ¡±±¨î¤]¦³¬ÛÀ³protected°ÊºA¤èªk¡C

¡@¡@Ƭ «ç¼Ë¨Ï¨Æ¥ó¥i¨£

¡@¡@¼Ð·Ç¨Æ¥óªºÁn©ú¬Oprotected¡A¦pªG·Q¨Ï¥Î¤á¦b°õ¦æ®É©Î³]­p®É¯à¦s¨ú¥¦­Ì¡A´N»Ý­n±N¥¦­Ì­«Án©ú¬°public©M published¡C­«Án©úÄݩʦӤ£´y­z¥¦ªº¹ê²{±NÄ~©Ó¬Û¦Pªº¹ê²{¤èªk¡A¥u¬O§ïÅܤF¦s¨ú¯Å§O¡C¨Ò¦p¡A«Ø¥ß¤@­Ó³¡¥ó¨Ã¨Ï¥¦ªºOnClick¨Æ¥ó¥X²{¦b°õ¦æ®É¡A§A¥i¼W¥[¤U­±ªº³¡¥óÁn©ú¡G

¡@

¡@ type

TMyControl=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´y­z²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´N­n©w¸q¨Æ¥ó¦p¦ó³Q³B²z¡A³o´N¬O­n¨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¦³´y­z¤°»ò®É­Ô©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¹Lvar°Ñ¼Æ¡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´N­n·Ç³ÆÁ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²zKey-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¡A­n´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²Î¡G

Delphi³¡¥ó®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¥u­n«Ø¥ß°T®§³B²z¤èªk¡C

¡@¡@Æ«Windows°T®§¤¤¦³¤°»ò?

Windows°T®§¬O¥]§t­Y¤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

¡@¡@³Ìªì¡AWindowsµ{¦¡­û¤£±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ªº´y­z¸ê°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¦bWindows 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¥¿·Q­n°µ¤°»ò¡CDelphi±N¤j¦h¼ÆªºWindows°T®§Âà´«¦¨³¡¥ó½s¼gªÌ©M³¡¥ó¥Î¤á³£¯à³B²zªº¨Æ¥ó¡C¤@¯ë¨Ó»¡¡A§AÀ³·í§ïÅܨƥó³B²z¦æ¬°¦Ó¤£¬O§ïÅÜ°T®§³B²z¦æ¬°¡C

¬°¤F§ïÅÜ°T®§³B²z¦æ¬°¡A­nÂл\°T®§³B²z¤èªk¡C¤]¯à´£¨Ñ®·Àò°T®§¨¾¤î³¡¥ó³B²z¸Ó°T®§¡C

Æ« Âл\³B²z¤èªk

¬°¤F§ïÅܳ¡¥ó³B²z¯S©w°T®§ªº¤èªk¡A­nÂл\¨º­Ó°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¡A­n¦b³¡¥ó¤¤¥H¬Û¦Pªº°T®§¯Á¤ÞÁn©ú·sªº¤èªk¡C¤£­n¨Ï¥Îoverride«ü¥O¡A§A¥²¶·¨Ï¥ÎMessage«ü¥O©M¬ÛÀ³ªº°T®§¯Á¤Þ¡C

¡@¡@¨Ò¦p¡A¬°¤FÂл\¤@­Ó³B²zWM_PAINT°T®§ªº¤èªk¡A§A­n­«Á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®§Á`¬Ovar°Ñ¼Æ¡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Âл\µê¤èªkWndProc¡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¤@­¶
¦^¥Ø¿ý
¦^­º­¶