Страницы

Поиск по вопросам

среда, 22 мая 2019 г.

Можно ли в Delphi, вызвать функцию по имени, которое хранится в строке?

Есть строка, которая может принимать разные значения,
можно ли вызвать функцию, имя которой, равно значению строки,
а если, допустим, такой функции нет, то ничего не произойдет
Что бы не использовать много раз if str = 'myfunc' then myfunc(a);


Ответ

как следует из комментариев, от того, что у вас используется классовая функция, ничего особо не меняется (при использовании RTTI для решения задачи)
type TTest = class(TObject) public class function myFunc(x : integer): integer; end;
class function TTest.myFunc(x: integer): integer; begin result := x*100; end;
метод TRttiMethod.invoke() имеет несколько перегруженных вараинтов, и может принимать как экземпляр класса так и мета-класс (class of ..).
function invokeClassFunction(cls: TClass; funcName: string; args: array of TValue): TValue; var ctx: TRttiContext; t: TRttiType; m: TRttiMethod; begin ctx := TRttiContext.Create(); try t := ctx.GetType(cls); m := t.GetMethod(funcName); if (m = nil) then raise Exception.Create('Method not found');
result := m.Invoke(cls, args); finally ctx.Free(); end; end;
Поэтому при вызове вы просто указываете нужный класс:
var r : TValue;
try r := invokeClassFunction(TTest, 'myFunc', [1]); writeln('result: ', r.AsInteger); except on e: Exception do writeln('ничего не проиозошло'); end;

Комментариев нет:

Отправить комментарий