【发布时间】:2015-06-01 16:30:24
【问题描述】:
我需要找到一种方法来识别调用类中当前函数或过程的位置。结果是内存位置还是单元和行号无关紧要,只要是调用来自的唯一位置即可。
位置 ID 需要快速计算,因为它将用于决定缓存数据是否可用。
例如。
type
TTestObject = class
public
procedure TestProc;
procedure TestCall;
end;
...
procedure TTestObject.TestProc;
begin
TestCall; // "Point A" - Displays "Point A"
TestCall; // "Point B" - Displays "Point B"
end;
procedure TTestObject.TestCall;
begin
ShowMessage(SomehowGetTheCallingLineLocation); // Displays "Point A" or "Point B" depending on which line above it is called from
end;
end.
在调用TestProc时会显示“点A”,然后显示“点B”,无论创建了多少个TTestObject实例或它们驻留在内存中的什么位置。
该功能将用于生成 SQL。目前,我将 GUID 传递给生成 SQL 的调用。如果 SQL 已经生成,则此 GUID 用于从缓存中拉取 SQL。
NewCommand(NewUpdateCriteria('{C43D3B79-9E73-4A4B-9E29-0553542AD0B2}').
SetValue('AFIELD', AValue).
Table
('ATABLE').
Where
(NewSQLComparitor
('ID', EqualTo, AID)));
调用位置的查找需要很快,否则它会抵消我们应该通过缓存 SQL 看到的速度改进。
该组件最终可能会开源,因此我无法使用任何商业第三方组件。我还想避免对 JEDI 等开源库的依赖。
【问题讨论】:
-
为什么不直接传入一个参数呢?
TTestObject.TestCall(UseCached : boolean);或者,任何存储缓存数据的对象都可以跟踪它是否具有有效数据。即:if FCacheDataStore.HasValidData then... -
我也想知道你所说的“快”是什么意思。您是否有特定的性能限制?
-
@DavidHeffernan - 我添加了一些关于我正在尝试做的事情的更多信息。
-
顺便说一句,ORM 最终可能会开源,所以我无法使用任何商业第三方组件。我还想避免对 JEDI 等开源库的依赖。
-
@DavidHeffernan - 好的,我已将评论添加到问题中。谢谢。
标签: delphi delphi-xe7