1000copy@gmail.com

»¶Ó­À´µ½1000copy@gmail.com>>¡¡¡¡ | Ê×Ò³ ×ÊÔ´ÖÐÐÄ | ÔĶÁ | Python | רÀ¸Ñ§Ï°technet ϵÁÐ¿Î³Ì | ¸öÈËÄ¿±ê | ¼ÒÈË | ÍæÀÖ | ¼¼Êõ | ITPUBÂÛ̳

°á¼ÒÁË¡£

·¢±íÈË:1000copy | ·¢±íʱ¼ä: 2007Äê°ËÔÂ26ÈÕ, 11:41

°áµ½1000copy.spaces.live.com

×Ô¼ÝÓΣº±ä»¯ºÍ¹ÊÊÂ

·¢±íÈË:1000copy | ·¢±íʱ¼ä: 2007ÄêÎåÔÂ18ÈÕ, 15:03

×Ô¼ÝÓÎÊÇÓɺܶàµÄÐÁ¿à£¬ºÍÉÙÁ¿µÄ¾ªÆæ£¬±ä»¯¹¹³ÉµÄ¡£ÕýÊÇÒòΪºóÕߣ¬²Å»áÓкܶàÈËÑ¡Ôñ"ÔÚ·ÉÏ".

ÒÔÎÒ×Ô¼ºÈ¥ÇຣΪÀý£¬ÊÂǰ²éÕÒΪÀý£º¹ØÐĵľÍÊÇÄÇÐ©Â·ÌØ±ðÀã¬ÄÇÐ©Â·ÌØ±ðºÃ£¬¿ÉÒÔ¿ªÐжà¿ìµÄËÙ¶È£¬
ÓÐÊ²Ã´ÌØ±ðµÄÈËÇé·çÍÁ£¬Õâô³¤Í¾µÄ·£¬ÆäÖÐÓÐÏ൱һ²¿·ÖÊǺÜÊìϤµÄ¡£²»ÐèҪ̫¶àÁ˽⣬
±ÈÈçÕâ¸ö¸ßËÙÄǸö¸ßËÙ£¬Ã»ÓÐʲô˵µÄ£¬Ò²ÊÇ×î·¦ÉÆ¿É³ÂµÄ¡£

È»ºóÕýƬ¿ªÊ¼£¬Ò»Çж¼°éËæ×ÅÔÚ·É϶øÕ¹¿ª¡£

±ÈÈçÇຣ¼âÔúµ½ÏĺÓһ·µÄ¼èÐÁ£¬ºÍÒ»Ö±Åã°é×ÅÎÒÃǵĻƺÓ
±ÈÈçÀöɯ·¹µêµÄËáÄ̺ÍǽÉϵÄÌùͼ
±ÈÈç·ÉÏÓöµ½Ó­½Ó»î·ð£¬ÑÓÐøÁ˼¸Ê®¹«À»¨Ö¦ÕÐÕ¹µÄ²ØÃñ
±ÈÈçÔÚ¸ßÔ­µÄÀ¶Ìì°×ÔÆÏ£¬±ÊÖ±µÄ·ÉÏ£¬°ÑССµÄ¸»¿µ¿ªµ½190¹«ÀȻºó´óºð´ó½Ð¡£
±ÈÈ籬̥ºóÓÐûÓб¸Ì¥µÄÇé¿öÏ£¬È˵ĴóÄÔºÍÐж¯ÅäºÏµÄÈçºÎµÄ¿ìËÙ£¬¸ßЧ¡£
±ÈÈçÒòΪûÓа²Åźã¬Ò¹ËÞ·þÎñÇø£¬ÍíÉÏ¿´ÐÇÐÇ£¬Íòô¥¾ã¼Å£¬Ö»ÓÐÁ½¸öÈ˵ÄÉùÒô¡£
Ò»¸ö¸öµÄ¹ÊÊ£¬ÔÚ¼ÒÀïÃæ£¬»òÕßÔÚ¼Ò¸½½ü¶¼ÊDz»»áÉÏÑݵġ£

±ä»¯ºÍ¹ÊÊÂÐÔ£¬µ¹ÊÇÕæµÄ¿ÉÒÔ³ÉΪһ¸ö×Ô¼ÝÓεÄÓÐÎüÒýÁ¦µÄµã¡£

ºÍ Google ½áʶ

·¢±íÈË:1000copy | ·¢±íʱ¼ä: 2007ÄêÎåÔÂ18ÈÕ, 09:14

µÚÒ»»ØºÏ Google Vs. Yahoo£¬Alta Vista

Google ×îÔçÊÇ2000ÄêµÄʱºò¿ªÊ¼Óã¬Ö®Ç°Ò»Ö±Ê¹ÓõÄÓÐYahoo£¬Alta Vista
µ±Ê±Ê¹ÓÃYahooµÄ¸Ð¾õ£¬ÓÈÆäÊÇËÑË÷¼¼ÊõÎÊÌâµÄʱºò£¬¾­³£ÎIJ»¶ÔÌ⣬Alta Vista¿ÉÒÔÓзdz£¸´ÔÓµÄËÑË÷±í´ïʽ£¬ºÅ³ÆÄãҪʲôÄã¸øÄãʲô£¬Êµ¼ÊÉÏÊÇÄãҪʲô£¬Ëü²»½ö½ö¸øÄãʲô¡£
ºÜ¶à¶«Î÷¿ÉÒÔÕÒµ½£¬µ«ÊǶÔÄãµÄ´ð°¸¿ÉÄÜÔÚ5-6Ò³ÉõÖÁ¸üÔ¶µÄλÖ㬲»¹»¹¢Ö±¡£²»¹ýûÓÐÆäËûµÄ£¬Ò²¿ÉÒÔ½«¾ÍÓá£
ÒªÕÒµ½ÏëÒªµÄ¶«Î÷£¬ÊÇÐèÒªµã¼¼Êõº¬Á¿µÄ£¬ÎÄÏ×¼ìË÷ÐèÒªµã´óѧÀïÃæµÄÎÄÏ×¼ìË÷ȷʵ´æÔÚ±ØÒª¡£

ËѼ¼ÊõÎÊÌâµÄʱºò£¬Í·5´ÎʹÓÃGoogleËÑË÷¼¼ÊõÎÊÌ⣬¶¼ÊÇÔÚµÚÒ»µÚ¶þλ¾ÍÁгöÀ´£¬µã¿ª¿´¾ÍÊÇÎÒËùÐèÒªµÄ¡£
ÒÔºó¾Í°ÑYahoo£¬AltavistaÖ±½Ó·Ïµô£¬¾ÍÖ»ÊÇʹÓÃGoogleÁË¡£

Google µÄÓû§ÊÇÃâ·ÑµÄ£¬²»ÐèҪΪʹÓÃGoogle¸¶·Ñ£¬GoogleµÄÊÕÈëÀ´×ÔÓÚ¹ã¸æ£¬µ«ÊÇ¹ã¸æÓëÖÚ²»Í¬£¬²»µ¯³ö£¬ÎÞͼƬºÍÉùÒô£¬´¿ÎÄ×Ö¹ã¸æ£¬
²¢ÇÒºÍÄãµÄËÑË÷ÄÚÈÝÓйأ¬±ÈÈçËÑË÷µÄÊÇ ×Ô¼ÝÓÎ ,ÄÇô¹ã¸æÁгöµÄ¾ÍÊÇºÍÆû³µ£¬±ö¹Ý ÓÐ¹ØµÄ¹ã¸æ£¬ÓÐÒ»¶¨µÄ²Î¿¼¼ÛÖµ£¬
²¢ÇÒ²»»á¾õµÃÁîÈËÑá·³£»¹ã¸æÖ÷Ò²´ÓÖеÃÒæ£¬ºÜ¾«È·µÄÖ¸ÏòÓÐÒâÏòµÄ¿Í»§¡£

µÚ¶þ»ØºÏ Google »¨Ðõ

²»¹ÜÊǼ¼ÊõµÄ£¬ÂÃÐвé·Ïߣ¨ÎÒÒ»¹á×ÔÖúÐУ¬²»¸úÍÅ£¬²»´î»ï£©£¬ÐÂÊéÆÀ¼Û£¬·²ÊÇÓйص쬶¼ÊDzéGoogle£¬Ì×ÓÃÍøÉÏÒ»¾ä»°
¡°ÄÚʲ»¾öÎÊÀÏÆÅ£¬Íâʲ»¾öÎÊGoogle¡±
ºóÀ´³£³£ÍøÕ¾µÄÓòÃû¶¼ÀÁµÃÇ㬱ÈÈçÏëÒªµ½www.delphibbs.com £¬¾ÍÖ±½ÓÊäÈë delphibbs £¬µã»÷"ÊÖÆø²»´í",Ö±½Óµ½Î»¡£

»¹ÓÐЩÓÐȤµÄ¶«Î÷
±ÈÈç½ÚÈÕ£¬Í¨³£Google¶¼»áÓÐÒ»¸öÊÖ»æµÄͼ°ÑGoogleºÍ½ÚÈÕµÄͼ·Åµ½Ò»Æð£¬ÒÕÊõÆø·ÕŨºñ£¬Èôó¼Ò¼ÇÒäÉî¿Ì¡£
±ÈÈçGoogleÏÂÃæÓÐÒ»¸öËÑË÷xXXxÍøÒ³£¬¿´µ½ÄÇôºÆÈçÑ̺£µÄÐÅÏ¢£¬Ã»ÓÐGoogle°ïæȷʵÓÐЩÀ§ÄѰɣ¨ÏÖÔÚÒѾ­²»ÏÔʾÁË£¬ÒѾ­²»ÊÇÂôµãÁË£©¡£
±ÈÈç"ÊÖÆø²»´í"£¬×îÔçµÄÊÇÓ¢ÎÄ£¬½Ð×ö"I'm Feeling Lucky",µ±Ê±ºÍͬÊ»¹ÌÖÂÛ¹ý£¬ÕâôºÃÓõļ¼ÊõÔõô»áºÍÐÒÔËÓÐʲô¹ØÏµ£¿
Æäʵ"ÊÖÆø²»´í"ÊÇGoogleµÄÈ˱ȽÏ×ÔÐÅÓйأ¬Èç¹ûÄãÒªµÄÕýʽµÚÒ»¸ö£¬¸Éʲô»¹¿´ËÑË÷½á¹û£¬Ö±½ÓÒª¶ÔÓ¦Õ¾µã²»¾ÃÍêÁË£¿

µÚÈý»ØºÏ Google GMail

ÍÆ³öÓ¦¸ÃÓÐ3ÄêÁ˰ɣ¬ÊÇGoogle±È½ÏÔçµÄÒ»¸öÓ¦Ó㻵±Ê±²ÉÓõÄÊÇÑûÇëÖÆ£¬¾ÍÊÇ˵ҪÓÐÈËÑûÇë²Å¿ÉÒÔ»ñµÃGmailµÄÕʺš£¾ÍÊÇÒòΪÕâ¸öÑûÇ룬
Ò²ÒòΪ̫Á˽âmailÁË£¬·´¶øÈÃÎÒ¾õµÃ·ÇÒª¿´¿´²»¿É¡£µ±Ê±¼ûµ½ÅóÓѾÍÒªÎÊ£¬ÓÐGmailµÄÑûÇëÂ𣿽øÈ¥ºó£¬Gmail³ýÁ˵Ǽ½çÃæ¾Í3¾ä»°£º
1. ËÑË÷¶ø²»ÅÅÐò
2. ²»±ØÉ¾³ýÓʼþ
3. Óʼþ¶¼ÓÐÉÏÏÂÎÄ
Ò»Ò»½âÊÍ.
GmailÊDZȽÏ×¢Ã÷µÄajax°¸Àý£¬Õâ¸ö¼¼Êõ¿ÉÒÔÈÃb/sÈí¼þ¿ÉÒÔÏñÊÇc/sÈí¼þÒ»Ñù£¬²»±ØË¢Ð¾ͿÉÒÔ´Ó·þÎñÆ÷»ñµÃÊý¾Ý£¬²¢ÇÒºÍÓû§½»»¥¡£
²»±ØË¢ÆÁ£¬¼üÅÌÖ§³Ö²Ù×÷ÆðÀ´ºÍc/s²î²»¶à£¬¿´ÆðÀ´ºÍb/s²î²»¶à¡£

µÚËÄ»ØºÏ Google ÖÚÉú

ÔÚGmailÒÔºó£¬GoogleÓÐЩ·Å¿ªÊÖ½ÅÁË£¬Earsh ,Notebook,Blog,Doc,Spreadsheet,Reader ,Picassa,Talk,GoogleÃ÷ÏÔ×¼±¸°ÑËùÓÐÖ÷Á÷µÄ×ÀÃæÈí¼þ£¬
Ö÷Á÷µÄÍøÂçÈí¼þͳͳÔÚÒ»¸öÕ¾µãÄÚ×öÍꡣ΢ÈíÒò´Ë¸Ðµ½ÍþвҲÊÇÕý³£µÄ£¬±Ï¾¹Èç¹ûÖ»ÊÇʹÓÃÒ»¸öä¯ÀÀÆ÷£¬¾Í¿ÉÒÔÍê³ÉÈÕ³£¹¤×÷£¬ÄÇôÓÃIe£¬»¹ÊÇFireFox,
,Opera,Netscape,ÓÐʲô¹ØÏµÄØ?¼ÈÈ»ä¯ÀÀÆ÷ÊÇΨһÐèÒªµÄ¶«Î÷£¬ÄÇô²Ù×÷ϵͳÊÇWindows,»¹ÊÇLinux£¬Unix£¬Mac OS,SUN,ÓÐʲô¹ØÏµÄØ£¿
ÄÇô΢Èí»¹ÓÐÄÇÃ´ÖØÒªÂð£¿
Ö»ÓÐÒ»¸öÕ˺ŵǼ½øÀ´£¬Õâ¸öÕ˺žÍÊÇgmailµÄÕ˺Źþ£¬¾Í¶¼¿ÉÒÔÓá£

ʵ¼ÊÉÏ£¬ºÜÔçÒÔǰ£¬ÎҾͲ»ÏêÓÃofficeÁË£¬´Óµ½ÈÎÎÒÐУ¬ÎÒÏÖÔÚдµÄLogÒѾ­ÓÐ30Íò×Ö£¬¶¼ÊÇÓÃÎı¾±à¼­£¬µ«ÊǺܶàÈËÒªÓã¬
²¢ÇÒÓõç×ÓÓʼþ¸øÎÒ·¢¹ýÀ´£¬Ã»Óа취ֻÓа²×°£¬ÏÖÔÚÒ²²»±ØÁË£¬Google doc/Spreadsheet¿ÉÒÔÖ±½Ó±à¼­word/excel Îĵµ¡£
¼ÒÀïµÄµçÄÔ¶¼Ã»Óа²×°OfficeÁË¡£

ÏëÒ»Ï룬MsµÄOfficeÈ­Í·²úÆ·£¬ÏÖÔÚ¶¼ÒѾ­È«ÃæµÄÒÆÖ²µ½b/sģʽÁË¡£¿É¼ûÕâ¸öÊÂÇé¶Ô΢ÈíµÄÓ°Ïì¡£

µÚÎ廨ºÏ »ØÉù

1. ÔÙ¹ÅÀϵÄÈí¼þ£¬Åöµ½ÁËеļ¼Êõ£¬¶Ô×Ô¼ºÀ´ËµºÃÏñ½ö½öÖØÐÂ×öÁËÒ»±é£¬ÆäʵÊDZ»¸³ÓèÁËеÄÒâÒå¡£
Àý×Ó£º GmailÖØ×öÁËÈ«²¿µÄmail¹¦ÄÜ£¬µ«ÊÇеÄÖ»ÓÐ3Ìõ£¬¾ÍÊÇÕâ3Ìõ¼ÓÉÏһЩ²»Í¬µÄÌåÑ飬ÈÃÓû§×ªÏò¹ýÀ´
2. ×ÜÊÇÓкܶàÓû§£¬¾¡¹ÜËûÃÇʹÓõÄÖ»ÊǺÜÉٵŦÄÜ£¬µ«ÊÇÒªÇóµÄȷʵºÜ¶àÕâЩ¹¦ÄÜÖ®ÍâµÄ£¬¶øËûÃÇÍùÍùÊÇÕâ¸öÁìÓòµÄÒâ¼ûÁìÐä¡£
Àý×Ó£º ÄãÃÇ×öµÄϵͳһ¶¨ÊÇJ2eeµÄ£¬ÕâÊÇË­µÄÒâ¼û£¿
3. SaaSµÄÐû´«¿ÉÄܺÜÐ飬ӦÓÃÈ´¿ÉÒÔºÜʵÔÚ¡£
µ«ÊÇÓкܶàÈËÏàÐŵġ£
ÔÚÏàÐźÍʵ¼ùµÄ¹ý³ÌÖУ¬ÓÐЩÈËÏȵõ½Á˸¡²Æ£¬È»ºóµÇÌÃÈëÊÒ£¬ÓÐЩÈ˸е½±»ÆÛÆ­£¬²¢Ô¶ÀëËü¡£


×öÒ»¸öºÃººÒ²ÐèÒªÓÐЩÔËÆø

·¢±íÈË:1000copy | ·¢±íʱ¼ä: 2007ÄêËÄÔÂ24ÈÕ, 08:36

»°ËµÀîåÓÏÂɽ³Ô·¹²»¸øÇ®£¬Ò»¸ö´óºº³öÀ´ËµÒ²²»¿´¿´ÕâÊÇÄÇÀÎÒÊÇÁºÉ½ºÃººº«²®Áú£¬±¾Ç®¶¼ÊÇËν­¸ç¸çµÄ£»ÀîåÓ˵ÎÒÈÏʶÄã¸öÄñ£¬ÒªÇ®Ã»ÓУ¬ÒªÃ´°Ñ°å¸«µ±µÖѺ£¬ÓÚÊÇÄóöÒ»¸ö°å¸«À´£¬º«²®Áú²»Ö»µ½Õâ¸öÊǼƲߣ¬¸ÙÒªÉìÊÖ£¬±»ÀîåÓÒ»¸«Í·µ±ÃæÅú¹ýÀ´£¬µ±Ê±¾ÍÍêµ°ÁË¡£

¿ÉÁ¯Õâ¸öº«²®Áú£¬×öÁËÒ»ÊÀÇ¿ÈË£¬½ñÈÕËÀÓÚÀîåÓÊÖÀÏëÀ´º«²®ÁúÒ²ÊÇÒ»¸öÒªµ½ÁºÉ½Èë»ïµÄÈË£¬±Ø¶¨ÓÐЩÊֶΣ¬È´ºÁÎÞÖª¾õ£¬Ò²Ã»ÓÐ×ö³öʲôÊÂÒµ£¬ÊµÔÚÊÇÔ©Í÷¡£

»¹ÓÐÒ»¸ö¸üÔ©Í÷£¬ÎäËɵ½ÁËÊ®×ÖÆÂ²»ÊDZä³ÉÐÐÕßÁËÂ𣿱¾À´µÄÐÐÍ·À´×ÔÒ»¸öÕæµÄÐÐÕߣ¬»°Ëµ·þ×°ºÍÎäËɾ¹¶øÒ»Ñù£¬Èçͬ¾ÍÊÇËû×Ô¼ºµÄÒ»Ñù£¬ÏëÀ´ÄǸöÕæµÄÐÐÕ߱ض¨Ò²¿×ÎäÓÐÁ¦£¬¸ü¿ö»¹ÓÐÒ»¶ÔÑ©Á·Ò»ÑùµÄ½äµ¶¡£µÈµ½ÕÅÇà»ØÀ´Ê±£¬Ôç¾Í±»Ëï¶þÄïжÏÂÁË¡°ËÄ×㡱¡£

»¹ÊÇËν­²»Ò»Ñù£¬³£³£±»±ðÈË׽ס£¬ÒªÃ´¾Í±»¾È³öÀ´£¬ÒªÃ´¾ÍÊÇ¡°ÎÒËν­¾¹È»¡£¡£¡£¡±£¬¶ÔÃæµÄ´óÍõ¾Í³å¹ýÀ´£¬Ô­À´ÊÇËν­¸ç¸ç,ÓÚÊÇÆ¨ÊÂûÓУ¬»¹Òª×ö´ó¸ç¡£

²»Òª¹Ö²»¹«Æ½£¬¾ÍÊÇÕâÑù¡£


ʹÓÃP4D ±àдPython Extension[ʹÓÃrst±àд]

·¢±íÈË:1000copy | ·¢±íʱ¼ä: 2007ÄêËÄÔÂ01ÈÕ, 13:58

Date: $Date: 2007Äê4ÔÂ1ÈÕ
Date: $Date: 2007Äê4ÔÂ1ÈÕ

ʹÓÃP4D ±àдPython Extension

Author:1000copy
Address:¿ÕÎÞÒ»ÈË ²»ÖªËùÖÂ
Contact:1000copy@gmail.com or http://1000copy.itpub.net
organization:ÎÞµ³ÅÉÈËÊ¿
status:²î²»¶àÁË:version: 1:copyright: This document has been placed in the public domain. You may do with it as you wish. You may copy, modify, redistribute, reattribute, sell, buy, rent, lease, destroy, or improve it, quote it at length, excerpt, incorporate, collate, fold, staple, or mutilate it, or do anything else to it that your or anyone else's heart desires.
Dedication:ϲ»¶PythonµÄDelphiµÄ³ÌÐòÔ±
abstract:ÔÚ»¥ÁªÍø¹«¹²¿É·ÃÎÊÁìÓòÄÚ£¬¹ØÓÚPython/C interfaceµÄ½éÉÜ£¬ÊֲᶼÊÇ ±È½Ï¶àµÄ¡£PyÖ±½ÓÖ§³ÖC±àдÀ©Õ¹£¬¶ÔÓÚDelphi³ÌÐòÔ±£¬P4DÊÇÒ»¸öºÜºÃµÄ Ñ¡Ôñ¡£²»ÐÒµÄÊÇ£¬Í¨¹ýP4D[#]±àдPyExtention£¬²¢Ã»ÓÐÒ»¸öºÜºÃµÄÈëÃÅÎÄ µµ£¬±¾ÎÄÊÔͼÌîдÕâ¸ö¿Õ°×¡£±¾ÎÄ·ç¸ñÍêȫģ·ÂWriting Python Extensions[1],Ï£ÍûÒÔÀý×ÓΪ±¾£¬Èôó¼ÒºÜ¿ìµÄ½øÈë״̬¡£

ÒýÑÔ

±¾ÎļÙÉèÄã

  • ¶®µÃPython
  • ¶®µÃDelphi
  • ÏëҪͨ¹ýP4D±àдPython Extension
  • ÒѾ­°²×°ÁËDelphi7£¬P4D£¬Python2.4ÒÔÉÏ¡£

µÚÒ»¸öPython Extension

ÒÔϵÄÀý×ÓÊÇ¿ÉÒÔÖ±½ÓʹÓõģ¬Ö»Òª¿½±´ÈçÏ´úÂ룬´æ·Åµ½ExAdd.dpr£¬Ö±½ÓÓÃDelphi±àÒ룬¾Í¿ÉÒÔ³ÉΪһ¸öPython Extension ¡£ ÎÒÃÇ¿ÉÒÔÊ×ÏÈ¿´µ½Ð§¹û£¬È»ºóÔÚ·ÖÎö³ÌÐò¡£

×îСµÄÀý×Ó

×îСµÄÀý×Ó:

{ÎļþÃû ExAdd.dpr}
library ExAdd;
uses SysUtils,Classes,PythonEngine;
{$E pyd}
var
FModule : TPythonModule;
FEngine:TPythonEngine ;
function Add( Self, Args : PPyObject ) : PPyObject; far; cdecl;
var
a, b : Integer;
begin
with GetPythonEngine do
begin
if PyArg_ParseTuple( args, 'ii:Add', [@a, @b] ) <> 0 then
begin
Result := PyInt_FromLong( a + b );
end
else
Result := nil;
end;
end;
procedure initExAdd; cdecl;
begin
FEngine := TPythonEngine.Create(nil);
FModule := TPythonModule.Create(nil);
FModule.Engine := FEngine;
FModule.ModuleName := 'ExAdd';
FModule.AddMethod( 'exadd', @Add, 'exadd(a,b) -> a+b ' );
FEngine.LoadDll;
end;
exports
initExAdd;
var
OldExitProc: pointer;
procedure MyExitProc;
begin
FModule.Free;
FEngine.Free;
ExitProc := OldExitProc;
end;
begin
OldExitProc := ExitProc;
ExitProc := @MyExitProc;
end.
// ²âÊÔ´úÂë
//from ExAdd import *
//print exadd(1,10)

½â˵

ÕâÊÇÒ»¸ö×îСµÄÀý×Ó£¬Ö»ÒªÒ»¸öÎļþExAdd.dpr ,²»ÐèÒªÈÎºÎÆäËûµÄPas UnitÎļþ¾Í¿ÉÒÔÁË¡£ µ±ÎÒÃǰÑËû·Åµ½pyµÄsyspathÄÚ£¬±ÈÈç<pythonhome>libsite-packages,ÔÚpywinÄÚ£¬¿ÉÒÔ×öÈçϲâÊÔ:

>>> from ExAdd import *
>>> print exadd(1,10)
11
>>>

¿ÉÒÔ¿´µ½£¬PythonÄڵijÌÐòȷʵ³É¹¦µÄµ÷ÓÃÁËͨ¹ýDelphiдµÄÀ©Õ¹¡£ÈçºÎ×öµ½µÄ£¿

ÈçºÎ×¢²áÒ»¸öÄ£¿é

µ±PythonÄÚÖ´ÐÐ

from ExAdd import *

ʱ£¬½«»áµ½syspathÄÚѰÕÒExAdd.pyd,ÕâÀïµÄpyd¾ÍÊÇÒ»°ãµÄdll£¬Ö»²»¹ý»¹ÓÐһЩԼ¶¨¡£ µ±PyÕÒµ½Õâ¸öÎļþºó£¬¾Íµ÷ÓÃÒý³öº¯ÊýinitExAdd,Õâ¸öº¯ÊýµÄÃüÃû¾ÍÊÇpython³ÌÐòºÍ.pydÄ£¿éµÄµÄÒ»¸öÔ¼¶¨----º¯ÊýÃüÃû±ØÐëΪinit+moduleÃû³Æ¡£ Ò»°ãÀ´Ëµ£¬ÔÚinitº¯ÊýÄÚ£¬¾Í½øÐÐÒýÇæµÄ³õʼ»¯£¬Ä£¿éµÄ×¢²á£¬º¯Êý£¬ÀàÐ͵Ä×¢²áµÈµÈ¹¤×÷¡£ÕâÀïÀý×ÓÄÚ£¬ÎÒÃÇʹÓÃÁËTPythonEngine£¬ TPythonModuleÁ½¸öP4DÌṩµÄÀ࣬°ïÖúÎÒÃÇ×öÕâЩ¹¤×÷¡£ ×¢²áÄ£¿éʱ£¬Òª×¢Òâ

FModule.ModuleName := 'ExAdd';

ÄÚµÄModuleName¾ÍÊÇÔÚPythonÄÚʹÓõÄÄ£¿éÍêȫһÖ£¬µ±È»ÎÒÃÇ¿ÉÒÔʹÓÃÆäËûµÄÃû×Ö£¬±ÈÈçExQuickAdd£¬Ö»Òª

from ExAdd import *

ÄÚʹÓõÄÄ£¿éÃû³ÆÒ»Ö¼´¿É¡£ÎªÁË·½±ãºÍÒ»Ö£¬ÎÒÃÇ¿ÉÒÔÔ¼¶¨dllµÄÃû×Ö£¬pythonÄÚµÄmodule£¬delphiÄÚµÄTPythonModuleÃû×ÖÍêȫһÖ¡£ ÕâÔÚÓï·¨Éϲ¢·Ç±ØÐ룬²»¹ýÕâÑù×öÊÇÒ»¸öºÜºÃµÄϰ¹ß¡£

ÈçºÎ×¢²áÒ»¸öº¯Êý

ÈκÎÒ»¸ö°´ÕÕÈçÏÂÔ­ÐÍ×¢²áµÄº¯Êý£¬¶¼¿ÉÒÔ±»×¢²áΪPyExtentionµÄº¯Êý¡£

function Add( Self, Args : PPyObject ) : PPyObject; far; cdecl;

ÆäÖÐcdecl˵Ã÷·þ´ÓCÓïÑԵĵ÷Óù淶£¬¶ø²»ÊÇPascal»òÕ߯äËû¡£±Ï¾¹PythonÊÇCÓïÑÔд¾ÍµÄ£¬µ±È»°´ÕÕCÓïÑÔµÄϰ¹ßÀ´¡£ Õâ¸öº¯ÊýÔ­ÐÍÖУ¬²ÎÊý½«»á°üÀ¨Self£¬Args£¬·µ»ØÖµµÃÒ²ÊÇÒ»¸öPPyObject£¬ÊìϤPythonÓïÑԵĶ¼ÖªµÀ£¬ÈκÎÒ»¸öPythonº¯ÊýÔÚ±»µ÷ÓÃʱ¶¼»á´«µÝÒ»¸öSelf Ö¸Õë½øÀ´£¬²¢ÇÒÒÔTupleµÄ·½Ê½´«µÝ²ÎÊýÁÐ±í£¬Õâ¸öAddº¯ÊýµÄʵÏÖÔ¼¶¨ÉÏÒ²¾Í±íÏÖ³öÀ´ÁË£¬ËùÓеÄÀàÐͶ¼ÊǶÔÏó¡£±ÈÈçAdd(3,4)Õâ¸öµÄPythonµ÷Ó㬲ÎÕÕAddÔÚDelphiÖк¯ÊýÔ­ÐÍ£¬ ÉÏ£¬ÄÇô"3,4"×÷Ϊһ¸öTuple¶ÔÏ󣬰éËæSelf£¬Ò²ÊÇÒ»¸öPPyObject,·µ»ØÖµ7Ò²ÊÇÒ»¸öPPyObjectÀ´±í´ï¡£ Òª²»Ôõô¶¼ËµPythonÂýÄØ£¿±¾À´Ò»¸ö¼Ó²Ù×÷¿ÉÒÔÖ±½Ó¶ÔÓ¦»ã±àÖеÄÒ»¸öÖ¸ÁÏÖÔÚÓÖÊǶÔÏóÓÖÊÇÖ¸Õ룬µ±È»ºÜÄÑ¿ìÁË¡£

Ò»µ©ÓÐÁËÕâÑùµÄÉùÃ÷£¬¾Í¿ÉÒÔÕâÑù×¢²áº¯Êý¡£

FModule.AddMethod( 'exadd', @Add, 'add(a,b) -> a+b ' );

ÒÔÉÏÓï¾äÏòPythonϵͳÉùÃ÷£¬exaddº¯ÊýµÄʵÏÖÔÚaddÄÚ£¬×îºó²ÎÊý×÷Ϊ__docstring__¡£µ±IDEÄÚʹÓÃÕâ¸öº¯Êýʱ£¬¿ÉÒÔͨ¹ýcodeinsight,»òÕßhelpÀ´»ñµÃº¯ÊýµÄʹÓÃ˵Ã÷¡£ ÏÖÔÚÀ´¿´addµÄʵÏÖ´úÂë¡£ Ò»ÑÛ¿´¹ýÈ¥£¬PyArg_ParseTuple£¬PyInt_FromLongÊÇÁ½¸öÌØ±ðµÄ¶«Î÷¡£ PyArg_ParseTuple¸ºÔð°Ñ´«½øÀ´µÄargs±ä³É¼òµ¥µÄDelphiÀàÐÍ£¬ÔÚPpyobjectÄÚ´æ´¢µÄ3,4£¬·Ö±ð´æ·Åµ½a,b:IntegerÄÚ£¬¾ÍÊÇ

PyArg_ParseTuple( args, 'ii:Add', [@a, @b] ) <> 0

ÆäÖеڶþ¸ö²ÎÊý 'ii:Add' £¬ÓÐЩÏñÊÇFormat¸ñʽ£¬iÖ¸Ã÷ÀàÐÍΪInteger£¬Á½¸öIÖ¸Ã÷ÓÐÁ½¸öÕûÊý,:addÊÇ¿ÉÑ¡µÄ£¬µ±³ö´íµÄʱºò£¬ÓÐ:add£¬¿ÉÒÔ°ïÖú³ÌÐòÔ±¸üºÃµÄÕÒµ½´íÎó¡£ ÕâÑù¾Í°ÑPPyobejectËù±í´ïµÄPythonTypeתΪһ°ãDelphiÀàÐÍ£» ¶øPyInt_FromLongÕâÊÇÏë·¨£¬Ëû°ÑDelphiµÄLongÀàÐÍת»»ÎªPyObjectµÄInteger£»´Ó¶ø¿ÉÒÔÈýá¹û¿ÉÒÔΪPythonʶ±ð¡£ ÕâÁ½¸öº¯Êý¾¡¹ÜÊÇP4dʵÏֵ쬵«ÊǺÍPython/C interfaceÊÖ²áÄڹ涨µÄº¯ÊýÃû³ÆÒ»Ö£¬Òò´Ë¾ßÌåµÄµ÷Ó÷½·¨Ò²¿ÉÒÔ¿´Python/C interfaceÊֲᡣ

ʵ¼ÊÉÏPythonʵÏÖÄڵĶÔÏó±í´ï²ÉÓÃÁËÒ»¸ö½á¹¹(Struct),ºÜÓÐһЩ¸´ÔÓ£¬ÎÒÃÇÏÖÔÚ¿ÉÒÔÔںܸ߲ãµÄÈ¥¿´£¬Òª¸ÐлP4DËù×öµÄ¹¤×÷¡£

ʵÏÖÒ»¸öÀà

µÚÒ»¸öÀý×Ó¿ÉÒÔ¹¤×÷£¬²¢ÇÒÄܹ»ÑÝʾע²áÄ£¿é£¬º¯ÊýºÍһЩ»ù±¾µÄPython ExtµÄ¸ÅÄî¡£ ¶ÔÓÚ³¤ÆÚʹÓÃDelphiÕâÑùµÄOOÓïÑÔ£¬½ö½ö¹«¿ªº¯Êýµ±È»²»¹»·½±ã£¬ÎÒÃÇÐèÒªµÄÊÇÈ«OO±à³Ì£¬¼´Ê¹¿çÔ½ÁËÓïÑÔ£¬Ò²²»»á·ÅÆúÕâÑùµÄϰ¹ß¡£ ÎÒÃÇÏÖÔÚÒªÈÃDelphiµÄÀà¿ÉÒÔΪPython¡£

ÓÖÒ»¸öÀý×Ó

ÄãÊ×ÏÈ¿´µ½µÄÒÀÈ»ÊÇÒ»¸öÀý×Ó,ÎÒÃÇÒª°ÑDelphiÖеÄTPoint¹«¿ª³öÀ´£¬ÈÃpython¿ÉÒÔµ÷Óã¬Ä£¿éÃû³ÆÎªdpoint£¬×îÖÕÎÒÃÇÒªÔÚpythonIDEÄÚ¿´µ½µÄЧ¹û:

>>> from dpoint import *
>>> print SmallPoint(222,111)
<SmallPoint at D393C8>
>>> SmallPoint.__doc__
'wrapper for Delphi TPoint typen'

P4DΪע²áÀàÕâÑùµÄ¹¤×÷ÌṩÁËTPyDelphiWrapperÀ࣬ÔÚÕâ¸öÀý×ÓÀÎÒÃÇÎ§ÈÆÕâTPyDelphiWrapperÀ´·ÖÎö¡£

Àý×Ó´úÂë:

library dpoint;
uses
Sharemem ,SysUtils,Classes,WrapDelphi,Types,PythonEngine;
{$E pyd}
var
FModule : TPythonModule;
FEngine:TPythonEngine ;
FDelphiWrapper : TPyDelphiWrapper;
procedure initdpoint; cdecl;
begin
FEngine := TPythonEngine.Create(nil);
FModule := TPythonModule.Create(nil);
FModule.Engine := FEngine;
FModule.ModuleName := 'dpoint';
FDelphiWrapper := TPyDelphiWrapper.Create(nil);
FDelphiWrapper.Engine := FEngine;
FDelphiWrapper.Module := FModule;
FEngine.LoadDll;
end;
exports
initdpoint;
var
OldExitProc: pointer;
procedure MyExitProc;
begin
FModule.Free;
FEngine.Free;
ExitProc := OldExitProc;
end;
type
TPyDelphiPoint = class(TPyObject)
private
fValue: TPoint;
protected
public
constructor CreateWith( APythonType : TPythonType; args : PPyObject ); override;
class procedure SetupType( PythonType : TPythonType ); override;
end;
Type
TTypesRegistration = class(TRegisteredUnit)
public
function Name : String; override;
procedure RegisterWrappers(APyDelphiWrapper : TPyDelphiWrapper); override;
end;
function TTypesRegistration.Name: String;
begin
Result := 'Types';
end;
procedure TTypesRegistration.RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper);
begin
inherited;
APyDelphiWrapper.RegisterHelperType(TPyDelphiPoint);
end;
constructor TPyDelphiPoint.CreateWith(APythonType: TPythonType;
args: PPyObject);
var
x, y : Integer;
begin
inherited;
if APythonType.Engine.PyArg_ParseTuple( args, 'ii:Create', [@x, @y] ) <> 0 then
begin
fValue.X := x;
fValue.Y := y;
end
end;
class procedure TPyDelphiPoint.SetupType(PythonType: TPythonType);
begin
inherited;
PythonType.TypeName := 'SmallPoint';
PythonType.TypeFlags := PythonType.TypeFlags + [tpfBaseType];
PythonType.DocString.Text := '12345';
end;
begin
RegisteredUnits.Add(TTypesRegistration.Create);
OldExitProc := ExitProc;
ExitProc := @MyExitProc;
end.

×¢²á¹ý³Ì

Ò»¸öÀà±ØÈ»ÒªÊôÓÚijһ¸öÄ£¿é£¬×¢²áÒ»¸öÀà¾ÍÉæ¼°µ½×¢²áÒ»¸öÄ£¿é¡£¹ØÓÚ×¢²áÄ£¿é£¬ÔÚÀý×ÓÖÐÕ¼¾ÝÁ˲»ÉÙ´ø´úÂ룬µ«ÊÇËüºÍµÚ¶þ²¿·ÖÍêȫһÑù£¬ÎÒÃÇÂÓ¹ý²»¿´¡£ ±¾À´×¢²áÒ»¸öÀàÊÇÓÐЩ¸´ÔӶȵģ¬Èç¹ûÏëÒªÖªµÀÕâ¸ö¸´ÔÓ¶È£¬¿ÉÒÔÏÈ¿´¿´²Î¿¼ÎÄÏ×1ÄÚµÄÃèÊö¡£²»¹ý²ÉÓÃP4DµÄÀàÐÍ×¢²á¿ò¼Ü¾Í¼òµ¥¶àÁË¡£ ÎÒÃǵÄÀý×ÓpydÃüÃûΪdpoint ,ÎÒÃÇ×¼±¸°ÑTPointÀàÐ͹«¿ªµ½PythonÄÚ¡£

ÔÚinitdpointº¯ÊýÄÚ£¬TPythonEngine£¬TPythonModuleÕÕÑùµÄ³õʼ»¯£¬±ÈÆðº¯Êý×¢²áÀ´Ëµ£¬²»Í¬µÄµØ·½ÔÚÓÚ´´½¨ÁËTPyDelphiWrapperµÄʵÀýgDelphiWrapper£¬ ²¢ÇÒÖ¸Ã÷ËûËùÊôµÄPythonEngine£¬PythonModule:

procedure initdpoint;
begin
gEngine := TPythonEngine.Create(nil);
gEngine.AutoFinalize := False;
gModule := TPythonModule.Create(nil);
gModule.Engine := gEngine;
gModule.ModuleName := 'dpoint';
gDelphiWrapper := TPyDelphiWrapper.Create(nil);
gDelphiWrapper.Engine := gEngine;
gDelphiWrapper.Module := gModule;
gEngine.LoadDll;
end;

gDelphiWrapper½«»áÔÚRegisteredUnitListѰÕÒRegisteredUnit£¬²¢ÇÒµ÷Óà Õâ¸öÀà±ðÄÚµÄRegisterWrappers·½·¨£¬Í¨¹ýÕâ¸ö·½·¨»òÕßÐèҪע²áµÄPythonÀàµÄDelphi°ü×°Àà¡£ Òò´Ë£¬ÎÒÃÇÒª×öµÄÊÂÇé¾ÍÊÇ£º Ô¼¶¨ÊµÏÖÁ½¸öÀ࣬һ¸öÊÇÐèÒª¹«¿ªµÄÀàÐ͵ÄWrapper£¬ÕâÀï¾ÍÊÇTPyDelphiPoint£¬Ò»¸öÊÇ×¢²áÕâ¸öWrapperµÄ×¢²áÀ࣬±¾Àý×ÓÄÚ¾ÍÊÇTTypesRegistration¡£ TTypesRegistrationֻҪʵÏÖÁ½¸ö¸²¸Ç»ùÀàµÄ·½·¨£¬´Ó¶ø´ïµ½Í¨ÖªTPyDelphiWrapperÐèҪע²áµÄÀàÊÇTPyDelphiPoint¡£

function Name : String; override; procedure RegisterWrappers(APyDelphiWrapper : TPyDelphiWrapper); override;

ÎÒÃǸü¶àµÄ×¢ÒâÁ¦£¬ÓÈÆäÊÇÒÔºóµÄ¸ü¶à¶ÔPythonExtensionÌØÐÔµÄÀûÓ㬼¯ÖÐÓÚTPyDelphiPointÉÏ¡£ TPyDelphiPoint£¬×÷Ϊһ¸öPythonType£¬×îÉÙҪʵÏֵķ½·¨ÓÐ:

      constructor CreateWith( APythonType : TPythonType; args : PPyObject ); override;
class procedure SetupType( PythonType : TPythonType ); override;

ÎÒÃÇ¿ÉÒÔ×¢Òâµ½£¬CreateWith´«µÝµÄargsÒÀÈ»ÊÇPPyObjectÀàÐÍ£¬ºÍǰÎÄ̸µ½µÄadd·½·¨¶Ô²ÎÊýºÍ·µ»ØÖµµÄ´¦Àí¶¼ÊÇÒ»Öµġ£ SetupType½«»áÖ¸Ã÷ÔÚPythonÄÚÈçºÎʹÓÃÕâ¸öÀàÐÍ£¬¸ù¾ÝÔ´´úÂëÖªµÀ£¬SetupTypeÖ¸Ã÷Õâ¸öÀàÐÍÔÚPythonÄÚµÄÀàÐÍΪSmallPoint£¬Ìṩ»ù±¾·þÎñ£¨fvbase£©,ÀàÐÍÎĵµ__doc__Ϊ '12345'£¬ ²âÊÔÓÃÀý3.1´úÂëÈç¹ûÕý³£ÔËÐУ¬¾Í×ÔÈ»µÄ֤ʵÁËÕâÒ»µã¡£

³ä·ÖÀûÓÃPythonµÄÌØÐÔ

repr·þÎñ

ÒÔÉÏÀý×Ӻܼòµ¥£¬µ«ÊÇ¿ÉÒÔ±í´ïÖ÷Ö¼£¬ÊǽøÒ»²½Á˽âºÍ°ÑÎÕP4D±àдÀ©Õ¹µÄ»ù´¡¡£ ´Ó3.1µÄ²âÊÔÓÃÀý¿´:

>>> print SmallPoint(222,111)
<SmallPoint at D393C8>

ÕâÑùµÄÊä³öºÜ²»ÓѺã¬ÎÒÃÇÏ£ÍûËûÊÇÕâÑùµÄ:

>>> print SmallPoint(222,111)
222,111

ÕâÑùµÄ·þÎñÔÚpyÄÚÔçÒÑ´æÔÚ£¬ËüµÄÃû×Ö½Ð×örepr£¬Ã¿¸ö¶ÔÏóÈç¹ûÏ£Íû´òÓ¡ÓѺ㬶¼Ó¦¸ÃÖ§³ÖÕâÑùµÄ·þÎñ¡£ ÔÚDelphi±àдµÄPyÀ©Õ¹ÖУ¬ÈçºÎ×öµ½ÕâÑùµÄЧ¹û£¿

Àý×Ó

Ò»µ©¿ò¼ÜÆÌ³ÂÍê±Ï£¬±àд¾ßÌåµÄ¹¦Äܾͺܼòµ¥ÁË¡£repr·þÎñÖ»Òª¸²¸ÇÒ»¸ö·½·¨£¬¼ÓÉ϶Էµ»Ø²ÎÊýµÄ°ü×°¾Í¿ÉÒÔÁË:

function  Repr : PPyObject; override;
..
implementation
..
function TPyDelphiPoint.Repr: PPyObject;
begin
with GetPythonEngine do
Result := PyString_FromString(PChar(Format('<Point (%d, %d)>', [Value.X, Value.Y])));
end;

¸ü¶à

ÉèÖÃÊôÐÔ£¬ÐèÒª¸²¸ÇRegisterGetSets·½·¨:

class procedure TPyDelphiPoint.RegisterGetSets(PythonType: TPythonType);
begin
inherited;
with PythonType do
begin
AddGetSet('X', @TPyDelphiPoint.Get_X, @TPyDelphiPoint.Set_X,
'Provides access to the X coordinate of a point', nil);
AddGetSet('Y', @TPyDelphiPoint.Get_Y, @TPyDelphiPoint.Set_Y,
'Provides access to the Y coordinate of a point', nil);
end;
end;

±ðÍüÁËÔÚSetupTypeÄÚ¼ÓÈëÒ»ÐУº

PythonType.Services.Basic := PythonType.Services.Basic+[bsGetAttrO, bsSetAttrO];

¸æËßPythonÄãµÄ·þÎñÖÐÓÐÊôÐÔµÄÖ§³Ö¡£

ÔÊÐídpointÖ®¼ä±È½Ï´óС£¬ÐèÒª¸²¸ÇCompare·½·¨:

function TPyDelphiPoint.Compare(obj: PPyObject): Integer;
var
_other : TPyDelphiPoint;
begin
if IsDelphiObject(obj) and (PythonToDelphi(obj) is TPyDelphiPoint) then
begin
_other := TPyDelphiPoint(PythonToDelphi(obj));
Result := CompareValue(Value.X, _other.Value.X);
if Result = 0 then
Result := CompareValue(Value.Y, _other.Value.Y);
end
else
Result := 1;
end;

ͬÑù±ðÍüÁËÔÚSetupTypeÄÚ¼ÓÈëÒ»ÐÐ:

PythonType.Services.Basic := PythonType.Services.Basic+[bsCompare];

¸æËßPythonÄãµÄ·þÎñÖÐÓÐbsCompareµÄÖ§³Ö¡£

±àдÀ©Õ¹ºó×öʲô£¿

  1. P4dµÄ´úÂëÖµµÃÒѶÁ£¬ÒòΪ
  • »ùÓÚ×¢²áµÄ¼Ü¹¹£¬dllÖ±½Óµ½ÀàTDynamicDllÖµµÃ¿´£¬Á˽âPythonµÄÄÚ²¿ÊµÏÖ£¬P4d±¾Éí¾ÍÊÇPythonºÍDelphi½áºÏ±à³ÌµÄÁ¼ºÃ°ñÑù¡£
  • ¿ÉÒԺܺõÄÁ˽âPythonÀàÐ͵ÄÄÚ²¿ÊµÏÖ£¬±ÈÈçÕûÊýµÄ½á¹¹ÀïÃæÓÐÄÇЩ×ֶΣ¬ÓÐÄÇЩ»ù±¾ÀàÐÍ·þÎñµÄ·½·¨
  1. ʹÓÃP4D»¹¿ÉÒÔÔõôÑù£¿
Õâ¸öͼ¾°ÔÚÎÒ×Ô¼º»¹²¢²»ºÜÇå³þ¡£µ«ÊÇPythonºÍDelphiµÄ½áºÏµÄÔ¸ÍûÔÚÎÒÈ´Ò»Ö±ºÜÇ¿ÁÒ£¬Ï£ÍûÓиü¶àµÄÅóÓѲÎÓë½øÀ´£¬Ìá³ö¸ü¶àµÄÏë·¨¡£

²Î¿¼

[1] Michael Hudson 's writingPythonExtensions

[2] P4D Python For DelphiµÄËõд£¬´ÓËüµÄChange.txtÄÚ¿ÉÒÔ¿´µ½£¬Õâ¸öP4D´Ó1998Äê¼ÆËãÓнӽü10ÄêµÄÀúÊ·ÁË¡£ÊÀµÀ²×É£°¡¡£

[3] Using Delphi and Python together pythonDelphiTalk .

ºÜºÃµÄ½Ì³Ì£¬¿Éϧ¶ÔÊä³öÀàÐÍÕâÀïÓïÑɲ»Ï꣬²»ÖªµÀΪʲô¡£ÕâÒ²ÊÇÎÒҪд±¾Îĵ͝Òò¡£


Delphi = a great object oriented language, and a fantastic RAD environment and framework. You can build excellent GUI's in Delphi that run very fast and have a small .EXE footprint. Runs on linux too. There is a free version of Delphi, too.

Python = is rapidly rising in popularity due to its pseudo-code-like, syntactically minimalist but straightforward syntax. Like the Delphi community, the Python community of programmers has a nice feel about it, and it is committed to developing rich, high quality, open-source class libraries for Python - without the hype of Java.

This paper will demonstrate how to incorporate Python in any of your Delphi apps! Or conversely, how to use Delphi as a GUI for your python apps.

¡ªAndy¡¡Bulka


Valid XHTML 1.0 Strict and CSS. Powered by pLog
Design by Blog.lvwo.com