2017-02-07 12 views
5

मैं स्वयं की अपनी समझ को आगे बढ़ाने के लिए कह रहा हूं।स्वयं का दायरा क्या है?

कृपया निम्नलिखित पर विचार:

type 
    PTestObject = ^TTestObject; 
    TTestObject = class(TObject) 
    private 
    FCaption : String; 
    public 
    procedure MakeThePointer; 

    property Caption : String read FCaption write FCaption; 
    end; 

    TForm4 = class(TForm) 
    ButtonFirst: TButton; 
    ButtonSecond: TButton; 
    ButtonThird: TButton; 
    procedure ButtonFirstClick(Sender: TObject); 
    procedure ButtonSecondClick(Sender: TObject); 
    procedure ButtonThirdClick(Sender: TObject); 
    private 
    public 
    end; 

var 
    Form4: TForm4; 
    PointerOfTest : PTestObject; 
    TestObj : TTestObject; 

implementation 

{$R *.dfm} 

procedure TTestObject.MakeThePointer; 
begin 
    PointerOfTest := @Self; 
end; 

procedure TForm4.ButtonFirstClick(Sender: TObject); 
begin 
    TestObj := TTestObject.Create; 
    TestObj.Caption := 'Hello'; 
    TestObj.MakeThePointer; 
end; 

procedure TForm4.ButtonSecondClick(Sender: TObject); 
begin 
    TestObj.MakeThePointer; 
    ShowMessage(PointerOfTest^.Caption); 
end; 

procedure TForm4.ButtonThirdClick(Sender: TObject); 
begin 
    // TestObj.MakeThePointer; - Because I do not do this I get Access Violation 
    ShowMessage(PointerOfTest^.Caption); 
end; 

विचार TestObj's Self के लिए सूचक बनाने के लिए है और फिर बाद में इसे फिर से एक्सेस करते हैं। यदि मैं उसी क्लिक ईवेंट (ButtonSecondClick) में MakeThePointer पर कॉल करता हूं, जहां मैं उस पॉइंटर तक पहुंचता हूं तो यह ठीक काम करता है। अगर मैं पॉइंटर (ButtonThirdClick) तक पहुंचने से पहले MakeThePointer पर कॉल नहीं करता हूं तो ऐसा लगता है कि TestObj's Self इस तरह से मौजूद नहीं है कि पहले बनाया गया पॉइंटर मान्य है और मुझे एक्सेस उल्लंघन मिलता है।

अगर मैं गलत हूं तो कृपया मुझे सही करें लेकिन मुझे लगता है कि स्वयं प्रत्येक ऑब्जेक्ट के तरीकों के लिए एक परिवर्तनीय स्थानीय है। इस प्रकार यह केवल उन तरीकों में से प्रत्येक के लिए अलग-अलग होगा?

अब इस पर विचार करें ... यदि ऐसा है तो बटनफर्स्ट पर क्लिक होने पर निम्नलिखित कार्य क्यों करते हैं, तो बटनसेकंड? ऐसा लगता है कि स्व चर एक ही पते पर उतरा है जिससे इस प्रकार काम करने की अनुमति मिलती है। क्या मुझे लगता है कि स्व चर हमेशा एक ही पते पर होगा या यह बदल जाएगा?

type 
    TFormOther = class(TForm) 
    ButtonFirst: TButton; 
    ButtonSecond: TButton; 
    procedure ButtonFirstClick(Sender: TObject); 
    procedure ButtonSecondClick(Sender: TObject); 
    private 
    public 
    procedure MakeThePointer; 
    procedure SetTheCaption; 
    end; 

var 
    FormOther: TFormOther; 
    PointerOfForm : ^TForm; 

implementation 

{$R *.dfm} 

procedure TFormOther.MakeThePointer; 
begin 
    PointerOfForm := @Self; 
end; 

procedure TFormOther.SetTheCaption; 
begin 
    PointerOfForm^.Caption := 'Hello'; 
end; 

procedure TFormOther.ButtonFirstClick(Sender: TObject); 
begin 
    MakeThePointer; 
end; 

procedure TFormOther.ButtonSecondClick(Sender: TObject); 
begin 
    SetTheCaption; 
end; 

उत्तर

4

स्व का क्या स्कोप है?

एक विधि में Self स्थानीय चर के रूप में सबसे अच्छा विचार है। इसका पता, @Self, इसलिए विधि लौटने तक वैध है।

यह बताता है कि आपका कोड विफल क्यों होता है। आपका कोड वापस लौटने के बाद पॉइंटर को संदर्भित करता है, जिसके द्वारा पॉइंटर वैध नहीं है।

क्या मुझे लगता है कि स्व चर हमेशा एक ही पते पर होगा?

नहीं आप नहीं कर सकते हैं।


मुझे लगता है कि अपनी समस्याओं यहाँ शुरू:

type 
    PTestObject = ^TTestObject; 

क्योंकि TTestObject, अपने Self के रूप में एक वर्ग, प्रकार TTestObject के एक चर, इस तरह के एक संदर्भ है। एक संदर्भ एक सूचक के लिए एक फैंसी नाम है। इस मामले में, , TTestObject के तरीकों के अंदर उदाहरण के लिए एक सूचक है।

तो के बजाय TTestObject का उपयोग करें और आपकी समस्याएं भंग हो जाएं।

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