本文为【Delphi学习:OOP 中的双刃剑】的汉字拼音对照版显示拼音
前qian几ji天tian看kan一yi份fen非fei常chang有you名ming的de商shang业ye控kong件jian的de源yuan码ma,发fa现xian一yi个ge非fei常chang有you趣qu的de用yong法fa:
Integer(xxx) := aaa;
Tttt(xxx) := bbb;
细xi细xi品pin味wei,发fa现xian利li用yong这zhe种zhong用yong法fa往wang往wang可ke以yi收shou到dao意yi想xiang不bu到dao的de效xiao果guo:
比bi如ru:
TTestRec = record
A, B, C: Integer;
end;
TTestCls = class
private
FInner: TTestRec;
FReadOnlyValue: Integer;
function GetNewInner: PTestRec;
public
property Inner: TTestRec read FInner write FInner;
property NewInner: PTestRec read GetNewInner;
property ReadOnlyValue: Integer read FReadOnlyValue;
end;
你ni会hui发fa现xian,直zhi接jie的de你ni是shi改gai不bu了le aTestCls.Inner.A 的de(编bian译yi时shi delphi 直zhi接jie报bao错cuo,因yin为wei delphi 7 中zhong两liang个ge recode 赋fu值zhi是shi copy memory 而er不bu是shi简jian单dan的de“传chuan址zhi”!
procedure TForm1.Button1Click(Sender: TObject);
begin
with TTestCls.Create do
try
// Inner.A := 10;
Caption := TButton(Sender).Caption + ' A := ' + IntToStr(Inner.A);
finally
Free;
end;
end;
可ke是shi,如ru果guo我wo们men知zhi道dao在zai访fang问wen这zhe个ge Inner 时shi delphi 在zai编bian译yi直zhi接jie FInner 的de地di址zhi,那na么me,结jie合he上shang面mian那na种zhong有you趣qu的de用yong法fa:
procedure TForm1.Button3Click(Sender: TObject);
var
p: PInteger;
begin
with TTestCls.Create do
try
p := @(Inner.A);
Integer(p^) := 100;
Caption := TButton(Sender).Caption + ' A := ' + IntToStr(Inner.A);
finally
Free;
end;
end;
更geng进jin一yi步bu,利li用yong指zhi针zhen竟jing然ran可ke以yi突tu破po oo 对dui private 的de保bao护hu:
procedure TForm1.Button4Click(Sender: TObject);
var
p: PInteger;
begin
with TTestCls.Create do
try
p := @(ReadOnlyValue);
Integer(p^) := 1000;
Caption := TButton(Sender).Caption + ' ReadOnlyValue := ' + IntToStr(ReadOnlyValue);
||||||
finally
Free;
end;
end;
至zhi于yu“踩cai过guo界jie”那na更geng不bu在zai话hua下xia:
procedure TForm1.Button5Click(Sender: TObject);
var
p1, p2: PInteger;
begin
with TTestCls.Create do
try
p1 := @(Inner.A);
// 内nei存cun中zhong FInner 与yu FReadOnlyValue 其qi实shi只zhi差cha TTestRec 大da小xiao个ge字zi节jie
Integer(p2) := Integer(p1) + SizeOf(TTestRec);
Integer(p2^) := 100;
Caption := TButton(Sender).Caption + ' ReadOnlyValue := ' + IntToStr(ReadOnlyValue);
finally
Free;
end;
end;
当dang然ran,指zhi针zhen不bu但dan可ke以yi破po坏huai oo,也ye能neng使shi您nin的de代dai码ma更geng加jia的de oo:
TTestRec = record
A, B, C: Integer;
end;
PTestRec = ^TTestRec;
TTestCls = class
private
FInner: TTestRec;
FReadOnlyValue: Integer;
function GetNewInner: PTestRec;
public
property Inner: TTestRec read FInner write FInner;
property NewInner: PTestRec read GetNewInner;
property ReadOnlyValue: Integer read FReadOnlyValue;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
with TTestCls.Create do
try
NewInner.A := 10;
Caption := TButton(Sender).Caption + ' A := ' + IntToStr(Inner.A);
finally
Free;
end;
end;
看kan看kan现xian实shi中zhong的de非fei oo 的de代dai码ma:
利li用yong“指zhi针zhen方fang案an”把ba Txxx 改gai成cheng Pxxx 后hou竟jing然ran对dui原yuan来lai的de代dai码ma一yi点dian影ying响xiang都dou没mei有you,而er使shi之zhi更geng加jia的de oo
【原文】