delphi通过方法名调用方法
<p>delphi通过方法名调用方法</p><div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">unit Unit1;
</span><span style="color: rgba(0, 0, 255, 1)">interface</span><span style="color: rgba(0, 0, 0, 1)">
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Vcl.StdCtrls;
type
TFunc </span>= procedure(Param: <span style="color: rgba(0, 0, 255, 1)">string</span>) of <span style="color: rgba(0, 0, 255, 1)">object</span>; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">定义方法原型</span>
<span style="color: rgba(0, 0, 0, 1)">
TForm1 </span>= <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
published
procedure hello(p: </span><span style="color: rgba(0, 0, 255, 1)">string</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">必须声明为published方法</span>
<span style="color: rgba(0, 0, 0, 1)">end;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
Form1: TForm1;
implementation
{$R </span>*<span style="color: rgba(0, 0, 0, 1)">.dfm}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">根据方法名调用方法</span>
<span style="color: rgba(0, 0, 0, 1)">
procedure ExecFunc(className, funcName, funcParam: </span><span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
m: TMethod;
f: TFunc;
begin
</span><span style="color: rgba(0, 0, 255, 1)">var</span> p: TPersistentClass :=<span style="color: rgba(0, 0, 0, 1)"> FindClass(className);
</span><span style="color: rgba(0, 0, 255, 1)">if</span> p =<span style="color: rgba(0, 0, 0, 1)"> nil then exit;
m.Data :</span>=<span style="color: rgba(0, 0, 0, 1)"> Pointer(p);
m.Code :</span>=<span style="color: rgba(0, 0, 0, 1)"> p.MethodAddress(funcName);
</span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> Assigned(m.Code) then
begin
f :</span>=<span style="color: rgba(0, 0, 0, 1)"> TFunc(m);
f(funcParam);
end;
end;
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
ExecFunc(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">TForm1</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">hello</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">hello yn</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
end;
procedure TForm1.hello(p: </span><span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">);
begin
ShowMessage(p);
end;
initialization
RegisterClass(TForm1);
finalization
UnRegisterClass(TForm1);
end.</span></pre>
</div>
<p> 方法二:通过RTTI调用</p>
<p> </p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">unit Unit1;
</span><span style="color: rgba(0, 0, 255, 1)">interface</span><span style="color: rgba(0, 0, 0, 1)">
uses
system.Rtti, System.StrUtils, Winapi.Windows, Winapi.Messages, System.SysUtils,
System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms,
Vcl.Dialogs, Vcl.StdCtrls;
type
TFunc </span>= <span style="color: rgba(0, 0, 255, 1)">class</span>(TPersistent) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">基类</span>
<span style="color: rgba(0, 0, 0, 1)">
end;
TFunc1 </span>= <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">(TFunc)
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">必须public,published</span>
procedure p1(p: <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">);
procedure p2(p: </span><span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">);
end;
TForm1 </span>= <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)">
end;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
Form1: TForm1;
implementation
{$R </span>*<span style="color: rgba(0, 0, 0, 1)">.dfm}
function FindAClass(</span><span style="color: rgba(0, 0, 255, 1)">const</span> Name: <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">): TClass;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
ctx: TRttiContext;
typ: TRttiType;
list: TArray</span><TRttiType><span style="color: rgba(0, 0, 0, 1)">;
begin
Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> nil;
ctx :</span>=<span style="color: rgba(0, 0, 0, 1)"> TRttiContext.Create;
list :</span>=<span style="color: rgba(0, 0, 0, 1)"> ctx.GetTypes;
</span><span style="color: rgba(0, 0, 255, 1)">for</span> typ <span style="color: rgba(0, 0, 255, 1)">in</span> list <span style="color: rgba(0, 0, 255, 1)">do</span><span style="color: rgba(0, 0, 0, 1)">
begin
</span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> typ.IsInstance and (EndsText(Name, typ.Name)) then
begin
Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> typ.AsInstance.MetaClassType;
</span><span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
end;
end;
ctx.Free;
end;
procedure execFunc(className, funcName: </span><span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">; funcParam: array of TValue);
begin
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> ctx: TRttiContext;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> t: TRttiType;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> m: TRttiMethod;
ctx :</span>=<span style="color: rgba(0, 0, 0, 1)"> TRttiContext.Create;
</span><span style="color: rgba(0, 0, 255, 1)">var</span> c: TClass :=<span style="color: rgba(0, 0, 0, 1)"> FindAClass(className);
t :</span>=<span style="color: rgba(0, 0, 0, 1)"> ctx.GetType(c);
m :</span>=<span style="color: rgba(0, 0, 0, 1)"> t.GetMethod(funcName);
</span><span style="color: rgba(0, 0, 255, 1)">var</span> o: TFunc := c.Create <span style="color: rgba(0, 0, 255, 1)">as</span><span style="color: rgba(0, 0, 0, 1)"> TFunc;
m.Invoke(o, funcParam);
ctx.Free;
o.Free;
end;
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
RegisterClass(TFunc1);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">注册类</span>
execFunc(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">TFunc1</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">p1</span><span style="color: rgba(128, 0, 0, 1)">'</span>, [<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">hello yn</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">]);
execFunc(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">TFunc1</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">p2</span><span style="color: rgba(128, 0, 0, 1)">'</span>, [<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">hello yn2</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">]);
end;
{ TFunc1 }
procedure TFunc1.p1(p: </span><span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">);
begin
ShowMessage(p);
end;
procedure TFunc1.p2(p: </span><span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">);
begin
ShowMessage(p);
end;
end.</span></pre>
</div>
<p> </p>
</div>
<div id="MySignature" role="contentinfo">
<p>本文来自博客园,作者:{咏南中间件},转载请注明原文链接:https://www.cnblogs.com/hnxxcxg/p/17066399.html</p><br><br>
来源:https://www.cnblogs.com/hnxxcxg/p/17066399.html
頁:
[1]