Предыдущая серия была тут - http://18delphi.blogspot.com/2013/11/gui-3-wordworker.html
Теперь как же в процедуру WorkTheWord передаётся управление и откуда берётся aWordToTheRight?
Дело в том, что слово TscriptWordWorker - помечено, как слово "непосредственного исполнения". Т.е. оно выполняется в процессе компиляции кода.
Как это выглядит?
А вот так:
Теперь как же в процедуру WorkTheWord передаётся управление и откуда берётся aWordToTheRight?
Дело в том, что слово TscriptWordWorker - помечено, как слово "непосредственного исполнения". Т.е. оно выполняется в процессе компиляции кода.
Как это выглядит?
А вот так:
interface type TscriptWordWorker = class(TscriptKeyWord) protected function IsImmediate: Boolean; override; procedure DoIt(aContext: TscriptContext); override; procedure WorkTheWord(aWordToTheRight : TscriptKeyWord; aContext: TscriptContext); virtual; abstract; end;//TscriptWordWorker implementation function TscriptWordWorker.IsImmediate: Boolean; begin Result := true; end; type TscriptCompiledWordWorker = class(TscriptKeyWord) // - вспомогательное слово, которое компилируется по месту вызова private f_Worker : TscriptWordWorker; f_WordToRight : TscriptKeyWord; protected procedure DoIt(aContext: TscriptContext); override; procedure Cleanup; override; public constructor Create(aWorker : TscriptWordWorker; aWordToRight: TscriptKeyWord); end;//TscriptCompiledWordWorker constructor TscriptCompiledWordWorker.Create(aWorker : TscriptWordWorker; aWordToRight: TscriptKeyWord); begin inherited Create; aWorker.SetReferenceTo(f_Worker); aWordToRight.SetReferenceTo(f_WordToRight); end; procedure TscriptCompiledWordWorker.Cleanup; begin FreeAndNil(f_Worker); FreeAndNil(f_WordToRight); inherited; end; procedure TscriptCompiledWordWorker.DoIt(aContext: TscriptContext); begin f_Worker.WorkTheWord(f_WordToRight); end; procedure TscriptWordWorker.DoIt(aContext: TscriptContext); var l_CompileContext : TscriptCompileContext; l_WordToTheRight : TscriptKeyWord; l_CompiledWordWorker : TscriptCompiledWordWorker; begin l_CompileContext := (aContext As TscriptCompileContext); l_WordToTheRight := l_CompileContext.CompileWordToTheRight; // - Об устройстве этого метода поговорим чуть позже try l_CompiledWordWorker := TscriptCompiledWordWorker.Create(Self, l_WordToTheRight); try l_CompileContext.Code.CompileKeyWord(l_CompiledWordWorker); finally FreeAndNil(l_CompiledWordWorker); end;//try..finally finally FreeAndNil(l_WordToTheRight); end;//try..finally end;Устройство метода CompileWordToTheRight - разберём в следующих сериях.
Комментариев нет:
Отправить комментарий