2012-02-10 13 views
7

tôi tạo các biểu mẫu của tôi tại một cái gì đó chạy như thế này:động Mẫu Creation

AboutForm := TAboutForm.Create(AboutForm); 
try 
    AboutForm.ShowModal; 
finally 
    AboutForm.Free; 
end; 

Nhưng sự khác biệt là gì mặc dù trong việc sử dụng bất kỳ trong số này:

AboutForm := TAboutForm.Create(Self); 
AboutForm := TAboutForm.Create(nil); 
AboutForm := TAboutForm.Create(Application); 

Tất cả họ đều có vẻ làm việc cùng từ những gì tôi có thể nhìn thấy nhưng đó là chính xác, hoặc là họ tất cả các chính xác, mà nói chung là tốt nhất để sử dụng?

Đánh giá cao ý kiến ​​của bạn nhờ :)

+0

1. Ví dụ đầu tiên của bạn không bị rò rỉ bộ nhớ. –

+0

re: câu hỏi đã bị xóa của bạn về cách trở thành lập trình viên tốt - đọc hướng dẫn sử dụng tốt trước khi gửi câu hỏi cho công chúng - http://docwiki.embarcadero.com/VCL/en/Forms.TCustomForm.Create. Đối số nào là mối quan tâm đặc biệt đối với bạn? Có, 'AOwner' - theo liên kết - http://docwiki.embarcadero.com/VCL/en/Classes.TComponent.Owner – OnTheFly

+0

@ user539484 cảm ơn, tôi nghĩ rằng câu hỏi đã xóa khác của tôi sẽ được cho phép vì nó là một chương trình liên quan câu hỏi. –

Trả lời

8

TForm.Create mất Owner làm thông số.

Trong ví dụ đầu tiên, AboutForm là chủ sở hữu. Rõ ràng đó là một ý tưởng tồi, vì nó chưa được tạo ra.

Khi Self là thông số, trường hợp thực hiện cuộc gọi là chủ sở hữu.
Khi thông số Application là thông số, Ứng dụng là chủ sở hữu.
Khi tham số nil là thông số, AboutForm không có chủ sở hữu. Đó là tất cả tốt, nhưng trong những trường hợp đó, bạn phải nhớ tự mình giải phóng biểu mẫu.

Khi bạn vượt qua chủ sở hữu, bạn thực sự không cần phải giải phóng một cách rõ ràng. Chủ sở hữu sẽ giải phóng nó khi chủ sở hữu được giải phóng.

Đây là cách mã của bạn sẽ giống như thế:

AboutForm := TAboutForm.Create(nil); 
try 
    AboutForm.ShowModal; 
finally 
    AboutForm.Free; 
end; 
+0

Điều đó có ý nghĩa, đặc biệt là với thông tin @PresleyDias đăng. –

+1

Hãy xem xét vấn đề này mô tả hệ thống thông báo của Chủ sở hữu và thành phần và tại sao bạn không thể chỉ định chủ sở hữu cho một thành phần mà bạn định tự giải phóng: http://delphi.about.com/od/ kbcurt/ss/dynamiccreateno.htm –

+0

Cảm ơn tuyệt vời, tôi có thể thấy cách truyền thông số sai là một điều xấu! –

2

Đầu tiên một

AboutForm := TAboutForm.Create(AboutForm); 

kể TAboutForm, rằng đó là Chủ đầu tư là một đối tượng, mà đã được gán cho con trỏ "AboutForm" trước (cũng có thể là NIL -> không có chủ sở hữu).

Các "Chủ đầu tư" tham số của

TForm.Create(Owner: TComponent) 

nói với các hình thức, người đó là chủ sở hữu. TComponents đăng ký chính mình tại chủ sở hữu của họ, nếu một số được cung cấp. Vì vậy, có một số loại thông tin liên lạc giữa chủ sở hữu và đó là trẻ em.

Ví dụ: Nếu chủ sở hữu được giải thoát, anh ấy cũng có thể giải phóng các thành phần thuộc sở hữu của nó.

Do đó,

TAboutForm.Create(Self); 

phương tiện, rằng "Tự" là chủ sở hữu của các TAboutForm mới, nếu (Self is TComponent).

TAboutForm.Create(NIL); 

cũng là một giải pháp chấp nhận được, nhưng ở đây, bạn phải giải phóng các thành phần bản thân (ngoại trừ, bạn tạo TAboutForm trong một MDI-Window).

+4

Bạn cho rằng cái đầu tiên có thể đúng như thế nào? Trong hoàn cảnh nào TAboutForm nên tạo và sở hữu một TAboutForm khác, sau đó loại bỏ tham chiếu đến bản gốc và thay thế nó bằng cái mới? –

+0

@RobKennedy: Ok, cái đầu tiên có thể đúng! Tất nhiên, có thể tạo ra một TControl khác và gán cho AboutForm, trước khi nó được overriden với ObjRef mới. Tôi đọc nó sai vòng tròn (nó hơi muộn ở đây trong áo;) – MJSt

+0

@RobKennedy bình luận của bạn ở trên làm cho rất nhiều ý nghĩa khi bạn đặt nó như thế :) –

5

khi bạn tạo Form động, đó là hình thức là available mẫu. Bạn phải vượt qua số owner của biểu mẫu.

enter image description here

.. Vì vậy, trong trường hợp của bạn

AboutForm: = TAboutForm.Create (Tự);

AboutForm: = TAboutForm.Create (nil);

AboutForm: = TAboutForm.Create (Application);

  1. Tự
  2. Nil
  3. Application

là chủ sở hữu của cho AboutForm (như bạn đã có thể biết điều đó)

But what is the difference though in using any of these:

đây là một cái gì đó từ about.com-Form Owner

nil - xác định rằng không có đối tượng sở hữu dưới hình thức - và do đó một nhà phát triển (bạn) có trách nhiệm giải phóng dưới dạng tạo ra (bằng cách gọi myForm.Free khi bạn không còn cần theo mẫu)

Tự - chỉ định đối tượng mà phương thức được gọi. Nếu, ví dụ, bạn đang tạo một thể hiện mới của biểu mẫu TMyForm từ bên trong trình xử lý OnClick của Button (trong đó nút này được đặt trên một MainForm) - tự đề cập đến "MainForm". Vì vậy, khi MainForm được giải phóng - nó cũng sẽ miễn phí "MyForm".

Ứng dụng - chỉ định biến loại TApplication chung được tạo khi bạn chạy ứng dụng của mình. "Ứng dụng" đóng gói ứng dụng của bạn cũng như cung cấp nhiều chức năng xảy ra trong nền của chương trình.

và điều này cũng Form Owner

a) Formx.Create (Application) -> nguồn Form sẽ được giải phóng khi ứng dụng được chấm dứt

b) Formx.Create (Tự) -> Form tài nguyên được giải phóng khi đối tượng chủ sở hữu bị hủy (nếu Tự là hậu duệ của TComponent)

c) Formx.Create (nil) -> bạn có trách nhiệm giải phóng biểu mẫu.

này từ

một được sử dụng bởi delphi khi một mẫu được autocreated

b là tiện dụng cho một hình thức chính mà có nhiều cửa sổ con rằng cần phải đóng khi biểu mẫu chính bị đóng

c là tiện dụng để hiển thị cửa sổ hộp thoại

Để giải phóng bạn có thể làm điều này ACtion := caFree trên biểu mẫu.

+0

Thông tin tuyệt vời cảm ơn –