2017-06-20 53 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)

讓我知道如果這能解決你的問題。

乾杯,

相關問題