unit ProcDict; interface type MyProc = procedure (s : String); procedure RegisterProc(procName : String; proc : MyProc); procedure ExecuteProc(procName : String; arg : String); implementation uses Classes; var ProcDict : TStringList; procedure RegisterProc(procName : String; proc : MyProc); begin ProcDict.AddObject(procName, TObject(@proc));end; procedure ExecuteProc(procName : String; arg : String); var index : Integer;begin index := ProcDict.IndexOf(ProcName);if index >= 0 thenMyProc(ProcDict.objects[index])(arg);// Можно вставить обработку исключительной ситуации - сообщение об ошибке end; initialization ProcDict := TStringList.Create;ProcDict.Sorted := true; finalization ProcDict.Free; end. |
[000307]
Никак. Тем не менее, вы могли бы создать StringList как показано ниже:
|
StringList.Create; StringList.AddObject('Proc1',@Proc1); StringList.AddObject('Proc2',@Proc2); |
и затем реализовать это в вашей программе:
var myFunc : procedure;begin if Stringlist.indexof(S) = -1 thenMessageDlg('Не понял процедуру '+S,mtError,[mbOk],0)elsebegin@myFunc := Stringlist.Objects[Stringlist.indexof(S)];myFunc;end; |
RAM [000697]