放100分问问。大家帮忙看看。
有没有办法象改变下述变量i值一样来改变一个类的属性。
例如,Button1.top值。不要用Button1.top := xxx;
procedure TFrmMain.Button1Click(Sender: TObject);
var
i : integer;
pii : ^integer;
begin
ShowMessage(IntToStr(i));
i :=100;
pii := @i;
pii^ := 1200;
ShowMessage(IntToStr(i));
end;
[解决办法]
有什么必要吗?
[解决办法]
改变类的属性还是对象?
[解决办法]
每一个控件,在内存中都是一下地址....
[解决办法]
楼主想去改的是组件中受保护成员吧
回答是可以改,但不可靠
Tfoo
private
public
property field: Integer read Ffield, write ffield; 这样的是可以的
property field: Integer read GetField... 这样的是不可靠的
end;
有几种办法可以硬性的存取成员,但结果都是不可预知的,不过delphi有个隐性约定,同一单元的成员全是友员,这是个好约定啊,这样可以用以下代码,以 DBGrid为例,不少人想存取Col,但DBGrid没提供
type
TGridHacker = class(TCustomGrid); end;//ok
操作处 TGRidHacker(DBGrid1).Col 这样去改写和读取,是安全的
[解决办法]
例如,Button1.top值。不要用Button1.top := xxx;
property Top: Integer read FTop write SetTop;
因为Top是直接Read FTop,所以可以用指针来操作Top,例如:
pii := @(Button1.Top);
pii^ := 200;
但是Button在屏幕中的位置却不会因此而移动。
因为SetTop中还有如下两句:
SetBounds(FLeft, Value, FWidth, FHeight);
Include(FScalingFlags, sfTop);
要想实现和Button1.top := xxx同样的效果而不用Button1.top := xxx;可以模拟如下:
with Button1 do
begin
SetBounds(Left,100,Width,Height);
ScalingFlags:=ScalingFlags+[sfTop];
end;
以上语句会将Button1的Top改为100。
[解决办法]
关注,