Klassen und ihre Implementierung



  • Hallo Leute.

    Ich habe mir hier vor ca. zwei Jahren eine Klasse gebastelt. Da war ich noch ganz fit in der Geschichte. Jetzt möchte ich diese Klasse in mein TForm1 so einbinden, dass ich mit

    Form1->Code...
    

    darauf zugreifen kann.
    Die Klasse heißt TCode und wird über

    #include "code.h";
    

    implementiert. Ich möchte deshalb auf diese Weiße darauf zugreifen können, weil ich in allen anderen Formularen, in die ich "Form1" einbinde, nicht extra auch noch die "code.h" includen möchte. Vor zwei Jahren hätt ich's sicher hinbekommen. Was man doch nicht alles so wieder verlernt :(.

    Danke für eure Hilfe.

    MFG, Red.



  • Hallo

    Jetzt möchte ich diese Klasse in mein TForm1 so einbinden, dass ich mit...
    darauf zugreifen kann.

    Das ist etwas unpräzisse. Willst du nur von Methoden in TForm1 aus auf code zugreifen, oder auch von außerhalb?

    Ich geh mal vom letzteren aus.
    Dann sieht der Header so aus :

    #include <vcl>
    ...
    #include "code.h"
    
    ...
      private :
        TCode* m_code; // Pointer auf Form1-abhängige Instanz
      public :
        ...
        __property TCode* Code = {read = m_code};
        ...
    

    Du bist dann natürlich selber für das Erstellen und Löschen der Instanz in der Implementation von TForm1 zuständig

    bis bald
    akari



  • VCL Klassen dürfen nicht mehrere Basisklassen haben. Deswegen dürfte eine Mehrfachvererbung aussscheiden.



  • Hallo

    was hat das mit Mehrfachvererbung zu tun? 😕

    bis bald
    akari



  • Ich habe das so verstanden, dass er etwas im Stil von

    class TMain : public TForm, public TCode

    machen will



  • 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