سؤال

وأنا خلق محرك النصي المدمج في استخدام PascalScript من RemObjects (ممتاز) ورئيس تحرير SynEdit. كل شيء قد انتهى تقريبا باستخدام المثال IDE التي يتم شحنها مع PascalScript والمثال IDE في SynEdit - ولكن - لا استطيع ان ارى كيف نطلب PascalScript ما إذا كان خط مصدر مرقمة هو "تنفيذ" أم لا. (I يمكن بعد ذلك استخدام هذا بمناسبة مزراب SynEdit مع 'نقطة زرقاء دلفي'). اعتقد انني قد تضطر الى القيام dissassembly من الناتج ROPS؟

وأي خبراء PascalScript هنا؟ شكر. بريان.

هل كانت مفيدة؟

المحلول

وإلقاء نظرة على شفرة المصدر من إعداد ابتكارات . فإنه لا تظهر نقطة صغيرة في منطقة مزراب SynEdit للخطوط مع رمز قابل للتنفيذ، منها الرمادية للخطوط التي هي للتنفيذ ولكن لم يتم تنفيذها، منها الخضراء للخطوط التي تم ضرب على الأقل مرة.

ويمكن العثور على رمز لذلك في CompForm.pas، ابحث عن نوع TLineState. يتم تعيين المعلومات حتى في حالة iscbNotifySuccess من رد مترجم، هل يمكن أن تفعل الشيء نفسه في IDE الخاص بك. قد تحتاج إلى التكيف مع رمز للتعامل مع ملفات متعددة المصدر، والصفقات مترجم إعداد ابتكارات مع مقتطفات الشفرة في ملف مصدر واحد فقط.

في مصادر باسكال سيناريو يجب أن يكون لديك نظرة على طريقة TPSCustomDebugExec.TranslatePositionEx() - فإنه يعود اسم الملف المصدر وكذلك

نصائح أخرى

وأنا لا أعرف بالضبط كيف يفعل ذلك، ولكن المشروع IDE في حزمة PascalScript (وجدت تحت \ عينات \ التصحيح) قادرة على تقديم الخطوة إلى والخطوة أكثر من (F7 و F8) وظيفة، لذلك منطقيا لها أن يكون وسيلة للربط PS بايت كود مع خطوط رمز البرنامج النصي. محاولة دراسة هذا المشروع لنرى كيف يفعل ذلك. على سبيل المكافأة، فإنه يستخدم SynEdit جدا، وبالتالي فإن الأفكار يكون من السهل على التكيف مع النظام الخاص بك.

وأعرف أن هذا هو السؤال القديم ولكن لقد تم فعل الشيء نفسه نفسي والاقتراحات المذكورة أعلاه لا تساعد حقا. الإعداد ابتكارات على سبيل المثال لا تستخدم Synedit، فإنه يستخدم محرر الشرارة.

وأيضا TPSCustomDebugExec.TranslatePositionEx () لا العكس على ما يريد، وأنه يعطي رقم سطر المصدر من موقع كود وقت التشغيل.

وبعد faffing حول لبعض الوقت جئت إلى استنتاج مفاده أن أسهل طريقة كانت لإضافة وظيفة إلى رمز 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 مع أرقام الخط، النقاط الرمز، نقاط التوقف، والعناوين ونظرة نقطة التنفيذ كما في الصورة أدناه

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top