Klassenaufruf/Objekterzeugung aus Windows:Forms Formular...



  • Hallo Zusammen,

    Ich (Programmiererfahren aber neu in der C++ Welt) habe folgendes Problem:
    Ich habe mit dem Dialog Editor von VC2005 Express ein Formular "Form1.h" erstellt. Abhängig von der jeweils aktivierten Schaltfläche soll ein Serieller Datenstream über RS232 ausgegeben werden. Die Datenausgabe läuft über eine eigene Klasse "SCHNITTSTELLE". Als Methoden stehen die vier Befehle Sopen(), Ausgabe(eventNR), Einlesen() und Sclose() zur Verfügung.

    Das grundsätzlich Vorgehen währe ja nun ein Objekt der Klasse Schnittstelle zu erzeugen und dann mittels Zugriffsoperator darauf zuzugreifen. Die Erzeugung des Objektes und die erste Methode zum Öffnen der Schnittstelle soll dabei direkt beim Auruf des Formulars ausgeführt werden.

    SCHNITTSTELLE^ seriell = gcnew SCHNITTSTELLE; //Objekterzeugung
    seriell->Sopen(); //Portöffnung
    

    Als Event bei Betätigung einer Schaltfläche soll dann die entsprechende Schaltflächennummer an die Übertragungsklasse ausgegeben werden:

    seriell -> Ausgabe(2)
    

    Dies funktioniert aber nicht wie es soll.

    Ich habe verschieden Positionen für die Erzeugung des Objektes ausprobiert, allerdings meldet der Compiler dann entweder:
    error C2039: 'seriell': Ist kein Element von 'SE550::Form1'
    oder
    error C3845: "SE550::Form1::seriell": Nur statische Datenmember können innerhalb einer Verweisklasse oder eines Werttyps initialisiert werden.

    Je nach Position der Objekterzeugung.
    Wenn ich die Obejkterzeugung komplett in einen der Event packe, dann funktioniert es, aber die anderen Events können nicht auf dieses Objekt zugreifen. Die Schnittstelle soll aber geöffnet bleiben da es ja auch noch Lesevorgänge gibt! Sonst könnte ich ja in jedem Event diese wieder schließen und erneut darauf zugreifen.

    Daher meine Frage:
    Wie bekomme ich es hin, ein Objekt zu erzeugen, das innerhalb des ganzen Formulars bekannt ist. Also das ich von allen Events darauf zugreifen kann?

    Und da ich gleich dabei bin:
    Die von mir vewendete Klasse ist ja eine managed class.
    Wenn ich jetzt eine unmanaged class ("normales" C++) hätte, wie würde ich darauf innerhalb des Formulars zugreifen?

    Ich hoffe Ihr könnt mir weiterhelfen!

    Gruß
    Carsten



  • Wie bekomme ich es hin, ein Objekt zu erzeugen, das innerhalb des ganzen Formulars bekannt ist. Also das ich von allen Events darauf zugreifen kann?

    ➡
    Mache einen Member in der Form Klasse:

    ref class Form1 : blabla
    {
    blabla
    
    private:
       SCHNITTSTELLE^ seriell;
    };
    

    Dann, beim öffnen:

    seriell = gcnew SCHNITTSTELLE();
    seriell->Sopen();
    

    Dann, beim senden:

    seriell-> Ausgabe(2);
    

    Die von mir vewendete Klasse ist ja eine managed class.
    Wenn ich jetzt eine unmanaged class ("normales" C++) hätte, wie würde ich darauf innerhalb des Formulars zugreifen?

    Einfach benutzen.

    Simon



  • Hallo,

    Es funktioniert, Danke!
    Aber um das auchzu verstehen, was mache ich hier genau, also was bewirkt:

    simon.gysi schrieb:

    ref class Form1 : blabla
    {
    blabla
    
    private:
       SCHNITTSTELLE^ seriell;
    };
    

    ?
    TEile ich damit dem Programm nur mit das irgendwann schon ein Objekt "seriell" vom Typ SCHNITTSTELLE erzeugt wird und dieses Objekt dann global gilt, oder was läuft da ab?
    Immerhin habe ich gerade festgestellt das die ausführung von "seriell-> Ausgabe(2);" nun nicht mehr von der vorherigen erzeugung des Objektes SCHNITTSTELLE durch "seriell = gcnew SCHNITTSTELLE();" abhängt.
    Nun wird versucht diese immer auszuführen, was dann natürlich während der Laufzeit einen Fehler wirft wenn das Objekt nicht erzeugt wurde...

    ICH schrieb:

    Die von mir vewendete Klasse ist ja eine managed class.
    Wenn ich jetzt eine unmanaged class ("normales" C++) hätte, wie würde ich darauf innerhalb des Formulars zugreifen?

    simon.gysi schrieb:

    Einfach benutzen.

    Simon

    Da hätte ich auch eigendlich selbst drauf kommen können 😉

    Gruß
    Carsten



  • TEile ich damit dem Programm nur mit das irgendwann schon ein Objekt "seriell" vom Typ SCHNITTSTELLE erzeugt wird ...

    Salop gesagt: ja.
    Eigentlich wird damit eine Referenz angelegt. Später wird dann mit gcnew ein Objekt erzeugt und diese Referenz wird auf die Adresse des Objektes gesetzt.

    ... dieses Objekt dann global gilt, oder was läuft da ab?

    Global ist es nicht. Es ist eine Member Variable (gehört zur Instanz). Es gehört zu Scope der Klasse.

    Immerhin habe ich gerade festgestellt das die ausführung von "seriell-> Ausgabe(2);" nun nicht mehr von der vorherigen erzeugung des Objektes SCHNITTSTELLE durch "seriell = gcnew SCHNITTSTELLE();" abhängt.
    Nun wird versucht diese immer auszuführen, was dann natürlich während der Laufzeit einen Fehler wirft wenn das Objekt nicht erzeugt wurde...

    Das kannst Du abfangen indem Du prüfst ob die Referenz schon auf was sinnvolles zeigt:

    if (seriell != nullptr)
    {
       seriell->Ausgabe(2);
    }
    

    Simon


Anmelden zum Antworten