操作平台:{win2000\delphi6}
工程描述:{一个单窗体工程,主窗体为form1,一个button}
问题描述:
在button1的click事件写入下面的代码时:
procedure TForm1.Button1Click(Sender: TObject);
var
   frm : Tform;
begin
   Frm.Caption := 'aaaa'; {??为什么没有错误提示}
   Frm:=Tform1.Create(Application);
   Frm.Caption := 'bbbb'; {??}
   Frm.Show;
end;当去掉Frm.Caption := 'bbbb'时{form1的caption变为'aaaa'}
加上这句时{button1的caption改变'aaaa'}效果都满奇怪的,呵呵,不知道这算不算一个BUG{不能随便说的~},希望能与大家统一一下口径.
      

解决方案 »

  1.   

    没什么奇怪的,静态的属性不能CREATE当然也可以用了啊;默认都是静态的;
      

  2.   

    var
       frm : Tform;
    begin
       Frm.Caption := 'aaaa'; {??为什么没有错误提示}你的frm 是Tform;
    我试了没什么奇怪的
      

  3.   

    测试一下也是这样子的。想ing
      

  4.   

    你这是要干什么啊?呵呵,
    这个问题应该算是一个bug;
      

  5.   

    to  outer2000(天外流星) : 谢谢你的解答,但为什么form1以及button1的caption会改变呢?
    to stevenpeng(第九种兵器):那button1的caption改变了怎么解释呢?
      

  6.   


    var
       frm : TForm;
    然后
    frm := TForm1.create(application);
    这两个地方(声明和创建实例)和你的问题好象没有什么关系。
    在 建立实例前就赋值,理论上是不应该的,你的这个问题至少算个 bug
      

  7.   

    to  Rainsea(飞龙在天)
    我主要看了  (xusun)关于类及其实例的问题  我本来想蹭帖的,后来想想还是自己开好了.呵呵,还有想给经常提问题的朋友做一个'模板',这样我们以后解决开才方便容易看懂~
      

  8.   

    考虑了一下这其实就是delphi的一个bug了,也就是在c++中(可以用C++ Builder或者VC++试试),这样的情况链接能过了,但不能够被执行,因为实例还没有建立,会有异常出现。那么在delphi中能够编译链接,而且能够运行,而且还有错误的结果,这不是bug是什么?
      

  9.   

    至少这也是属于内存泄露方面的问题。
    因为实例没有建立,就对这个Object的属性赋值,而且不报告错误。
    给出错误的结果当然是内存泄露方面的问题了。
    刚才看了汇编的结果,结果说明就是内存泄露造成错误结果出现的。
      

  10.   

    我有一点不大明白,请各位指教。
       建立的frm,但并没有建button,为什么在frm中有button1呢?
      

  11.   

    to:mikko11 你试过例子了? 谢谢关注~
     
    因为Frm:=Tform1.Create(Application);是由Tform1类创建的,是Tform1的一个实例,也就是说frm继承了Tform1和所有的属性,方法以及.再试试  Frm:=Tform.Create(Application);就会发现不同了
      

  12.   

    to laihecongxi(兴哥) ( ) 
      多谢回答。form1,还是form倒没注意。
      

  13.   

    呵呵,我觉得要是从结果往前推理的话,就是说这句Frm.Caption := 'aaaa';被执行成这个样子了Button1.Caption := 'aaaa';至于delphi为什么会把没实例化的frm当成button1?偶就不知道了,估计是它在frm未实例化之前就完全把frm当做当前控件来用,在这里可以用TForm和TButton公有的属性来控制button1,比如width,height等,换成点击label或image之类的也是如此。最奇怪的是换成image以后,虽然image没有caption属性,可还是不会报错??????呵呵,我一直以为它会报错的,所以才信心十足的写了这许多,呵呵,算我灌水好了。
      

  14.   

    我的观点:
    不是delphi的BUG,二是程序本身的问题,即不对对象创建就是用对象。
    如果遵循先创建再使用的规范的话,不会存在这些问题。
    关于:
    Frm.Caption := 'aaaa'; {??为什么没有错误提示}
    1。在编译时,此处无语法错误,当然不提示。
    2。运行时,frm应该为随机值,执行到此处应该出错,之所以没有出错,可能是由于delphi编译器的安排,使frm临时指向了存在的窗体(From1\Button),从多次试验看,改指向完全是随机的。
    3。如果使用
    for i:=0 to 1 do
      frm.caption := 'aa';
    替代
      frm.caption := 'aa';的话,在我的机器上总是出错。(windows2000Professional+Delphi6)。
    从这里可以看出,上述问题,并不是delphi的问题,而是程序的问题。
      

  15.   

    果然,不知delphi的源代码有没有错啊?procedure TControl.SetTextBuf(Buffer: PChar);
    begin
      Perform(WM_SETTEXT, 0, Longint(Buffer));
      Perform(CM_TEXTCHANGED, 0, 0);
    end;
      

  16.   

    谢谢各位的高论,不知是否还有其他意见?
    再加一百分!to: Kingron(单身走我路……) 
        这位高人好,一万年前我们也讨论过,黄河水为什么会少,但现在不知道他们那时候讨论了些什么,麻烦你老人家把一万年前的东西拿出来让我看一下好吧.谢谢.
    不好意思您讨论的时候我还小.呵呵
      

  17.   

    http://expert.csdn.net/Expert/topic/569/569053.xml?temp=.5480005
      

  18.   

    Kingron(单身走我路……)
    谢谢你的帮助~。我对我上面的话不好意思`别见怪~