私は自己についての理解を進めることを求めています。自己の範囲は何ですか?
次の点を考慮してください:
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
へのポインタを作成した後に再度アクセスすることです。私がそのポインタにアクセスする同じClickイベント(ButtonSecondClick
)でMakeThePointer
を呼び出すと、正常に動作します。ポインタ(ButtonThirdClick
)にアクセスする前にMakeThePointer
に電話しないと、以前に作成されたポインタが有効でアクセス違反が発生するような方法でTestObj's Self
が存在しないようです。
私が間違っている場合は私を修正してくださいが、私は自己がオブジェクトのメソッドのそれぞれの変数であると仮定します。したがって、それぞれのメソッドのスコープのみを個別に持つことになりますか?
これを考えてみましょう。その場合、ButtonFirstをクリックした後にButtonSecondを押した場合、なぜ次のようなことが起こりますか? Self変数が同じアドレスに置かれているので、以下のように動作するようです。 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;