пятница, 8 ноября 2013 г.

GUI-тестирование "по-русски". Продолжение про WordWorker'ы

Предыдущая серия была тут - http://18delphi.blogspot.com/2013/11/gui-3-wordworker.html

Теперь как же в процедуру 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 - разберём в следующих сериях.

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

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