문제

Remobjects (우수) 및 Synedit 편집기에서 Pascalscript를 사용하여 내장 스크립트 엔진을 만들고 있습니다. Synedit의 Pascalscript 및 IDE 예제가 포함 된 IDE 예제를 사용하여 거의 완료되었습니다. 그러나 번호가 매겨진 소스 라인이 '실행 가능'인지 아닌지 PascalScript를 묻는 방법을 알 수 없습니다. (그런 다음 이것을 사용하여 Synedit 거터를 'Delphi Blue Dot'으로 표시 할 수 있습니다). ROPS 출력을 해부해야 할 것 같아요?

여기에 pascalscript 전문가가 있습니까? 감사해요. 브라이언.

도움이 되었습니까?

해결책

소스 코드를 살펴보십시오 이노 설정. 실행 가능한 코드가있는 라인의 경우 Synedit 거터 영역에 작은 점을 보여줍니다. 실행 가능하지만 실행되지 않은 선을위한 회색은 적어도 한 번에 쳤던 라인의 녹색을 보여줍니다.

이에 대한 코드는 찾을 수 있습니다 CompForm.pas, TLineState 유형. 정보는 다음에 설정됩니다 iscbNotifySuccess 컴파일러 콜백 상태, IDE에서도 동일한 작업을 수행 할 수 있습니다. Inno 설정 컴파일러는 단일 소스 파일의 코드 스 니펫을 처리하므로 여러 소스 파일을 처리하려면 코드를 조정해야 할 수도 있습니다.

Pascal 스크립트 소스에서 당신은 TPSCustomDebugExec.TranslatePositionEx() 메소드 - 소스 파일의 이름도 반환됩니다.

다른 팁

정확히 어떻게 해야하는지 모르겠지만 PascalScript 패키지의 IDE 프로젝트 ( 샘플 debug 아래에 있음)는 단계적으로 그리고 단계 오르기 (F7 및 F8) 기능을 제공 할 수 있으므로 논리적으로 일부가 있어야합니다. ps bytecode를 스크립트 코드 줄과 연결하는 방법. 그 프로젝트를 검토하여 어떻게 작동하는지 확인하십시오. 보너스로서 Synedit도 사용하므로 아이디어는 자신의 시스템에 쉽게 적응할 수 있습니다.

나는 이것이 오래된 질문이라는 것을 알고 있지만 나는 나 자신과 똑같은 일을 해왔으며 위의 제안은 실제로 도움이되지 않습니다. 예를 들어 Inno 설정은 Synedit을 사용하지 않으며 Scintilla 편집기를 사용합니다.

또한 tpsCustomDebugexec.transLatePositionEx ()는 원하는 것과 반대를 수행하고 런타임 코드 위치에서 소스 라인 번호를 제공합니다.

얼마 동안 주위를 돌아 다니면서 나는 가장 쉬운 방법이 pascalscript 코드에 함수를 추가하는 것이었다는 결론에 도달했습니다.

새로운 방법은 Upsdebugger 장치의 TPSCustomDebugeXEC 클래스에 추가됩니다.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top