Button einfügen



  • Hallo,
    ich habe ein Formular, in dem ich schon einige Button eingefügt habe und mit Behandlungsroutinen versehen habe.
    Die funktionieren auch prima...

    Jetzt will ich einen weiteren Button einfügen und der Funktioniert nicht !!!

    Nachdem ich ihn eingefügt und doppelt angeklickt habe bestätige ich das ON_Click Ereignis und komme auch in die Funktion zum codieren.
    Ich habe aber keinen Zugriff auf Membervariablen oder ähnliches in dieser Funktion!

    Der Editor trägt diesen Code in die .cpp-Datei ein, was er bei den anderen Button nicht gemacht hat:

    BEGIN_MESSAGE_MAP(Optionen, CDialog)
    //{{AFX_MSG_MAP(Optionen)
    ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()

    In der Header-datei sieht das so aus:

    // Generierte Nachrichtenzuordnungsfunktionen
    //{{AFX_MSG(Optionen)
    virtual void OnOK();
    afx_msg void OnButton1();
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()

    Der OK-Button ist als virtual deklariert und Button1 als afx_msg ???????

    Was mache ich falsch ???



  • Das ist schon ok so. Für Buttons mit IDOK und IDCANCEL ist diese Behandlungsroutine schon in der Basisklasse CDialog. Allerdings wundert es mich, dass du nicht auf Membervariablen zugreifen kannst. Zeig mal deinen Code.



  • Hier ist der Code:

    // Optionen.cpp: Implementierungsdatei
    //

    #include "stdafx.h"
    #include "GameStarter.h"
    #include "Optionen.h"
    #include "DatenScreen.h"

    #ifdef DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE
    _;
    #endif

    DatenScreen sDat;

    /////////////////////////////////////////////////////////////////////////////
    // Dialogfeld Optionen

    Optionen::Optionen(CWnd* pParent /=NULL/)
    : CDialog(Optionen::IDD, pParent)
    {
    //{{AFX_DATA_INIT(Optionen)
    m_VollScreen = FALSE;
    m_Schatten = FALSE;
    m_Device = -1;
    m_Screen = -1;
    m_Bit = -1;
    //}}AFX_DATA_INIT
    }

    void Optionen::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(Optionen)
    DDX_Control(pDX, chkVollScreen, mc_VollScreen);
    DDX_Control(pDX, chkSchatten, mc_Schatten);
    DDX_Control(pDX, lstBit, mc_Bit);
    DDX_Control(pDX, lstDevice, mc_Device);
    DDX_Control(pDX, lstScreen, mc_Screen);
    DDX_Check(pDX, chkVollScreen, m_VollScreen);
    DDX_Check(pDX, chkSchatten, m_Schatten);
    DDX_CBIndex(pDX, lstDevice, m_Device);
    DDX_CBIndex(pDX, lstScreen, m_Screen);
    DDX_CBIndex(pDX, lstBit, m_Bit);
    //}}AFX_DATA_MAP
    }

    BEGIN_MESSAGE_MAP(Optionen, CDialog)
    //{{AFX_MSG_MAP(Optionen)
    ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()

    /////////////////////////////////////////////////////////////////////////////
    // Behandlungsroutinen für Nachrichten Optionen

    void Optionen::OnOK(){
    // Daten speichern
    sDat.RenderDevice = mc_Device.GetCurSel();
    sDat.Resolution = mc_Screen.GetCurSel();
    sDat.Farbtiefe = mc_Bit.GetCurSel();
    sDat.Vollbild = 0;
    if(mc_VollScreen.GetCheck())
    sDat.Vollbild = 1;
    sDat.Schatten = 0;
    if(mc_Schatten.GetCheck())
    sDat.Schatten = 1;
    sDat.SaveDaten();
    CDialog::OnOK();
    }

    void Optionen::LoadDaten(){
    // Daten laden
    sDat.LoadDaten();
    // Daten anzeigen
    m_Device = sDat.RenderDevice;
    m_Screen = sDat.Resolution;
    m_Bit = sDat.Farbtiefe;
    m_VollScreen = (sDat.Vollbild==1);
    m_Schatten = (sDat.Schatten==1);
    }

    void Optionen::OnButton1(){
    sDat.Farbtiefe = 1;
    //mc_Schatten.

    }

    Also, auf sDat habe ich Zugriff (wenn ich den Punkt eingebe kommt die Liste mit allen Funktionen und Eigenschaften)...
    mc_Schatten ist eine Membervariable vom Typ Control.
    In der Routine zum Button OK greife ich darauf zu (if(mc_Schatten.GetCheck())) und es funktioniert aber in Button1 nicht !!!!
    Gebe ich bei OnOK den Punkt hinter mc_Schatten ein bekomme ich alle Eigenschaften und Funktionen in der Pulldownliste aber nicht in OnButton1...
    Beim Compilieren gibt es keine Fehlermeldung aber der Button funktioniert nicht (im ausgeführten Prog)...

    Ich weiß nicht mehr weiter, habe alles mögliche probiert... 😢

    CU



  • sollte so aber tun ..



  • Servus,

    ist vielleicht OnButton1() in der .h als protected oder privat oder sonst was ausser public deklariert?
    wie sieht denn die .h aus? (Wenn du den Quelltext reinstellen solltest benutz bitte die Tags, dann kam mans besser lesen 😋 )

    *winke*
    Hellsgore



  • Hi.
    Was sagt Debuger?
    So wie ich es verstehe, nachdem Click auf Button1 muss sich eine Farbe ändern.
    Versuchst du in OnButton1 UpdateData oder UpdateWindow einfügen.



  • Hellsgore schrieb:

    Servus,

    ist vielleicht OnButton1() in der .h als protected oder privat oder sonst was ausser public deklariert?
    wie sieht denn die .h aus? (Wenn du den Quelltext reinstellen solltest benutz bitte die Tags, dann kam mans besser lesen 😋 )

    *winke*
    Hellsgore

    lol ... Ist doch egal, als was OnButton1 deklariert ist, das ändert nichts daran, dass sie auf die Variablen in der eigenen Klasse zugreifen kann, sondern nur was an der Sichtbarkeit nach aussen.



  • *g*
    jaja ich habs jetzt auch nochmal durchgelesen völliger Unfug.....
    Hatte noch keinen Kaffee zu dem Zeitpunkt gehabt 😃

    *winke*



  • Hier noch die Header:
    ich kann in den schon bestehenden Funktionen problemlos auf die MVariablen zugreifen, aber jetzt - selbst wenn ich eine einfache neue Member-Funktion einfüge (wie vorher z.B. DatLoad, wo's funktioniert) habe ich keinen Zugriff darauf, eben nur noch in den alten Funktionen !?!?!?!
    Die Funktion selber wird aufgerufen (mit Breakpoint getestet), der Compiler macht keinen Mucks (0 Warnungen, 0 Fehler), Operationen mit der Membervariablen ergeben keine Fehler (weder Compiler nocht Laufzeit) haben aber auch keinerlei Wirkung !!!

    #if !defined(AFX_OPTIONEN_H__1837290C_DEC2_4C74_9BCF_D12D82DD1DCB__INCLUDED_)
    #define AFX_OPTIONEN_H__1837290C_DEC2_4C74_9BCF_D12D82DD1DCB__INCLUDED_

    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    // Optionen.h : Header-Datei
    //

    /////////////////////////////////////////////////////////////////////////////
    // Dialogfeld Optionen

    class Optionen : public CDialog
    {
    // Konstruktion
    public:
    void LoadDaten();
    Optionen(CWnd* pParent = NULL); // Standardkonstruktor

    // Dialogfelddaten
    //{{AFX_DATA(Optionen)
    enum { IDD = frmOptionen };
    CButton mc_VollScreen;
    CButton mc_Schatten;
    CComboBox mc_Bit;
    CComboBox mc_Device;
    CComboBox mc_Screen;
    BOOL m_VollScreen;
    BOOL m_Schatten;
    int m_Device;
    int m_Screen;
    int m_Bit;
    //}}AFX_DATA

    // Überschreibungen
    // Vom Klassen-Assistenten generierte virtuelle Funktionsüberschreibungen
    //{{AFX_VIRTUAL(Optionen)
    protected:
    virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung
    //}}AFX_VIRTUAL

    // Implementierung
    protected:

    // Generierte Nachrichtenzuordnungsfunktionen
    //{{AFX_MSG(Optionen)
    virtual void OnOK();
    afx_msg void OnButton1();
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
    };

    //{{AFX_INSERT_LOCATION}}
    // Microsoft Visual C++ fügt unmittelbar vor der vorhergehenden Zeile zusätzliche Deklarationen ein.

    #endif // AFX_OPTIONEN_H__1837290C_DEC2_4C74_9BCF_D12D82DD1DCB__INCLUDED_



  • Dann zeig uns doch mal deine Operationen ...



  • Na z.B. wenn ich volgendes eingebe:

    if(mc_Schatten.GetCheck())
    sDat.Schatten = 1;

    (mc_Schatten ist eine Membervariable, Typ Control, Checkbox)
    dann habe ich keine Liste wenn ich den Punkt hinter mc_Schatten eingebe, also dürfte das Objekt mc_Schatten da nicht existieren.
    Der Compiler gibt aber keine Fehler oder Warnungen aus.
    Wenn ich auf den Button klicke wird die Funktion zwar ausgeführt, sDat.Schatten behällt aber seinen alten Wert, egal welchen Wert mc_Schatten zurückliefern würde.



  • Rätsel über Rätsel...

    Ich habe jetzt ein neues Formular eingefügt und alles vom alten da hinen kopiert. In dem neuen Formular ist alles wieder normal, ich kann nach belieben Schaltflächen einfügen !!!

    kann mir Das bitte mal einer erklären ?¿¡!¡¿?


Log in to reply