User interface 为什么在没有错误或警告的情况下不显示窗口
我正在尝试以下GUI代码来显示两个相同的窗口。我使用的是show而不是showmodal:User interface 为什么在没有错误或警告的情况下不显示窗口,user-interface,delphi,lazarus,freepascal,User Interface,Delphi,Lazarus,Freepascal,我正在尝试以下GUI代码来显示两个相同的窗口。我使用的是show而不是showmodal: program RnTFormclass; {$mode delphi} uses //cthreads, // for linux only. Interfaces, Forms, StdCtrls; type RnTForm = class(TForm) private wnd: TForm; btn: TButton; pub
program RnTFormclass;
{$mode delphi}
uses
//cthreads, // for linux only.
Interfaces, Forms, StdCtrls;
type
RnTForm = class(TForm)
private
wnd: TForm;
btn: TButton;
public
constructor create;
procedure showit;
end;
constructor RnTForm.create;
begin
//Application.Initialize; //removed.
wnd := TForm.Create(Application);
with wnd do begin
Height := 300;
Width := 400;
Position:= poDesktopCenter;
Caption := 'LAZARUS WND';
end;
btn := TButton.Create(wnd);
with btn do begin
SetBounds(0, 0, 100, 50);
Caption := 'Click Me';
Parent := wnd;
end;
end;
procedure RnTForm.showit;
begin
wnd.Show;
end;
var
myform1, myform2: RnTForm;
begin
// create windows:
myform1 := RnTForm.Create;
myform2 := RnTForm.Create;
// show windows:
myform1.showit;
myform2.showit;
end.
我想要两个相同的窗口显示/打开。虽然程序运行时没有任何错误或警告,但甚至没有显示一个窗口。
程序刚刚终止
问题在哪里?如何解决?谢谢你的帮助
编辑:正如注释中所指出的,Application.initialize被调用两次而没有运行。我已经注释掉了Application.initialize,代码仍然没有打开任何窗口。(如果将showmodel
替换为showmodel
,则会逐个打开窗口)
主要问题是如何在
显示后保持窗口打开?根据评论中的建议,我通过以下主要方法使其工作:
begin
Application.Initialize;
// create windows:
myform1 := RnTForm.Create;
myform2 := RnTForm.Create;
// show windows:
myform1.showit;
myform2.showit;
Application.run;
end.
现在两个窗口都出现了,我可以单击并使用其中任何一个
但是,关闭两个窗口后,程序仍在后台运行。需要添加带有单击功能的退出按钮 我不知道Linux和Lazarus,但从Windows/Delphi的角度来看,您的程序似乎缺少消息循环。另外,我认为在表单构造函数中调用应用程序。初始化是错误的。我怀疑您需要调用应用程序。很早就初始化(并且每次创建RnTForm
!)一次,而不是一次),然后执行类似于应用程序的操作。运行以启动消息循环。进一步:您似乎没有在RnTForm
构造函数中运行继承的TForm
构造函数。[同样,这些评论是从Win32/Delphi的角度来看的。]这是实现GUI的一种非常奇怪的方式。您确定在构造函数中调用applicationin.Initialize是正确的吗?毕竟,这种方式会被调用两次!为什么要创建其他TForm实例并显示这些实例,而不是简单地使用创建的RnTForm实例?此外,没有对Application.Run的调用,因此可以创建表单,甚至可以在逻辑上显示表单,但程序会立即终止,因此在绘制表单之前,表单就会消失。从Lazarus附带的gui模板开始。在没有消息循环的情况下分析这段中断的代码并没有多大意义。@rno:当然不起作用;它没有消息循环。由于我不了解Linux/Lazarus,我无法帮助您了解详细信息,但我认为David的建议很好:Lazarus当然可以为您创建一个空的GUI应用程序,这样您就可以获得正确的基本结构。现在,至少您得到了一个消息循环。但这几乎肯定不是正确的做法,而且可能会引发许多问题。您已经发现了其中的一个,但我怀疑还有更多问题(如果没有,下一个Lazarus RTL版本、下一个Windows版本、添加到表单中的下一个按钮等可能会有其他问题)。我真的相信正确的做法是改变标准方法。我们不想编写“大部分工作(在有利条件下)”的软件。我们需要一个健壮的软件,它能正确地工作,如果我不得不使用一个应用程序,而这个应用程序不能通过使用标题栏关闭按钮、系统菜单、Alt+F4等关闭可见窗口来关闭,我会有点恼火。再次,非常抱歉,我不了解Linux/Lazarus,因此无法向您提供正确方法的详细信息/为什么这个过程会结束?通常,当主窗体关闭时,进程关闭。你没有主窗体。如果您希望在两个表单都关闭时关闭流程,请实现代码来完成此操作。