Zeiger auf Form legen



  • Das sieht schwer nach einem Grundsatzproblem aus, aber mit Deinen vielen Codefragmenten und Bezeichnungen, deren Bedeutung/Funktion/Datentyp man nicht kennt, ist die Fehlersuche fast unmöglich 😞



  • du mußt die Instanz folgendermaßen deklarieren:

    MainMenuDatei MainMenuDateiInUse = new MainMenuDatei();
    


  • So ist es glaube ich besser 😉

    MainMenuDatei *MainMenuDateiInUse = new MainMenuDatei();
    

    Aber ob das Giovannis Programmlogik gerecht wird 🙄 das kann nur er selbst wissen.



  • Hallo,

    Dieses MainMenuDatei scheint ja nicht von einer VCL-Klasse abgeleitet zu sein (muss also nicht zwingend per new erzeugt werden), verwendet aber scheinbar eine VCL-Klasse (TForm ?).
    Sein zweiter Fehler

    [C++ Fehler] MainMenuDatei.cpp(22): E2316 'MainMenuDatei::Speichern(TForm *)' ist kein Element von 'MainMenuDatei'

    scheint wohl darauf zu beruhen, das Deklaration und Definition nicht übereinstimmen.
    Ach so, Giovanni, bitte verwende beim posten von Code die Code-Tags. Das macht das Lesen etwas einfacher.

    Ciao



  • ups, nen sternchen vergessen 🙄
    aber dann hätte er zur abwechslung mal ne andere fehlermeldung gesehen. 😃



  • Hallo!!!

    Also, mein letzter Versuch, wenns diesmal nicht klappt möchte ich euch nicht weiter damit auf die Nerven gehen!

    Ich glaube ihr habt hir nen kleinen Fehler gemacht, wenn ich eine neue Instanz mit new bilde, dann muss ich um die Methoden anzusprechen den Operator -> vwerwenden und nicht den Punktoperator. Hab dies geändert. Mein Projekt sieht jetzt so aus. Ich habe 3 Dateien.

    1. Datei

    void __fastcall TMainform::Button1Click(TObject *Sender)
    {
    
    MainMenuDatei *MainMenuDateiInUse = new MainMenuDatei();
    MainMenuDateiInUse->Speichern(Mainform);
    
    }
    

    2. Datei (Klassendeklaration (Gesamte Datei))

    #include <vcl.h>

    #ifndef MainMenuDateiH
    #define MainMenuDateiH

    class MainMenuDatei
    {
    private:
    int TextVeraendert;

    public:
    // Methoden
    int MessageboxMeldung(AnsiString);
    Speichern(TForm);

    // Konstuktor
    MainMenuDatei();

    // Dekonstuktor
    ~MainMenuDatei();
    };

    #endif

    3. Datei (Methodendefintion)

    MainMenuDatei::Speichern(TForm *Formular);
    {
    // Von hier aus möchte ich später die Form ansprechen z. B.
    // Formular->Caption = "Endlich klappts!!!";
    }

    Wie ich es verstanden hab liegt der Fehler darin, dass ich dem Compiler sagen muss: "hey Compiler, ich benutzer da ein Objekt - TForm, lassm ich doch bitte damit arbeiten". Muss ich das nicht auch erst irgendwie inkludieren oder so?
    Also die vcl.h hab ich in jeder Datei inkludiert. Und was noch wichtig ist, die aktuelle Fehlermeldung - ist immer noch die alte:

    [C++ Fehler] Unit1.cpp(263): E2459 Klassen im VCL-Stil müssen mit dem Operator new erstellt werden.

    Also, ich hoffe diesmal klappts! Grüße



  • Benutzer ich doch den Punktoperator statt dem -> Operator erhalte ich folgende Fehlermeldung:

    [C++ Fehler] Unit1.cpp(262): E2294 Auf linker Seite der Struktur ist . oder .* erforderlich.
    [C++ Warnung] Unit1.cpp(264): W8004 'MainMenuDateiInUse' wurde ein Wert zugewiesen, der nie verwendet wird.



  • Die Deklaration und die Definition von MainMenuDatei::Speichern sind immernoch unterschiedlich.
    Siehe:

    Deklaration: Speichern(TForm);
    Definition: MainMenuDatei::Speichern(TForm*)

    Bitte poste doch mal die Zeilen 262 bis 264 (hier treten die Fehler ja wohl auf).



  • Die Zeilen waren schon drin, hier nochmal nummeriert:

    void __fastcall TMainform::Button1Click(TObject *Sender)
    {

    //MainMenuDatei MainMenuDateiInUse;
    MainMenuDatei *MainMenuDateiInUse = new MainMenuDatei();
    MainMenuDateiInUse.Speichern(Mainform); // 262
    // 263
    } // 264

    Noch mal zur Deklaration. Muss ich bei der deklaration nicht sagen:
    - Parameter ist ein Objekt vom Typ TForm: Tform

    bei der Definition dann noch zusätzlich eine Variable definieren:
    - Parameter mit Variabllename ist TForm *Formular
    - Und ne komplett neue Variable will ich ja nicht erzeugen, sondern nen Pointer.
    Da das ja falsch ist, könntst du mir dann sagen was in dem Fall richtig wäre?



  • Ich meine die Methode Speichern deiner Klasse MainMenuDatei. Vielleicht war der Post deiner Headerdatei "MainMenuDatei.h" ja auch nicht vollständig. Da zumindest hat speichern weder einen Rückgabewert (und sei es void) noch den richtigen Parameter (TForm anstelle TForm*).


Anmelden zum Antworten