代码如下:
unit1
procedure TForm1.Button1Click(Sender: TObject);
begin
  application.CreateForm(tform2,form2);
  form2.Visible:=true;
  form2.Visible:=false;
  form2.tag:=1;
  form2.showmodal;
end;unit2
procedure TForm2.FormShow(Sender: TObject);
begin
  case tag of
  0:showmessage('0');
  1:showmessage('1');
  end;
end;怪就怪在在form2启动时,case语句中的两项都执行了!!!
问题一:何解会出现上面的问题.另注:
   如把TForm1.Button1Click中的form2.Visible:=true一句去掉的话,就不会出现这种情况.   为何本人要加上这一句呢?这是模拟的.只因在实际程序中不知道为何,在form1调用form2时会出现异常"cannot make a visible window modal",只有加一句form2.visible:=false才没有出现异常的情况,但可笑(苦笑)的是却出现了case语句中的情况.我也曾试过把case改成if但也是同样的情况.请碰到过的朋友指点一二行吗??在此先谢过!

解决方案 »

  1.   

    Ctrl + Shift + F11
    把窗体移到右边----------------------------------------
    :-)
      

  2.   

    默认为Tag = 0 
    另:楼主可以检测一下Show事件;
    如果你将Form放在自动创建的话,那么你只要用Form,则就会Show----------------------------------------
    :-)
      

  3.   

    楼主是不是没有把form2的自动的创建的属性去掉啊
      

  4.   

    application.CreateForm(tform2,form2);
      form2.Visible:=true;  //<<<<<<<<这时候就触发了OnShow;
      form2.Visible:=false;
      form2.tag:=1;
      form2.showmodal;///////try
      application.CreateForm(tform2,form2);
      form2.tag:=1;
      form2.showmodal;
      

  5.   

    我知道了!那是因为你把form2设为真的时候,触发了FORM2的SHOW事件,然后form2.showmodal;这句,又触发了FORM2的SHOW事件,所以会SHOWMESSAGE两次!
      

  6.   

    表单创建之后你直接Show 或ShowModal就可以了,为什么还要form2.Visible:=true;?
    form2.Visible:=true;
    这一句要调用一次TForm2.FormShow,此时TAG未赋值,对象初始化时为0,所以,显示0
    form2.showmodal;
    这一句又要调用TForm2.FormShow一次,此时TAG赋值1,显示1
      

  7.   

    如果 form2 不需要返回值,可以 form2.show;
      

  8.   

    改成这样就可以了:
    unit1
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      application.CreateForm(tform2,form2);
      form2.tag:=1;
      form2.showtest(Sender);
    end;unit2
    procedure TForm2.ShowTest(Sender: TObject);//自己定义的过程
    begin
      case tag of
      0:showmessage('0');
      1:showmessage('1');
      end;
    end;我觉得原因是:application.createform(tform2,form2);
    这句代码会去读取form2窗体的所有属性,事件,其中就有form2.onshow,但是form2.onshow中又会用到tag属性,这样就会产生问题了!所以用自己写的一个过程代替onshow事件就可以了。
    不知道这样分析对不对?
      

  9.   

    楼上这样有误人子弟的嫌疑,什么'form2.onshow中又会用到tag属性',跟application.createform(tform2,form2)这句有有什么关系,自己在下面的代码里设个端点,一跟踪就知道怎么回事,明显的是这样的:
    form2.Visible:=true;触发TForm2.FormShow此时TAG未赋值,对象初始化时TAG为0,所以,显示0
    form2.showmodal;触发TForm2.FormShow一次,此时TAG赋值1,显示1
      

  10.   

    unit1
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      application.CreateForm(tform2,form2);
      form2.tag:=1;
      form2.showtest(Sender);
    end;unit2
    procedure TForm2.ShowTest(Sender: TObject);//自己定义的过程
    begin
      case tag of
      0:showmessage('0');
      1:showmessage('1');
      end;
    end;
      

  11.   

    : wdsimon() (说得有道理
      

  12.   

    to : wdsimon
      老兄,话不是这样讲的吧?怎么说我也是抱着学习交流的态度的,虽然你很强,也不用这样讲话吧?再说,我的代码是正确的阿,问题解决了不是吗?to : bingjiling(sstreet.net 为你提供项目交)
      能不能copy后修改那怕一个字母再发贴子啊?老哥?这次真是长了见识了,CSDN上原来也是什么人都有啊,不服不行!
      

  13.   

    以下2句本就多此一举:  form2.Visible:=true;
      form2.Visible:=false;
      

  14.   

    复 ihihonline(小小) and angle097113(深思不解):form2并没有自动创建,且在另一窗口调用时没有这样的现象(当然这一窗体没有对form2.tag赋值)复zswangII(伴水清清)(职业清洁工) and  wdsimon() :对是这样,但问题是不知何解application.CreateForm(tform2,form2);
      form2.tag:=1;
      form2.showmodal;
    这样调用时出现"cannot make a visible window modal"的异常.对lwtdd(网上邻居)说:是啊信誉是差,但这是有原因的.但也没必要对你说了是吧,因为你并非抱着帮助别人的心态来的.wdsimon():过程是很明显的了,如你所分析的. 我现在的情况感觉就是不知何解,form2.visible的属性不知为何变为true了.futureyre(一叶知秋):对于你的建议,我等下再试试,好吧感谢大家,但主要的问题还未解决到啊,还有些更好的建议吗????
      

  15.   

    呵呵,中午回去睡午觉的时候就觉得话说得不对,
     futureyre(一叶知秋)老弟:给你道歉了
    其实这个TAG=0与application.createform(tform2,form2)是有些关系的,我们知道对象建立的时候,对象的成员(字段)如果在CREATE里没有进行初始化设置的话,会在TObject的InitInstance时被初始化:FillChar(Instance^, InstanceSize, 0);因为这个TAG属性对应的FTag是Integer类型,所以为被初试化为0
      

  16.   

    如果是这样:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      application.CreateForm(tform2,form2);
      form2.Visible:=true;
      //form2.Visible:=false;
      form2.tag:=1;
      form2.showmodal;
    end;
    那么错误"cannot make a visible window modal"是必然的,
    如果是这样:
    begin
      application.CreateForm(tform2,form2);
      //form2.Visible:=true;
      //form2.Visible:=false;
      form2.tag:=1;
      form2.showmodal;
    end;
    就不会出错,如果还有错误,你在看一下是否在程序的其他地方已经让form2显示了
      

  17.   

    我倒有个想法,就是加多一个选择
    case tag of
    0:showmessage(0);
    1:showmessage(1);
    2:
    end;
     然后把tag在设计时设为2,这样就算在运行时 执行了2:也只不过是执行了空的代码,这样行得通吗?方法是不是太那个了...惨
      

  18.   

    to wdsimon() :去掉了还是会出错,但我查来查去,form2此前并没有被调用过(因为一共只有两个窗体会调用到form2).
    或许我再查查吧
      

  19.   

    最后,用了上面自已所说的笨方法,代码什么都不用改了,只是把tag的初始属性改为2
    就可以了.但为何直接用showmodal为出现异常,还是不太明白,想来不知道会不会和以前曾用过form2这个窗体,后来把它在工程文件中删除后,又重新建立有关...