Предыдущая серия была тут - 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 - разберём в следующих сериях.
Комментариев нет:
Отправить комментарий