決IDEを使用パスカルスクリプトおよびSynEdit
-
20-08-2019 - |
質問
私の作成を内蔵したスクリプトエンジンを使用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線番号、コードドットブレークポイント-ブックマークおよび実行ポイントとしては、下記の画像