2010-03-25 9 views
9

प्रलेखन और आगे निरीक्षण के लिए, मैं सभी एसक्यूएल कथनों को खोजने के लिए कई परियोजनाओं में सभी डीएफएम फाइलों पर 'एक्स्ट्रैक्ट स्ट्रिंग' चलाने की इच्छा रखूंगा। क्या कमांड लाइन टूल्स हैं जो यह कर सकते हैं? डीएफएम फाइलें सभी पाठ प्रारूप में हैं।क्या कोई उपकरण है जो डेल्फी फॉर्म फ़ाइलों से सभी SQL कमांड स्ट्रिंग निकाल सकता है?

+1

हूँ मुझे लगता है करने के लिए एक है, जिसे ठीक "डीएफएम" फ़ाइल एक रिसोर्स फ़ाइल का डेल्फी का संस्करण है? – lexu

+0

@lexu yes उनमें 'फॉर्म', 'फ्रेम' और 'डेटामोड्यूल' के लिए लेआउट और बाध्यकारी जानकारी शामिल है। – mjn

+0

@lexe लेकिन मुझे नहीं पता कि वे तकनीकी रूप से समाप्त होंगे या नहीं द्विआधारी – mjn

उत्तर

1

यहाँ है फेलिक्स Colibri

DFM Parser

यहाँ से एक DFM पार्सर इस

की तरह काम करना के लिए एक दिलचस्प उपकरण है

+2

यह एक दिलचस्प लिंक है, धन्यवाद! – robsoft

3

आप जिस प्रकार के क्वेरी घटक का उपयोग कर रहे हैं उसके आधार पर, मुझे लगता है कि आप अपने प्रोजेक्ट फ़ोल्डर्स पर कमांड लाइन grep (या कोई अन्य टेक्स्ट-सर्चिंग टूल) का उपयोग करके ऐसा कर सकते हैं। DFM में, सामान्य TQuery एक जैसे घटकों के लिए, आप

 
    SQL.Strings=('select * from mytable') 

या संभवतः की तर्ज पर कुछ करने जा रहे हैं (मैं कोई डेल्फी जाँच करने के लिए, घर पर होने की खुशियों सौंपने के लिए है!)

 
    SQL.Text=('select * from mytable') 

देखते हुए कि कैसे इन तार, DFM अंदर कई 'पंक्तियों' में फैला सकता है और कैसे वहाँ कई रूप में आप के लिए जाँच करने के लिए आवश्यकता होगी हो सकता है, व्यक्तिगत रूप से मैं डेल्फी के एक छोटे से टुकड़े लिखते हैं क्या करने के लिए दिए गए इस।

मूल विचार होगा; किसी दिए गए निर्देशिका में सभी फ़ाइलों/सबफ़ोल्डर के माध्यम से पुनरावृत्त करें, सभी डीएफएम फ़ाइलों की तलाश करें, और प्रत्येक के लिए, इसे एक TStringList में पढ़ें, किसी भी TQuery (आदि) SQL गुणों में से किसी एक के लिए जांचें, और लिखें परिणाम फ़ाइल में परिणाम (घटक का नाम, फ़ाइल नाम, वास्तविक SQL स्ट्रिंग)। वास्तव में सबसे अधिक एक घंटे या दो से अधिक काम नहीं होना चाहिए।

यदि आपने प्रोसेस संग्रहित किया है, तो आप किसी TQuery-type घटक के अलावा किसी अन्य चीज़ का उपयोग करके कॉल करते हैं, तो आपको पहले डीएफएम के अंदर एक झांक देखना होगा और देखें कि SQL कैसे दिखाई देता है; यह शायद के

 
    CommandText=('exec mysproc :id, :value') 

आदि

संपादित तर्ज पर होगा: टिप्पणी में चर्चा के बाद , यहाँ मेरी DFMs में से एक से एक नमूना है,

 
    (other properties) 
    SQL.Strings = (
     'SELECT D.*, ' 
     'C.DESCRIPTION AS CLASS_DESCRIPTION, ' 
     'C.CHQ_NUM_THRESHOLD AS CLASS_CHQ_NUM_THRESHOLD,' 
     'C.CREDIT_LIMIT AS CLASS_CREDIT_LIMIT,' 
     'A.REF AS ACCOUNT_REF,' 
     'A.SORT_CODE AS ACCOUNT_SORT_CODE,' 
     'A.ACCOUNT_NUMBER AS ACCOUNT_ACCOUNT_NUMBER,' 
     'A.PREFERRED_ACCOUNT AS ACCOUNT_PREFERRED_ACCOUNT' 
     'FROM ' 
     'DRAWER_ACCOUNTS A LEFT JOIN DRAWERS D ' 
     'ON D.REF=A.DRAWER_REF' 
     'LEFT JOIN REF_DRAWER_CLASSES C' 
     'ON D.DRAWER_CLASS = C.CLASS_ID' 
     'WHERE A.SORT_CODE=:PSORT AND A.ACCOUNT_NUMBER=:PACC') 
    (other properties) 

तो सब मैं वास्तव में क्या करने की जरूरत, SQL.Strings = ( सा स्थान है, तो लाइन और बाद के सभी लाइनों के बाकी को पढ़ने के लिए, प्रमुख को दूर करने और ' अनुगामी है जब तक मैं एक पंक्ति है कि ')' में समाप्त होता है के लिए मिलता है - जिस बिंदु पर मैं कर रहा हूँ। जो कुछ भी दिलचस्प एसक्यूएल (और टिप्पणियां) प्रत्येक पंक्ति पर उद्धरण के भीतर निहित हो सकता है, वास्तव में अप्रासंगिक है। आप अपनी रुचि रखने वाली प्रत्येक पंक्ति को पढ़ना चाहते हैं और प्रत्येक पंक्ति पर पहले और अंतिम उद्धरण के बीच टेक्स्ट काट लें। यह काम करना चाहिए क्योंकि मैं नहीं देख सकता कि डेल्फी इसे किसी अन्य तरीके से कैसे स्ट्रीम करेगा, यह संभवतः स्ट्रिंग सामग्री को 'पढ़' नहीं सकता है - यह सिर्फ इस आधार पर काम कर रहा है कि स्ट्रिंगलिस्ट (संभवतः) लाइनों में विभाजित है और प्रत्येक पंक्ति डीएफएम में एक उद्घाटन और समापन ' के साथ सीमित है, और पूरी स्ट्रिंगलिस्ट सामग्री स्वयं को ब्रैकेट की एक जोड़ी के भीतर निहित है।

क्या यह समझ में आता है, या क्या मुझे अभी भी कुछ याद आ रहा है?:-)

+0

एसक्यूएल कमांड में (और) (और टिप्पणियां (सहित (और)) शामिल हो सकती हैं) तो पार्सिंग थोड़ा मुश्किल होगा, क्योंकि) एसक्यूएल स्ट्र को भी समाप्त कर देता है आईएनजी ... और यूनिकोड के बारे में, यदि SQL टेक्स्ट में टिप्पणियों या फ़ील्ड मानों में विशेष वर्ण होते हैं। लेकिन मुझे लगता है कि यह मजेदार और आसान हिस्सा होगा: पी – mjn

+0

बहुत सच्चाई ... लेकिन यदि आप पहले पर पार्सिंग शुरू करते हैं और जब आप जाते हैं तो उद्धरण के कितने स्तर "इन" होते हैं, तो आपको चाहिए अच्छा होने के लिए। दिन के अंत में, डेल्फी डीएफएम पार्सर स्ट्रिंग को समझने में सक्षम होना चाहिए जैसे कि यह एक उद्धरण के साथ शुरू होता है और समाप्त होता है। एसक्यूएल टेक्स्ट में यूनिकोड नहीं हो सकता है जब तक कि डीएफएम फ़ाइल यूनिकोड स्वयं न हो (जब तक कि मुझे डीएफएम में स्ट्रिंग्स के बारे में कुछ याद नहीं आ रहा है!) ताकि आप पहले यूनिकोड फ़ाइल के लिए परीक्षण कर सकें - मेरे पास कुछ कोड है जो कहीं भी फाइल करता है यह देखने के लिए कि यह यूनिकोड है या नहीं। जैसा कि आप कहते हैं, यह मजाक का हिस्सा है! :-) – robsoft

+0

डेल्फी इसके लिए आदर्श नहीं है जब तक कि आप RegExp लाइब्रेरी का उपयोग न करें। मैं डीएफएम को पार्स करने और एसक्यूएल निकालने के लिए एक पर्ल स्क्रिप्ट लिखने की सिफारिश करता हूं। मैंने टीटीएबल/टीवीसी घटकों को डीओए "समकक्ष" में परिवर्तित करने के समान कुछ किया और इसमें फाइलों को संशोधित करने के दौरान पास्क और डीएफएम को सिंक में रखने में शामिल था। नौकरी के लिए सही उपकरण का उपयोग करें। इस मामले में नियमित अभिव्यक्तियों के अच्छे कार्यान्वयन के साथ एक पटकथा भाषा। पर्ल शायद चाय का प्याला न हो लेकिन आपको पाइथन, रूबी जैसे कुछ ढूंढने में सक्षम होना चाहिए? – mcottle

0

DFM के बाद से नाम = मूल्य प्रारूप में मूल रूप से है, तो आप सिर्फ एक TStringList में लोड कर सकता है, फिर विशिष्ट संपत्ति के नाम में अपने रुचि के लिए देख प्रत्येक पंक्ति के माध्यम से लूप:

var 
    slDfm : tStringList; 
    Item : String; 
    ix : integer; 
begin 
    slDFM := tStringlist.create; 
    try 
    slDFM.LoadFromFile(filename); 
    for ix := 0 to slDfm.Count-1 do 
     begin 
     slDfm.Strings[ix] := Trim(slDfm.Strings[ix]); 
     if SameText(Trim(slDfm.Names[ix]),'CommandText') then 
      memo1.Lines.Add('"'+Trim(slDfm.ValueFromIndex[ix])+'"'); 
     end; 
    finally 
    slDFM.free; 
    end; 
end; 
0

उत्तर के लिए बहुत धन्यवाद! एक और समाधान जो मैं कोशिश करूंगा वह 'निकालना तार' उपकरण है जो "GNU Gettext for Delphi and C++ Builder" में शामिल है।

.po फाइलों में न केवल सभी घटक टेक्स्ट शामिल हैं बल्कि सभी संसाधनों (अन्य स्थान जहां एसक्यूएल कमांड संग्रहीत हैं) शामिल हैं, मूल के संदर्भ (जो पैस या डीएफएम फ़ाइल, कौन सा घटक संपत्ति नाम) के संदर्भ में पूर्ण है और यह है पहले से ही एक बहुत ही सरल "नाम = मूल्य" सूची।

एक पुलिस फाइल .pas फ़ाइलों से सभी SQL.Text और 'एसक्यूएल _... "सभी फ़ाइलों में जैसे नामों के साथ सभी resourcestrings सुलझाने के लिए यह आसान हो जाएगा के साथ

संबंधित मुद्दे

 संबंधित मुद्दे