主窗口与子窗口的问题

时间:2021-08-31 23:50:17
刚学delphi不久,正在用Delphi+sql   server数据库做个程序,其中 form1 登陆窗口
           form2 主窗口

目标:想让主窗口先启动,再启动登陆窗口,停留在主窗口上面,使得此时主窗口看得见但是不能点击。
     然后登陆以后,主窗口的菜单栏里面点出来的都是子窗口。(主窗口和登录窗口均连接数据库)

现在遇到问题:之前网上也搜过类似的问题,现在已经将主窗口的formstyle设为了fsMDIform,登陆窗口的formstyle设为了fsNormal,project那里也将自动生成的form改为只有主窗口了。原来还能出现登陆窗口,然后登陆后不能点击菜单栏去调用子窗口;现在不知在哪里改动过,连登陆窗口都不显示了。。。。

在线等,急......

17 个解决方案

#1


把代码贴出来看看!

先显示FORM2再把FORM1.showmodal;

#2


form2.onshow那里建form1,然后form1.showmodal

#3


要那部分代码?

#4


form2.onshow和form2.create有什么区别?网上一些解决方法好像集中在这两个上。

如何在form2.onshow上建form1,然后在哪里form1.showmodal?

#5


上面说错了,是form2.onshow和form2.active有什么区别,网上的一些解决办法集中在这两个上

#6


procedure TForm2.FormShow(Sender: TObject);
begin
  Form1:= TForm1.Create(self);
  Form1.ShowModal;
  Form1.Free;
  ...   
end

#7


主窗体form1
procedure TForm1.FormShow(Sender: TObject);
begin
  Form2:= TForm2.Create(self);
  Form2.ShowModal;
  Form2.Free;
end;


登陆窗体登陆按钮
procedure TForm2.Button1Click(Sender: TObject);
begin
  if  通过 then 
  begin
   form2.Close;
   form1.Show;
  end
  else
    showmessage('验证没有通过');
    form2.SetFocus;   
end;

#8


引用 6 楼 dinoalex 的回复:
procedure TForm2.FormShow(Sender: TObject); 
begin 
  Form1:= TForm1.Create(self); 
  Form1.ShowModal; 
  Form1.Free; 
  ...  
end


我这样拿进去编译了,报错说cannot make a visble window modal

#9


不要沉啊,大家帮忙

#10


[code=Delphi(Pascal)]

procedure TForm2.FormActivate(Sender: TObject);
begin
with tForm1.Create(self) do
 begin
  ShowModal;
  free;
 end;
end;
code]

#11




procedure TForm1.FormActivate(Sender: TObject);
begin
with tForm2.Create(self) do
 begin
  ShowModal;
  free;
 end;;
end;

#12


试过了,没问题,如果你还有问题,把那部分代码贴出来!

#13


procedure TForm2.FormShow(Sender: TObject);
begin
    Form1:=TForm1.Create(self);
  try
   if Form1.showmodal <> mrok then
      close; 
   finally
     Form1.free;
  end;
end;

我的代码是这样的
现在可以先跳出form1登陆框了,但是我用户名密码验证完后跳不出form2,这是怎么回事情?

#14


引用 2 楼 dinoalex 的回复:
form2.onshow那里建form1,然后form1.showmodal

#15


目标:想让主窗口先启动,再启动登陆窗口,停留在主窗口上面,使得此时主窗口看得见但是不能点击。 
    然后登陆以后,主窗口的菜单栏里面点出来的都是子窗口。(主窗口和登录窗口均连接数据库) 
你在form1.onActivate 这个事件下面写:

procedure TForm1.FormActivate(Sender: TObject);
begin
  if not Assigned(Form2) then
  Form2 :=TForm2.Create(Self);
 form2.ShowModal;
 FreeAndNil(Form2);
end;

是应该可以实现了的。

现在遇到问题:之前网上也搜过类似的问题,现在已经将主窗口的formstyle设为了fsMDIform,登陆窗口的formstyle设为了fsNormal,project那里也将自动生成的form改为只有主窗口了。 原来还能出现登陆窗口,然后登陆后不能点击菜单栏去调用子窗口;现在不知在哪里改动过,连登陆窗口都不显示了。。。。 
说明你的错误不是这里的show的问题,应该是别处有错了。

#16


引用 7 楼 de410 的回复:
主窗体form1 
procedure TForm1.FormShow(Sender: TObject); 
begin 
  Form2:= TForm2.Create(self); 
  Form2.ShowModal; 
  Form2.Free; 
end; 


登陆窗体登陆按钮 
procedure TForm2.Button1Click(Sender: TObject); 
begin 
  if  通过 then 
  begin 
  form2.Close; 
  form1.Show; 
  end 
  else 
    showmessage('验证没有通过'); 
    form2.SetFocus;  
end; 


试下这个

#17


引用 11 楼 n29882942 的回复:
Delphi(Pascal) code

procedure TForm1.FormActivate(Sender: TObject);
begin
with tForm2.Create(self) do
 begin
  ShowModal;
  free;
 end;;
end;
正解

#1


把代码贴出来看看!

先显示FORM2再把FORM1.showmodal;

#2


form2.onshow那里建form1,然后form1.showmodal

#3


要那部分代码?

#4


form2.onshow和form2.create有什么区别?网上一些解决方法好像集中在这两个上。

如何在form2.onshow上建form1,然后在哪里form1.showmodal?

#5


上面说错了,是form2.onshow和form2.active有什么区别,网上的一些解决办法集中在这两个上

#6


procedure TForm2.FormShow(Sender: TObject);
begin
  Form1:= TForm1.Create(self);
  Form1.ShowModal;
  Form1.Free;
  ...   
end

#7


主窗体form1
procedure TForm1.FormShow(Sender: TObject);
begin
  Form2:= TForm2.Create(self);
  Form2.ShowModal;
  Form2.Free;
end;


登陆窗体登陆按钮
procedure TForm2.Button1Click(Sender: TObject);
begin
  if  通过 then 
  begin
   form2.Close;
   form1.Show;
  end
  else
    showmessage('验证没有通过');
    form2.SetFocus;   
end;

#8


引用 6 楼 dinoalex 的回复:
procedure TForm2.FormShow(Sender: TObject); 
begin 
  Form1:= TForm1.Create(self); 
  Form1.ShowModal; 
  Form1.Free; 
  ...  
end


我这样拿进去编译了,报错说cannot make a visble window modal

#9


不要沉啊,大家帮忙

#10


[code=Delphi(Pascal)]

procedure TForm2.FormActivate(Sender: TObject);
begin
with tForm1.Create(self) do
 begin
  ShowModal;
  free;
 end;
end;
code]

#11




procedure TForm1.FormActivate(Sender: TObject);
begin
with tForm2.Create(self) do
 begin
  ShowModal;
  free;
 end;;
end;

#12


试过了,没问题,如果你还有问题,把那部分代码贴出来!

#13


procedure TForm2.FormShow(Sender: TObject);
begin
    Form1:=TForm1.Create(self);
  try
   if Form1.showmodal <> mrok then
      close; 
   finally
     Form1.free;
  end;
end;

我的代码是这样的
现在可以先跳出form1登陆框了,但是我用户名密码验证完后跳不出form2,这是怎么回事情?

#14


引用 2 楼 dinoalex 的回复:
form2.onshow那里建form1,然后form1.showmodal

#15


目标:想让主窗口先启动,再启动登陆窗口,停留在主窗口上面,使得此时主窗口看得见但是不能点击。 
    然后登陆以后,主窗口的菜单栏里面点出来的都是子窗口。(主窗口和登录窗口均连接数据库) 
你在form1.onActivate 这个事件下面写:

procedure TForm1.FormActivate(Sender: TObject);
begin
  if not Assigned(Form2) then
  Form2 :=TForm2.Create(Self);
 form2.ShowModal;
 FreeAndNil(Form2);
end;

是应该可以实现了的。

现在遇到问题:之前网上也搜过类似的问题,现在已经将主窗口的formstyle设为了fsMDIform,登陆窗口的formstyle设为了fsNormal,project那里也将自动生成的form改为只有主窗口了。 原来还能出现登陆窗口,然后登陆后不能点击菜单栏去调用子窗口;现在不知在哪里改动过,连登陆窗口都不显示了。。。。 
说明你的错误不是这里的show的问题,应该是别处有错了。

#16


引用 7 楼 de410 的回复:
主窗体form1 
procedure TForm1.FormShow(Sender: TObject); 
begin 
  Form2:= TForm2.Create(self); 
  Form2.ShowModal; 
  Form2.Free; 
end; 


登陆窗体登陆按钮 
procedure TForm2.Button1Click(Sender: TObject); 
begin 
  if  通过 then 
  begin 
  form2.Close; 
  form1.Show; 
  end 
  else 
    showmessage('验证没有通过'); 
    form2.SetFocus;  
end; 


试下这个

#17


引用 11 楼 n29882942 的回复:
Delphi(Pascal) code

procedure TForm1.FormActivate(Sender: TObject);
begin
with tForm2.Create(self) do
 begin
  ShowModal;
  free;
 end;;
end;
正解