gpt4 book ai didi

delphi - 通过名称将现有方法从一个单元分配给另一个单元中的通用TMethod

转载 作者:行者123 更新时间:2023-12-03 18:31:53 24 4
gpt4 key购买 nike

基本上,我有一个应用程序,它将从INI文件中检索信息,并且此过程的一部分包括提取名称(存储在INI中)的名称,该名称在另一单元的全局范围内声明。

我使用以下方法获取SQL方法:

MyIni.ReadString('SQL', SubStr + '_Insert, ''); 


SubStr是我想要的数据类型,例如“ titles”,它以我想要的SQL过程类型作为前缀,在本例中为“ _Insert”,因此,我在这里的请求可以看成是:

MyIni.ReadString('SQL', 'titles_Insert', ''); 


然后,这将检索相应的SQL过程名称“ InsertTitlesSql”,该名称将显示在INI内,因此:

[SQL]    
titles_Insert=InsertTitlesSql


我有一个列出我们使用的SQL过程的单元。
像这样:

unit uSqlLibrary;

interface
function InsertTitlesSql: string;

implementation

function InsertTitlesSql: string;
begin
{
INSERT INTO TITLES (ENGLISH, AFRIKAANS, KEY)
VALUES (:english,
:afrikaans,
:key)
}
Result := ''
+'INSERT INTO TITLES (ENGLISH, AFRIKAANS, KEY) '
+'VALUES (:english, '
+' :afrikaans, '
+' :key) ';
end;

end.


我已经尝试了TGenericContainer并没有成功,我也尝试了MethodAddress,但是我不知道如何告诉MethodAddress在没有引用对象的情况下查看另一个单元(例如Form1.MethodAddress()),这是我迄今为止最好的结果这是:

type
TExec = procedure of object;

procedure TForm1.Button1Click(Sender: TObject);
var
M : TMethod ;
E : TExec ;
begin
M.Code := @Test; // Where "Test" is a procedure inside a secondary Unit.
E := TExec(M);
E;
end;


我想做的是通过所需的名称(函数InsertTitlesSql:string;)获取SQL过程,并将其分配给行为相同的通用方法。

我的团队负责人说他不想编辑uSqlLibrary。所以我不能那样做,并考虑改用方法的名称。欢迎其他任何建议。

希望这很清楚。抱歉,不是(我对xD的使用不是很好)。如果可以的话,我会尽我所能详细说明您的问题。

最佳答案

您不能使用RTTI来枚举具有全局范围的过程。您可以枚举方法,因此可以将全局过程转换为静态类方法。

但是,您还声明团队负责人不希望您更改uSqlLibrary。我认为这似乎是短视的。随时告诉他/她我是这样说的。

无论如何,如果您不能更改uSqlLibrary,则不能使用RTTI。因此,您需要构造自己的查找表。使用通用字典:

uses
System.Generics.Collections;

var
ProcTable: TDictionary<string, TProc>;


以通常的方式实例化它。在程序启动时添加功能:

....
ProcTable.Add('InsertTitlesSql', InsertTitlesSql);
....


当您需要查找并调用它时,请执行以下操作:

var
Proc: TProc;
....
if not ProcTable.TryGetValue(ProcName, Proc) then
raise EProcNotFound.CreateFmt(...);
Proc();


默认情况下,用于键的默认相等比较器区分大小写。因此,您可以选择提供一个自定义的相等比较器,该比较器比较键时不区分大小写。

关于delphi - 通过名称将现有方法从一个单元分配给另一个单元中的通用TMethod,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22616817/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com