Δελφικό πρόβλημα: TForm. Δημιουργία () - Μηδέν, Εαυτό ή Εφαρμογή;

Όταν δημιουργείτε Οι Δελφοί αντιτίθενται δυναμικά που κληρονόμησε από το TControl, όπως ένα TForm (που αντιπροσωπεύει μια μορφή / παράθυρο στις εφαρμογές Delphi), ο κατασκευαστής "Create" αναμένει μια παράμετρο "Owner":

Κατασκευαστής Δημιουργία (AOwner: TComponent);

Η παράμετρος AOwner είναι ο ιδιοκτήτης του αντικειμένου TForm. Ο κάτοχος της φόρμας είναι υπεύθυνος για την απελευθέρωση της φόρμας - δηλ. Της μνήμης που διατίθεται από τη φόρμα - όταν απαιτείται. Η φόρμα εμφανίζεται στον πίνακα στοιχείων του ιδιοκτήτη της και καταστρέφεται αυτόματα όταν καταστρέφεται ο κάτοχός της.

Έχετε τρεις επιλογές για την παράμετρο AOwner: Μηδέν, εαυτός, και εφαρμογή.

Για να κατανοήσετε την απάντηση, πρέπει πρώτα να γνωρίζετε την έννοια του "μηδέν", "αυτο" και "εφαρμογή".

  • Μηδέν δηλώνει ότι κανένα αντικείμενο δεν διαθέτει τη φόρμα και ως εκ τούτου ο προγραμματιστής είναι υπεύθυνος για την απελευθέρωση της δημιουργηθείσας φόρμας (καλώντας το myForm. Δωρεάν όταν δεν χρειάζεστε πλέον τη φόρμα)
  • Εαυτός καθορίζει το αντικείμενο στο οποίο ονομάζεται η μέθοδος. Αν, για παράδειγμα, δημιουργείτε μια νέα εμφάνιση μιας φόρμας TMyForm από το χειριστήριο OnClick ενός κουμπιού (όπου αυτό το κουμπί τοποθετείται σε ένα MainForm),
    instagram viewer
    εαυτός αναφέρεται στο "MainForm". Έτσι, όταν το MainForm ελευθερωθεί, θα ελευθερώσει επίσης το MyForm.
  • Εφαρμογή καθορίζει μια παγκόσμια μεταβλητή τύπου TA που δημιουργείται όταν εκτελείτε την εφαρμογή σας. Η "εφαρμογή" ενσωματώνει την εφαρμογή σας και παρέχει πολλές λειτουργίες που εμφανίζονται στο παρασκήνιο του προγράμματος.

Παραδείγματα:

  1. Modal forms. Όταν δημιουργείτε μια φόρμα που θα εμφανίζεται μεταφορικά και θα απελευθερωθεί όταν ο χρήστης κλείσει τη φόρμα, χρησιμοποιήστε το "μηδέν" ως ιδιοκτήτης:
    var myForm: TMyForm; αρχίστε το myForm: = TMyForm. Δημιουργώ(μηδέν); δοκιμάστε το myForm. ShowModal; τέλος myForm. Ελεύθερος; τέλος; τέλος;
  2. Μορφές χωρίς μορφή. Χρησιμοποιήστε την "Εφαρμογή" ως ιδιοκτήτη:
    var
    myForm: TMyForm;
    ...
    myForm: = TMyForm. Δημιουργία (Εφαρμογή);

Τώρα, όταν τερματίσετε (έξοδο) από την εφαρμογή, το αντικείμενο "Εφαρμογή" θα απελευθερώσει την εμφάνιση "myForm".

Γιατί και πότε είναι TMyForm. Δημιουργία (Εφαρμογή) ΔΕΝ συνιστάται; Αν το έντυπο είναι μια μορφή και θα καταστραφεί, θα πρέπει να περάσετε "nil" για τον ιδιοκτήτη.

Θα μπορούσατε να περάσετε "εφαρμογή", αλλά η χρονική καθυστέρηση που προκαλείται από τη μέθοδο ειδοποίησης που αποστέλλεται σε κάθε στοιχείο και το έντυπο που ανήκει ή εμμέσως ανήκει στην εφαρμογή, θα μπορούσε να αποδειχθεί ανατρεπτικό. Εάν η αίτησή σας αποτελείται από πολλές μορφές με πολλά συστατικά (σε χιλιάδες) και η φόρμα που δημιουργείτε έχει πολλούς ελέγχους (στις εκατοντάδες), η καθυστέρηση ειδοποίησης μπορεί να είναι σημαντική.

Αν περάσετε "μηδέν" ως ιδιοκτήτης αντί για "εφαρμογή", η φόρμα θα εμφανιστεί νωρίτερα και δεν θα επηρεάσει τον κώδικα με άλλο τρόπο.

Ωστόσο, εάν η φόρμα που θέλετε να δημιουργήσετε δεν είναι μονόδρομη και δεν δημιουργείται από την κύρια φόρμα της εφαρμογής, τότε όταν καθορίζετε τον εαυτό σας ως ιδιοκτήτη, κλείνοντας ο κάτοχος θα απελευθερώσει τη δημιουργηθείσα φόρμα. Χρησιμοποιήστε τον εαυτό σας όταν δεν θέλετε η φόρμα να ξεπεράσει τον δημιουργό της.

Προειδοποίηση: Για να δημιουργήσετε μια δυναμική παράσταση ενός στοιχείου Delphi και να τον απελευθερώσετε κάποια στιγμή αργότερα, πάντα να περάσετε "μηδέν" ως ιδιοκτήτης. Εάν δεν το κάνετε, μπορεί να δημιουργηθεί περιττός κίνδυνος, καθώς και προβλήματα επιδόσεων και συντήρησης κώδικα.

Σε SDI εφαρμογές, όταν ένας χρήστης κλείσει τη φόρμα (κάνοντας κλικ στο κουμπί [x]) η φόρμα εξακολουθεί να υπάρχει στη μνήμη - αποκρύπτεται μόνο. Στις εφαρμογές MDI, το κλείσιμο μιας παιδικής φόρμας MDI ελαχιστοποιεί μόνο αυτή.
ο OnClose η εκδήλωση παρέχει ένα Δράση (του τύπου TCloseAction) μπορείτε να χρησιμοποιήσετε για να καθορίσετε τι συμβαίνει όταν ένας χρήστης επιχειρεί να κλείσει τη φόρμα. Ο ορισμός αυτής της παραμέτρου σε "caFree" θα απελευθερώσει τη φόρμα.

Πλοηγός συμβουλών Delphi:
»Αποκτήστε το πλήρες HTML από το στοιχείο TWebBrowser
«Πώς να μετατρέψετε τα εικονοστοιχεία σε χιλιοστά