2009-06-26 1 views
9

RemObjects (우수)의 PascalScript와 SynEdit 편집기를 사용하여 내장 스크립트 엔진을 만들고 있습니다. SynEdit에서 PascalScript 및 IDE 예제와 함께 제공된 IDE 예제를 사용하여 거의 끝났습니다. 그러나 PascalScript에 번호 매겨진 소스 라인이 '실행 가능'인지 여부를 묻는 방법을 볼 수 없습니다. (그런 다음 이것을 사용하여 SynEdit 도랑을 'Delphi blue dot'으로 표시 할 수 있습니다.) 나는 ROPS 산출물의 해체를해야 할 것 같은가요?Pascal Script와 SynEdit을 사용하여 IDE 만들기

모든 PascalScript 전문가가 여기에 있습니까? 감사. 브라이언.

+0

이것은 흥미로운 프로젝트처럼 보입니다. 그것을위한 사이트가 있습니까? 일단 소스를 작동 시키면 소스를 사용할 수있게할까요? –

답변

9

Inno Setup의 소스 코드를 살펴보십시오. SynEdit gutter 영역에는 실행 코드가있는 줄, 작은 줄은 실행 코드가있는 줄, 실행은 가능하지만 실행되지 않은 줄은 회색으로 표시됩니다. 한 번 이상 적중 한 줄은 녹색입니다.

이 코드는 CompForm.pas에서 찾을 수 있으며 TLineState 유형을 찾으십시오. 이 정보는 컴파일러 콜백의 iscbNotifySuccess 상태에서 설정됩니다. IDE에서 동일한 작업을 수행 할 수 있습니다. Inno Setup 컴파일러는 단일 소스 파일에서만 코드 단편을 처리하기 때문에 여러 소스 파일을 처리하도록 코드를 조정해야 할 수 있습니다.

파스칼 스크립트 소스에서 TPSCustomDebugExec.TranslatePositionEx() 메소드를 살펴 봐야합니다. 소스 파일의 이름도 반환합니다.

+1

좋은 아이디어. 나는 Innosetup이 PascalScript를 사용함을 알고 있었지만 편집 기능이 있다는 것을 깨닫지 못했습니다. 보기. 감사. –

+0

mghie, 당신의 제안은 훌륭했습니다. 그게 내가 필요한 모든 정보를 가지고 있었어. 감사합니다, Brian. –

1

정확한 방법은 모르겠지만 PascalScript 패키지 (\ samples \ debug 아래에 있음)의 IDE 프로젝트는 Step Into 및 Step Over (F7 및 F8) 기능을 제공 할 수 있으므로 논리적으로는 PS 바이트 코드를 스크립트 코드 행과 연관시키는 방법이 있어야합니다. 해당 프로젝트를 검토하여 어떻게 수행되는지보십시오. 보너스로 SynEdit도 사용하기 때문에 아이디어는 자신의 시스템에 쉽게 적응할 수 있습니다.

+0

Mason 주석 주셔서 감사합니다. 나는 그 예제를 많이 사용 해왔다. StepInto와 StepOver는 TPSDebugScript 클래스에 내장되어 있으며 놀랍지 않게 코드를 실제로 실행함으로써 '새로운 라인에서 끝났다'는 것을 알 수 있습니다. 코드가 실행되기 전에 스크립트 코드를 쿼리하여 가능한 행을 찾아야합니다. 그 점이 나를 불쾌하게 만듭니다. Bri –

+0

어떻게 코드를 소스 라인에 매핑합니까? 1 : 1 관계는 없습니다."x : = 5;"를 고려하십시오. 및 "x : = 5 * performCalculation (y, z + x);" 두 줄 모두 한 줄이지만 두 번째 줄에는 더 많은 작업을 수행 할 수 있습니다. 매핑을 수행하는 데 사용되는 바이트 코드와 혼합 된 메타 데이터가 있어야합니다. –

+0

@Mason : TPSCustomDebugExec.TranslatePositionEx()을보십시오. 디버그 정보 레코드에 소스 위치가 있으며 모든 op에 대해 소스 위치 정보를 찾을 수 있습니다. 두 번째 예제에서 모든 작업은 해당 행에서 첫 번째 작업의 저장된 소스 위치를 반환합니다. – mghie

0

나는 이것이 오래된 질문이라는 것을 알고 있지만 나는 똑같은 일을하고 있으며 위의 제안은 도움이되지 않는다. Inno setup은 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