FastScriptのスクリプトをデバッグするアプリケーションを作成してみます。
スクリプトを実行するとき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;