2017-04-05 25 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

相关问题