Probleme mit Vererbung



  • Hi,

    ich scheitere gerade mal an einem denkbar einfachen Problem (hoff ich zumindest).

    Ich leite von der Klasse TForm meine eigene Klasse TView ab, in der ich eine Liste mit Zeigern auf Klassen, in denen die Daten stehen, eingebaut habe. Anschließend wird ein konkretes Fenster noch mal von TView abgeleitet, daß dann auch die visuellen Komponenten enthält.

    hier meine Klasse TView:

    class TView : public TForm
    {
      public:
        __fastcall TView(TComponent* Owner);
        __fastcall ~TView();
    
        virtual void __fastcall UpdateData(TObject *Sender) = 0;
        int __fastcall CountDocuments();
    
        void __fastcall RegisterDocument(TObject* value);
        void __fastcall UnregisterDocument(TObject* value);
    
       private:
        TListe *pDocuments;
    };
    

    nun eine sichtbare Form von TView abgeleitet:

    class TObjectBrowserForm : public TView
    {
    __published:	// Von der IDE verwaltete Komponenten
            TTreeView *TreeView;
            void __fastcall TreeViewMouseDown(TObject *Sender,
              TMouseButton Button, TShiftState Shift, int X, int Y);
    public:
        __fastcall TObjectBrowserForm(TComponent* Owner);
    
    private:
         void __fastcall UpdateData(TObject *Sender);
    
    };
    

    Mein Problem besteht darin, das ich nicht aus der abgeleiteten Klasse TObjectBrowserForm auf die Funktion CountDocuments() der TView-Klasse zugreifen kann.

    void __fastcall TObjectBrowserForm::UpdateData(TObject *Sender)
    {
      // alle Documents durchlaufen
      for(int i=0; i<this->CountDocuments(); i++)  //  Meldung: CountDocuments() ist kein Element von TObjectBrowserForm
      {
    
      }
    }
    

    Ich habe doch alles mit public deklariert, aber warum kennt TObjectBrowserForm die Funktion CountDocuments() nicht? Danke für eure Hinweise oder Lösungen. Ich sitz wohl schon zu lange davor, so daß ich den Wald vor lauter Bäumen nicht sehe 😉

    bais



  • Versuchs mal mit dem Aufruf "TView::CountDocuments();", ohne "this".

    [offtopic mode="sligthly"]Hat es ein bestimmten Grund, wieso du die Docs bei den Views registrierst und nicht umgekehrt?

    Normalerweise kenn ichs nur umgekehrt. Bin aber gerne bereit eine neue Sichtweise zu adaptieren (o:[/offtopic]

    -junix



  • AARRGHHHHH, ich brauch umbedingt ne Pause 😉

    Hab noch mal alles geschlossen und beim öffnen gemerkt, das die TObjectBrowserForm noch aus einem anderen Verzeichnis war und gar nicht zum Projekt gehörte. 🤡
    Jetzt klappt alles wunderbar.

    Zu deiner Farge junix:
    Ich habe eine Ansicht mit mehreren Dokumenten, und nicht wie üblich ein Dokument und verschiedene Ansichten. Da dachte ich mir, warum nicht den Spieß umderehen. Die Ansicht ist ein TreeView und jeder Knoten spiegelt dann ein anderes Dokument wieder. Ob es nun eine gute Variante ist oder nicht, weiß ich nicht. Die Idee kam übrigends durch deinen Artikel 👍

    Gruß bais



  • Dann ab, raus ins schöne warme Wetter und ne runde Skaten oder so (o;

    Naja, das im Artikel erwähnte Konzept, schliesst doch das Registrieren bei mehreren Dokumenten nicht aus?

    -junix



  • Stimmt, aber deine TView-Klasse hat doch keine Information darüber, welchen Dokumenten sie zugeordnet ist. Sie kann also nur die Daten aktualisieren, die im Dokument sind, von dem sie aufgerufen wurde. Ich brauche aber auch noch Informationen über die anderen Dokumente. Das kann man bestimmt auch mit der "normalen" Doc/View Methode lösen, aber ich fand meinen Weg erstmal einfacher 😉

    Leider ist das Wetter bei mir nicht schön, sondern bes*****en kalt und es schweben dunkle Wolken am Himmel.

    Gruß bais



  • Grundsätzlich finde ich deine Überlegungen sehr gut. Ich sehe du hast dich mit der Thematik beschäftigt. Ich will dir jetzt auch nix aufschatzen. Ich möchte nur einen Gedankenaustusch erlangen. Deshalb möchte ich die Diskussion noch etwas weiter ziehen. Ich hoffe du verzeihst (o;

    bais schrieb:

    Stimmt, aber deine TView-Klasse hat doch keine Information darüber, welchen Dokumenten sie zugeordnet ist. Sie kann also nur die Daten aktualisieren, die im Dokument sind, von dem sie aufgerufen wurde.

    Richtig. Macht doch aber auch sinn, dass sie nur die Daten aus dem Dokument aktualisiert, welche auch tatsächlich geändert wurden oder nicht? Die anderen Daten scheinen sich zu diesem Zeitpunkt ja gar nicht verändert zu haben. Da ohnehin eine aktuelle lokale Kopie der Daten in den anderen Dokumenten besteht, gibt es doch keinen Grund diese Kopie zu aktualisieren?

    bais schrieb:

    Ich brauche aber auch noch Informationen über die anderen Dokumente.

    Das View registriert sich ja selbst bei den Dokumenten. Somit weisst du ja wo du dich regsitriert hast? (o;

    Wie gesagt: Das sind nur einige Gedanken welche ich gerne in dein Konzept eingebracht und von dir kommentiert hätte (o:

    -junix



  • Auf das Problem mit dem Neuzeichnen aller Daten bin ich gerade gestoßen (gut, das ich doch keine Pause mache :p ). Im Moment zeichne ich den TreeView komplett neu, da sich die Daten eh nur beim Laden oder Schließen einer Datei ändern. Deshalb hab ich mir noch keine Gedanken darüber gemacht, nur die geänderten Daten neu zu zeichen. Denn dann müßte ich ja den kompletten TreeView durchgehen und bei jedem Item nachschauen, ob es zum Dokument dazugehört und gegebenfalls neuzeichnen. Da es mein erster Kontakt mit dem TreeView ist, bin ich eh schon froh, das ich die Daten sichtbar machen konnte 😉
    Aber ich glaube, ich muß mich noch mal ransetzten und es überdenken. Wenn ich jetzt immer wieder drüber nachdenke, hat dein Konzept doch mehr Vorteile. Egal, ich zieh das jetzt mit meiner Variante durch, da es hier ja nicht um Geschwindigkeit geht. Aber es warten noch weitere Visualisierungen von Daten auf mich, da werde ich es mal mit deiner Variante versuchen. Erst dann kann ich wirklich sagen, was "besser" ist 😉

    Auf jeden Fall vielen Dank für deine guten Gedankenanstöße.

    Gruß bais



  • Auf jeden Fall gut, wenn du deine eignen Erfahrungen machst. (o: Viel Erfolg auf deinem Weg (o:

    -junix


Anmelden zum Antworten