2011-01-23 5 views
1

私は、この手順を持っている:フォームの作成手順をどのようにすることができますか?

procedure TForm1.Button1Click(Sender: TObject); 
var 
    a:TForm2; 
begin 
    a := TForm2.Create(Self); 
    a.Parent := ScrollBox1; 
    a.Align := alClient; 
    a.Show; 
    a.SetFocus; 
end; 

を、私は、このコードに上記の変更、しかし、私はエラーを受け取り、なぜ? このコードを変更する必要がありますか?

procedure TForm1.MakeAform(aForm:Tform;Cmp:TComponent;Parent1:TWinControl;Align1:TAlign); 
var 
    a:aForm; // Error Here 
begin 
    a := aForm.Create(Cmp); 
    a.Parent := Parent1; 
    a.Align := Align1; 
    a.Show; 
    a.SetFocus; 
end; 

procedure TForm1.Button2Click(Sender: TObject); 
begin 
    MakeAform(Tform2,Self,Panel1,alClient); 
end; 
+0

なぜMakeAFormプロシージャが必要なのですか?なぜTForm1クラスの一部ですか? – johnny

+1

エラーメッセージを**推測**したいですか?私の推測:**宣言されていない識別子:aForm ** –

+0

または、エラーメッセージが "識別子の再宣言"ですか? –

答えて

5

元のコードでは、クラス(TForm2)がインスタンス(aForm)を受け取るプロシージャに渡されます。実際にこのインスタンスは初期化されていませんが、実際にはここの問題ではありません。

あなたがする必要があることは、MakeAformでインスタンスではなくクラスを受け取ることです。

あなたのコードは次のようになります。

//note, in Forms.pas the type TFormClass is defined as: 
// TFormClass = class of TForm; 
// 
//A variable of TFormClass holds a class (rather than an instance) 
//and that class must be derived from TForm. 

procedure TForm1.MakeAform(
    FormClass: TFormClass; 
    Owner: TComponent; 
    Parent: TWinControl; 
    Align: TAlign 
); 
var 
    a: TForm; 
begin 
    a := FormClass.Create(Owner); 
    a.Parent := Parent; 
    a.Align := Align; 
    a.Show; 
    a.SetFocus; 
end; 

カップルより多くのポイント:

  1. a.SetFocusの目的は何ですか?私はフォームが焦点を当てることができることを知らなかった。
  2. このフォームを作成した後にこのフォームを再作成するつもりがない場合は、所有者パラメータを削除して親フォームに所有させることもできます。
+0

サイレントダウンボッターが上記の答えに間違っていることを説明できるのは面白いでしょう –

+0

heffernan:1 - "a.setfocus"は重要ではありません。ありがとうございました:) – User

+0

@ハミドあなたは歓迎です –

1

これを行うより良い方法は、Form2でクラスプロシージャを宣言し、Form1でそのprpocedureを呼び出すことです。 Ej

TForm2 
    ... 
    public 
     class procedure ShowForm; 
    end; 

class procedure TForm2.ShowForm; 
begin 
    with TForm2.Create(Application) do begin 
    ShowModal; 
    Free; 
    end; 
end; 

そして、Form1.ButtonClick(...)にあります。

TForm2.ShowForm; 
+0

それは、OPが明らかに望んでいた、クラス参照を渡すことでした何をしません。それはまた、子育てをしません。 –

関連する問題