Parameter Übergabe zwischen zwei Klassen



  • Ersteinmal stimme ich Devil81 mal zu...

    Nun zu deinem Problem das wohl sinnvollste ist es einen Pointer deiner Klasse an den neuen Dialog zu übergeben.

    Beachte aber bitte das die Instanz auch weiter existieren muss denn ansonsten knallt es im Speicher.

    Des Weiteren solltest du dein Problem mal ein wenig genauer Erklären....

    Dann wird man die helfen können !



  • So???

    CClass1* pClass1 = new CClass1; // Pointer auf meine erste Klasse
    CClass2 instanz_class2 = new CClass2; // Instanz meiner zweiten KLasse

    instanz_class2.SetVars( pClass1 ); // Übergabe Pointer auf erste Klasse
    // an Funktion SetVars von zweite KLasse 😕



  • Mensch Cassimus zeig doch mal ein bisschen mehr CODE !



  • Das ist die Funktion aus meiner ersten KLasse :

    void CNewTermEmuDlg::OnButton2()
    {
    CNewTermEmuDlg * pCNewTermEmuDlg = new CNewTermEmuDlg;
    COnlinezeitpunkt test = new COnlinezeitpunkt;

    test.SetVars( pCNewTermEmuDlg );

    m_ozp.Create(IDD_OZP_DLG,NULL);
    m_ozp.ShowWindow(SW_SHOW);
    m_ozp.SetWindowPos(NULL, 841, 254, 225, 488, SWP_NOZORDER);
    }

    Ich möchte hier in dieser Funktion verschiedene Editfelder aus der zeiten Klasse
    (Dialogfeld) belegen und dann anzeigen lassen.
    Und mit dieser Funktion aus der zweiten Klasse will ich die Variablen
    annehmen und in den Editfeldern ausgeben...

    void COnlinezeitpunkt::SetVars(class CNewTermEmuDlg * p)
    {

    display_ozp01.SetWindowText( p->ozp01 ); // ozp01 ist variable aus klasse1
    display_ozp02.SetWindowText( p->ozp02 ); //
    display_ozp03.SetWindowText( p->ozp03 ); // display_ozp0x ist cedit aus klasse2
    display_ozp04.SetWindowText( p->ozp04 ); // in dem ich den wert der übergebenen
    display_ozp05.SetWindowText( p->ozp05 ); // variablen ausgeben will
    display_ozp06.SetWindowText( p->ozp06 );
    display_ozp07.SetWindowText( p->ozp07 );
    display_ozp08.SetWindowText( p->ozp08 );
    display_ozp09.SetWindowText( p->ozp09 );

    }
    Ich hoffe mein Problem ist jetzt irgendwie verständlich geworden...



  • ist alles ok. nur du musst um den wert zu erhalten, nicht eine neue Instanz anlegen,
    sondern du übergibtst den this zeiger an die Funktion.

    Devil



  • Habs jetzt so probiert...

    void CNewTermEmuDlg::OnButton2()
    {
    ozp01 = "123;
    ozp02 = "111";
    ozp03 = "222";
    ozp04 = "333";
    ozp05 = "484";
    ozp06 = "665";
    ozp07 = "444";
    ozp08 = "333";
    ozp09 = "666";

    CNewTermEmuDlg * jetzt = new CNewTermEmuDlg;

    COnlinezeitpunkt test2 = new COnlinezeitpunkt;

    test2.SetVars( this );
    }
    ...nun bekomme ich aber in der Funktion SetVars beim Befehl :

    display_ozp01.SetWindowText( p->ozp01 );
    ...

    die Fehlermeldung :
    Debug Assertion Failed!
    File: winocc.cpp
    Line: 229

    Und dann Unknown Software Exception...

    Was mach ich falsch??



  • Also ich würde dir folgendes Vorschlagen.

    In deiner Klasse, die die Variablen anzeigen sollen definierst du Global ein LPVOID m_pKlasse.
    Jetzt fügst du folgende Zeile in den Konstruktor dieser Klasse ein.
    m_pKlasse = NULL;

    Bevor der Dialog angezeigt werden soll übergibst du den Pointer der Klasse die die Daten enthält wie folgt !
    Entweder
    p.m_pKlasse = x;
    oder
    p.m_pKlasse = this;
    oder du schreibst dir wieder eine Funktion.

    Nun rufst du zum Beispiel DoModal() des Dialoges auf der angezeigt werden soll !

    In die Funktion OnInitDialog dieses Dialoges greifst du nun auf m_pKlasse zu und zwar wie folgt !

    KlassenName* m_pKlassenInstanz = (KlassenName*)m_pKlasse
    KlassenName = Name der Klasse die die Variablen enthält !

    so und nun kannst du deine EditFelder mit SetWindow füllen.
    Dazu benutzt du m_pKlassenInstanz->.... als Wert !

    Sollte jetzt eigentlich funktionieren und sauber sein !

    [ Dieser Beitrag wurde am 02.12.2002 um 13:19 Uhr von DaDaywalker editiert. ]



  • Irgendwie will das hier alles nicht funktionieren,
    nun hab ichs so gemacht :

    Klasse1

    void CNewTermEmuDlg::OnButton2()
    {
    COnlinezeitpunkt test = new COnlinezeitpunkt;
    test.m_pKlasse = this;

    m_ozp.DoModal();
    }

    Klasse 2:

    BOOL COnlinezeitpunkt::OnInitDialog()
    {
    CDialog::OnInitDialog();

    CNewTermEmuDlg * testinstanz = (CNewTermEmuDlg)m_pKlasse;

    return TRUE;
    }
    --> ergibt Fehlermeldung :
    error C2440: 'type cast' : 'void *' kann nicht in 'class CNewTermEmuDlg' konvertiert werden Quelltyp konnte von keinem Konstruktor angenommen werden, oder die Ueberladungsaufloesung des Konstruktors ist mehrdeutig

    Das kann doch nicht so schwer sein...oder sollt ich doch besser Kindergärtner werden und mich dem Coden abwenden... 😮



  • Original erstellt von Casimus:
    **Irgendwie will das hier alles nicht funktionieren,
    nun hab ichs so gemacht :

    Klasse1

    void CNewTermEmuDlg::OnButton2()
    {
    COnlinezeitpunkt test = new COnlinezeitpunkt;
    test.m_pKlasse = this;

    m_ozp.DoModal();
    }

    Klasse 2:

    BOOL COnlinezeitpunkt::OnInitDialog()
    {
    CDialog::OnInitDialog();

    CNewTermEmuDlg * testinstanz = (CNewTermEmuDlg)m_pKlasse;

    return TRUE;
    }
    --> ergibt Fehlermeldung :
    error C2440: 'type cast' : 'void *' kann nicht in 'class CNewTermEmuDlg' konvertiert werden Quelltyp konnte von keinem Konstruktor angenommen werden, oder die Ueberladungsaufloesung des Konstruktors ist mehrdeutig

    Das kann doch nicht so schwer sein...oder sollt ich doch besser Kindergärtner werden und mich dem Coden abwenden... 😮**

    Naja wie wäre es denn wenn du bei (CNewTermEmuDlg*)m_pKlasse hinschreiben würdest dann würde es funktionieren.

    BOOL COnlinezeitpunkt::OnInitDialog()
    {
    CDialog::OnInitDialog();

    CNewTermEmuDlg * testinstanz = (CNewTermEmuDlg)m_pKlasse;

    ////////////////////////////////////////////////////////////////////////////
    Du solltest noch überprüfen ob m_pKlasse nicht NULL ist.
    if (m_pKlasse)
    { // jetzt felder belegen

    }
    else
    {
    // Fehlermeldung z.B

    }

    ////////////////////////////////////////////////////////////////////////////
    Hier müssen aber nun die Felder belegt werden denn ansonsten ist testinstanz
    nicht mehr gültig !
    ////////////////////////////////////////////////////////////////////////////

    return TRUE;
    }



  • Okay ich gebs auf...es will nicht klappen.
    Dann muss ich mir was andres überlegen...
    das Problem quasi umgehen...😡 😡 😡

    BIG THX 2 DaDaywalker & devil81



  • Mensch jung dat kann doch nicht so schwer sein schick mir mal das Projekt als zip gepackt dann schau ich mir das mal an !



  • Okay müsste da sein... :p



  • Lern doch erst mal C/C++ .........



  • Original erstellt von <->:
    Lern doch erst mal C/C++ .........

    Das wäre wohl das beste...

    Devil



  • He zu diesem Thema gibt es jede Menge in der datenbank

    Versuche es mal unter Suchen

    Andreas


Anmelden zum Antworten