Neue Form erstellt, aber kein Zugriff auf die 1. Form



  • Hi,

    ich habe eine HauptForm ( Form1 ). Dort initiallisere ich einen ClientSocket und baue eine Verbindung zu einem Server auf.
    Sobald die Verbindung erfolgreich ist, soll dich Unterform( Form2 ) öffnen. Das klappt auch ganz gut. So jetzt möchte ich aber über "Form2" auf das ClientSocket Objekt zugreifen. Nur wie?? Ich habe keine Methode gefunden, wo einen einen Pointer mitübergeben kann. Beim MS VC++ hab ich die DoModal Funktion dazu mitgenutzt. Nur die gibts beim BCB ja nciht mehr. Ok ich kann den Konstruktor der Klasse Form2 so umschreiben das dieser nen Pointer übernimmt. Nur muss ich ihn dann ja irgendwo aus der Form1 Klasse übergeben.

    Wie macht ihr dieses am besten??



  • Nehmen wir an deine Form1 heißt frmMain,
    dort legst du das ClientSocket Objekt als Memvar ab z.B.

    TClientSocket* m_CS; // in Header

    m_CS = new TClientSocket; // in CPP Datei

    nun includierst du in Form2 den Header von Form1, somit hat du dort auch Zugriff auf frmMain und kannst nun deine m_CS mit

    frmMain->m_CS->....... ansprechen!!!!!!!!!



  • woow... na das geht aber nicht so einfach...

    wenn man zwar in der ersten form(klasse) ein Objekt anlegt TClientSocket *m_CS;

    und diesem Speicher zuweist mit m_CS = new TCLientSocket;

    hat das Obejekt zwar Speicher und man kann damit arbeiten. Includierst du nun aber Form1 in Form2, musst du aber für Form2 auch ein Objekt erstellen. also

    TForm1 *form1;

    form1 = new Tform1;

    somit hast du aber zwei Objekte mit zwei verschiedenen Speicherbereichen von Form1.

    Man muss aber in der Form2 ein Objekt für Form1 anlegen:
    Tform1 *form1;

    und diesem Objekt (form1) die Speicheradresse von der richtigen Form1 übergeben. Dies macht man sonst(bzw ich sonst über einen Konstruktor) nur Leider klappt das mit dem BCB nicht.



  • wenn du nur auf die erste, also die MainForm der Anwendung zugreifen willst, kannst du das auch über

    Application->MainForm
    

    machen. ansonsten gibt es in den FAQ da ein beispiel zu und mit der suchfunktion findet man im normalfall auch einiges. 😉

    oli



  • Hallo,

    ist bei dir denn frmMain kein globales Objekt der Unit1.h auf welche du von überall zugreifen kannst?

    Also frmMain->blahblah sollte dann schon funktionieren, du darfst dir aber natürlich über Form2 nicht nochmal frmMain mit new überschreiben.

    Also du machst in FOrm1 z.B.
    Form2 = new TForm2(Application)

    und in Form2 kannst du dann ganz einfach z.B.
    Form1->Caption = "Muhh";

    machen...

    Gruß,
    Robert



  • ich glaub ich bin noch zusehr an das Visual Studio gewöhnt...

    @der oli, habe in der FAQ dazu leider nichts gefunden, habe schon gesucht bevor ich diesen Thread erstellt hatte. Auch die Borland Hilfe kann mir nicht weiter helfen.

    @rowisoft:
    in der form1.h habe ich ein globales Objekt

    extern PACKAGE Tlogin_from *login_from;
    

    so nur wie soll ich denn darauf jetzt aus form2.cpp/form2.h zugreifen??

    deklariere ich in der form2.cpp ein Objekt etwa so:

    #include <vcl.h>
    #pragma hdrstop
    
    #include "main.h"
    #include "login.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    Tmain_form *main_form;
    Tlogin_form *login_form;
    //---------------------------------------------------------------------------
    __fastcall Tmain_form::Tmain_form(TComponent* Owner)
            : TForm(Owner)
    {
    }
    

    bekomme ich in der Zeile Tlogin_form *login_form einen Syntax Error.

    Und mit Application kann ich aus der form2 nur auf die form2 zugreifen, nicht aber auf die form1.

    PS ich habe den C++ Builder 6





  • Hallo,

    Wenn du die main.h eh schon inkludierst, wozu dann noch diese Zeile?:

    Tlogin_form *login_form;
    

    Lass die doch weg und greif einfach auf login_form->... zu!

    Gruß,
    Robert



  • ich habe exakt das gleiche prob. nur wenn ich jetzt die instanzen in der header-datei vereinbare, bekomme ich den fehler, dass ein typname erwartet würde.

    server *Chatserver;
    client *Chatclient;
    // funzt net
    

    dagegen bei einer vereinbarung direkt in der cpp-datei, kommt der fehler nicht.

    /EDIT und die FAQ bringt mir auch nicht viel



  • Wenn die Objekte in der Header-Datei deklariert werden, muss natürlich das include in die Header-Datei.



  • welches include denn nur?



  • also mal ganz laaangsam...

    wenn ich form2 in form1 includiere und nen objekt anlege klappt alles einwandfrei...

    lege ich aber in form2 nen objekt für form1 ab und includiere form1 klappt es nicht und ich bekomme nen syntax error.

    Teil Code der Form1.cpp

    #include <vcl.h>
    #pragma hdrstop
    
    #include "login.h"
    #include "main.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    Tlogin_from *login_from;
    Tmain_form *main_form;
    //---------------------------------------------------------------------------
    __fastcall Tlogin_from::Tlogin_from(TComponent* Owner)
            : TForm(Owner)
    {
    
    }
    //---------------------------------------------------------------------------
    

    so nun der form1.h

    //---------------------------------------------------------------------------
    
    #ifndef loginH
    #define loginH
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <Sockets.hpp>
    #include <ScktComp.hpp>
    //---------------------------------------------------------------------------
    class Tlogin_from : public TForm
    {
    __published:	// IDE-managed Components
            TLabel *Label1;
            TLabel *Label2;
            TEdit *txt_Benutzername;
            TEdit *txt_Kennwort;
            TButton *b_Login;
            TClientSocket *ClientSocket;
            TButton *bConnect;
            TButton *bDisconnect;
            void __fastcall b_LoginClick(TObject *Sender);
            void __fastcall TcpClientConnect(TObject *Sender);
            void __fastcall TcpClientReceive(TObject *Sender, PChar Buf,
              int &DataLen);
            void __fastcall bConnectClick(TObject *Sender);
            void __fastcall ClientSocketConnect(TObject *Sender,
              TCustomWinSocket *Socket);
            void __fastcall ClientSocketDisconnect(TObject *Sender,
              TCustomWinSocket *Socket);
            void __fastcall ClientSocketError(TObject *Sender,
              TCustomWinSocket *Socket, TErrorEvent ErrorEvent,
              int &ErrorCode);
            void __fastcall bDisconnectClick(TObject *Sender);
            void __fastcall ClientSocketRead(TObject *Sender,
              TCustomWinSocket *Socket);
    private:	// User declarations
    public:		// User declarations
            __fastcall Tlogin_from(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE Tlogin_from *login_from;
    //---------------------------------------------------------------------------
    #endif
    

    so und nun die form2.cpp

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "main.h"
    #include "login.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    Tlogin_form *login_form;
    Tmain_form *main_form;
    
    //---------------------------------------------------------------------------
    __fastcall Tmain_form::Tmain_form(TComponent* Owner)
            : TForm(Owner)
    {
    
    }
    //---------------------------------------------------------------------------
    

    und nun die form2.h

    //---------------------------------------------------------------------------
    
    #ifndef mainH
    #define mainH
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    class Tmain_form : public TForm
    {
    __published:	// IDE-managed Components
            TButton *bLogout;
    private:	// User declarations
    public:		// User declarations
            __fastcall Tmain_form(TComponent* Owner);
    
    };
    //---------------------------------------------------------------------------
    extern PACKAGE Tmain_form *main_form;
    //---------------------------------------------------------------------------
    #endif
    

    so in der form2.cpp habe ich die form1.h (login.h) includiert und ein Objekt angelegt. nur leider bekomme ich dabei nen Syntax error.

    Hoffe ihr könnt mir nun genauer weiterhelfen, bzw dem Hilflosen Kollegen auch.



  • Hallo,

    warum legst du denn in Unit2 nochmal das Object von Unit1 an?
    So schauts aus:

    Unit1.h:

    //---------------------------------------------------------------------------
    
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
    private:	// Anwender-Deklarationen
    public:		// Anwender-Deklarationen
      __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    

    Unit1.cpp:

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    #include "Unit2.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
      : TForm(Owner)
    {
      Form2 = new TForm2(Application);
      Form2->Show();
    }
    //---------------------------------------------------------------------------
    

    Unit2.h:

    //---------------------------------------------------------------------------
    
    #ifndef Unit2H
    #define Unit2H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    class TForm2 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
    private:	// Anwender-Deklarationen
    public:		// Anwender-Deklarationen
      __fastcall TForm2(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm2 *Form2;
    //---------------------------------------------------------------------------
    #endif
    

    Unit2.cpp:

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    #include "Unit2.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm2 *Form2;
    //---------------------------------------------------------------------------
    __fastcall TForm2::TForm2(TComponent* Owner)
      : TForm(Owner)
    {
      Form1->Caption = "jetzt ist Form2 auch da";
      //hier kannst du auf Form1 zugreifen
    }
    //---------------------------------------------------------------------------
    

    Achso: Und unter "Projekt" - "Optionen" - "Formulare" braucht unter "Automatisch erzeugen" dann nur Form1 stehen, Form2 packst du nach "Verfügbare Formulare".
    Wenn du das nicht machst, brauchst du in der Form1.cpp die Form2 gar nimmer mit new erzeugen, sondern nur noch ->Show machen. Dann allerdings ist immer von Anfang an schon eine Instanz von Form2 da, auch wenn dus noch nicht brauchst.

    Gruß,
    Robert



  • also ich weiß ja nich was du da machst, aber irgendwie klappt es nicht, genau so wie du es geschrieben hast klappt der form1 aufruf NICHT!... Form2 wird geöffnet aber schreibe ich den Konstruktor der form2 login_form->

    meldet er genau DIESE Fehlermeldung:

    Unable to invoke Code Conpletation due to errors in source code

    Und das hatte ich ja vorher auch schon.. die main_form(form2) habe ich mit main_form = new TMainForm(Application);
    main_form->show();

    aufgerufen.



  • Hallo,

    hast du diese beiden Zeilen in der Unit2.cpp von mir beachtet?:

    #include "Unit1.h"
    #include "Unit2.h"
    

    Gruß,
    Robert



  • na logo hab ich die drin.. hier nochmal die unit1.cpp und die undit2.cpp

    unit1

    #include <vcl.h>
    #pragma hdrstop
    
    #include "login.h"
    #include "main.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    Tlogin_from *login_from;
    //---------------------------------------------------------------------------
    __fastcall Tlogin_from::Tlogin_from(TComponent* Owner)
            : TForm(Owner)
    {
    
    }
    
    void __fastcall Tlogin_from::bConnectClick(TObject *Sender)
    {
             main_form = new Tmain_form(Application);
             main_form->Show();
            //ClientSocket->Active = true;
    }
    

    unit2

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "main.h"
    #include "login.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    Tmain_form *main_form;
    
    //---------------------------------------------------------------------------
    __fastcall Tmain_form::Tmain_form(TComponent* Owner)
            : TForm(Owner)
    {
    
    }
    

    wunder mich nur das das bei euch klappen soll und bei mir nich...



  • Hallo,

    Warum so kompliziert... 😕
    unit1.h

    #include "unit2.h"
    #include "unit3.h"
    

    unit1.cpp

    #include "unit1.h"
    

    unit2.cpp

    #include "unit1.h"
    

    unit3.cpp

    #include "unit1.h"
    

    So kann jedes Form auf die anderen zugreifen. Der einzige Nachteil ist, das immer alle Units kompiliert werden, wenn man in einem Header was ändert.

    Bis dann denn,
    🙂
    Nash


Anmelden zum Antworten