2012-09-22 26 views
7

मैं डेल्फी XE में काम कर रहा हूँ में उपलब्ध कराया जा सकता है,। ऐसा करने के लिए, मेरे पास 1 बेस रिपोर्ट क्लास और एक सबक्लास प्रति रिपोर्ट प्रकार (xml, csv, ppt, आदि) है।"अप्रयुक्त" वर्गों विंडोज़ 7</p> <p>एक आवेदन मैं अपने उपयोगकर्ताओं को चुनने के लिए के लिए विभिन्न प्रकार की रिपोर्ट के सक्षम करना चाहते हैं में डेल्फी XE

{Just an illustrating example} 
TBaseReport = class 
public 
    constructor Create; 
    procedure GenerateReport; virtual; abstract; 
    class function ReportType: string; virtual; abstract; 
end; 

T*Report = class(TBaseReport); 
//Etcetera. 

मुझे क्या करना चाहते हैं उपयोग RTTI सभी रिपोर्ट वर्गों का पता लगाने और उनके ReportType सूची है। उसके बाद, मैं चयनित रिपोर्ट क्लास का उदाहरण बनाने और जेनरेट रिपोर्ट को कॉल करने के लिए आरटीआई का उपयोग करना चाहता हूं। सब कुछ, यह हासिल करना बहुत मुश्किल नहीं है।

हालांकि एक बड़ी कमी है: मैं अवरोही कक्षाओं के उपयोग को कभी भी कड़ी मेहनत नहीं कर रहा हूं, इसलिए कोड निष्पादन योग्य में शामिल नहीं होता है।

क्या इन वर्गों को शामिल करने के लिए लिंकर/कंपाइलर को मजबूर करने का कोई अच्छा तरीका है?

ए (एन बदसूरत) काम उनके प्रारंभिक अनुभाग में रिपोर्ट के उपयोग को अनुकरण करना होगा, लेकिन मैं ऐसा नहीं करना चाहूंगा। बेस क्लास को लगातार बनाने और 'रजिस्टर क्लास (टी * रिपोर्ट)' कॉल करने के लिए एक बेहतर समाधान है; प्रारंभिक खंड में। यह काम करता है, लेकिन मुझे उन्हें लगातार बनाने की कोई अन्य ज़रूरत नहीं है, इसलिए फिर, मैं ऐसा नहीं करूँगा। दूसरी ओर, शायद यह करने का यही एकमात्र तरीका है?

अग्रिम धन्यवाद।

उत्तर

5

आप अंतिम एक्सई में अपने ऐप के सभी प्रतीकों को शामिल करने के लिए {$STRONGLINKTYPES ON} कंपाइलर निर्देश का उपयोग कर सकते हैं, याद रखें कि यह विकल्प निष्पादन योग्य आकार को बढ़ाता है, क्योंकि अधिक आरटीटीआई निष्पादन योग्य में शामिल है।

+0

यह करने का यह तरीका है। आपके अंतिम बिंदु के बारे में, अधिक कोड –

+0

के रूप में बहुत अधिक आरटीटीआई नहीं, मुझे लगता है कि STRONGLINKTYPES का दायरा वैश्विक है। क्या आप जानते हैं कि स्थानीय समकक्ष भी उपलब्ध है या नहीं? – deColaman

+0

फ़ाइल आकार में वृद्धि की जांच करने के लिए बस मेरे आवेदन के लिए इसे चालू कर दिया। Exe 8.3MB से 9.9 एमबी तक बढ़ी। यद्यपि यह बहुत कुछ लगता है, लाभ मुझे लगता है कि अतिरिक्त आकार से अधिक है। – deColaman

7

आप रजिस्टर क्लास का अपना संस्करण बना सकते हैं। RegisterReportClass की तरह कुछ। आंतरिक रूप से आप अपनी रिपोर्ट कक्षाओं की अपनी सूची रखते हैं जिनका उपयोग किया जा सकता है। आपका रजिस्टर फ़ंक्शन एक TBaseReport क्लास प्रकार लेगा - TPersistent की आवश्यकता नहीं है।

आपके रजिस्टररपोर्ट क्लास विधि को प्रारंभिक अनुभाग में कॉल किया जाना चाहिए ताकि कक्षाएं शामिल हों।

यदि आप ग्राफिक्स इकाई में देखते हैं तो आप TFileFormatsList = class (TList) देख सकते हैं। यह वह वर्ग है जिसका उपयोग विभिन्न ग्राफिक प्रकारों को पकड़ने के लिए किया जाता है और इसे अपनी खुद की TReportFormatsList बनाने के लिए एक उदाहरण के रूप में उपयोग किया जा सकता है। डेल्फी अपनी आंतरिक सूची में आइटम जोड़ने के लिए एक स्थिर कार्य TPicture.RegisterFileFormat का उपयोग करता है।

+0

Altough यह वास्तव में संभव है, यह मूल रूप से अंत में मैंने जो उल्लेख किया है उसका योग है। इसके अलावा, यह रेटी के माध्यम से प्राप्त होने वाले गतिशील भाग को अस्वीकार करेगा। – deColaman

+0

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