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;
4

2 に答える 2

5

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

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. このフォームを構築した後に再親化するつもりがない場合は、Owner パラメータを廃止して、親にフォームを所有させることもできます。
于 2011-01-23T10:11:41.187 に答える
1

これを行うより良い方法は、Form2 でクラス プロシージャを宣言し、Form1 でそのプロシージャを呼び出すことです。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;
于 2011-01-23T17:44:37.170 に答える