質問

私の作成を内蔵したスクリプトエンジンを使用PascalScriptからプ(優)のSynEditます。そのほとんど利用終了後は、IDEの例では出荷PascalScriptのIDE例SynEditか見えないことに気づいた方へのお願いPascalScriptるかどうかを番号つきのソースラインは"実行"またはいません。てしまう可能性があることから、SynEdit溝のデ青のドット').思っていdissassemblyップス美の力が増加する。

当PascalScriptの専門家。感謝。Brian.

役に立ちましたか?

解決

のInnoセットアップするのソースコードを見てください。それは、少なくとも一度打ってきたラインのための実行可能コード、実行可能ですが、実行されていないライン用の灰色のもの、緑色のものとのラインのためのSynEditガターエリアに小さなドットを示しています。

このためのコードは、CompForm.pasタイプを探し、TLineStateで見つけることができます。情報は、コンパイラ、コールバックのiscbNotifySuccess状態に設定されている、あなたはあなたのIDEで同じことを行うことができます。あなたは、単一のソース・ファイル内のコードスニペットとInno Setupのコンパイラお得な情報として、複数のソースファイルを処理するコードを適応させる必要がある場合があります。

パスカルスクリプトのソースでは、あなたがTPSCustomDebugExec.TranslatePositionEx()方法を見ている必要があります - 。それは同様に、ソースファイルの名前を返すん。

他のヒント

私にはわからない正確には、それをしないが、(\サンプル\デバッグの下にあります)pascalscriptというパッケージのIDEプロジェクトはとても論理的にそれが持っている、にステップを提供し、(F7とF8)機能をステップオーバーすることができますどのようにスクリプトコードの行でPSのバイトコードを関連付けるいくつかの方法を持っています。それはそれをしない方法を確認するには、そのプロジェクトを検討してみてください。ボーナスとして、それはあまりにもSynEditを使用するため、アイデアは、あなた自身のシステムに適応しやすいだろう。

そうすることを義務付けられているものとして同じものは自分にとっても提案していないんです。Inno setupのためのインスタンスを使用しないSyneditでscintillaます。

また、TPSCustomDebugExec.TranslatePositionEx()はどんなソース行番号からランタイムコードの位置にします。

後faffingはあっという結論を出した最も簡単な方法でした追加機能のPascalscriptます。

この新しい方法が追加されTPSCustomDebugExecクラスのuPSdebuggerユニットです。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top