2011-01-23 2 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. Если вы не намерены переустанавливать эту форму после ее создания, вы можете также уйти с параметром Owner и предоставить родительской форме форму.
+0

было бы интересно, если бы тихий downvoter мог объяснить, что не так с приведенным выше ответом –

+0

heffernan: 1 - «a.setfocus» не имеет значения. Спасибо :) – User

+0

@ Hamidm добро пожаловать –

1

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

Это не делает то, что, по-видимому, требовало OP, которое должно было передать ссылку на класс. Он также не занимается воспитанием детей. –

Смежные вопросы