Faire un IDE en utilisant Pascal Script et SynEdit
-
20-08-2019 - |
Question
Je crée un moteur de script intégré à l'aide de PascalScript de RemObjects (excellent) et de l'éditeur SynEdit. C'est presque fini d'utiliser l'exemple IDE fourni avec PascalScript et l'exemple IDE dans SynEdit - mais - je ne vois pas comment demander à PascalScript si une ligne source numérotée est 'exécutable' ou non. (Je peux ensuite l'utiliser pour marquer la gouttière SynEdit avec le "point bleu Delphi"). Je suppose que je pourrais avoir à faire un démontage de la sortie ROPS?
Des experts en PascalScript ici? Merci. Brian.
La solution
Consultez le code source de la Configuration Inno . Il affiche un petit point dans la gouttière SynEdit pour les lignes contenant du code exécutable, les points gris pour les lignes exécutables mais non exécutées, les points verts pour les lignes frappées au moins une fois.
Vous trouverez le code correspondant dans CompForm.pas
, recherchez le type TLineState
. Les informations sont configurées dans l'état iscbNotifySuccess
du rappel du compilateur, vous pouvez en faire autant dans votre IDE. Vous devrez peut-être adapter le code pour gérer plusieurs fichiers source, car le compilateur Inno Setup traite les extraits de code dans le fichier source unique uniquement.
Dans les sources de script Pascal, vous devriez jeter un coup d'œil à la méthode TPSCustomDebugExec.TranslatePositionEx()
. Elle renvoie également le nom du fichier source.
Autres conseils
Je ne sais pas exactement comment cela fonctionne, mais le projet IDE du package PascalScript (situé dans \ samples \ debug) est en mesure de proposer les fonctionnalités Pas à pas (F7 et F8), il est donc logique avoir un moyen d’associer le pseudo-code PS à des lignes de code de script. Essayez d'examiner ce projet pour voir comment il le fait. En prime, il utilise également SynEdit, ce qui facilite l'adaptation des idées à votre propre système.
Je sais que c’est une vieille question, mais j’ai fait la même chose moi-même et les suggestions ci-dessus n’aident pas vraiment. La configuration d’Inno, par exemple, n’utilise pas Synedit, elle utilise l’éditeur scintilla.
De même, TPSCustomDebugExec.TranslatePositionEx () fait l'inverse de ce qui est voulu, il donne un numéro de ligne source à partir d'une position de code d'exécution.
Après un certain temps, je suis arrivé à la conclusion que le moyen le plus simple était d’ajouter une fonction au code Pascalscript.
la nouvelle méthode est ajoutée à la classe TPSCustomDebugExec dans l'unité 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;
et le rappel de gouttière de peinture sous la forme de l'éditeur principal est comme ci-dessous
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;
Le Synedit avec les numéros de ligne, les points de code, les points d'arrêt, les signets et le point d'exécution se présente comme dans l'image ci-dessous