Zugriffsproblem



  • Hallo.

    Ich krieg hier bald zuviel. Ich sitze heut schon seid 8 Uhr an diesem Problem. Ich habe alles Mögliche probiert, ich kriege es aber nicht hin.

    Ich will, dass wenn ich auf eine Registerkarte klicke, er den Kundennamen von oben (normales Dialogfeld) mit in das Register nimmt.

    Der Ablauf ist wie folgt: Wenn ich das Programm starte, öffnet sich das Hauptdialogfenster. In diesem öffnet man dan den anderen Dialog, der wie folgt aufgerufen wird:

    TestDlg.h

    CDialog* Pruef_Auf;
    

    TestDlg.cpp

    #include "TestDlg.h"
    
    .....
    .....
    
    void TestDlg::OnStammdatenPrfplne() 
    {
    	// TODO: Code für Befehlsbehandlungsroutine hier einfügen
    	Pruef_Auf = new Pruefplaene;
    	Pruef_Auf->Create(IDD_Pruefplaene, this);
    	Pruef_Auf->ShowWindow(SW_SHOW);
    }
    

    So, dass funktioniert alles wunderbar. So, in diesem Dialog sind dann Registerkarten. Und wenn ich da jetzt auf ein anderes Register klicke, soll er den Text aus dem Dialog mit dem Editfeld (Kundenname) und das Registereditfeld (Kundenname) schreiben.

    Hab das so versucht:

    TABPruefplaene.h
    [cpp]
    #include "TestDlg.h"

    .....
    ....
    ....

    class CTABPruefplaene : public CTabCtrl
    {
    // Konstruktion
    public:
    CTABPruefplaene();
    int m_aktuelleSeite;
    int m_Seitennummern;
    CDialog* m_tabellenSeite[4];
    CTestDlg Handle;

    // Attribute

    public:

    // Operationen
    public:
    void Initialisierung();
    void SetRec();

    // Überschreibungen
    // Vom Klassen-Assistenten generierte virtuelle Funktionsüberschreibungen
    //{{AFX_VIRTUAL(CTABPruefplaene)

    //}}AFX_VIRTUAL

    // Implementierung
    public:
    virtual ~CTABPruefplaene();

    // Generierte Nachrichtenzuordnungsfunktionen
    protected:
    //{{AFX_MSG(CTABPruefplaene)
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point);

    //}}AFX_MSG

    DECLARE_MESSAGE_MAP()
    };
    [/cpp]

    Dann weiter:

    TABPruefplaene.cpp

    void CTABPruefplaene::OnLButtonDown(UINT nFlags, CPoint point) 
    {
    	CString Test;
    	Handle.Pruef_Auf->GetDlgItemText(IDC_Kundenname,Test);
    	MessageBox(Test);
    	CTabCtrl::OnLButtonDown(nFlags, point);
    	if (m_aktuelleSeite != GetCurFocus())
    	{
    		m_tabellenSeite[m_aktuelleSeite]->ShowWindow(SW_HIDE);
    		m_aktuelleSeite = GetCurFocus();
    		m_tabellenSeite[m_aktuelleSeite]->ShowWindow(SW_SHOW);
    		m_tabellenSeite[m_aktuelleSeite]->SetFocus();
    	}
    }
    

    So, das wars! Hier nun die Fehler, die er mir gibt:

    tabpruefplaene.h(22) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'Handle'

    tabpruefplaene.h(22) : error C2501: 'CTestDlg' : Fehlende Speicherklasse oder Typspezifizierer

    tabpruefplaene.h(22) : error C2501: 'Handle' : Fehlende Speicherklasse oder Typspezifizierer

    Ich weiß echt nicht mehr weiter....

    Bitte helft mir!



  • Hi,
    in TestDlg.cpp

    void TestDlg::OnStammdatenPrfplne()
    

    daraus schliesse ich, dass Deine Klasse in TestDlg.h

    class TestDlg : public CDialog
    {
    // ...
    };
    

    heisst.

    Du hast aber in TABPruefplaene.h
    CTestDlg als Typbezeichner stehen.

    Schau mal, ob's daran liegt.

    Gruss,
    Qweety.



  • ja, das ist richtig, aber wie soll ich das denn sonst anders machen?



  • das Problem ist, dass die alle in dieser Klasse sind

    ich hab das schonmal versucht, in eine andere Klasse auszulagern, aber war nicht von erfolg gekrönt



  • ich muss aber mit

    CTestDlg ein neues Handle erstellen, um in anderen Klassen dementsprechend damit arbeiten zu können, worauf ich dann auf die Elemente zugreifen kann



  • Also entweder mit dem 'C' oder ohne das 'C'. Aber im Source immer einheitlich.
    Ich denke, Du hast Dich einfach vertippt. Entweder beim Anlegen der Klasse, oder nachher beim referenzieren.

    Er findet den Bezeichner CTestDlg nicht (so die Fehlermeldung) und das wird wohl daran liegen, dass die Klasse TestDlg (ohne 'C') heisst.

    Schreib in TABPruefplaene.h einfach:

    TestDlg        Handle;
    

    und schau, ob's geht.



  • nee, die Klasse fängt wirklich mit 'C' an

    aber ich hab mal was anderes ausprobiert:

    wenn ich diesen include aus der TABPruefplne.h rausnehme, krieg ich zwar diese Fehler nicht mehr, aber kann logischerweise auch nichts mit dem Handle anfangen

    #include "TestDlg.h"
    


  • Moin!

    Wenn:

    MSS-Software schrieb:

    die Klasse fängt wirklich mit 'C' an

    wie dann das:

    MSS-Software schrieb:

    TestDlg.cpp

    #include "TestDlg.h"
    
    .....
    .....
    
    void TestDlg::OnStammdatenPrfplne() 
    {
    	// TODO: Code für Befehlsbehandlungsroutine hier einfügen
    	Pruef_Auf = new Pruefplaene;
    	Pruef_Auf->Create(IDD_Pruefplaene, this);
    	Pruef_Auf->ShowWindow(SW_SHOW);
    }
    

    ??? Hast Du uns hier was falsch abgetippt oder hast Du das kopiert? Jedenfalls heisst die Klasse in diesem Code-Schnipsel anders.

    MSS-Software schrieb:

    wenn ich diesen include aus der TABPruefplne.h rausnehme, krieg ich zwar diese Fehler nicht mehr, aber kann logischerweise auch nichts mit dem Handle anfangen

    Scherzcookie 😃 . Natürlich.

    Du kannst noch ne Forward-Deklaration

    class CTestDlg;
    

    vor

    class CTABPruefplaene : public CTabCtrl
    {
    // ...
        CTestDlg        Handle;
    // ...
    };
    

    versuchen.

    Ich bin mir aba nicht sicher, ob das nicht nur bei Pointern hilft 😕 . Hier muss er ja direkt den Konstruktor aufrufen.

    Jedenfalls sagen Deine Fehlermeldungen, dass er schlicht die Klasse CTestDlg nicht kennt, weswegen er dann den Handle nicht anlegen kann und folglich auch den Handle nicht kennt.

    tabpruefplaene.h(22) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'Handle'

    Compiler -> Was da vor dem Bezeichner Handle steht, kann ich nicht auswerten. Also bewerte ich es als Bezeichner und zwei Bezeichner dürfen hier nicht hintereinander stehen.

    tabpruefplaene.h(22) : error C2501: 'CTestDlg' : Fehlende Speicherklasse oder Typspezifizierer

    Compiler -> Was is'n 'CTestDlg'? Nie gehört/gelesen. Für Bezeichner 'CTestDlg' habe ich keine Typangabe.

    tabpruefplaene.h(22) : error C2501: 'Handle' : Fehlende Speicherklasse oder Typspezifizierer

    Compiler -> Was is'n 'Handle'? Nie gehört/gelesen. Für Bezeichner Handle (da, wo das Semikolon vor fehlt!) habe ich keine Typangabe.

    Gruss,
    Qweety.



  • hui hui

    ganz schön viel geschrieben *ggg*

    aber ich hab alles verstanden *zwinka*

    das eine ist wirklich ein Tippfehler

    heißt natürlich CTestDlg::.....

    hab ich auch grad nachgeschaut

    so, ich werd das jetzt mal so umsetzen/berichtigen/korriegieren/wie auch immer *ggg*

    und mich dann nochmal melden

    mfg

    Matthias



  • Bin auf komische Sachen gestoßen:

    Folgendes: So ein ähnliches Handle hab ich schon mit Registerkarten. Sieht wie folgt aus:

    TABPruefplaene.h
    [cpp]
    #if !defined(AFX_TABPRUEFPLAENE_H__8DA5DC8A_3D82_452E_8FC9_DABBA7CF1B76__INCLUDED_)
    #define AFX_TABPRUEFPLAENE_H__8DA5DC8A_3D82_452E_8FC9_DABBA7CF1B76__INCLUDED_

    #if _MSC_VER > 1000
    #pragma once

    #endif // _MSC_VER > 1000
    // TABPruefplaene.h : Header-Datei
    //

    /////////////////////////////////////////////////////////////////////////////
    // Fenster CTABPruefplaene

    class CTABPruefplaene : public CTabCtrl
    {
    // Konstruktion
    public:
    CTABPruefplaene();
    int m_aktuelleSeite;
    int m_Seitennummern;
    CDialog* m_tabellenSeite[4];

    // Attribute

    public:

    // Operationen
    public:
    void Initialisierung();
    void SetRec();

    // Überschreibungen
    // Vom Klassen-Assistenten generierte virtuelle Funktionsüberschreibungen
    //{{AFX_VIRTUAL(CTABPruefplaene)

    //}}AFX_VIRTUAL

    // Implementierung
    public:
    virtual ~CTABPruefplaene();

    // Generierte Nachrichtenzuordnungsfunktionen
    protected:
    //{{AFX_MSG(CTABPruefplaene)
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point);

    //}}AFX_MSG

    DECLARE_MESSAGE_MAP()
    };

    /////////////////////////////////////////////////////////////////////////////

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

    #endif // AFX_TABPRUEFPLAENE_H__8DA5DC8A_3D82_452E_8FC9_DABBA7CF1B76__INCLUDED_
    [/cpp]

    TABPruefplaene.cpp

    // TABPruefplaene.cpp: Implementierungsdatei
    //
    
    #include "stdafx.h"
    #include "CAQ.h"
    
    #include "TABPruefplaene.h"
    #include "Pruefplandetails.h"
    #include "Pruefplanliste.h"
    #include "Pruefreihenfolge.h"
    #include "Kundenadresse.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    
    /////////////////////////////////////////////////////////////////////////////
    // CTABPruefplaene
    
    CTABPruefplaene::CTABPruefplaene()
    {
    	m_tabellenSeite[0] = new CPruefplanliste;
    	m_tabellenSeite[1] = new CPruefplandetails;
    	m_tabellenSeite[2] = new Pruefreihenfolge;
    	m_tabellenSeite[3] = new Kundenadresse;
    	m_Seitennummern = 4;
    }
    
    CTABPruefplaene::~CTABPruefplaene()
    {
    	for (int nZaehler = 0; nZaehler < m_Seitennummern; nZaehler++)
    	{
    		delete m_tabellenSeite[nZaehler];
    	}
    }
    
    void CTABPruefplaene::Initialisierung()
    {
    	m_aktuelleSeite = 0;
    	m_tabellenSeite[0]->Create(IDD_Pruefplanliste, this);
    	m_tabellenSeite[1]->Create(IDD_Pruefplandetails, this);
    	m_tabellenSeite[2]->Create(IDD_Pruefreihenfolge, this);
    	m_tabellenSeite[3]->Create(IDD_Kundenadresse, this);
    	m_tabellenSeite[0]->ShowWindow(SW_SHOW);
    	m_tabellenSeite[1]->ShowWindow(SW_HIDE);
    	m_tabellenSeite[2]->ShowWindow(SW_HIDE);
    	m_tabellenSeite[3]->ShowWindow(SW_HIDE);
    	SetRec();
    }
    
    void CTABPruefplaene::SetRec()
    {
    	CRect tabRec, itemRec;
    	int nX, nY, nXz, nYz;
    	GetClientRect(&tabRec);
    	GetItemRect(0, &itemRec);
    	nX = itemRec.left;
    	nY = itemRec.bottom + 1;
    	nXz = tabRec.right - itemRec.left - 1;
    	nYz = tabRec.bottom - nY - 1;
    	m_tabellenSeite[0]->SetWindowPos(&wndTop, nX, nY, nXz, nYz, SWP_SHOWWINDOW);
    	for (int nZaehler = 1; nZaehler < m_Seitennummern; nZaehler++)
    	{
    		m_tabellenSeite[nZaehler]->SetWindowPos(&wndTop, nX, nY, nXz, nYz, SWP_HIDEWINDOW);
    	}
    }
    
    BEGIN_MESSAGE_MAP(CTABPruefplaene, CTabCtrl)
    	//{{AFX_MSG_MAP(CTABPruefplaene)
    	ON_WM_LBUTTONDOWN()
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    
    /////////////////////////////////////////////////////////////////////////////
    // Behandlungsroutinen für Nachrichten CTABPruefplaene 
    
    void CTABPruefplaene::OnLButtonDown(UINT nFlags, CPoint point) 
    {
    	CTabCtrl::OnLButtonDown(nFlags, point);
    	if (m_aktuelleSeite != GetCurFocus())
    	{
    		m_tabellenSeite[m_aktuelleSeite]->ShowWindow(SW_HIDE);
    		m_aktuelleSeite = GetCurFocus();
    		m_tabellenSeite[m_aktuelleSeite]->ShowWindow(SW_SHOW);
    		m_tabellenSeite[m_aktuelleSeite]->SetFocus();
    	}
    }
    

    So, das war das für das Register und jetzt folgt der Code, wo die Initialisiert und aufgerufen werden!

    Pruefplaene.h
    [cpp]
    #if !defined(AFX_PRUEFPLAENE_H__5A4D3DE6_0C4C_4206_BCA7_BAC285538436__INCLUDED_)
    #define AFX_PRUEFPLAENE_H__5A4D3DE6_0C4C_4206_BCA7_BAC285538436__INCLUDED_

    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    #include "TABPruefplaene.h"
    // Pruefplaene.h : Header-Datei
    //
    /////////////////////////////////////////////////////////////////////////////
    // Dialogfeld Pruefplaene

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

    // Dialogfelddaten
    //{{AFX_DATA(Pruefplaene)
    enum { IDD = IDD_Pruefplaene };
    CTABPruefplaene m_cTabCtrl;
    CString m_strArtikelnummer;
    CString m_strBezeichnung;
    CString m_strDatum;
    CString m_strKennung;
    BOOL m_bHistorie;
    CString m_strIndex;
    CString m_strIndexdatum;
    CString m_strKundenname;
    UINT m_intKundennummer;
    CString m_strZeichnungsnummer;
    CString m_strZusatz1;
    CString m_strZusatz2;
    CString m_strZusatz3;
    CString m_strZusatz4;
    CString m_strZusatz5;
    BOOL m_bVorlage;
    //}}AFX_DATA

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

    // Implementierung
    protected:

    // Generierte Nachrichtenzuordnungsfunktionen
    //{{AFX_MSG(Pruefplaene)
    virtual BOOL OnInitDialog();
    afx_msg void OnButton2();
    afx_msg void OnButton6();
    afx_msg void OnButton10();
    afx_msg void OnButton7();
    afx_msg void OnButton4();
    afx_msg void OnButton8();
    afx_msg void OnSave();
    afx_msg void OnTimer(UINT nIDEvent);
    afx_msg void OnNew();
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
    };

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

    #endif // AFX_PRUEFPLAENE_H__5A4D3DE6_0C4C_4206_BCA7_BAC285538436__INCLUDED_
    [/cpp]

    Pruefplaene.cpp
    [cpp]
    #include "stdafx.h"
    #include "CAQ.h"
    #include "Kundenadresse.h"
    #include "Pruefplaene.h"
    #include "PPlanDruck.h"
    #include "Pruefreihenfolge.h"
    #include "Auswahl.h"
    #ifdef DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE
    _;
    #endif

    /////////////////////////////////////////////////////////////////////////////
    // Dialogfeld Pruefplaene

    Pruefplaene::Pruefplaene(CWnd* pParent /=NULL/)
    : CDialog(Pruefplaene::IDD, pParent)
    {
    //{{AFX_DATA_INIT(Pruefplaene)

    //}}AFX_DATA_INIT
    }

    void Pruefplaene::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(Pruefplaene)
    DDX_Control(pDX, IDC_TAB1, m_cTabCtrl);

    //}}AFX_DATA_MAP
    }

    BEGIN_MESSAGE_MAP(Pruefplaene, CDialog)
    //{{AFX_MSG_MAP(Pruefplaene)

    //}}AFX_MSG_MAP
    END_MESSAGE_MAP
    /////////////////////////////////////////////////////////////////////////////
    // Behandlungsroutinen für Nachrichten Pruefplaene

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

    m_cTabCtrl.InsertItem(0, ("Prüfplanmerkmale"));
    m_cTabCtrl.InsertItem(1, ("Details"));
    m_cTabCtrl.InsertItem(2, ("Prüfreihenfolge"));
    m_cTabCtrl.InsertItem(3, ("Lieferanschrift"));
    m_cTabCtrl.Initialisierung();

    SetTimer(ID_Timer_Pruefplan,0,NULL);

    return TRUE; // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten
    }
    [/cpp]

    Alles, was mit dem Handle zu tun hat, ist FETT!

    So, das Funktioniert wunderbar. Nach dem gleichen Prinziep bin ich dann auch für das andere Handle vorgegangen.

    Und zwar so:

    1.Die TABPruefplaene.h sehe ich hier als die Headerdatei an, wo der Zeiger für das neue Dialogfeld zu erstellen ist (oben: CDialog* m_tabellenSeite[4] )
    Dem zu folge wäre das bei mir die CAQDlg.h Datei, wo ich das dann machen müsste.

    Sähe dann so aus:

    // CAQDlg.h : Header-Datei
    //
    
    #if !defined(AFX_CAQDLG_H__47AEA728_BCD2_4484_9896_A54DA7EBC6F6__INCLUDED_)
    #define AFX_CAQDLG_H__47AEA728_BCD2_4484_9896_A54DA7EBC6F6__INCLUDED_
    
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    
    /////////////////////////////////////////////////////////////////////////////
    // CCAQDlg Dialogfeld
    
    class CCAQDlg : public CDialog
    {
    // Konstruktion
    public:
    	CCAQDlg(CWnd* pParent = NULL);	// Standard-Konstruktor
             CDialog* Pruef_Auf;
    
    	void SetRec();
    // Dialogfelddaten
    	//{{AFX_DATA(CCAQDlg)
    	enum { IDD = IDD_CAQ_DIALOG };
    
    	//}}AFX_DATA
    
    	// Vom Klassenassistenten generierte Überladungen virtueller Funktionen
    
    	//{{AFX_VIRTUAL(CCAQDlg)
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV-Unterstützung
    	//}}AFX_VIRTUAL
    
    // Implementierung
    protected:
    	HICON m_hIcon;
    
    	// Generierte Message-Map-Funktionen
    	//{{AFX_MSG(CCAQDlg)
    	virtual BOOL OnInitDialog();
    	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    	afx_msg void OnPaint();
    	afx_msg HCURSOR OnQueryDragIcon();
    	afx_msg void OnStammdatenPrfplne();
    	//}}AFX_MSG
    	DECLARE_MESSAGE_MAP()
    };
    
    //{{AFX_INSERT_LOCATION}}
    // Microsoft Visual C++ fügt unmittelbar vor der vorhergehenden Zeile zusätzliche Deklarationen ein.
    
    #endif // !defined(AFX_CAQDLG_H__47AEA728_BCD2_4484_9896_A54DA7EBC6F6__INCLUDED_)
    

    So, dann gehe ich in die CPP Datei und erstelle den Dialog (oben: m_tabellenSeite[0] = new Kundenadresse; m_tabellenSeite[0]->Create(IDD_Kundenadresse, this); m_tabellenSeite[0]->ShowWindow(SW_SHOW);

    Dem zu folge habe ich das dann auch so gemacht:

    CAQDlg.cpp
    [cpp]
    #include "stdafx.h"
    #include "CAQ.h"
    #include "CAQDlg.h"
    #include "Datenbank.h"
    #ifdef DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE
    _;
    #endif

    /////////////////////////////////////////////////////////////////////////////
    // CAboutDlg-Dialogfeld für Anwendungsbefehl "Info"

    class CAboutDlg : public CDialog
    {
    public:
    CAboutDlg();

    // Dialogfelddaten
    //{{AFX_DATA(CAboutDlg)
    enum { IDD = IDD_ABOUTBOX };
    //}}AFX_DATA

    // Vom Klassenassistenten generierte Überladungen virtueller Funktionen
    //{{AFX_VIRTUAL(CAboutDlg)
    protected:
    virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung
    //}}AFX_VIRTUAL

    // Implementierung
    protected:
    //{{AFX_MSG(CAboutDlg)
    virtual void OnOK();
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
    };

    CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
    {
    //{{AFX_DATA_INIT(CAboutDlg)
    //}}AFX_DATA_INIT
    }

    void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CAboutDlg)
    //}}AFX_DATA_MAP
    }

    BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
    //{{AFX_MSG_MAP(CAboutDlg)
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()

    /////////////////////////////////////////////////////////////////////////////
    // CCAQDlg Dialogfeld

    CCAQDlg::CCAQDlg(CWnd* pParent /=NULL/)
    : CDialog(CCAQDlg::IDD, pParent)
    {
    //{{AFX_DATA_INIT(CCAQDlg)
    // HINWEIS: Der Klassenassistent fügt hier Member-Initialisierung ein
    //}}AFX_DATA_INIT
    // Beachten Sie, dass LoadIcon unter Win32 keinen nachfolgenden DestroyIcon-Aufruf benötigt
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }

    void CCAQDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CCAQDlg)
    // HINWEIS: Der Klassenassistent fügt an dieser Stelle DDX- und DDV-Aufrufe ein
    //}}AFX_DATA_MAP
    }

    BEGIN_MESSAGE_MAP(CCAQDlg, CDialog)
    //{{AFX_MSG_MAP(CCAQDlg)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()

    ON_COMMAND(ID_STAMMDATEN_PRFPLNE, OnStammdatenPrfplne)

    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()

    /////////////////////////////////////////////////////////////////////////////
    // CCAQDlg Nachrichten-Handler

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

    // Hinzufügen des Menübefehls "Info..." zum Systemmenü.

    // IDM_ABOUTBOX muss sich im Bereich der Systembefehle befinden.
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
    CString strAboutMenu;
    strAboutMenu.LoadString(IDS_ABOUTBOX);
    if (!strAboutMenu.IsEmpty())
    {
    pSysMenu->AppendMenu(MF_SEPARATOR);
    pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    }
    }

    // Symbol für dieses Dialogfeld festlegen. Wird automatisch erledigt
    // wenn das Hauptfenster der Anwendung kein Dialogfeld ist
    SetIcon(m_hIcon, TRUE); // Großes Symbol verwenden
    SetIcon(m_hIcon, FALSE); // Kleines Symbol verwenden

    // ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
    Datenbank Aufruf;
    Aufruf.DoModal();
    return TRUE; // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten
    }

    void CCAQDlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
    CAboutDlg dlgAbout;
    dlgAbout.DoModal();
    }
    else
    {
    CDialog::OnSysCommand(nID, lParam);
    }
    }

    // Wollen Sie Ihrem Dialogfeld eine Schaltfläche "Minimieren" hinzufügen, benötigen Sie
    // den nachstehenden Code, um das Symbol zu zeichnen. Für MFC-Anwendungen, die das
    // Dokument/Ansicht-Modell verwenden, wird dies automatisch für Sie erledigt.

    void CCAQDlg::OnPaint()
    {
    if (IsIconic())
    {
    CPaintDC dc(this); // Gerätekontext für Zeichnen

    SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

    // Symbol in Client-Rechteck zentrieren
    int cxIcon = GetSystemMetrics(SM_CXICON);
    int cyIcon = GetSystemMetrics(SM_CYICON);
    CRect rect;
    GetClientRect(&rect);
    int x = (rect.Width() - cxIcon + 1) / 2;
    int y = (rect.Height() - cyIcon + 1) / 2;

    // Symbol zeichnen
    dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
    CDialog::OnPaint();
    }
    }

    // Die Systemaufrufe fragen den Cursorform ab, die angezeigt werden soll, während der Benutzer
    // das zum Symbol verkleinerte Fenster mit der Maus zieht.
    HCURSOR CCAQDlg::OnQueryDragIcon()
    {
    return (HCURSOR) m_hIcon;
    }

    void CCAQDlg::OnStammdatenPrfplne()
    {
    // TODO: Code für Befehlsbehandlungsroutine hier einfügen
    Pruef_Auf = new Pruefplaene;
    Pruef_Auf->Create(IDD_Pruefplaene, this);
    Pruef_Auf->ShowWindow(SW_SHOW);

    }
    [/cpp]

    Soweit auch ok. Dann muss ich dem Prinziep nach zu folge in die Header Datei, wo ich den Handle anwenden will. (oben: Pruefplaene.h)

    Hier ist es nun die:

    TABPruefplaene.h (genau die gleiche wie oben mit folgenden Zeilen hinzugefügt:)

    #include "CAQDlg.h"
    

    [cpp]
    class CTABPruefplaene : public CTabCtrl
    {
    // Konstruktion
    public:
    CTABPruefplaene();
    int m_aktuelleSeite;
    int m_Seitennummern;
    CDialog* m_tabellenSeite[4];
    CCAQDlg Handle;
    [/cpp]

    So, wenn ich das jetzt alles so belassen würde, bekomme ich schon diese Fehler, allerdings erkennt er dann auch den vorherigen Handle (m_cTabCtrl) nicht mehr. Bei dem spuckt er genau die gleichen Fehler aus!



  • Wenn ich das jetzt aber so mache, gibt er mir zwar keine Fehler mehr aus, aber ich kireg im Debug nen Fehler im Speicher x, sobald ich auf die Registerkarte klicke.

    TABPruefplaene.cpp

    #include "CAQDlg.h"
    
    void CTABPruefplaene::OnLButtonDown(UINT nFlags, CPoint point) 
    {
    	CTabCtrl::OnLButtonDown(nFlags, point);
    	if (m_aktuelleSeite != GetCurFocus())
    	{
    		CCAQDlg Handle;
    		CString Test;
    		Handle.Pruef_Auf->GetDlgItem(IDC_Kundenname)->EnableWindow(FALSE);
    		m_tabellenSeite[m_aktuelleSeite]->ShowWindow(SW_HIDE);
    		m_aktuelleSeite = GetCurFocus();
    		m_tabellenSeite[m_aktuelleSeite]->ShowWindow(SW_SHOW);
    		m_tabellenSeite[m_aktuelleSeite]->SetFocus();
    	}
    }
    

Anmelden zum Antworten