TWinControl oder TEdit



  • eine Kurze Frage

    nehmen wir an ich habe eine Variable von Typ TWinControl

    Bsp. 1:

    TWinControl *tmp;
    
    tmp = new TWinControl(this);
    // irgendwas mit tmp anstellen
    delete tmp;
    

    Bsp. 2:

    TWinControl *tmp;
    
    tmp = ((TWinControl*)new TEdit(this));
    // irgendwas mit tmp anstellen
    delete tmp;
    

    Nun zu der Frage:
    in bsp 1 wird eine Instanz von TWinControl erstellt und später wieder gelöscht. alles ok, sauber.
    in bsp 2 wird eine Instanz von TEdit erstellt und später wird tmp mit Typ TWinControl gelöscht.
    Wird dabei auch alles was TEdit betrifft sauber aus dem Speicher entfernt, oder nur das, was zu TWinControl gehört?



  • Hmm du erstellst doch ein TEdit und machst dann einen Cast in ein TWinControl das du dann tmp zuweist. (geht ja, da TWinControl in der Hierachie als Basisklasse von TEdit geführt wird)
    Also hat doch tmp den Typ TWinControl.
    Und dann löschst du ihn auch als Typ TWinControl... also wird es wunderbar abgebaut.
    Falls ich falsch liege sorry, hatte noch keinen Kaffee 😃



  • wenn TWinControl oder dessen Basisklasse nen virtuellen Destruktor hat ist alles ok



  • mal ne gegenfrage. was soll der schnulli eigentlich?

    ein TEdit beim instanzieren nach TWinControl zu casten, da kannste auch gleich TWinControl zum instanzieren nehmen!



  • oder das casten ganz weglassen. 🙂



  • der "schnuli" bedeutet, dass tmp ist eine Variable, die ein Zeiger auf ein Objekt, Nachkommen von TWinControl, speichert.

    von dem Objekt werden später verschiedene Methoden aufgerufen, alle von TWinControl oder dessen Eltern. Ich habe jetzt, sagen wir, 10 Abkommen von TWinControl. Ich lege jetzt doch nicht 10 Variablen an, nur um die Eigenschaft Left zu zuweisen.

    oder siehst du es anders @Sunday?



  • Hallo

    Wie @Oder? schon sagte brauchst du hier nicht zu casten und wenn du schon casten willst nimm bitte c++ casts.

    Ciao



  • aber dann brauchst du die nicht mit new erzeugen und so komisch zu vergewaltigen! mach das doch einfach wie im folgenden beispiel:

    // alle steuerelemente eines parents aktivieren oder deaktivieren
    void __fastcall TForm1::ModifyAll(TWinControl *Element, bool Value)
    {
      TWinControl *Feld;
    
      for (int i = 0; i < Element->ComponentCount; i++)
      {
        Feld = (TWinControl *) Element->Components[i];
    
        // alle elemente bis auf die StatusBar en- oder disablen
        if (Feld->Name != "StatusBar1")
          Feld->Enabled = Value;
      }
    }
    
    // aufruf
    ModifyAll(GroupBox1, false);
    ModifyAll(Form1, true);
    


  • Mit dem cast wäre ich aber vorsichtig. Components ist vom Typ TComponent was ja eine Basisklasse von TWinControl ist. Hier ist ein dynamic_cast mit anschließender Abfrage des Zeigers auf NULL angebracht.



  • @Sunday Die Control werden zur Laufzeit erzeugt, so wie im Bsp.



  • @Xqgene: Mal wieder zu deiner Ausgangsfrage: Ich glaube(!), dass ordentlich gelöscht wird, denn soweit ich weiß speichert der Compiler irgendwo, wo er wieviel Speicher allokiert. Demnach schaut er bei Verwendung von "delete" in seiner Tabelle nach und löscht den allokierten Speicher. Es kommt also AFAIK nicht darauf an, von was für nem Typ die Variable ist, die auf den Speicherblock zeigt.


Anmelden zum Antworten