2017-04-05 12 views
0

私は他のどのプロジェクトにも簡単に実装できる小さな広告フォームをプログラムしたいと思います。 実際のプロジェクト/アプリが始まる前に広告フォームが表示されます。 - フォーム/ユニットを追加して、ほとんどすべてが、残りの面倒をメインフォームの前にフォームを追加

  1. 簡単に任意の手間をかけずに任意のプロジェクトに実装する:

    いくつかの要件が満たされなければなりません。

  2. 広告フォームが正常にクローズされている(または要件が満たされている)後、マイアプリのMainFormを(Application.MainForm)は実行時に作成されなければならない
  3. のみ1単位/フォームが
を実装するために十分なはずの追加

これまでの私の進捗状況は以下のとおりです。

  1. 私はその後、私は、実際の広告フォームでmodalformを作成、隠されている空のメインフォーム(Application.MainForm)
  2. を作成 - 右modalresultに、無料私たち私は私のプロジェクトからすべての自動作成フォーム
  3. 私は(ソースを参照)、アプリケーションのメインフォームを含むいくつかのパラメータ、と私のプロジェクトのソースファイルで手順を開くを削除する必要があり、「メインアプリ」
  4. にlcomescreenと進み
  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

@ウィリアムなぜ私はそれ以前に考えなかったのですか? * facepalm *編集:追加のユニットはどうですか?フォーム/単位を区切ったままにしたいのですが、私はプロジェクトにすべてのフォームを追加する必要があります。ちょうど1ではなく –

+1

なぜですか?他のプロジェクトに広告フォームを追加して同じロジックを実行することができます – William

答えて

3

Application.MainFormは、TForm生まれのクラスの場合、Application.CreateForm()への最初の呼び出しによって確立されます。 Application.MainFormが割り当てられていない場合は、すぐにApplication.Run()が終了します。

あなたがしようとしていることをするには、代わりに次のようにする必要があります。空白の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のcreateイベントで広告フォームを作成します。私は自分のプロジェクトでこれを行います。

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

それでもMainFormが作成されます。広告ウィンドウが期待値を返さない場合は、アプリを終了する必要があることは明らかです。理想的には、メインフォームが使用されない場合は、メインフォームを作成しないでください。しかし、MainFormの 'OnCreate'イベントからアプリケーションを終了するには' Application.Terminate() 'を呼び出して(' Application.ShowMainForm = False'を設定して、終了要求が処理される前にMainFormが短時間表示されないようにしてください)。 –

+1

@RemyLebeau私は、それを行うための最善の方法ではない、それは単なる代替である、私はあなたのコメントをappreaciate。 – William

関連する問題