मैं स्वयं की अपनी समझ को आगे बढ़ाने के लिए कह रहा हूं।स्वयं का दायरा क्या है?
कृपया निम्नलिखित पर विचार:
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;