Как я могу сделать процедуру для создания формы? - PullRequest
1 голос
/ 23 января 2011

У меня есть эта процедура:

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;

Ответы [ 2 ]

5 голосов
/ 23 января 2011

Ваш исходный код передает класс (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. Если вы не собираетесь переопределять эту форму после ее создания, то вы можете также отказаться от параметра Owner и позволить родителю владеть формой.
1 голос
/ 23 января 2011

Лучший способ сделать это - объявить процедуру класса в Form2 и затем вызвать эту prpocedure в 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;
...