Zeiger auf Form legen



  • Hallo,

    man kann ja einen Zeiger auf eine Variable legen:
    int GanzZahl;
    int *Zeiger;
    Zeiger = &GanzZahl;

    und dann kann man mit der Variable arbeiten:
    Zeiger = 10;

    Wie kann ich nun einen Zeiger auf eine Form legen?



  • TForm1 **ptrForm = &Form1
    


  • TForm1 **ptrForm = &Form1

    Ist TForm1 sozusagen der "Datentyp" also sowas wie int - eben bloß die Form?

    Wieso 2 Sternchen statt einem?

    Danke!



  • Also, meine Form heißt Mainform und die Zeigervariable soll Formular heißen.
    Da ist die Bildung des Zeiger, die Bildung eine Klasseninstanz und der Methodenaufruf:

    TForm1 **Formular = &Mainform;
    MainMenuDatei MainMenuDateiInUse;
    MainMenuDateiInUse.Speichern(Formular);

    Als Fehler wird angezeigt: Undefiniertes Objekt TForm1!



  • wenn deine form Mainform heißt ist es doch klar, dass er form1 nicht kennt

    machs so:

    TMainform **Formular = &Mainform;
    

    oder so:

    TForm **Formular = &Mainform;
    


  • Ja, du hast Recht. Das hab ich auch schon eingegeben, das Problem ist, was gebe ich als Übergabeparameter ein:

    TMainform **Formular = &Mainform;
    MainMenuDatei MainMenuDateiInUse;
    MainMenuDateiInUse.Speichern(**Formular); // Geht nicht
    MainMenuDateiInUse.Speichern(Formular); // Geht auch nicht

    Und das andere Problem ist, wie deklariere ich die Methode in der Klasse,
    ich kann doch in der Klasse nicht Mainform reinschreiben, das ist nicht
    allgemein gültig - falls jemandem seine Klasse mal Form1 heißt!

    Gruß



  • Kann mir denn keiner helfen?



  • Wieso Zeiger auf ne Form legen ? Wenn Dein Formular MainForm heisst dann ist MainForm bereits ein Zeiger vom Typ TForm*. Willst Du das Teil an eine Funktion übergeben dann müßte die ungefähr so aussehen:

    void SetCaption(TForm *Form)
    {   // Zugriff auf übergebene Form
        Form->Caption="Sodele, jetzetle";
    }
    {
    

    Der Aufruf geht dann so:

    SetCaption(MainForm);
    


  • Hey, ich hab das so schon gehabt. Wahrscheinlich hab ich das mit den Pointern auch schon richtig gehabt. Auf jeden Fall kommt bei beiden Möglichkeiten folgende Fehlermeldung:

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

    Meine Klassendeklaration:
    class MainMenuDatei
    {
    private:
    int TextVeraendert;

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

    // Konstuktor
    MainMenuDatei();

    // Dekonstuktor
    ~MainMenuDatei();
    };

    Meine Methodendefinition (noch leer):
    MainMenuDatei::Speichern(TForm &Formular);
    {

    }

    Mein Aufruf + Instanzbildung:
    MainMenuDatei MainMenuDateiInUse;
    MainMenuDateiInUse.Speichern(Mainform);

    Sieht doch alles verdammt richtig aus, aber trotzdem stimmt irgendwas mit der Klasse nicht. Wäre nett, wenn du mir da weiterhelfen könntest.

    Grüße



  • MainMenuDatei::Speichern(TForm &Formular)
    ist auch falsch, so muß es aussehen
    MainMenuDatei::Speichern(TForm *Formular)



  • Es geht immer noch nicht. Es kommt immer noch der Fehler:

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

    Dann bleibt der Cursor bei folgender Zeile stehen

    MainMenuDatei MainMenuDateiInUse; // Instanz falsch gebildet?
    MainMenuDateiInUse.Speichern(Mainform); // Hier

    Keine Ahnung. Hab ich die Instanz vielleicht falsch gebildet, wenn der sagt, dass Klassen mit dem Operator new erstellt werden???

    Aha. Hab gerade die zweite Zeile (den Aufruf) auskommentiert. Jetzt kommen ganz andere Fehler. Obwohl ja kein Fehler kommen darf:

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

    [C++ Fehler] MainMenuDatei.cpp(23): E2040 Deklaration nicht ordnungsgemäß abgeschlossen

    Sorry, aber ich hab absolut keinen Plan. Und ohne diese Übergabe kann ich einfach an meinem Programm nicht weiter machen. Hoffe du kannst mir helfen!

    Tausend Dank!!!



  • 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?


Anmelden zum Antworten