2011-12-18 3 views
5

के अंदर सार्वजनिक विधियों और गुणों तक पहुंच मेरे पास एक ऐसा एप्लिकेशन है जो एक साधारण रूप के रूप में एक बीपीएल लोड करता है।डेल्फी बीपीएल

यह फ़ॉर्म मुख्य एप्लिकेशन का एक वैकल्पिक विकल्प है।

बीपीएल सही ढंग से लोड होता है, फॉर्म सही ढंग से दिखाया गया है, लेकिन मुझे नहीं पता कि बीपीएल के अंदर फॉर्म के सार्वजनिक तरीकों और गुणों का उपयोग कैसे किया जाए।

कोई भी एक साधारण उदाहरण प्रदान कर सकता है?

मेरी कोड:

// Load the BPL on aplication Load 
LoadPackage('About.bpl'); 

// CAll for TForm1 inside the About.BPL 
var 
    AClass: TClass; 
    AForm: TForm; 
begin 

    AClass := GetClass('TForm1'); 
    if AClass <> nil then 
    begin 
     Application.CreateForm(TComponentClass(AClass), AForm); 
     AForm.Show; 
    end; 

// The unit TForm1 inside the BPL package 
unit Unit1; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, StdCtrls; 

type 
    TForm1 = class(TForm) 
     Button1: TButton; 
     Label1: TLabel; 
     procedure Button1Click(Sender: TObject); 
    private 
     { Private declarations } 
    public 
     { Public declarations } 
     PublicMthd; 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

Procedure TForm1.PublicMthd; 
Begin 
    ShowMessage('Inside call'); 
End; 

initialization 
    RegisterClass(TForm1); 

finalization 
    UnRegisterClass(TForm1); 

end. 

कैसे मैं Tform1 में "PublicMthd" पहुँच सकता है?

+2

हमें दिखाएं कि आपका कोड कैसा दिखता है। बीपीएल फाइलों को लोड करने के कई तरीके हैं और उत्तर इस बात पर निर्भर करेगा कि आप इसे कैसे कर रहे हैं। –

+0

यह SO प्रश्न भी देखें: [निष्पादन-ए-विधि-से-एक-फॉर्म-निर्मित-द्वारा-श्रेणी-संदर्भ-डेल्फी] (http://stackoverflow.com/questions/2991934/execute-a-method-from -ए-फॉर्म-निर्मित-द्वारा-श्रेणी-संदर्भ-डेल्फी) –

+0

क्या आपने यह बीपीएल लिखा था? आप GetMainForm नामक फ़ंक्शन को क्यों निर्यात नहीं करते हैं, और फिर आप 'फ़ंक्शन GetMainForm: TForm'' कॉल करते हैं और फिर आप इसे एक्सेस कर सकते हैं?क्या कोई कारण है कि आप एक सामान्य ज्ञान दृष्टिकोण का उपयोग नहीं कर सकते हैं? कक्षाओं को जानने के बाद आप क्या करना चाहते हैं और उन्हें गिन सकते हैं, और शायद उनके उदाहरण भी बना सकते हैं? क्या आपके पास एक मुख्य कारण है कि आप अपने मुख्य अनुप्रयोग से अंतर्निहित वर्ग प्रकारों पर सीधे जाने के बजाय, आपके समस्या डोमेन को फिट करने वाले IPluginInterface निर्दिष्ट नहीं कर रहे हैं? –

उत्तर

9

एक गतिशील रूप से लोड बीपीएल (इसे "वैकल्पिक" बिट से मानते हुए) में टोप्शनलफॉर्म रखने के हित में से एक है) अपने आवेदन को टॉप्शनलफॉर्म क्लास की परिभाषा को विशेष रूप से परिभाषित करने के लिए बचाना है (यह इकाई में निहित इकाई में है पैकेज और केवल वहां)।

इसका मतलब है कि आपके आवेदन जब तक आप या तो का उपयोग इसके बारे में कुछ पता नहीं कर सकते हैं:
- एक साझा आधार कक्षा
- एक इंटरफ़ेस गुण और विधियों आप
उपयोग करना चाहते घोषित - प्रकाशित गुण का उपयोग करने के लिए कुछ बुनियादी RTTI और विधियों
- सार्वजनिक संपत्तियों और विधियों तक पहुंचने के लिए कुछ विस्तारित आरटीटीआई (यदि आपके पास डी 2010 या बाद में है)
- बेस क्लास पैरामीटर (या टॉब्जेक्ट/पॉइंटर) को स्वीकार करने वाले बीपीएल से कुछ बाह्य दिनचर्या इसे आंतरिक रूप से टॉप्शनलफॉर्म के रूप में टाइप करते हैं।

यह बहुत अस्पष्ट और सामान्य और अधिक सटीक के बारे में अपने कोड को परिष्कृत करने की जरूरत होगी है ...

2

आप गतिशील रूप से गरीबी रेखा से नीचे लोड करने के लिए की जरूरत है, तो आप का उपयोग करना चाहिए - के रूप में पहले से ही फ़्राँस्वा द्वारा metioned:

  • एक अमूर्त वर्ग
  • एक इंटरफेस (जो मैं क्लीनर पर विचार करने और साथ बेहतर अनुभव है)

जगह (जो और अधिक डेल्फी की तरह या है) मुख्य अनुप्रयोग और फॉर्म बीपीएल दोनों द्वारा उपयोग की जाने वाली इंटरफ़ेस-केवल इकाई में डी।

मैं एक मध्यवर्ती "अनुबंध/इंटरफ़ेस" बीपीएल का उपयोग करता हूं, जो मुख्य रूप से मुख्य अनुप्रयोग और गतिशील रूप से लोड किए गए दोनों द्वारा उपयोग किया जाता है।

इंटरफ़ेस उपयोग के मामले में, बीपीएल फोम एप्लिकेशन को आगे बढ़ाने के लिए $WEAKPACKAGEUNIT निर्देश भी देख सकता है।

टिप्पणियों पर टिप्पणी करने के लिए - डीएलएल निर्यात या आरटीटीआई का उपयोग करके, आप मूल रूप से बीपीएल के पूरे बिंदु को बाईपास करेंगे, जो प्रकार और नामस्थान साझाकरण है।

+1

मैं इसका सरल उदाहरण हूं और मैं आपको बक्षीस देता हूं – DRokie

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