2008-11-14 15 views
9

पर TFrame वंश के अतिरिक्त गुण दिखा रहा है डेल्फी ऑब्जेक्ट इंस्पेक्टर TFrame वंशजों के डिज़ाइन द्वारा अतिरिक्त गुण नहीं दिखाता है। लोग एक ज्ञात चाल का उपयोग करने का सुझाव देते हैं जिसका प्रयोग ऑब्जेक्ट इंस्पेक्टर पर टीएफओएम वंश के गुणों को दिखाने के लिए किया जाता है। चाल है: डिजाइन समय पैकेज के माध्यम से डेल्फी आईडीई के लिए TForm वंशजों के लिए कस्टम मॉड्यूल दर्ज की तरह:ऑब्जेक्ट इंस्पेक्टर

RegisterCustomModule(TMyFrame, TCustomModule); 

वस्तु निरीक्षक इस तरह से साथ TFrame वंशज के उदाहरण के अतिरिक्त गुण दिखा सकते हैं, लेकिन यह इसके फ्रेम व्यवहार खो देता है यह है, जबकि एक रूप में एम्बेडेड। पुन: डिजाइन नहीं किया जा सकता है, इसके उप-संयोजकों के लिए घटनाओं को लागू करना संभव नहीं है और यह बाल नियंत्रण स्वीकार करता है (जो यह नहीं है)। लेकिन यह सामान्य रूप से अपने स्वयं के डिजाइन क्षेत्र में व्यवहार करता है।

ऐसा लगता है, डेल्फी आईडीई द्वारा विशेष रूप से केवल TFrame के लिए प्रदान किए गए व्यवहार। वे problaly सामान्य सुविधाओं की तरह नहीं हैं।

क्या फ्रेम व्यवहार खोए बिना इसे पूरा करने का कोई और तरीका है?

मैं डेल्फी 2007


@Tondrej उपयोग कर रहा हूँ,

पहले से समस्या के लिए टिप्पणी, धन्यवाद पढ़ें।

frameunit.dfm:

object MyFrame: TMyFrame 
    Left = 0 
    Top = 0 
    Width = 303 
    Height = 172 
    TabOrder = 0 
    object Edit1: TEdit 
    Left = 66 
    Top = 60 
    Width = 151 
    Height = 21 
    TabOrder = 0 
    Text = 'Edit1' 
    end 
end 

unit frameunit; 

interface 

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

type 
    TBaseFrame = Class(TFrame) 
    protected 
    Fstr: string; 
    procedure Setstr(const Value: string);virtual; 
    published 
    Property str:string read Fstr write Setstr; 
    End; 

    TMyFrame = class(TBaseFrame) 
    Edit1: TEdit; 
    private 
    // This won't be called in designtime. But i need this to be called in designtime 
    Procedure Setstr(const Value: string);override; 
    end; 

implementation 

{$R *.dfm} 

{ TBaseFrame } 

procedure TBaseFrame.Setstr(const Value: string); 
begin 
    Fstr := Value; 
end; 

{ TMyFrame } 

procedure TMyFrame.Setstr(const Value: string); 
begin 
    inherited; 
    Edit1.Text := Fstr; 
    // Sadly this code won't work and Edit1 won't be updated in designtime. 
end; 

end. 

unit RegisterUnit; 

interface 

procedure Register; 

implementation 

uses 
    Windows, DesignIntf, frameunit; 

procedure Register; 
var 
    delphivclide: THandle; 
    TFrameModule: TCustomModuleClass; 
begin 
    delphivclide := GetModuleHandle('delphivclide100.bpl'); 
    if delphivclide <> 0 then 
    begin 
    TFrameModule := GetProcAddress(delphivclide, '@[email protected]@'); 
    if Assigned(TFrameModule) then 
    begin 
     RegisterCustomModule(frameunit.TBaseFrame, TFrameModule); 
     // Just registering that won't cause Tmyframe to loose its frame behaviours 
     // but additional properties won't work well. 

     //RegisterCustomModule(frameunit.TMyFrame, TFrameModule); 
     // That would cause Tmyframe to lose its frame behaviours 
     // But additional properties would work well. 

    end; 
    end; 
end; 


end. 

उत्तर

0

नहीं, मैं नहीं लगता है कि यह पूरी तरह से संभव है।

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

फिर फिर, ओओपी-परिप्रेक्ष्य से यह बहुत बुरा नहीं है। यह वास्तव में कार्यान्वयन छिपाने की अवधारणा को लागू करता है। आप अभी भी नए गुणों और फ्रेम पर विधियों के माध्यम से उप-घटकों की व्यक्तिगत गुणों और कार्यक्षमता का पर्दाफाश कर सकते हैं।

4

आप अपने फ्रेम के लिए कौन सी कस्टम मॉड्यूल क्लास पंजीकृत कर रहे हैं? डेल्फी का कौन सा संस्करण आप उपयोग कर रहे हैं?

डेल्फी 2007 के साथ अपने प्रयोगों से, कस्टम मॉड्यूल क्लास जो काम करने लगता है TFrameModule है। यह वर्ग delphivclide100.bpl में निहित है। ,

unit FrameTestReg; 

interface 

procedure Register; 

implementation 

uses 
    Windows, DesignIntf, 
    FrameTest; 

procedure Register; 
var 
    delphivclide: THandle; 
    TFrameModule: TCustomModuleClass; 
begin 
    delphivclide := GetModuleHandle('delphivclide100.bpl'); 
    if delphivclide <> 0 then 
    begin 
    TFrameModule := GetProcAddress(delphivclide, '@[email protected]@'); 
    if Assigned(TFrameModule) then 
     RegisterCustomModule(TTestFrame, TFrameModule); 
    end; 
end; 

end. 

मेरे FrameTest इकाई बहुत सरल है यह कोई FrameTest.dfm केवल नए TFrame वंशज की घोषणा की है:: चूंकि कोई इसी delphivclide.dcp है आप इसे मैन्युअल लोड करने के लिए है

unit FrameTest; 

interface 

uses 
    Forms; 

type 
    TTestFrame = class(TFrame) 
    private 
    FHello: string; 
    published 
    property Hello: string read FHello write FHello; 
    end; 

implementation 

end. 

TFrameModule क्लास का उपयोग करके, सब कुछ ठीक काम करने लगता है।मैं प्रोजेक्ट में शामिल करने के लिए टीटेस्टफ्रेम का एक नया वंशज बना सकता हूं और ऑब्जेक्ट इंस्पेक्टर में अपनी प्रकाशित संपत्तियों को संपादित कर सकता हूं, आईडीई में एक फॉर्म पर इस नए वंशज के उदाहरण डाल सकता हूं, ऑब्जेक्ट इंस्पेक्टर में अपनी नई प्रकाशित गुणों को संपादित कर सकता हूं, ईवेंट हैंडलर लिख सकता हूं उनके बच्चे के घटक इत्यादि। डीडीएफ संसाधन में मैं उदाहरणों के लिए अपेक्षित "इनलाइन" निर्देश देख सकता हूं। मुझे अब तक कोई समस्या नहीं आई है, इसलिए शायद यह समाधान है।

+0

अच्छा, मैं कुछ समय के लिए इस्तेमाल किया फ्रेम havn't, क्योंकि मुझे लगता है कि वे परेशानी के लायक नहीं हैं। लेकिन मैं यह कोशिश करने जा रहा हूँ। –

0
procedure TMyFrame.Setstr(const Value: string); 
begin 
    inherited; 
    Edit1.Text := Fstr; 
    // Sadly this code won't work and Edit1 won't be updated in designtime. 
end; 

मुझे लगता है कि ऐसा इसलिए है क्योंकि इसे डिजाइन समय पर काम नहीं करना चाहिए। आपने एक कस्टम मॉड्यूल के रूप में TBaseFrame पंजीकृत किया है, इसलिए यह TBaseFrame है (न कि यह वंशज है !!!) गुण जो डिज़ाइन समय पर संपादन योग्य होना चाहिए। डेल्फी आईडीई केवल आपके द्वारा पंजीकृत कक्षा के प्रकाशित गुणों के बारे में जानता है; यह आपके प्रोजेक्ट में किए गए किसी भी वंशज और ओवरराइड के बारे में कुछ भी नहीं जानता है। डिजाइन समय में कोड काम करने के लिए, आप या तो TBaseFrame परिभाषा में शामिल करना चाहिए:

procedure TBASEFrame.Setstr(const Value: string); 
begin 
    inherited; 
    Edit1.Text := Fstr; 
end; 

या (TBaseFrame के अलावा) दर्ज होने वाले कस्टम मॉड्यूल के रूप में TMyFrame परिभाषा।

समझने की कोशिश करें: डिज़ाइन समय पर डेल्फी आईडीई केवल उन चीजों के बारे में जानता है जो इसमें पंजीकृत हैं। यह एक बाधा नहीं है; यह तार्किक व्यवहार है।

+1

यह लंबे समय से रहा है .. जहां तक ​​मुझे याद है, अगर मैं टीएमफ्रेम पंजीकृत करता हूं, तो इसके उदाहरणों में अब redisegnablity की क्षमता नहीं है और यह केवल इसके वंशज की गुण दिखाती है। – Serguzest

0

"हैक रास्ता"

uses 
... 
    DMForm, 
    VCLFormContainer, 
... 

procedure Register; 
begin 
... 
    RegisterCustomModule(TYourFrameClass, TFrameModule); // for frames 
    RegisterCustomModule(TYourModuleClass, TDataModuleCustomModule); // for data modules 
... 
end; 

एक और तरीका है चारों ओर फ्रेम जोड़ने के लिए भी इकाइयों के

type 
    TNestableWinControlCustomModule = class (TWinControlCustomModule) 
    public 
    function Nestable: Boolean; override; 
    end; 

function TNestableWinControlCustomModule.Nestable: Boolean; 
begin 
    Result := True; 
end; 

+

RegisterCustomModule(TYourFrameClass, TNestableWinControlCustomModule); 

नाम नहीं है में करने के लिए कोई जरूरत नहीं है (एक्सई 7 में परीक्षण):

TCustomModule =>DesignEditors

TDataModuleCustomModule =>DMForm (designide.dcp)

TWinControlCustomModule =>WCtlForm (designide.dcp)

TFrameModule =>VCLFormContainer (vcldesigner.dcp)

मुझे लगता है के लिए FireMonkey यह संभव हो जाना चाहिए समान तरीके में (लगता है fmxdesigner.dcp & जांच क्या Notepad ++ में अंदर है) कि

पी एस। पुराने डेल्फी संस्करणों में वहाँ इकाई DMDesigner

पी पी एस में TDataModuleDesignerCustomModule metaclass TDataModuleCustomModule के बजाय था। अन्य मौजूदा metaclass नाम:

TCustomFormCustomModule

TIDESourceModuleCustomModule

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