Delphi "problem": TForm. Oluştur () - Nil, Benlik veya Uygulama?

Yarattığın zaman Delphi nesnelerini dinamik olarak TForm (Delphi uygulamalarında bir formu / pencereyi temsil eden) gibi TControl'den devralan "Oluştur" yapıcısı bir "Sahip" parametresi bekler:

yapıcı Create (AOwner: TComponent);

AOwner parametresi TForm nesnesinin sahibidir. Formun sahibi, gerektiğinde formu - yani form tarafından ayrılan belleği - boşaltmaktan sorumludur. Form, sahibinin Bileşenler dizisinde görünür ve sahibi yok edildiğinde otomatik olarak yok edilir.

AOwner parametresi için üç seçeneğiniz vardır: sıfır, öz, ve uygulama.

Cevabı anlamak için önce "nil," "benlik" ve "Uygulama" nın anlamını bilmeniz gerekir.

  • sıfır hiçbir nesnenin forma sahip olmadığını ve bu nedenle geliştiricinin oluşturulan formu (myForm'u çağırarak) serbest bırakmaktan sorumlu olduğunu belirtir. Artık forma ihtiyacınız olmadığında ücretsiz)
  • öz yöntemin çağrıldığı nesneyi belirtir. Örneğin, bir düğmenin OnClick işleyicisinin içinden (bu düğmenin MainForm'a yerleştirildiği yer) yeni bir TMyForm formu örneği oluşturuyorsanız,
    instagram viewer
    öz "MainForm" anlamına gelir. Böylece, MainForm serbest bırakıldığında, MyForm'u da serbest bırakacaktır.
  • Uygulama uygulamanızı çalıştırdığınızda oluşturulan genel bir TApplication türü değişkeni belirtir. "Uygulama", uygulamanızı kapsar ve programın arka planında meydana gelen birçok işlevi sağlar.

Örnekler:

  1. Kalıcı formlar. Kullanıcı formu kapattığında kalıcı olarak görüntülenecek ve serbest bırakılacak bir form oluşturduğunuzda, sahip olarak "nil" kullanın:
    var myForm: TMyForm; başlangıç ​​myForm: = TMyForm. Oluşturmak(sıfır); myForm'u deneyin. ShowModal; sonunda myForm. Bedava; son; son;
  2. Modelsiz formlar. Sahip olarak "Uygulama" yı kullanın:
    var
    myForm: TMyForm;
    ...
    myForm: = TMyForm. Oluştur (Uygulama);

Şimdi, uygulamayı sonlandırdığınızda (çıktığınızda), "Application" nesnesi "myForm" örneğini serbest bırakacaktır.

TMyForm neden ve ne zaman. Oluşturma (Uygulama) Önerilmiyor mu? Form kalıcı bir formsa ve imha edilecekse, sahibine "sıfır" iletmelisiniz.

"Başvuruyu" geçebilirsiniz, ancak Uygulamaya ait olan veya dolaylı olarak sahip olunan her bileşene ve forma gönderilen bildirim yönteminin yol açtığı zaman gecikmesi rahatsız edici olabilir. Uygulamanız birçok bileşene (binlerce) sahip birçok formdan oluşuyorsa ve oluşturduğunuz formun birçok denetimi (yüzlerce) varsa, bildirim gecikmesi önemli olabilir.

"Nil" ifadesinin "uygulama" yerine sahip olarak iletilmesi, formun daha erken görünmesine neden olur ve kodu başka şekilde etkilemez.

Ancak, oluşturmanız gereken form kalıcı değilse ve uygulamanın ana formundan oluşturulmamışsa, sahip olarak "benlik" değerini belirttiğinizde, sahibin kapatılması oluşturulan formu serbest bırakır. Formun yaratıcısını geçmesini istemiyorsanız "benlik" i kullanın.

Uyarı: Bir Delphi bileşenini dinamik olarak başlatmak ve bir süre sonra bunu açıkça serbest bırakmak için, sahibi olarak her zaman "nil" iletin. Aksi takdirde, performans ve kod bakım problemlerinin yanı sıra gereksiz riskler ortaya çıkabilir.

İçinde SDI uygulamaları, bir kullanıcı formu kapattığında ([x] düğmesine tıklayarak) form hala bellekte bulunur - yalnızca gizlenir. MDI uygulamalarında, bir MDI alt formunu kapatmak yalnızca onu en aza indirir.
OnClose olay bir Aksiyon (TCloseAction türünde) parametresi, kullanıcı formu kapatmaya çalıştığında ne olacağını belirtmek için kullanabilirsiniz. Bu parametrenin "caFree" olarak ayarlanması formu serbest bırakır.

Delphi ipuçları navigasyon:
»Tam HTML'yi TWebBrowser bileşeninden edinin
«Nasıl piksel dönüştürmek için milimetre

instagram story viewer