2017-06-20 51 views
1

这里是第一次业余程序员。希望得到一些帮助。使用Delphi XE7。在启动时从mainform自动加载第二个窗体时出错

我有一个Mainform,它有一个可以调出第二个窗体的按钮。在最初的启动时,我想单击出现第二个窗体的按钮,以便两个窗体都可见。然后我将它保存到一个配置文件中,以便它不会在每个负载上执行。

当进行内部追踪时,我看到Form2为零,并且出现访问冲突错误。我认为问题在于MainForm尚未完全加载以提升Form2。或者Form2尚未创建,因此无法提出。

我试图添加延迟等待MainForm加载。我试过了一个计时器。我试图寻找其他答案,但仍然没有找到帮助。我希望这里有人能带领我走向正确的方向。

+3

显示[最小,完整和可验证示例](https://stackoverflow.com/help/mcve) – William

回答

1

如果MainForm仍处于创建过程中,则说明您尚未创建Form2。您必须等到Form2才能显示出来。

做到这一点的最简单的方法是简单地将Form2.Visible属性设置为True在设计时(继发形式的默认设置为Visible=False),并确保Form2被设置为在项目选项自动创建(辅助表格不是默认自动创建的)。让Form2在启动时自动显示。

但是,如果你的按钮需要做的事情来设置Form2,那么你必须延迟按钮点击,直到Form2创建后。我喜欢用延迟窗口消息为目的,例如:

const 
    WM_DELAYED_STARTUP = WM_APP + 1; 

type 
    TMainForm = class(TForm) 
    Button1: TButton; 
    procedure FormCreate(Sender: TObject); 
    procedure ButtonClick(Sender: TObject); 
    private 
    procedure WMDelayedStartup(var Message: TMessage); message WM_DELAYED_STARTUP; 
    end; 

procedure TMainForm.FormCreate(Sender: TObject); 
begin 
    PostMessage(Handle, WM_DELAYED_STARTUP, 0, 0); 
end; 

procedure TMainForm.ButtonClick(Sender: TObject); 
begin 
    //... 
    Form2.Show; 
    //... 
end; 

procedure TMainForm.WMDelayedStartup(var Message: TMessage); 
begin 
    Button1.Click; 
end; 

一个计时器也将正常工作:

type 
    TMainForm = class(TForm) 
    Button1: TButton; 
    StartupTimer: TTimer; 
    procedure FormCreate(Sender: TObject); 
    procedure ButtonClick(Sender: TObject); 
    procedure StartupTimerTimer(Sender: TObject); 
    end; 

procedure TMainForm.FormCreate(Sender: TObject); 
begin 
    StartupTimer.Enabled := True; 
end; 

procedure TMainForm.ButtonClick(Sender: TObject); 
begin 
    //... 
    Form2.Show; 
    //... 
end; 

procedure TMainForm.StartupTimerTimer(Sender: TObject); 
begin 
    StartupTimer.Enabled := False; 
    Button1.Click; 
end; 

或者,你可以使用的MainForm的OnShow事件(如果您展示的MainForm只有一次,不应用程序的生命周期中隐藏):

type 
    TMainForm = class(TForm) 
    Button1: TButton; 
    procedure FormShow(Sender: TObject); 
    procedure ButtonClick(Sender: TObject); 
    end; 

procedure TMainForm.FormShow(Sender: TObject); 
begin 
    Button1.Click; 
end; 

procedure TMainForm.ButtonClick(Sender: TObject); 
begin 
    //... 
    Form2.Show; 
    //... 
end; 
0

我想推荐的是有你的后项目开盘,执行SHIFT + CTRL + F11快捷方式并选择窗体选项如下 [1]。在此之后,在自动创建表单中选择您的Form2,将其移动到可用表单并单击按钮确定。 在此之后,改变的代码调用窗体2到行:

Application.CreateForm(TForm2, Form2); Form2.ShowModal; FreeAndNil(Form2)

让我知道如果这能解决你的问题。

干杯,

相关问题