2009-06-26 4 views
9

RemObjects(優れた)のPascalScriptとSynEditエディタを使用して、組み込みのスクリプトエンジンを作成します。 PascalScriptに同梱されているIDEの例とSynEditのIDEの例を使ってほぼ完成しましたが、番号の付いたソース行が「実行可能」かどうかをPascalScriptに問い合わせる方法はわかりません。 (私はこれを使ってSynEdit溝を 'Delphi blue dot'でマークすることができます)。私はROPSの出力を分解しなければならないかもしれないと思いますか?Pascal ScriptとSynEditを使用したIDEの作成

ここにあるPascalScriptの専門家はいますか?ありがとう。ブライアン

+0

これは興味深いプロジェクトのようです。あなたはそれのためのサイトを持っていますか?一旦それを稼働させると、ソースを利用可能にしますか? –

答えて

9

Inno Setupのソースコードをご覧ください。 SynEditガター領域には、実行可能なコードを持つ小さなドットが表示されます。実行可能で実行されていない行は灰色のドット、少なくとも1回はヒットした行は緑色のドットが表示されます。

このコードは、CompForm.pasにあります。TLineStateを探してください。情報は、コンパイラのコールバックのiscbNotifySuccessの状態で設定されます。IDEで同じことができます。 Inno Setupコンパイラは単一のソースファイル内のコードスニペットのみを処理するため、複数のソースファイルを処理するコードを変更する必要があります。

パスカルスクリプトのソースでは、TPSCustomDebugExec.TranslatePositionEx()メソッドを見てください。ソースファイルの名前も返されます。

+1

素晴らしいアイデア。私はInnosetupがPascalScriptを使用していることを知っていましたが、私はそれに編集機能があることに気づいていませんでした。見ることをやめる。ありがとう。 –

+0

mghie、あなたの提案はすばらしかったです。それは私が必要としたすべての情報を持っていた。よろしく、ブライアン。 –

1

PascalScriptパッケージ(\ samples \ debugにあります)のIDEプロジェクトは、ステップインとステップオーバー(F7とF8)機能を提供できるため、論理的にはPSバイトコードをスクリプトコードの行に関連付ける何らかの方法が必要です。そのプロジェクトを調べて、それがどのように機能しているか見てみてください。ボーナスとして、それはSynEditも使用しているので、あなたのシステムに簡単に適応できます。

+0

コメントMasonに感謝します。私はその例をたくさん使っていました。 StepIntoとStepOverはTPSDebugScriptクラスに組み込まれていて、実際にコードを実行することによって、「新しいラインで終わった」という驚くべきことはありません。コードが実行される前に、私は可能な行のためにスクリプトコードを照会する必要があり、それは私をうっとりさせるビットです。 Bri –

+0

コードをソース行にどのようにマップしますか? 1対1の関係はありません。「x:= 5;」と考えると "x:= 5 * performCalculation(y、z + x);"両方とも1行ですが、2行目にはさらに多くの操作が含まれています。マッピングを行うために使用するバイトコードには、ある種のメタデータが混在している必要があります。 –

+0

@Mason:TPSCustomDebugExec.TranslatePositionEx()を見てください。これは、デバッグ情報レコードにソース位置を持ち、すべてのオペレーションに対して、ソース位置情報をルックアップできます。 2番目の例では、これらの操作はすべて、その行の最初の操作の保存されたソース位置を返します。 – mghie

0

私はこれが古い質問だと知っていますが、私は同じことをやっています。上記の提案は本当に助けにはなりません。たとえば、InnoのセットアップではSyneditを使用せず、シンチラエディタを使用します。

また、TPSCustomDebugExec.TranslatePositionEx()は、必要なものとは逆の動作をします。実行時コード位置からソース行番号を取得します。

私は結局、Pascalscriptコードに関数を追加するのが最も簡単な方法であると結論づけました。

uPSdebuggerユニットのTPSCustomDebugExecクラスに新しいメソッドが追加されました。

下の画像のように、行番号、コードド​​ット、ブレークポイント、ブックマーク、実行点表情で
function TPSCustomDebugExec.HasCode(Filename:string; LineNo:integer):boolean; 
var i,j:integer; fi:PFunctionInfo; pt:TIfList; r:PPositionData; 
begin 
    result:=false; 
    for i := 0 to FDebugDataForProcs.Count -1 do 
    begin 
    fi := FDebugDataForProcs[i]; 
    pt := fi^.FPositionTable; 
    for j := 0 to pt.Count -1 do 
    begin 
     r:=pt[j]; 
     result:= SameText(r^.FileName,Filename) and (r^.Row=LineNo); 
     if result then exit 
    end; 
    end; 
end; 

と、メインエディタフォームでペイントガターコールバックが

procedure Teditor.PaintGutterGlyphs(ACanvas:TCanvas; AClip:TRect; 
    FirstLine, LastLine: integer); 
var a,b:boolean; LH,LH2,X,Y,ImgIndex:integer; 
begin 
    begin 
    FirstLine := Ed.RowToLine(FirstLine); 
    LastLine := Ed.RowToLine(LastLine); 
    X := 14; 
    LH := Ed.LineHeight; 
    LH2:=(LH-imglGutterGlyphs.Height) div 2; 
    while FirstLine <= LastLine do 
    begin 
     Y := LH2+LH*(Ed.LineToRow(FirstLine)-Ed.TopLine); 
     a:= ce.HasBreakPoint(ce.MainFileName,FirstLine); 
     b:= ce.Exec.HasCode(ce.MainFileName,FirstLine); 
     if Factiveline=FirstLine then 
     begin 
     if a then 
      ImgIndex := 2 //Blue arrow+red dot (breakpoint and execution point) 
     else 
      ImgIndex := 1; //Blue arrow (current line execution point) 
     end 
     else 
     if b then 
     begin 
      if a then 
      ImgIndex := 3 //Valid Breakpoint marker 
      else 
      ImgIndex := 0; //blue dot (has code) 
     end 
     else 
     begin 
      if a then 
      ImgIndex := 4 //Invalid breakpoint (No code on this line) 
      else 
      ImgIndex := -1; //Empty (No code for line) 
     end; 
     if ImgIndex >= 0 then 
     imglGutterGlyphs.Draw(ACanvas, X,Y,ImgIndex); 
     Inc(FirstLine); 
    end; 
    end; 
end; 

以下の通りですSynedit

enter image description here

関連する問題