2011-01-07 13 views
2

私のプロジェクトには2つのフォーム(form1、form2)があり、form1は設定フォームです。設定フォームをメインフォームの前に表示するにはどうすればよいですか?

Form1を表示し、Button1をクリックしてForm2を表示し、Form1を解放(リリース)します。どうすればこのことができますか?

私はこのコードを使用します。このプロジェクトは開始して自動的に終了します。Friendは、メインメッセージが存在しないため、アプリケーションメッセージループが開始されず、アプリケーションが終了するため、どのように私はこの問題を解決することができますか? ///

program Project1; 
uses 
    Forms, 
    Unit1 in 'Unit1.pas' {Form1}, 
    Unit2 in 'Unit2.pas' {Form2}; 
{$R *.res} 
begin 
    Application.Initialize; 
    Application.MainFormOnTaskbar := True; 
    Form1:= TForm1.Create(Application); 
    Application.Run; 
end. 
+0

は、私はあなたがここに同じ質問を考える:http://stackoverflow.com/questions/4623345/how-i-can-to-destoryfree-a-form-from-memory 追加情報やコメントをお持ちの場合この質問については、あなたがそこに書き込む必要があります。 – SimaWB

+0

@SimaWB:はい、私はそのリンクで同じ質問をします。友人の中には「新しい」質問をする必要があると私は言っていました!!!そのリンクのコメントを読むことができます。 – User

+1

@SimaWBはHamidmと公平になるように、彼はRob Kennedyの指示に従うだけで、これは正確にこの問題に新しい質問を投稿することでした。私は以前と同じ質問だとは思わない。 –

答えて

0

uses Unit2; 

{$R *.dfm} 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    Application.CreateForm(TForm2, Form2); 
    Release; 
end; 

あなたが最初のForm2を作成する必要があり、これはあなたのメインフォームになります。 Form1がその仕事を終えた後で、それを隠して表示したいと思っています。このようなもの:

uses Unit2; 

{$R *.dfm} 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    Form2.Show; 
    Release; 
end; 

/// 

program Project1; 
uses 
    Forms, 
    Unit1 in 'Unit1.pas' {Form1}, 
    Unit2 in 'Unit2.pas' {Form2}; 
{$R *.res} 
begin 
    Application.Initialize; 
    Application.MainFormOnTaskbar := True; 
    Application.CreateForm(TForm2, Form2); 
    Form2.Hide; 
    Form1 := TForm1.Create(Application); 
    Form1.Show; 
    Application.Run; 
end. 

理由は、メインフォームが閉じるときにアプリが終了するということです。そして、あなたのメインフォームは、通常あなたが作成する最初のフォームです。

+0

@David:あなたのコードを使用すると、Delphi XEでエラーメッセージが表示されます。 "[DCC Error] Project1.dpr(13):E2010互換性のないタイプ: 'TComponentのクラス'および 'TApplication'"なぜ?? – User

+0

メインフォームは、最初にトラフのApplication.CreateForm()メソッドを作成するものですが、TxxxForm.Create()を使用して任意の数のノーメインフォームをいつでも作成できます。 – jachguate

+0

@Hamidm:Application.CreateForm呼び出しが不正だったためにエラーが発生しましたが、最初に何が起こっているのかを理解しようとすると修正できなければなりません。 – jachguate

7

質問タイトルで質問したことを正確に実行します。設定フォームを作成して表示し、メインフォームを作成して表示します。トリックはですどのようにを作成します。 Only use Application.CreateForm for the one form that you want to be your main form.他のすべてのフォームには通常のオブジェクト作成テクニックを使用します。

はそうのようなあなたのDPRのファイルを変更します。

var 
    ConfigForm: TConfigForm; 
begin 
    Application.Initialize; 

    ConfigForm := TConfigForm.Create(nil); 
    try 
    if ConfigForm.ShowModal <> mrOK then 
     exit; 
    finally 
    ConfigForm.Free; 
    end; 

    Application.CreateForm(TMainForm, MainForm); 
    Application.Run; 
end. 
+0

@Rob:自分のコードをDPRファイルに入れましたが、 "ConfigForm.ShowModalではない場合は"このテキストでエラーメッセージを受け取りました: "[DCC Error] Project1.dpr(11):E2076この形式のメソッドクラスメソッドにのみ許可された呼び出し "なぜ? – User

+0

'ConfigForm'は*クラス*の名前か*変数*の名前ですか?私のコードでは、変数の名前です。あなたの中で、エラーメッセージはそれがクラスの名前であることを示唆しています。あるいはユニットの名前かもしれません。 –

+0

私はあなたのコードをこれに変更しますが、私はすでにそのエラーを受けています(私のプロジェクトform1は設定フォームで、form2はメインフォームです)。ここに私の変更されたコードがあります:Application.Initialize; Form1:= TForm1.Create(nil); しない場合は (Form1.ShowModal)を入力して終了します。 最終的に Form1.Free; end; Application.CreateForm(Form2、TForm2); Application.Run; – User

0

あなたはShowMainFormを設定することによって示されなければ、Form1を禁止することができます。 IDEは、それを作成するだけのようDPRでコードを残す:

uses 
    Forms, 
    Unit2 in 'Unit2.pas' {Form2}, 
    Unit1 in 'Unit1.pas' {Form1}; 

{$R *.res} 

begin 
    Application.Initialize; 
    Application.MainFormOnTaskbar := True; 
    Application.CreateForm(TForm1, Form1); 
    Application.CreateForm(TForm2, Form2); 
    Application.Run; 
end. 

のForm2のFormCreateイベントでちょうどに偽ShowMainFormを設定し、Form2のが見えるように表示を呼び出す:

procedure TForm2.FormCreate(Sender: TObject); 
begin 
    Application.ShowMainForm := False; 
    Show; 
end; 

およびButtonClick Form2のイベントはForm1を表示し、Form2を閉じる:

procedure TForm2.Button1Click(Sender: TObject); 
begin 
    Form1.Show; 
    Close; 
end; 

これは、unit2内で必要な変更をすべて行います。

編集 その上、夜寝た後、頭に浮かんだいくつかの発言:

  1. Form2が最後の自動作成、直接Application.Run文の前、すなわち1でなければなりません。
  2. ButtonClickイベントのForm1.Showステートメントは、FormCloseイベントに移動する必要があります。したがって、ユーザーはWindowsの閉じるボタンまたは彼が一番好きなものを使ってフォームを閉じることができます。
  3. 何らかの理由でForm1を表示しない場合は、アプリケーションを閉じるためにいくつかのコードを追加する必要があります。A 停止がここに奉仕するかもしれません。
+0

-1、スプラッシュやメインフォームの前に表示されるその他のフォームには 'Application.CreateForm()'を使用しないでください。 – mghie

+0

明確にしてください:なぜこの解決策が正しくないと評価するのですか?それは質問が求めるものを正確に行います(XEでテスト済み)。さらに、DPRを手動で変更しないようにします。あなたのコメントには、この問題の「正しい」解決策が1つしかないということを意味するでしょうか? –

+0

@Uwe:私は解決策が間違っているとは思わないが、必要以上に醜く複雑である(もちろんIMHO)。言い換えれば、ロブの解決策ほど役に立たない。 3つの答えはすべて昨日0票だった。私の票は、私がこの問題の簡単な解決策を探している人にとって最も有用だと思った秩序に入れた。 – mghie

関連する問題