可以啊
delphi中ComponentState是一个只读属性, 一般情况下无法写。 所以需要用一种“非法”手段来写。
这个方法就是通过一个指向类中Private变量的指针直接操作无法访问的Private变量。
type
PComponentState = ^TComponentState; // 定义一个指向TComponentstate类型的指针
TSkipVars = record
FOwner: TComponent;
FName: TComponentName;
FTag: Longint;
FComponents: TList;
FFreeNotifies: TList;
FDesignInfo: Longint;
FVCLComObject: Pointer;
end; // 直接查源代码, 发觉ComponentState属性访问的是FComponentState这个变量。
// 而在FComponentSate前还有一些变量。 我要为指针定位时需要跳过它们。
procedure TForm1.Button1Click(Sender: TObject);
var
p: PComponentState;
begin
p := pointer(integer(self)+TPersistent.InstanceSize+sizeof(TSkipVars));
// Integer(self)--->找到Form1的入口地址
// TPersistent.InstanceSize---> ComponentState第一次出现的地方在TComponent类中
// TComponent继承自TPersistent, 所以要找到TComponent中的某个变量需要跳过TPersistent中所有变量
// TPersistent.InstanceSize就是TPersistent类的实例所占用的字节数
// TSkipVars是我定义的类型, 目的就是为跳过TComponent中在FComponentState前的所有变量(TSkipVars中的定义直接copy自源代码TComponent定义中)
// 现在我就获得了一个指向FComponentState的指针了
p^ := p^+[csDesigning]; // 直接修改它的值
if csDesigning in componentState then // 让我们看看修改是否成功了
showmessage('yes');
end;