Frage

Ich erstelle einen integrierten Skript-Engine Pascal von RemObjects (ausgezeichnet) und der SynEdit Editor. Es ist fast fertig, das IDE Beispiel mit Pascal und dem IDE Beispiel in SynEdit ausgeliefert mit - aber - ich kann nicht sehen, wie Pascal zu fragen, ob eine nummerierte Source-Leitung ‚ausführbare‘ ist oder nicht. (Ich kann dann diese verwenden, um die SynEdit Rinne mit dem ‚Delphi blauen Punkt‘ zu markieren). Ich glaube, ich könnte ein Zerlegen des ROPS Ausgangs zu tun?

Jeder Pascal Experten hier? Vielen Dank. Brian.

War es hilfreich?

Lösung

Haben Sie einen Blick auf den Quellcode von Inno Setup . Es zeigt einen kleinen Punkt in der SynEdit Rinne Bereich für Linien mit ausführbarem Code, graue für Linien, die ausführbar sind, aber noch nicht ausgeführt worden ist, grünen für Linien, die mindestens einmal getroffen worden sind.

Der Code für diese kann in CompForm.pas, suchen Sie nach dem TLineState Typ zu finden. Die Informationen werden in der iscbNotifySuccess Zustand des Compilers Rückruf einrichten, können Sie das gleiche in Ihrem IDE tun. Unter Umständen müssen Sie den Code anpassen mehrere Quelldateien zu handhaben, da die Inno Setup Compiler beschäftigt sich mit Code-Schnipsel in der Quelldatei nur.

In den Pascal-Script Quellen sollten Sie einen Blick auf die TPSCustomDebugExec.TranslatePositionEx() Methode haben -. Den Namen der Quelldatei als auch zurückgibt

Andere Tipps

Ich weiß nicht genau, wie sie es tut, aber das IDE-Projekt in der Pascal Paket (unter \ Samples \ debug gefunden) ist in der Lage Schritt zu bieten In und Step Over (F7 und F8) Funktionalität, so logisch es hat eine Möglichkeit der Zuordnung PS-Bytecode mit Linien von Script-Code zu haben. Versuchen Sie, dieses Projekt untersucht, um zu sehen, wie sie es tut. Als Bonus, verwendet es SynEdit zu, so werden die Ideen einfach zu Ihrem eigenen System anzupassen.

Ich weiß, dass dies eine alte Frage, aber ich habe mich die gleiche Sache getan, und die oben genannten Vorschläge helfen nicht wirklich. Inno Setup zum Beispiel nicht SynEdit verwenden, verwendet es scintilla Editor.

Auch die TPSCustomDebugExec.TranslatePositionEx () macht das Gegenteil zu dem, was gewünscht wird, gibt es eine Quelle Zeilennummer aus einer Laufzeitcodeposition.

Nach faffing schon seit einiger Zeit, die ich zu dem Schluss gekommen, dass der einfachste Weg, um eine Funktion des Pascal Code hinzuzufügen war.

Die neue Methode wird in der uPSdebugger Einheit an die TPSCustomDebugExec Klasse hinzugefügt.

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;

und die Farbe Gosse Rückruf in Form Haupt-Editor ist als unten

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;

Die SynEdit mit Zeilennummern, Codepunkten, Haltepunkten, Lesezeichen und Ausführungspunkt Blick, wie im Bild unten

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top