2017-04-05 54 views
0

我想編一個小型廣告表單,讓我可以輕鬆地將其實施到我的其他任何項目中。 廣告表單應顯示在我的真實項目/應用程序啓動之前。在Mainform之前添加表單

有些要求必須得到滿足:

  1. 易於實施任何項目,沒有任何麻煩 - 添加表單/單位和幾乎所有負責剩下的照顧。
  2. 我的應用程序的MainForm的(Application.MainForm)應在運行時後,我的廣告形式來創建已成功關閉(或要求已得到滿足)
  3. 只增加1個單位/形式應該是落實不夠

我迄今取得的進展是:

  1. 我創造出隱藏在空的主窗體(Application.MainForm)
  2. 然後,我創建一個MODALFORM,這是實際的廣告表格 - 右側modalresult,免費我的我們lcomescreen並進入「主應用程序」
  3. 我需要從我的項目中刪除所有自動創建表單
  4. 我打開一些參數我的項目的源文件中的程序,包括應用程序的主窗口(源)
  5. 不幸的是我要補充各單位/表格的項目,而不只是一個

這是我到目前爲止(遞歸路徑問題?):

項目來源:

program MyTestProgram; 

uses 
    Vcl.Forms, 
    Windows, 
    uMainWindow in 'uMainWindow.pas' {Form1}, 
    uEmptyForm in '..\AdProject\uEmptyForm.pas' {AdEmptyMainForm}, 
    uWelcomeScreen in '..\AdProject\uWelcomeScreen.pas' {WelcomeScreen}; // shouldn't be here 

{$R *.res} 

begin 
    Application.Initialize; 
    Application.MainFormOnTaskbar := True; 
    Application.Run; 
    LoadAdWindow('Title of my app', uMainWindow.TForm1, uMainWindow.Form1); 
end. 

EmptyForm單位:

unit uEmptyForm; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs; 

type 
    TAdEmptyMainForm = class(TForm) 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    AdEmptyMainForm: TAdEmptyMainForm; 

    procedure LoadAdWindow (Appname: string; InstanceClass: TComponentClass; var Reference); 

implementation 

{$R *.dfm} 

    uses 
    uWelcomeScreen; // Has to be added to the project, otherwise it doesn't detect the unit in the same path as this unit 

    procedure LoadAdWindow (Appname: string; InstanceClass: TComponentClass; var Reference); 
    begin 
    Application.MainFormOnTaskbar := True; 
    Application.ShowMainForm  := False; 
    Application.Title    := Appname; 
    Application.CreateForm(TAdEmptyMainForm, AdEmptyMainForm); 
    with uWelcomeScreen.TWelcomeScreen.Create(Application.MainForm) do 
    begin 
     Caption := Appname; 
     if ShowModal <> 1337 then ExitProcess(0); 
     Free; 
    end; 
    Application.CreateForm(InstanceClass, Reference); 
    end; 

end. 

歡迎屏幕成功後,應用程序關閉。 這是否正確嗎? 任何幫助表示讚賞!

+1

您可以在創建主窗體時調用該廣告窗體。 – William

+0

@William爲什麼我之前沒有想到這個? * facepalm *編輯:附加單位呢?我想保持表格/單元分開,但我需要將所有表格添加到我的項目中,而不是僅爲1 –

+1

爲什麼?您可以在其他項目上添加廣告表單並執行相同的邏輯 – William

回答

3

Application.MainForm是通過Application.CreateForm()TForm派生類的第一次調用而建立的。 Application.Run()如果未分配Application.MainForm,則立即退出。

要做你正在嘗試的,你應該做更像下面的代替。您不需要空白的MainForm,只需在創建真正的MainForm之前創建並顯示廣告窗口即可。只有主源需要的項目進行更改:

program MyTestProgram; 

uses 
    Vcl.Forms, 
    Windows, 
    uMainWindow in 'uMainWindow.pas' {Form1}, 
    uWelcomeScreen in '..\AdProject\uWelcomeScreen.pas' {WelcomeScreen}; 

{$R *.res} 

begin 
    Application.Initialize; 
    Application.MainFormOnTaskbar := True; 
    Application.Title := 'Title of my app'; 

    with TWelcomeScreen.Create(Application) do 
    try 
    Caption := Application.Title; 
    if ShowModal <> 1337 then 
     Exit; 
    finally 
    Free; 
    end; 

    Application.CreateForm(TForm1, Form1); 
    Application.Run; 
end. 
+0

我想在我的歡迎屏幕單元中添加其他表單。附加表單與歡迎屏幕的路徑也相同。我如何在uses子句中聲明這一點,而不向每個主項目中添加每個額外的表單? –

+2

項目使用的任何表單必須添加到項目中。除非你將它們移動到運行時包,然後用它來代替。 –

+0

爲什麼要用魔法數字而不是'mrOk'或'idOK'? – willys

4

您可以輕鬆創建和顯示廣告的形式和後創建和顯示的主要形式,是這樣的:

var 
FAdFrm : TAdFrm; 

begin 
FAdFrm := TAdFrm.Create(nil); 
if FAdFrm.ShowModal = mrOK then 
    begin 
    FAdFrm.Free; 

    Application.Initialize; 
    Application.MainFormOnTaskbar := True; 
    Application.CreateForm(TMainFrm, MainFrm); 

    Application.Run; 
    end 
else 
    FAdFrm.Free; 

要小心,你的項目的主要形式是與Application.CreateForm創建的第一種形式方法

1

另一種方法是創建MainForm中的創建活動的廣告形式。我在我自己的項目上這樣做。

procedure TMainForm.FormCreate(Sender: TObject); 
begin 
    AdvForm := TAdvForm.Create(Self); 
    Try 
    AdvForm.ShowModal; 
    finally 
    AdvForm.Free; 
    end; 
end; 
+2

這仍然創建MainForm。從這個問題可以清楚的看出,如果廣告窗口沒有返回預期值,應用程序應該終止。理想情況下,如果不使用MainForm,則根本不應該創建MainForm。但是,要從MainForm的OnCreate事件終止應用程序,可以調用Application.Terminate()並設置Application.ShowMainForm = False,這樣MainForm在處理終止請求之前不會短暫出現。 –

+1

@RemyLebeau我明白了,這不是最好的辦法,它只是一種替代方案,我贊同你的評論。 – William

相關問題