动态创建 BUTTON 中出现的问题(50分)

  • 主题发起人 主题发起人 flyinsky
  • 开始时间 开始时间
F

flyinsky

Unregistered / Unconfirmed
GUEST, unregistred user!
//////////自定义过程
procedure ChangeOwner (Component, NewOwner: TComponent);
begin
Component.Owner.RemoveComponent (Component);
NewOwner.InsertComponent (Component);
end;

///////Form1上的buttonchange纽,点击在form2上创建button1
procedure TForm1.ButtonChangeClick(Sender: TObject);
begin
if Assigned (Button1) then
begin
// change parent
Button1.Parent := Form2;
// change owner
chaneowner(button1,form2);
end;
end;

///先定义了 Form1,Form2,在Form1上放个 BUTTON1,并且给予一个事件:
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage ('My owner is ' +((Sender as TButton).Owner
as TForm).Caption);
end;
//////////////////////////////////////////////////////
以上可以正确执行,但我在procedure TForm1.ButtonChangeClick中修改
如下,(不使用procedure changeowner)
procedure TForm1.ButtonChangeClick(Sender: TObject);
begin
if Assigned (Button1) then
begin
// change parent
Button1.Parent := Form2;
// change owner
form1.removecomponent(button1);
form2.insertcomponent(button1);
end;
end;
/////////////////////////////////////////
这时运行中有异常出现,虽然BUTTON1还是在Form2中创建了,但
button1click 事件无法正确运行了。
照说这与前面的方法是一样的呀?问题在哪?
2:还有button1以及事件button1click都是在Form1中创建的
为什么动态创建到Form2中时,同样可以调用呢?
是否只要用了Insertcomponent(mycomponent) 后,Mycomponent
及其相关的方法都自动创建到了新窗体中了呢?
 
1, 从来没这么用过,不清楚。
2, button1click 只是一个指针,开始的时候,
指向一个地址,你把它放到 form2 时,
这个指针没有改变。
 
“button1click 只是一个指针,开始的时候,指向一个地址,你把它放到 form2 时,这个指针没有改变。”可以理解了,
 
{ form1.removecomponent(button1);
form2.insertcomponent(button1);}
这两句究竟有没有错?
 
觉得这样用不好
还不如你自己动态Create和设定事件,InsertComponent感觉不是很方便
2、当然移过去了,因为控件没有被Free当然数据没变,指针等事件指向也不变呀
1、我用的方法是先InsterComponent再RemoveComponent
然后在窗体的Close事件里写上相反的过程,让窗体自动Free控件,否则会出错
 
》》我用的方法是先InsterComponent再RemoveComponent:
其实原来的procedure ChangeOwner (Component, NewOwner: TComponent);
是完全正确的,就是不用这个过程,直接写
form1.removecomponent(button1);
form2.insertcomponent(button1);就有错,但其实这是一回事
这是个D5的例子
对与“然后在窗体的Close事件里写上相反的过程,让窗体自动Free控件,否则会出错”,我试了没有用的,程序结束时确实会报出错信息。
 
//我的代码
procedure TForm2.Button2Click(Sender: TObject);
begin
if Assigned (Button1) then
begin
// change parent
Button1.Parent := Form1;
// change owner
form1.insertcomponent(button1);
form2.removecomponent(button1);
form1.Show;
end;
end;

procedure TForm2.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
form1.removecomponent(button1);
form2.insertcomponent(button1);
end;
 
那我就不是很清楚了,但是我的Close没有问题,一切OK可能你没有注意我的代码不
大一样,我也测试了一下不过交换了一些设置
例子我倒是没注意,也许例子是对的,就按照例子来吧:)Delphi例子很不错,我要
加紧多看看:)
 
是不是我的DELPHI错问题了,?
还有其实不用在TForm2.FormClose吧,
多次一举了。
 
好像我不加这几句就会出保护性错误
好像你没有好好测试嘛,呵呵,我的代码可以一句一句运行了的哦!
如果不加在Close里面你强行直接调用InsertComponent 和RemoveComponent
就会出现以下错误提示(Delphi5的IDE环境下)而且前后的次序很重要
我指的是直接调用,而不是你用的那个函数解决哦
Exception EAccessViolation in module Project1.exe at 00000000.
Access violation at address 00000000, Read of address 00000000.
呵呵,我估计是Form自动Free控件的时候找不到了控件
你好好看一下吧,也许还是没好好一句一句的测试:)
要不你建一个简单的程序来调试,呵呵可以好好讨论一下这个问题:)
我想不是多此一举吧,最起码不出错了
呵呵,不论如何没错就行
Good luck!
 
接受答案了.
 
后退
顶部