FastScriptを使ってみる スクリプトをデバッグする

FastScriptのスクリプトをデバッグするアプリケーションを作成してみます。

005

スクリプトを実行するときTfsScriptのOnRunLineイベントが呼ばれます。
引数から実行するコードがわかります。

procedure TForm1.fsScript1RunLine(Sender: TfsScript;
  const UnitName, SourcePos: string);
begin
  …
end;

引数SourcePosはfsPosToPoint関数でTPoint型に変換できます。
TPointのYプロパティに行、Xプロパティに文字の場所が設定されます。

uses
  fs_itools;
var
  p: TPoint;
begin
  p := fsPosToPoint(SourcePos);

取得した実行位置をTfsSyntaxMemoコンポーネントのSetPosプロパティに設定することで、実行しているコードの場所にカーソルを配置できます。

fsSyntaxMemo1.SetPos(p.X, p.Y);

TfsSyntaxMemoコンポーネントのSetActiveLineメソッドに実行している行番号を設定することで、実行中の行をアクティブにできます。

Dec(p.Y);
fsSyntaxMemo1.SetActiveLine(p.Y);

フォームにBoolean型のメンバ変数FExecを追加します。

type
  TForm1 = class(TForm)
  private
    FExec: Boolean;

fsScript1のOnRunLineイベント内でメンバ変数FExecがTrueになるまで、スクリプトの実行を待機します。

FExec := False;
while not FExec do
begin
  Sleep(10);
  Application.ProcessMessages;
end;

fsScript1RunLine関数は次のようになります。

procedure TForm1.fsScript1RunLine(Sender: TfsScript;
  const UnitName, SourcePos: string);
var
  p: TPoint;
begin
  p := fsPosToPoint(SourcePos);
  fsSyntaxMemo1.SetPos(p.X, p.Y);
  Dec(p.Y);
  fsSyntaxMemo1.SetActiveLine(p.Y);
  fsSyntaxMemo1.SetFocus;

  FExec := False;
  while not FExec do
  begin
    Sleep(10);
    Application.ProcessMessages;
  end;
end;

「次の処理へ」ボタンを押したときに、メンバ変数FExecをTrueにします。

procedure TForm1.Button2Click(Sender: TObject);
begin
  FExec := True;
end;

「中止」ボタンを押すと、fsScript1のTerminateメソッドを呼び出し、処理を中止します。

procedure TForm1.Button3Click(Sender: TObject);
begin
  fsScript1.Terminate;
end;

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください