Мне нужно найти способ определить место, из которого была вызвана текущая функция или процедура в классе. Неважно, является ли результат ячейкой памяти или номером устройства и строки, просто что-то уникальное для позиции, из которой пришел вызов.
Идентификатор местоположения необходимо вычислить быстро, так как он будет использоваться для принятия решения о доступности кэшированных данных.
Например.
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. Этот 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...
- person J...   schedule 01.06.2015