Klassen und ihre Implementierung



  • Hallo

    aber nicht wenn er so auf den Code-Teil des Forms zugreifen will

    Redhawk schrieb:

    Form1->Code...
    

    bis bald
    akari



  • Nein. Nix Mehrfachvererbung.
    Wenn ich dann die Instanze im "Form1->OnCloseQuery"-Event durch

    delete m_code;
    

    lösche, dürfte das doch genügen? Weiß zumindest nicht wo der Destructor von TForm zu finden ist. Brauche ich sicher auch gar nicht.
    Danke schon mal für die schnelle Hilfe.



  • Hallo

    @ Redhawk : bitte niemals OnCreate oder OnDestroy benutzen. Stattdessen Konstruktor und Destruktor benutzen.
    Den TForm-Destruktor mußt du noch selber hinschreiben, muß so aussehen :

    void __fastcall ~TForm1();
    

    bis bald
    akari



  • Alles klar.
    Danke dir.

    Bis bald.



  • Wenn ich die Mehrfachvererbunf nutze dann kann ich grundsätzlich mit

    Form1->CodeGrün...
    Form1->CodeRot...

    oder sonstewas darauf zugreifen und das sind PublicMethoden der Klasse TCode

    Oder habe ich das jetzt komplett falsch verstanden.



  • Hallo

    ja aber das war so nicht vom OP gewollt. Wär ich auch nie drauf gekommen ,das der OP Mehrfahcvererbung hätte haben wollen... meine Lösung (die der OP ja auch bestätigt hat) ist mir doch aufgrund der Frage viel naheliegender.

    bis bald
    akari



  • Hallo. Habe doch noch eine Frage.
    Konnte eben erst testen.
    Ich kann die Klasse jetzt durch

    Form1->Code->...
    

    aufrufen.
    Wenn ich das Programm starte und etwas in eine Variable dieser Klasse schreiben möchte, gibt es eine Fehlermeldung.
    Ist auch logisch. Wurde ja noch kein Speicher reserviert.
    An welcher Stelle muss ich nun folgende Zeile einfügen.

    m_code = new TCode;
    

    Im Konstructor müsste ich noch eine TComponent mit übergeben, geht da auch NULL?



  • Hallo

    da du nicht veraten hast was denn TCode überhaupt macht, von welcher Klasse es abgeleitet ist oder was der Parameter des Konstruktors bedeutet, kann ich da nur allgemein sagen :
    Ich geh davon aus, das du von TComponent abgeleitet hast und der Parameter also der von der VCL vorgegebene TComponent Owner* ist. In diesem Fall kannst du durchaus NULL übergeben, dnn bist du selber für das Löschen der Instanz verantwortlich, zum Beispiel im Destruktor.
    Wenn du aber zum Beispiel this angibst, ist die Fenster-Instanz selber für das Löschen der Code-Instanz verantwortlich, wenn das Form gelöscht wird. Dann braucht du im Konstruktor nichts manuell löschen.

    bis bald
    akari



  • In der TCode Klasse sind nur selbst geschriebene Funktionen enthalten. Ich benutze dort keinerlei Objekte. Ist reines c. Mit der TComponent meinte ich den Konstruktor des Formulars. Ich war halt der Meinung, dass ich in den Konstruktor des Formulars

    void __fastcall TForm::TForm(owner)
    {
      m_code = new TCode;
    }
    

    schreiben müsse, damit ich die Variable im Destruktor wieder richtig löschen kann. Jedoch ist dieses "owner" vom Typ TComponent, bzw. von dieser Klasse. Und wenn ich NULL für "owner" übergeben möchte, meckert er rum.

    Mittlerweile habe ich mir Funktionen geschrieben, die dann die verschiedenen Funktionen der TCode-Klasse aufrufen. Somit kann ich auch immer über Form1->... darauf zugreifen. Ist nicht ganz so schön, aber funst. Möchte aber trotzdem wissen, wie das sauber zu lösen geht.



  • Hallo

    😕
    Wenn du in deiner TCode-Klasse keinen eigenen Konstruktor-Parameter vom Typ TComponent hast, was hat denn das dann mit der Klasse TForm und desen Instanz zu tun? Wo willst du du welchen Owner (auf 0) setzen?
    Der Owner des Forms selber beeinflußt dein m_code nicht im geringsten, den solltest du weder verändern noch an untergeordnete Objekte weitergeben.

    bis bald
    akari



  • Der Konstruktor von TForm existiert doch bereits im public-Teil. Ist wahrscheinlich Standart:

    .
    .
    .
    public:
      __fastcall TForm1 (TComponent* Owner);
    .
    .
    .
    

    Wenn ich nun im Konstructor etwas eintragen möchte, schreibe ich doch:

    __fastcall TForm1::TForm1(Keine Ahnung)
    {
    .
    .
    .
    }
    


  • Hallo

    nein du darfst die Definition Standard-Konstruktor von TForm nicht verändern. Dafür gibt es auch keinen Grund! Was willst du denn damit bezwecken?

    Du darfst der Implementation des Konstruktor etwas hinzufügen, oder die Initialisierungsliste erweiteren.

    bis bald
    akari



  • Akari, kümmere dich wieder um die anderen Beiträge. Ich bin noch nicht so weit. Muss mich erst mal wieder etwas mehr belesen. Trotzdem danke für deine Geduld :(.



  • Hallo

    ich empfehle dir zum Lesen zum Beispiel das hier.

    bis bald
    akari



  • Super, Danke.
    Jetzt kann ich mein Wissen aus dem Studium wieder auffrischen :).


Anmelden zum Antworten