Auf Label von Form1 mit eigener Klasse zugreifen



  • Hallo,

    ich will mit meiner eigenen Klasse "Board" unter anderem die Eigenschaft Caption von meinem Label "VerbindungsStatus" ändern. Dieses Label gehört zu dem Objekt Form1. Hier der Quelltext:

    class TForm1 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
            TButton *Button1;
            TLabel *VerbindungsStatus;
            void __fastcall Button1Click(TObject *Sender);
    private:	// Anwender-Deklarationen
    public:		// Anwender-Deklarationen
            __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    class Board {
            private:
                    //Variablen
                    int addr;
            public:
                    //Methoden
                    Board(); //Konstruktor
                    void connect(); //Verbindung zum Board herstellen
    };
    //---------------------------------------------------------------------------
    Board::Board() {
    
    }
    //---------------------------------------------------------------------------
    void Board::connect() {
            Form1->VerbindungsStatus->Caption = "Verbindung wird hergestellt...";
            if(Form1->OpenDevice(0) == 0)
            {
                    this->addr = 0;
                    Form1->VerbindungsStatus->Caption = "Verbunden! Addr: " + IntToStr(this->addr);
    
            }
            else Form1->VerbindungsStatus->Caption = "Verbindung konnte nicht herrgestellt werden";
    }
    

    Mein Problem, ich kriege immer folgende Fehlermeldung:

    E2451 Undefiniertes Symbol 'Form1'
    

    Dabei wird auf die erste Zeile in der Methode Board::connect() verwiesen ("Form1->VerbindungsStatus->Caption...").

    Ich kann mir echt nicht erkären warum es zu dieser Fehlermeldung kommt. Ich habe schon in meinem Buch (C++ für Kids) nachgesehen und die Suchfunktion benutzt. 😉

    Wäre toll wenn ihr mir helfen könntet...



  • Hallo

    Hast du Form und Board in zwei verschiedene Klassen aufgeteilt? Wenn ja dann fehlt vermutlich ein include.

    Aber es ist eh besser wenn du nicht den den globalen Pointer des Forms benutzt sondern der Klasse Board einen eigenen Pointer auf das Form mitgibst, am besten über den Konstruktor.

    bis bald
    akari



  • Beide Klassenvereinbarungen stehen in der üblichen "Unit1.h".

    Wie sähe so ein Pointer auf das Form in dem Konstruktor von "Board" aus?



  • Hallo

    Definition der Klasse

    class Board {
            private:
                    //Variablen
                    int addr;
                    TForm* m_Form;
            public:
                    //Methoden
                    Board(TForm1* Form); //Konstruktor
                    void connect(); //Verbindung zum Board herstellen
    };
    

    Implementation der Klasse

    Board::Board(TForm1* Form) : m_Form(Form)
    {
    }
    
    void Board::connect() {
            m_Form->...
    }
    

    Verwendung der Klasse aus dem Form heraus :

    ... new Board(this);
    

    Dabei ist zu beachten das bei der Definition von Board bereits TForm1 bekannt sein muß. Da wäre es angebracht Board in eine eigene Unit auszulagen und richtig zu includen. Eventuell auch Forward Declaration verwenden.

    bis bald
    akari



  • Danke für die schnelle Hilfe! 🙂 👍

    Leider ernte ich immer noch Fehlermeldungen, und zwar:

    [C++ Fehler] Board.h(21): E2316 'VerbindungsStatus' ist kein Element von 'TForm'
    [C++ Fehler] Board.h(22): E2316 'OpenDevice' ist kein Element von 'TForm'
    etc...
    

    So sieht meine Unit1.cpp im Moment aus:

    [...]
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
            MeinBoard = new Board(this);
    }
    

    Meine Unit1.h so:

    [...]
    class TForm1 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
            TButton *Button1;
            TLabel *VerbindungsStatus;
            void __fastcall Button1Click(TObject *Sender);
    private:	// Anwender-Deklarationen
    public:		// Anwender-Deklarationen
            __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #include "Board.h"  //"Includierung" der Klasse Board
    #endif
    

    und meine Board.h so:

    class Board {
            private:
                    //Variablen
                    TForm* m_Form;
                    int addr; //speichert die Adresse des Boards (0 bis 3)
            public:
                    //Methoden
                    Board(TForm1* Form); //Konstruktor
                    void connect(); //Verbindung zum Board herstellen
    };
    //---------------------------------------------------------------------------
    Board::Board(TForm1* Form) : m_Form(Form)  {
    }
    //---------------------------------------------------------------------------
    void Board::connect() {
            m_Form->VerbindungsStatus->Caption = "Verbindung wird hergestellt...";
            if(m_Form->OpenDevice(0) == 0) {
    
            [...]
    }
    


  • Hallo

    Sorry im Board.h müßen natürlich alle TForm durch TForm1 ersetzt werden.
    Um jetzt nicht mit den Includes einen Kreis zu bilden siehe Forward Declaration, z.B. hier und Include Guards.

    bis bald
    akari



  • Vielen Dank!

    Ich habe jetzt folgendes gemacht:

    1.) In der Datei Board.h alle "TForm"s durch "TForm1"se ersetzt.
    2.) Die Include Anweisung für die Datei Board.h in die Unit1.cpp verschoben, wie hier hier beschrieben.

    Jetzt scheint der Compiler das Label "VerbindungsStatus" zu kennen. Es werden nur noch 2 Fehlermeldungen angezeigt:

    [C++ Fehler] Board.h(24): E2316 'OpenDevice' ist kein Element von 'TForm1'
    [C++ Fehler] Unit1.cpp(20): E2451 Undefiniertes Symbol 'MeinBoard'
    

    Der Befehl "OpenDevice" kommt aus einer DLL Datei, deren .lib Datei ich über Projekt->Dem Projekt hinzufügen hinzugefügt habe. Außerdem habe ich in der Unit1.cpp Datei noch die Header Datei der DLL eingebunden:

    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    #include "K8055D.h"  //<-- Die Header Datei der DLL
    #include "Board.h"   //<-- Hier wird die Klasse Board includiert
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    [...]
    

    Dieser Einbindungsprozess müsste korrekt sein, da bevor ich angefangen habe meine Klasse "Board" zu benutzen die Befehle wie "OpenDevice" alle geklappt haben.

    MeinBoard ist der Name den ich der Instanz der Klasse "Board" geben will in der Datei Unit1.cpp geben will:

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
            MeinBoard = new Board(this);
    }
    

    Ich habe die Header Datei der DLL schon mal testweise in die Datei Board.h eingesetzt, doch bewirkt hat es nichts...


Anmelden zum Antworten