{"id":2274,"date":"2015-04-08T23:53:55","date_gmt":"2015-04-08T15:53:55","guid":{"rendered":"http:\/\/blog.qdac.cc\/?p=2274"},"modified":"2015-04-08T23:53:55","modified_gmt":"2015-04-08T15:53:55","slug":"%e8%af%91-%e5%a6%82%e4%bd%95%e5%9c%a8-c-builder-%e4%b8%ad%e4%bd%bf%e7%94%a8-delphi-%e7%9a%84%e5%8c%bf%e5%90%8d%e6%96%b9%e6%b3%95","status":"publish","type":"post","link":"https:\/\/blog.qdac.cc\/?p=2274","title":{"rendered":"[\u8bd1] \u5982\u4f55\u5728 C++ Builder \u4e2d\u4f7f\u7528 Delphi \u7684\u533f\u540d\u65b9\u6cd5"},"content":{"rendered":"<p><i>\u56de\u5230\u00a0<a title=\"Handling Delphi Features in C++Builder Index\" href=\"http:\/\/docwiki.embarcadero.com\/RADStudio\/XE8\/en\/Handling_Delphi_Features_in_C%2B%2BBuilder_Index\">\u5728 C++ Builder \u4e2d\u4f7f\u7528 Delphi \u7279\u6027<\/a><\/i><\/p>\n<p>\u672c\u4e3b\u9898\u63cf\u8ff0\u4e86\u4e00\u4e9b\u4f60\u53ef\u80fd\u5728\u9762\u5bf9\u533f\u540d\u51fd\u6570\u65f6\u9047\u5230\u7684\u7f16\u7a0b\u95ee\u9898-\u4e00\u4e2a Delphi \u7684\u65b0\u7279\u6027\u3002<\/p>\n<p>\u8bf4\u8d77\u6765\uff0cDelphi \u662f\u901a\u8fc7\u63a5\u53e3\u7684\u4e00\u4e2a Invoke(&#8230;) \u51fd\u6570\u6765\u5b9e\u73b0\u533f\u540d\u51fd\u6570\u7684\uff08\u4e5f\u88ab\u79f0\u4e3a\u51fd\u6570\u5f15\u7528\uff09\u3002<\/p>\n<p>\u6240\u4ee5\u4e00\u4e2a Delphi \u4e2d\u7684\u51fd\u6570\u5f15\u7528\u53c2\u6570\u5bfc\u51fa\u5230 C++ \u5c31\u6210\u4e86\u4e00\u4e2a\u62e5\u6709\u51fd\u6570\u7684\u63a5\u53e3\uff0c\u4e0b\u9762\u662f\u4e00\u4e2a\u4f8b\u5b50\uff1a<\/p>\n<pre class=\"lang:delphi decode:true \">interface\r\n\r\ntype\r\nTFilterPredicate = reference to function(const Path: string;const SearchRec: TSearchRec): Boolean;\r\n\/\/ ...\r\nclass function GetFiles(const Path: string;\r\nconst Predicate: TFilterPredicate): TStringDynArray;overload; inline; static;<\/pre>\n<p>\u4e0b\u9762\u662f\u6839\u636e\u4e0a\u9762\u751f\u6210\u7684 .hpp \u6587\u4ef6\uff1a<\/p>\n<pre class=\"lang:delphi decode:true\">typedef System::DelphiInterface&lt;TFilterPredicate&gt; _di_TFilterPredicate;\r\n__interface TFilterPredicate : public System::IInterface \r\n{\r\nvirtual bool __fastcall Invoke(const System::UnicodeString Path, const System::Sysutils::TSearchRec &amp;SearchRec) = 0 ;\r\n};\r\n\/\/ .. \r\nstatic System::TStringDynArray __fastcall GetFiles(const System::UnicodeString Path, const _di_TFilterPredicate Predicate)\/* overload *\/;<\/pre>\n<p>\u5c31\u8c61\u4e0a\u9762\u6240\u770b\u5230\u7684\uff0cTFilterPredicate \u5728 C++ \u8fd9\u8fb9\u88ab\u5bfc\u51fa\u4e3a\u4e00\u4e2a\u63a5\u53e3\u3002C++ \u4ee3\u7801\u4e2d\u4f7f\u7528\u4e00\u4e2a\u5305\u542b Invoke() \u65b9\u6cd5\u7684\u63a5\u53e3\u6765\u505a\u4e3a\u51fd\u6570\u5f15\u7528\u53c2\u6570\u3002<\/p>\n<p>\u4e0b\u9762\u63d0\u4f9b\u4e86\u4e24\u79cd\u65b9\u6cd5\u6765\u5b9e\u73b0\u8fd9\u4e00\u63a5\u53e3\uff1a<\/p>\n<ul>\n<li>\u4f7f\u7528\u4e00\u4e2a\u51fd\u6570\u5bf9\u8c61<\/li>\n<\/ul>\n<p>\u4e00\u4e2a C++ \u6a21\u677f\u53ef\u4ee5\u7528\u6765\u5c01\u88c5\u4e00\u4e2a\u63a5\u53e3\u5e76\u66b4\u9732 Invoke() \u65b9\u6cd5\u3002<\/p>\n<p>\u4e0b\u9762\u7684 C++ \u4ee3\u7801\u663e\u793a\u4e86\u4e00\u4e2a\u53ef\u4ee5\u7528\u4e8e\u4f20\u9012C++\u65b9\u6cd5\u6216\u6210\u5458\u51fd\u6570\u505a\u4e3a\u51fd\u6570\u5f15\u7528\u7ed9 Delphi \u7684\u6a21\u677f\u793a\u4f8b\uff1a<\/p>\n<pre class=\"lang:c++ decode:true\">#include &lt;System.hpp&gt;\r\n\r\nenum _DummyType{}; \/\/ Parameter used as default\r\n\r\ntemplate &lt;typename INTF, \/\/ Interface with Invoke\r\ntypename F, \/\/ Functor type\r\ntypename R, \/\/ Return type\r\ntypename P1 = _DummyType, \/\/ Param #1\r\ntypename P2 = _DummyType, \/\/ Param #2\r\ntypename P3 = _DummyType, \/\/ Param #3\r\ntypename P4 = _DummyType, \/\/ Param #4\r\ntypename P5 = _DummyType&gt; \/\/ Param #5\r\nclass TMethodRef : public TCppInterfacedObject&lt;INTF&gt;\r\n{\r\nprivate:\r\nF callback;\r\npublic:\r\nTMethodRef(F _callback) : callback(_callback) {}\r\nINTFOBJECT_IMPL_IUNKNOWN(TInterfacedObject);\r\n\r\nR __fastcall Invoke(P1 p1) {\r\nreturn callback(p1);\r\n}\r\nR __fastcall Invoke(P1 p1, P2 p2) {\r\nreturn callback(p1, p2);\r\n}\r\nR __fastcall Invoke(P1 p1, P2 p2, P3 p3) {\r\nreturn callback(p1, p2, p3);\r\n}\r\nR __fastcall Invoke(P1 p1, P2 p2, P3 p3, P4 p4) {\r\nreturn callback(p1, p2, p3, p4);\r\n}\r\nR __fastcall Invoke(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) {\r\nreturn callback(p1, p2, p3, p4, p5);\r\n}\r\n};<\/pre>\n<p>\u4e0b\u9762\u7684\u4ee3\u7801\u6f14\u793a\u4e86\u5982\u4f55\u4f7f\u7528\u6a21\u677f\u6765\u8c03\u7528 GetFiles\uff1a<\/p>\n<pre class=\"lang:c++ decode:true \">#include &lt;System.IOUtils.hpp&gt;\r\n#include &lt;iostream&gt;\r\n\r\nstruct Filter {\r\nFilter(String _ext) : ext(_ext)\r\n{}\r\nbool operator()(const System::UnicodeString, const System::Sysutils::TSearchRec &amp;SearchRec) {\r\nreturn ExtractFileExt(SearchRec.Name) == ext;\r\n}\r\nString ext;\r\n};\r\n\r\nint main()\r\n{\r\ntypedef TMethodRef&lt;TDirectory::TFilterPredicate,Filter,bool,const System::UnicodeString,const System::Sysutils::TSearchRec&amp;&gt; MyMethRef;\r\nString ext(\".cpp\"); \r\nTStringDynArray files = TDirectory::GetFiles(TDirectory::GetCurrentDirectory(),\r\nTDirectory::_di_TFilterPredicate(new MyMethRef(Filter(ext))));\r\nstd::cout &lt;&lt; \"Found \" &lt;&lt; files.Length \r\n&lt;&lt; \" files with ext: '\" &lt;&lt; AnsiString(ext).c_str() &lt;&lt; \"'\\n\";\r\nfor (int i=0; i&lt;files.Length; ++i)\r\nstd::cout &lt;&lt; AnsiString(files[i]).c_str() &lt;&lt; std::endl;\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<p>[\u4ffa\u7684\u8bc4\u4ef7\uff1a\u4f9d\u7136\u5f88\u4e0d\u8212\u670d]<\/p>\n<ul>\n<li>\u4f7f\u7528\u4e00\u4e0a Lamda \u8868\u8fbe\u5f0f<\/li>\n<\/ul>\n<p>\u5f53\u4e00\u4e2a API \u8981\u6c42\u4e00\u4e2a\u533f\u540d\u51fd\u6570\u65f6\uff0c\u4f60\u4e5f\u53ef\u4ee5\u4f7f\u7528\u4e00\u4e2a Lambda \u8868\u8fbe\u5f0f\u3002Delphi \u63a5\u53e3\u7c7b\u88ab\u66f4\u65b0\u4ee5\u81ea\u52a8\u8f6c\u6362\u4e3a lambda \u8868\u8fbe\u5f0f\u3002\u8fd9\u4e2a\u7279\u6027\u4ec5\u9002\u7528\u4e8e\u57fa\u4e8e Clang \u00a0\u7684 C++ \u7f16\u8bd1\u5668\u3002<\/p>\n<p>\u4e0b\u9762\u662f\u793a\u4f8b\u89e3\u51b3\u65b9\u6cd5\uff1a<\/p>\n<pre class=\"lang:delphi decode:true\">#include &lt;System.hpp&gt;\r\n#include &lt;System.IOUtils.hpp&gt;\r\n#include &lt;iostream&gt;\r\n\r\nint main()\r\n{\r\nString ext(\".cpp\"); \r\nTStringDynArray files = TDirectory::GetFiles(TDirectory::GetCurrentDirectory(),\r\n[ext](const String Path, const System::Sysutils::TSearchRec &amp;SearchRec) -&gt; bool\r\n{\r\nreturn ExtractFileExt(SearchRec.Name) == ext;\r\n});\r\nstd::cout &lt;&lt; \"Found \" &lt;&lt; files.Length \r\n&lt;&lt; \" files with ext: '\" &lt;&lt; AnsiString(ext).c_str() &lt;&lt; \"'\\n\";\r\nfor (int i=0; i&lt;files.Length; ++i)\r\nstd::cout &lt;&lt; AnsiString(files[i]).c_str() &lt;&lt; std::endl;<\/pre>\n<p>[\u597d\u5427\uff0c\u8212\u670d\u591a\u4e86\uff0c\u4e0d\u8fc7\u9057\u61be\u7684\u662f BCC32 \u660e\u663e\u4e0d\u652f\u6301\u8fd9\u79cd\u8868\u8fbe\u65b9\u5f0f]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u56de\u5230\u00a0\u5728 C++ Builder \u4e2d\u4f7f\u7528 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[69,21],"tags":[71],"class_list":["post-2274","post","type-post","status-publish","format-standard","hentry","category-c-builder","category-misc","tag-71"],"views":3466,"_links":{"self":[{"href":"https:\/\/blog.qdac.cc\/index.php?rest_route=\/wp\/v2\/posts\/2274","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.qdac.cc\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.qdac.cc\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.qdac.cc\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.qdac.cc\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2274"}],"version-history":[{"count":1,"href":"https:\/\/blog.qdac.cc\/index.php?rest_route=\/wp\/v2\/posts\/2274\/revisions"}],"predecessor-version":[{"id":2275,"href":"https:\/\/blog.qdac.cc\/index.php?rest_route=\/wp\/v2\/posts\/2274\/revisions\/2275"}],"wp:attachment":[{"href":"https:\/\/blog.qdac.cc\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2274"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.qdac.cc\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2274"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.qdac.cc\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2274"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}