إجراء IDE باستخدام باسكال سيناريو وSynEdit
-
20-08-2019 - |
سؤال
وأنا خلق محرك النصي المدمج في استخدام 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 مع أرقام الخط، النقاط الرمز، نقاط التوقف، والعناوين ونظرة نقطة التنفيذ كما في الصورة أدناه