2011-12-13 36 views
5

những gì tôi cần làm là một cái gì đó như thế này:Đi qua một lớp học như một tham số của một thủ tục trong Delphi XE

procedure A(type_of_form); 
var form: TForm; 
begin 
    form := type_of_form.Create(application); 
    form.showmodal; 
    freeandnil(form); 
end; 

Tôi đã làm điều này cho tất cả các hình thức tự động tạo ra:

form1 := TForm1.Create(application); 
form1.showmodal; 
freeandnil(form1); 

gì tôi sẽ làm thủ tục bên trong A phức tạp hơn, nhưng vấn đề nằm trong cách tạo ra biểu mẫu hơi chung chung. Có lẽ một cái gì đó với @ nhà điều hành ... tôi thực sự không biết.

Cảm ơn mọi đề xuất!

Trả lời

6
procedure Test(AMyFormClass: TFormClass); 
var 
form: TForm; 
begin 
    form := AMyFormClass.Create(Application); // you can use nil if you Free it in here 
    try 
    form.ShowModal; 
    finally 
    form.Release; // generally better than Free for a Form 
    end; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    Test(TForm2); 
end; 
+0

'form.Free' chỉ là tốt ở đó. Thật đáng để chỉ ra rằng điều này chỉ hoạt động nếu constructor của biểu mẫu là một sự ghi đè của hàm tạo 'TForm'. –

+0

@David, bạn có nói rằng điều này sẽ không hoạt động nếu hàm tạo được đặt tên là Tạo, với các tham số phù hợp, nếu nó ẩn trình tạo con cháu? –

+2

@Marcus Đúng vậy. Bạn cần phải sử dụng các nhà xây dựng ảo để có được instantiation thông qua tham chiếu lớp để làm việc. Nếu không, bạn kết thúc bằng 'TMyForm' mỗi lần, bất kể cái gì có trong tham chiếu lớp. –

3

gì bạn đang yêu cầu cơ bản là những gì TApplication.CreateForm() không, ví dụ:

Application.CreateForm(TForm1, form1); 
form1.ShowModal; 
FreeAndNil(form1); 

Bạn có thể bắt chước mà không gọi TAppliction.CreateForm() như thế này:

procedure A(AClassType: TFormClass); 
var 
    form: TForm; 
begin 
    form := AClassType.Create(Application); 
    try 
    form.ShowModal; 
    finally 
    FreeAndNil(form); 
    end; 
end; 

... 

begin 
    A(TForm1); 
end; 
+0

Có ... mã này tương tự với mã khác (và tương tự như phương thức CreateForm) ... jeje ... tôi chưa từng thực sự như vậy! – Speaker

+0

Chỉ là một câu hỏi khác ... đó là cách tốt nhất để giải phóng các biểu mẫu? Form.release? hoặc FreeAndNil (Mẫu) tôi đã từng sử dụng FreeAndNil ... nhưng ... – Speaker

+2

'TForm.Release() 'có nghĩa là chỉ được sử dụng khi biểu mẫu cần để giải phóng bản thân từ bên trong của một trong những sự kiện của nó xử lý. Việc miễn phí bị trì hoãn cho đến khi kiểm soát trở lại vòng lặp thông báo chính để đảm bảo rằng TForm không được sử dụng bởi bất kỳ thứ gì. Nếu bạn biết rằng TForm không được sử dụng nữa (đó là trường hợp trong tình huống này), thì bạn có thể gọi ngay lập tức là 'Free()'. 'FreeAndNil()' là quá mức cho việc sử dụng đơn giản như vậy của một biến cục bộ như ví dụ này. Không cần phải nil một con trỏ sẽ không được sử dụng nữa. –

Các vấn đề liên quan