2009-06-26 15 views
9

का उपयोग कर एक आईडीई बनाना मैं RemObjects (उत्कृष्ट) और SynEdit संपादक से पास्कलस्क्रिप्ट का उपयोग कर एक अंतर्निहित स्क्रिप्ट इंजन बना रहा हूं। यह पास्कलस्क्रिप्ट के साथ भेजे गए आईडीई उदाहरण और SynEdit में आईडीई उदाहरण का उपयोग करके लगभग समाप्त हो गया है - लेकिन - मैं नहीं देख सकता कि पास्कलस्क्रिप्ट से कैसे पूछना है कि कोई क्रमांकित स्रोत रेखा 'निष्पादन योग्य' है या नहीं। (फिर मैं 'डेल्फी ब्लू डॉट' के साथ SynEdit गटर को चिह्नित करने के लिए इसका उपयोग कर सकता हूं)। मुझे लगता है कि मुझे आरओपीएस आउटपुट का एक पृथक्करण करना पड़ सकता है?पास्कल स्क्रिप्ट और SynEdit

कोई पास्कलस्क्रिप्ट विशेषज्ञ यहां? धन्यवाद। ब्रायन।

+0

यह एक दिलचस्प परियोजना की तरह दिखता है। क्या आपके पास इसके लिए साइट है? एक बार जब आप इसे काम कर लेंगे तो क्या आप स्रोत उपलब्ध कराएंगे? –

उत्तर

9

Inno Setup के स्रोत कोड पर नज़र डालें। यह निष्पादन योग्य कोड वाली लाइनों के लिए SynEdit गटर क्षेत्र में एक छोटा सा बिंदु दिखाता है, जो कि निष्पादन योग्य लाइनों के लिए भूरे रंग के होते हैं लेकिन निष्पादित नहीं किए जाते हैं, कम से कम एक बार लाइनों के लिए हरे रंग के होते हैं।

इस के लिए कोड CompForm.pas में पाया जा सकता है, TLineState प्रकार के लिए देखो। यह जानकारी iscbNotifySuccess कंपाइलर कॉलबैक की स्थिति में स्थापित की गई है, तो आप इसे अपने आईडीई में भी कर सकते हैं। आपको एकाधिक स्रोत फ़ाइलों को संभालने के लिए कोड को अनुकूलित करने की आवश्यकता हो सकती है, क्योंकि इनो सेटअप कंपाइलर केवल एकल स्रोत फ़ाइल में कोड स्निपेट से संबंधित है।

पास्कल स्क्रिप्ट स्रोतों में आपको TPSCustomDebugExec.TranslatePositionEx() विधि पर एक नज़र रखना चाहिए - यह स्रोत फ़ाइल का नाम भी वापस कर देता है।

+1

ग्रेट विचार। मुझे पता था कि इनोसेटअप ने पास्कलस्क्रिप्ट का इस्तेमाल किया था, लेकिन मुझे एहसास नहीं हुआ कि इसमें संपादन सुविधाएं थीं। देखने के लिए बंद करो। धन्यवाद। –

+0

मागी, आपका सुझाव उत्कृष्ट था। उसमें मेरी सारी जानकारी थी। विनम्र, ब्रायन। –

1

मुझे नहीं पता कि यह वास्तव में कैसे करता है, लेकिन पास्कलस्क्रिप्ट पैकेज (\ samples \ debug के अंतर्गत पाया गया) में आईडीई प्रोजेक्ट चरण में और चरण (एफ 7 और एफ 8) कार्यक्षमता प्रदान करने में सक्षम है, इसलिए तर्कसंगत रूप से स्क्रिप्ट कोड की लाइनों के साथ पीएस बाइटकोड को जोड़ने का कोई तरीका होना चाहिए। उस प्रोजेक्ट की जांच करने का प्रयास करें कि यह कैसे करता है। बोनस के रूप में, यह SynEdit का भी उपयोग करता है, इसलिए विचार आपके सिस्टम को अनुकूलित करना आसान हो जाएगा।

+0

टिप्पणी मेसन के लिए धन्यवाद। मैं उस उदाहरण का बहुत उपयोग कर रहा हूं। स्टेपइंटो और स्टेपओवर टीपीएसडीबगस्क्रिप्ट क्लास में बनाए गए हैं और आश्चर्य की बात नहीं है कि वे कोड को निष्पादित करके 'आईवीवी इस नई लाइन पर समाप्त हो गए हैं'। कोड निष्पादित होने से पहले, मुझे संभावित लाइनों के लिए स्क्रिप्ट कोड से पूछने की आवश्यकता है और यह थोड़ा सा है जो मुझे flumoxing। Bri –

+0

यह स्रोत लाइनों पर कोड कैसे मैप करता है? 1: 1 रिश्ते नहीं है।"एक्स: = 5;" पर विचार करें और "एक्स: = 5 * प्रदर्शन गणना (वाई, जेड + एक्स);" दोनों एक ही पंक्ति हैं, लेकिन दूसरे में प्रदर्शन करने के लिए बहुत अधिक ऑपरेशन हैं। बाइटकोड के साथ मिश्रित कुछ मेटाडेटा होना चाहिए जो मैपिंग करने के लिए उपयोग करता है। –

+0

@ मेसन: TPSCustomDebugExec.TranslatePositionEx() में देखें। डीबग जानकारी रिकॉर्ड में इसकी स्रोत स्थिति है, और प्रत्येक सेशन के लिए यह स्रोत स्थिति जानकारी देख सकता है। आपके दूसरे उदाहरण के लिए वे सभी ऑपरेशन उस पंक्ति में पहले ऑपरेशन की संग्रहीत स्रोत स्थिति लौटाएंगे। – mghie

0

मुझे पता है कि यह एक पुराना सवाल है, लेकिन मैं खुद वही कर रहा हूं और ऊपर दिए गए सुझाव वास्तव में मदद नहीं करते हैं। उदाहरण के लिए इनो सेटअप Synedit का उपयोग नहीं करता है, यह स्किंटिला संपादक का उपयोग करता है।

इसके अलावा TPSCustomDebugExec.TranslatePositionEx() जो चाहता है उसके विपरीत करता है, यह रनटाइम कोड स्थिति से स्रोत पंक्ति संख्या देता है।

कुछ समय के लिए चारों ओर घूमने के बाद मैं निष्कर्ष पर आया कि पास्कलस्क्रिप्ट कोड में कोई फ़ंक्शन जोड़ने का सबसे आसान तरीका था।

यूपीएसडेबगर इकाई में 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; 

नीचे छवि में के रूप में लाइन नंबर, कोड डॉट्स, breakpoints, बुकमार्क और निष्पादन बिंदु देखो के साथ Synedit नीचे के रूप में है

enter image description here