一个Form1中有一个TEdit控件TEdit1 ,给TEdit1添加一个OnChange事件,
另一个From2中有一个TEdit控件TEdit2,
代码
From2.TEdit2:=From1.TEdit1;From2.show;这是TEdit2并未获得TEdit1的属性,如text值,事件多未赋值过来,
但是我在跟踪代码的时候,From2.TEdit2.text=From1.TEdit1.text;
但是From2.TEdit2显示的text还是未改变
From2.TEdit2.OnChange 也没有赋值
什么原因??是不是没刷新 ?? 谢谢
Edit2:=Edit1,,,我是要获得Edit1的所有特性,text,event等, 如果赋值做到,那有什么其他方法可以回去Edit1一个完全一样的副本???继承其所有特性
会出错,不知道为什么
TEdit是类,不是如Integer,String一样内置数据类型,是不能直接赋值的,Edit2:=Edit1是对象变量的赋值,不是对象实例的赋值,这句的结果将对象Edit2指向Edit1所指向的TEdit类的实例,而Edit2原来指向的实例对象丢失了,它在内存中仍然存在,只是不能再访问它,唯一指向它的Edit2现在指向了跟Edit1相同的实例对象。
说简单点Edit1,Edit2都是类似于指向对象实例的指针,你改变了指针而没有改变实际对象实例。也就是Form2中的Edit2在这之后指向的是Form1.Edit1,跟Form2中显示的Edit控件已经没有关系,该Edit已无法直接访问。
你试下Form2.Edit1.text:='NewEditText',看改变的是哪个Edit的属性就知道了!
Assign方法用来复制对象。Form2.Edit2.Assign(Edit1)应该没问题。至于TEdit.Assign方法会Copy多少属性自己到VCL的源代码中看。如果Form2在是没有显示的把这行写到From2.show后面试试。
Form2.Edit2.onclick := Form1.Edit1.onclick;.....
and so on
或者你觉得某些组件的方法比较常用,就直接写成一个公共的Procedure,然后给别的组件动态赋值就好了。比如:
Type
Form1 = class(TForm)
public
procedure ButtonClick(Sender: TObject)
end;
...procedure ButtonClick(Sender: TObject)
begin
Showmessage('Hi');
end;procedure TForm1.show(Sender: TObject)
begin
Button1.onclick := ButtonClick;
end;
TForm1 = class(TForm)
Button1: TButton;
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure Button1Click(Sender: TObject);
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage('Hi');
end;procedure TForm1.FormShow(Sender: TObject);
begin
Button1.OnClick := Button1Click;
end;