Создание IDE с использованием Pascal Script и SynEdit - PullRequest
9 голосов
/ 26 июня 2009

Я создаю встроенный скрипт-движок, используя PascalScript из RemObjects (отлично) и редактор SynEdit. Он почти закончен, используя пример IDE, поставляемый с PascalScript, и пример IDE в SynEdit, но я не могу понять, как спросить PascalScript, является ли исчисляемая исходная строка «исполняемой» или нет. (Затем я могу использовать это, чтобы пометить желоб SynEdit 'Delphi blue dot'). Я думаю, что мне, возможно, придется сделать разборку вывода ROPS?

Здесь есть эксперты по PascalScript? Благодарю. Брайан.

Ответы [ 3 ]

9 голосов
/ 27 июня 2009

Посмотрите на исходный код Inno Setup . Он показывает маленькую точку в области желоба SynEdit для строк с исполняемым кодом, серые - для строк, которые являются исполняемыми, но не были выполнены, зеленые - для строк, которые были найдены хотя бы один раз.

Код для этого можно найти в CompForm.pas, ищите тип TLineState. Информация устанавливается в состоянии iscbNotifySuccess обратного вызова компилятора, вы можете сделать то же самое в вашей IDE. Возможно, вам придется адаптировать код для обработки нескольких исходных файлов, поскольку компилятор Inno Setup работает с фрагментами кода только в одном исходном файле.

В источниках Pascal Script вы должны взглянуть на метод TPSCustomDebugExec.TranslatePositionEx() - он также возвращает имя исходного файла.

1 голос
/ 06 ноября 2015

Я знаю, что это старый вопрос, но я сам делал то же самое, и приведенные выше предложения не очень помогают. Inno setup, например, не использует Synedit, он использует редактор scintilla.

Кроме того, TPSCustomDebugExec.TranslatePositionEx () выполняет действия, противоположные тому, что требуется, он дает номер строки исходного текста из позиции кода времени выполнения.

После недолгого раздувания я пришел к выводу, что проще всего добавить функцию в код 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

1 голос
/ 26 июня 2009

Я не знаю точно, как он это делает, но проект IDE в пакете PascalScript (находится в \ samples \ debug) может предложить функциональность Step Into и Step Over (F7 и F8), поэтому логически он иметь некоторый способ связывания байт-кода PS со строками кода сценария. Попробуйте изучить этот проект, чтобы увидеть, как он это делает. В качестве бонуса он также использует SynEdit, поэтому идеи легко адаптируются к вашей собственной системе.

...