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.

Était-ce utile?

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

 entrer la description de l'image ici

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top