User interface 为什么在没有错误或警告的情况下不显示窗口

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

我正在尝试以下GUI代码来显示两个相同的窗口。我使用的是show而不是showmodal:

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,因此无法向您提供正确方法的详细信息/为什么这个过程会结束?通常,当主窗体关闭时,进程关闭。你没有主窗体。如果您希望在两个表单都关闭时关闭流程,请实现代码来完成此操作。