Objekt von TForm1 nicht bekannt in TForm2



  • Hallo,

    ich habe eine Klasse rs232 und erstelle ein Objekt com1 in der Klasse TForm1.

    rs232 *com1 = new rs232;
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    
    }
    //----------------------------------------------------------------------------
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
         com1->baudrate = 2400;
         com1->comport  = "com1";
         com1->timeout  = 1000;
         if(!(com1->init_rs232()))
         {
              Application->MessageBox("RS232 Port is already used"," ",MB_OK | MB_ICONERROR);
              Application->Terminate();
         }
    
    }
    //-----------------------------------------------------------------------------
    Nun habe ich ein weiteres Formular Form2 und erstelle es
    void __fastcall TForm1::Baudrate1Click(TObject *Sender)
    {
         Application->CreateForm(__classid(TForm2), &Form2);
    }
    //---------------------------------------------------------------------------
    //---------------------------------------------------------------------------
    In der der Klasse TForm2 ist nun aber mein Objekt com1 aus TForm1 nicht bekannt
    //---------------------------------------------------------------------------
    void __fastcall TForm2::FormCreate(TObject *Sender)
    {
         Form1->com1->close_comport();
    }
    Fehler "com1 ist kein Element von TForm1"
    

    Da ich in TForm2 den header von TForm1 include, müsste es doch eine Möglichkeit
    geben das Objekt com1 "rs232 *com1 = new rs232" im header von TForm1 zu initialisieren, im header von TForm1 habe ich ebenfalls den header der Klasse rs232 includet, funktioniert aber nicht mit der Fehlermeldung:
    "KlassenElement kann hier nicht initialisiert werden"".
    Wie kann ich soetwas machen?



  • Öhm, natürlich ist com1 kein Element von Form1, weil du es nicht in Form1 angelegt hast, sondern global. 😃

    Wenn du ein Objekt, das zum Formular gehören soll, anlegen willst, musst du das in der Header machen und nicht einfach in der CPP-Datei.



  • Hallo,

    danke für deine Antwort.

    Hoffmann_Till schrieb:

    Wenn du ein Objekt, das zum Formular gehören soll, anlegen willst, musst du das in der Header machen und nicht einfach in der CPP-Datei.

    Das habe ich schon erfolglos versucht.

    Wenn ich com1 im header von TForm1 initialisiere "rs232 *com1 = new rs232" kommt die Fehlermeldung:
    KlassenElement kann hier nicht initialisiert werden.

    Den Header der Klasse rs232 habe ich natürlich in den header von TForm1
    included.



  • Hi Hermes:

    Im Header Form1 DEKLARIERST Du eine Member- Variable *Com1

    Im Construktor / OnCreate erzeugst Du eine Instanz mit new

    Im Destructor / OnClose deletest Du das Teil!

    WICHTIG: Die Variable muss ein Member von Form 1 sein.



  • Hi,

    meinst du das so:

    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include "rs232.h"
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
    	TButton *Button1;
    	void __fastcall Button1Click(TObject *Sender);
    private:	// Anwender-Deklarationen
    public:		// Anwender-Deklarationen
    	__fastcall TForm1(TComponent* Owner);
         rs232* com1;
    };
    Konstruktor
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    {
    	rs232* com1 = new rs232;
    }
    
    TForm2
    void __fastcall TForm2::FormCreate(TObject *Sender)
    {
         Form1->com1->baudrate = 19200;
         Form1->com1->comport  = "com2";
         Form1->com1->timeout  = 1000;
         if(!(Form1->com1->init_rs232()))
         {
              Application->MessageBox("RS232 Port is already used"," ",MB_OK | MB_ICONERROR);
              Application->Terminate();
         }
    }
    

    Läuft nicht mit der Fehlermeldung:
    com1 ist kein Element von TForm1



  • Hermes schrieb:

    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
        rs232* com1 = new rs232;
    }
    

    Muss so ausssehen:

    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
        com1 = new rs232;
    }
    

    Kennst du dich mit Klassen, Pointern usw. aus???



  • Alles klar, ich habe im Header von TForm1 ja schon den pointer rs232* com1 declariert.

    Habe eigentlich keine Probleme mit Pointer wie z.B. char* int* const char*
    char a; char* pt = &a;
    der Pointertyp rs232* hat mich ein bischen verwirrt.

    Mit rs232* com1 = new rs232 declariere ich im Konstruktor natürlich einen Pointer der nichts
    mit der public Membervariable rs232* com1 inTForm1 zu tun hat, sprich das Objekt hat nur im Konstruktor seine gültigkeit.

    Mit dem Ausdruck com1 = new com1 wird der Pointer TForm1->com1 initialisiert, der für
    das Objekt com1 als Zeiger auf alle seine Eigenschaften/Variabeln zeigt.

    Dieser Zeiger wird z.B. beim aufruf der MemberFunktion der Klasse rs232 com1->init_rs232() mit übergeben (this)
    in der dann die Eigenschaften/Variabeln des Objekts com1 als Kriterium benutzt werden.

    Intialisiere ich ein weiteres Objekt der Klasse rs232 z.B. com2 wird wiederum
    ein Zeiger auf den Speicherbereich der Eigenschaften/Variabeln erstellt.

    Es ist wichtig mit delete Objekte zu löschen wenn sie nicht mehr benötigt werden, da sonst der Speicherbereich nicht freigegeben wird.

    Falls ich da irgendetwas missverstanden habe korrigiert mich bitte.

    Noch eine Frage:
    __published:
    TEdit Edit1;
    public:
    rs232
    com1;

    Wo liegt hier der Unterschied bei den declarierten Objektzeigern?

    Vielen Dank


Anmelden zum Antworten