Probleme mit ctrltab in der view



  • Hallo,

    ich habe 2 Probleme und eine SDI-Anwendung geschrieben.
    im doc Objekt wird beim ablauf des Programms ein gebilde aus datenobjekte durch Dialogabfragen erstellt.nachdem die abfragen alle durch sind soll das Programm die daten über ein Tabctrl in der view, auf den einzelnen Seiten mit hilfe von einem ListCtrl welches sich in dem PropertyPage objekt befindet darstellen.Also habe ich ein Tabcontrol in die form eingefügt und es wird in der überschriebenen Funktion Ondraw() initialisiert welches dann die seiten initialisiert und somit auch die jeweilige listCtrl.
    nun beginnt das erste Problem sobalt das Progammfenster in den hintergrund rutscht weil ich zum beispielden internetexplorer öffne kommt ne Assert fehlermeldung und das Programmstürzt ab.
    und zwar bei

    m_AusgabeTab.Create( WS_CHILD | WS_VISIBLE, ClientRect, this, 255 );
    

    in der überschriebenen Ondraw()funktion!
    ich hab versucht mit einer if anweisung sie nur einmal durchlaufen zulassen aber dann ist die form der view danach leer!
    was mach ich da falsch???
    mein 2 Problem ist wenn das gebilde aufgebaut ist werden die Daten von der jeweiligen list nicht dargestellt,
    sondern sie Bleibt leer!

    //die View.h////////////////////////////////////////////////////////////
    
    #pragma once
    #include "ErgCtrl.h"
    #include "afxcmn.h"
    class CKabelstPrfSet;
    
    class CKabelstPrfView : public CRecordView
    {
    protected: // Nur aus Serialisierung erstellen
    	CKabelstPrfView();
    	DECLARE_DYNCREATE(CKabelstPrfView)
    
    public:
    	enum{ IDD = IDD_KABELSTPRF_FORM };
    	CKabelstPrfSet* m_pSet;
    
    // Attribute
    public:
    	CKabelstPrfDoc* GetDocument() const;
    
    // Operationen
    public:
    
    // Überschreibungen
    	public:
    	virtual CRecordset* OnGetRecordset();
    virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
    protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV-Unterstützung
    	virtual void OnInitialUpdate(); // Erster Aufruf nach Erstellung
    	virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
    	virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
    	virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
    
    // Implementierung
    public:
    	virtual ~CKabelstPrfView();
    #ifdef _DEBUG
    	virtual void AssertValid() const;
    	virtual void Dump(CDumpContext& dc) const;
    #endif
    
    protected:
    
    // Generierte Funktionen für die Meldungstabellen
    protected:
    	DECLARE_MESSAGE_MAP()
    public:
     :arrow: 	CErgCtrl m_AusgabeTab; // Das tab dessen Seiten die Daten ausgeben sollen
    protected:
    //	void OnAusgabe();
     :arrow: 	afx_msg LPARAM OnAusgabe(WPARAM wpar, LPARAM lpar);// der Meldungshandler der diemeldung abfängt welche geschickt wird wenn die daten dargestellt werden sollen!
    	virtual void OnDraw(CDC* pDC);
    public:
    
    	bool erledigt;
    };
    
    #ifndef _DEBUG  // Debugversion in KabelstPrüfView.cpp
    inline CKabelstPrfDoc* CKabelstPrfView::GetDocument() const
       { return reinterpret_cast<CKabelstPrfDoc*>(m_pDocument); }
    #endif
    
    //Die View.cpp/////////////////////////////////////////////////////////////////
    BEGIN_MESSAGE_MAP(CKabelstPrfView, CRecordView)
    	// Standarddruckbefehle
    	ON_COMMAND(ID_FILE_PRINT, CRecordView::OnFilePrint)
    	ON_COMMAND(ID_FILE_PRINT_DIRECT, CRecordView::OnFilePrint)
    	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CRecordView::OnFilePrintPreview)
     	ON_MESSAGE(WM_AUSGABE,OnAusgabe) 
    END_MESSAGE_MAP()
    
    // CKabelstPrfView Erstellung/Zerstörung
    
    CKabelstPrfView::CKabelstPrfView()
    	: CRecordView(CKabelstPrfView::IDD)
    	, erledigt(false)
    {
    	m_pSet = NULL;
    	// TODO: Hier Code zum Erstellen einfügen
    
    }
    
    CKabelstPrfView::~CKabelstPrfView()
    {
    }
    
    void CKabelstPrfView::DoDataExchange(CDataExchange* pDX)
    {
    	CRecordView::DoDataExchange(pDX);
    	// Sie können hier DDX_Field*-Funktionen einfügen, um die Steuerelemente mit den Datenbankfeldern zu verbinden:
    	// DDX_FieldText(pDX, IDC_MYEDITBOX, m_pSet->m_szColumn1, m_pSet);
    	// DDX_FieldCheck(pDX, IDC_MYCHECKBOX, m_pSet->m_bColumn2, m_pSet);
    	// Weitere Informationen finden Sie in den MSDN- und ODBC-Beispielen.
    }
    
    BOOL CKabelstPrfView::PreCreateWindow(CREATESTRUCT& cs)
    {
    	// TODO: Ändern Sie hier die Fensterklasse oder die Darstellung, indem Sie
    	//  CREATESTRUCT cs modifizieren.
    
    	return CRecordView::PreCreateWindow(cs);
    }
    
    void CKabelstPrfView::OnInitialUpdate()
    {
    	m_pSet = &GetDocument()->m_KabelstPrfSet;
    	CRecordView::OnInitialUpdate();
    }
    
    // CKabelstPrfView drucken
    
    BOOL CKabelstPrfView::OnPreparePrinting(CPrintInfo* pInfo)
    {
    	// Standardvorbereitung
    	return DoPreparePrinting(pInfo);
    }
    
    void CKabelstPrfView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
    {
    	// TODO: Zusätzliche Initialisierung vor dem Drucken hier einfügen
    }
    
    void CKabelstPrfView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
    {
    	// TODO: Bereinigung nach dem Drucken einfügen
    }
    
    // CKabelstPrfView Diagnose
    
    #ifdef _DEBUG
    void CKabelstPrfView::AssertValid() const
    {
    	CRecordView::AssertValid();
    }
    
    void CKabelstPrfView::Dump(CDumpContext& dc) const
    {
    	CRecordView::Dump(dc);
    }
    
    CKabelstPrfDoc* CKabelstPrfView::GetDocument() const // Nicht-Debugversion ist inline
    {
    	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CKabelstPrfDoc)));
    	return (CKabelstPrfDoc*)m_pDocument;
    }
    #endif //_DEBUG
    
    // CKabelstPrfView Datenbankunterstützung
    CRecordset* CKabelstPrfView::OnGetRecordset()
    {
    	return m_pSet;
    }
    
     :arrow: Die untenstehende Funktion wird ausgeführt sobalt die meldung kommt das das Datengebilde fertig aufgebaut wurde
    // CKabelstPrfView Meldungshandler
    afx_msg LPARAM CKabelstPrfView::OnAusgabe(WPARAM wpar, LPARAM lpar)
    //void CKabelstPrfView::OnAusgabe()
    { :warning: //2. Problem es Passiert nichts wenn die funktion durchlaufen wird!!!
    	for(int i=0;i<m_AusgabeTab.m_nNumberOfPages;i++)
    	{
    
    		m_AusgabeTab.m_DocBasisPage[i].m_SeiteA.m_fnListDaten(i);
    		UpdateData(true);
    		m_AusgabeTab.m_DocBasisPage[i].m_SeiteA.AusgabeListe.SetRedraw(true);	
    	}
    
    //	Invalidate();
    	return lpar;
    }
    
     :arrow: die initialisierung mußte ich hier reinsetzen.Sonst gab es noch mehr fehler. für Anregungen bin ich dankbar das anders zu machen!!!
    void CKabelstPrfView::OnDraw(CDC* pDC)
    {
    //	if(!erledigt)
    //	{
    		erledigt=true;
    		CRect ClientRect; 
    
    		GetClientRect(&ClientRect); 
    		ClientRect.bottom = 500; 
    		ClientRect.left = 10; 
    		ClientRect.right = 700; 
    		ClientRect.top= 1; 
    
     :warning: 	m_AusgabeTab.Create( WS_CHILD | WS_VISIBLE, ClientRect, this, 255 ); //Problem zeile des ersten Problems
    		m_AusgabeTab.SetExtendedStyle( TCS_EX_FLATSEPARATORS|TCS_BUTTONS | TCS_FLATBUTTONS ); 
    		m_AusgabeTab.InsertItem(0,_T("Stecker Tabelle")); 
    		m_AusgabeTab.InsertItem(1,_T("Knoten Tabelle"));
    //		}
    	CKabelstPrfDoc* pmyDoc=GetDocument();
    	m_AusgabeTab.m_fnInit2(pmyDoc);
    
    }
    //Die TabCtrl.h////////////////////////////////////////////////////////////////
    #pragma once
    #include "DocBasisPage.h"
    #include "KabelstPrüfDoc.h"
    
    // CErgCtrl
    
    class CErgCtrl : public CTabCtrl
    {
    	DECLARE_DYNAMIC(CErgCtrl)
    
    public:
    	CErgCtrl();
    	virtual ~CErgCtrl();
        int m_nNumberOfPages;
    	int m_tabCurrent;
    	void m_fnInit2(CKabelstPrfDoc* pmyDoc);
    	CDocBasisPage* m_DocBasisPage;
    	int typ;
    
        void SetRectangle(void); 
    protected:
    	DECLARE_MESSAGE_MAP()
    public:
    	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
    };
    
    //TabCtrl.cpp/////////////////////////////////////////////////////////////////
    CErgCtrl::CErgCtrl()
    : m_DocBasisPage(NULL)
    , typ(0)
    {
    	EnableActiveAccessibility();
    }
    
    CErgCtrl::~CErgCtrl()
    {
    }
     :arrow: //Initialiesierung des TabCtrl
    void CErgCtrl::m_fnInit2(CKabelstPrfDoc* pmyDoc)
    {
    
    	m_nNumberOfPages=2;
    	m_DocBasisPage=new CDocBasisPage[2];
        m_tabCurrent=0;
    
    	for(int i=0;i<m_nNumberOfPages;i++)
    	{
    		m_DocBasisPage[i].AddPage(&m_DocBasisPage[i].m_SeiteA);
    		m_DocBasisPage[i].m_SeiteA.Create(IDD_AUSGABE_1,this);
    		m_DocBasisPage[i].m_SeiteA.Pageinit(pmyDoc,i);
    		m_DocBasisPage[i].m_SeiteA.ShowWindow(SW_SHOW);
    	}
    	SetRectangle();
    }
    
    void CErgCtrl::SetRectangle(void) 
    { 
        CRect tabRect, itemRect; 
        int nX, nY, nXc, nYc; 
    
        GetClientRect(&tabRect); 
        GetItemRect(0, &itemRect); 
    
        nX=itemRect.left; 
        nY=itemRect.bottom+1; 
        nXc=tabRect.right-itemRect.left-1; 
        nYc=tabRect.bottom-nY-1; 
    
    	for(int nCount=0; nCount < m_nNumberOfPages; nCount++)
    	{
    		m_DocBasisPage[nCount].m_SeiteA.SetWindowPos(&wndTop, nX, nY, nXc, nYc, SWP_SHOWWINDOW); 
    	}
    }
    BEGIN_MESSAGE_MAP(CErgCtrl, CTabCtrl)
    	ON_WM_LBUTTONDOWN()
    END_MESSAGE_MAP()
    
    // CErgCtrl-Meldungshandler
    
    void CErgCtrl::OnLButtonDown(UINT nFlags, CPoint point)
    {
    	CTabCtrl::OnLButtonDown(nFlags, point);
    	if(m_tabCurrent != GetCurFocus())
    	{
    		m_DocBasisPage[m_tabCurrent].m_SeiteA.ShowWindow(SW_HIDE);
    		m_tabCurrent=GetCurFocus();
    		m_DocBasisPage[m_tabCurrent].m_SeiteA.ShowWindow(SW_SHOW);
    		m_DocBasisPage[m_tabCurrent].m_SeiteA.GetFocus();
    	}
    }
    //Die PropertyPage.h///////////////////////////////////////////////////////////
    class CAusgabe : public CPropertyPage
    {
    	DECLARE_DYNAMIC(CAusgabe)
    
    public:
    	CAusgabe();
    	virtual ~CAusgabe();
    
    // Dialogfelddaten
    	enum { IDD = IDD_AUSGABE_1 };
    
    protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV-Unterstützung
    
    	DECLARE_MESSAGE_MAP()
    public:
    	CmyListCtrl AusgabeListe;
             CKabelstPrfDoc* pDoc; :arrow:  //zeiger auf das Doc Objekt
    	void Pageinit(CKabelstPrfDoc* pmyDoc, int PageTyp);
    	void m_fnListDaten(int typ);
    };
    //Die PropertyPage.cpp/////////////////////////////////////////////////////////
    CAusgabe::CAusgabe()
    	: CPropertyPage(CAusgabe::IDD)
    	, pDoc(NULL)
    {
    	EnableActiveAccessibility();
    }
    
    CAusgabe::~CAusgabe()
    {
    }
    
    void CAusgabe::DoDataExchange(CDataExchange* pDX)
    {
    	CPropertyPage::DoDataExchange(pDX);
    	DDX_Control(pDX, IDC_AUSGABE_LIST, AusgabeListe);
    }
    
    BEGIN_MESSAGE_MAP(CAusgabe, CPropertyPage)
    END_MESSAGE_MAP()
    
    // CAusgabe-Meldungshandler
    
    void CAusgabe::Pageinit(CKabelstPrfDoc* pmyDoc, int PageTyp)  :idea: //PropertyPage initialisierung
    {
    	pDoc=pmyDoc;
    	int KnGroesse=0;
    	int SpaltenZahl=0;
    	int nColInterval=0;
    	int e=0;
    	char msg[20]="";
    	AusgabeListe.ModifyStyle(0, LVS_REPORT);
    	CRect rect;
    	AusgabeListe.GetClientRect(&rect);
    	switch(PageTyp)
    	{
    	case 0:
    		nColInterval = rect.Width()/5;
    
    		AusgabeListe.InsertColumn(0, _T("Stecker Nr:"), LVCFMT_LEFT, nColInterval);
    		AusgabeListe.InsertColumn(1, _T("Stecker Bez.:"), LVCFMT_LEFT, nColInterval*3);
    		AusgabeListe.InsertColumn(2, _T("Kammer Anzahl"), LVCFMT_LEFT, rect.Width()-4*nColInterval);
    		break;
    	case 1:
    		for(int i=0;i<pDoc->m_pcks.m_ckmKnMenge.m_nTatsaechlicheKnotenmenge;i++)
    		{
    			if(pDoc->m_pcks.m_ckmKnMenge.m_pcknKnotenSpringer[i].m_nKnGroesse>KnGroesse)
    			{
    				KnGroesse=pDoc->m_pcks.m_ckmKnMenge.m_pcknKnotenSpringer[i].m_nKnGroesse;
    			}
    		}
    		SpaltenZahl=(2+(KnGroesse*2));
    		nColInterval = (rect.Width()/SpaltenZahl);
    
    		AusgabeListe.InsertColumn(0, _T("Knoten Nr:"), LVCFMT_LEFT, nColInterval);
    		AusgabeListe.InsertColumn(1, _T("Knotengroesse:"), LVCFMT_LEFT, nColInterval);
    		for(i=2;i<SpaltenZahl;i++)
    		{
    			if(i%2==0)
    			{
    				wsprintf(msg,"Anschl.%d Bez:",e);
    				AusgabeListe.InsertColumn(i,msg, LVCFMT_LEFT,nColInterval);
    			}
    			else
    			{
    				wsprintf(msg,"Anschl.%d Kammer Nr.:",e);
    				AusgabeListe.InsertColumn(i, msg, LVCFMT_LEFT,nColInterval);
    				e++;
    			}
    		}
    		break;
    	}
    	m_fnListDaten(PageTyp);
    
    }
    
    void CAusgabe::m_fnListDaten(int typ) :idea: //Funktion zur Daten eingabe für die ListCtrl
    {
    	AusgabeListe.DeleteAllItems();
    	char text[10];
    	// Use the LV_ITEM structure to insert the items
    	LVITEM lvi;
    	CString strItem;
    	switch(typ)
    	{
    	case 0:
    		for (int i = 0; i < pDoc->m_pcks.m_csmStMeng.m_nSteckerMenge; i++)
    		{
    			// Insert the first item
    			wsprintf(text,"%i",i);
    			strItem=text;
    			lvi.iItem = i;
    			lvi.iSubItem = 0;
    			lvi.pszText = (LPTSTR)(LPCTSTR)(strItem);
    			AusgabeListe.InsertItem(&lvi);
    
    			// Set subitem 1
    			strItem=pDoc->m_pcks.m_csmStMeng.m_pcstSteckEingang[i].m_szSteckerBezeichnung;
    			lvi.iSubItem =1;
    			lvi.pszText = (LPTSTR)(LPCTSTR)(strItem);
    			AusgabeListe.SetItem(&lvi);
    
    			// Set subitem 2
    			wsprintf(text,"%d",pDoc->m_pcks.m_csmStMeng.m_pcstSteckEingang[i].m_nPinAnz);
    			strItem=text;
    			lvi.iSubItem =2;
    			lvi.pszText = (LPTSTR)(LPCTSTR)(strItem);
    			AusgabeListe.SetItem(&lvi);
    
    		}
    		break;
    	case 1:
    		for (int i = 0; i < pDoc->m_pcks.m_ckmKnMenge.m_nTatsaechlicheKnotenmenge; i++)
    		{
    			// Insert the first item
    			wsprintf(text,"%i",i);
    			strItem=text;
    			lvi.iItem = i;
    			lvi.iSubItem = 0;
    			lvi.pszText = (LPTSTR)(LPCTSTR)(strItem);
    			AusgabeListe.InsertItem(&lvi);
    
    			// Set subitem 1
    			wsprintf(text,"%d",pDoc->m_pcks.m_ckmKnMenge.m_pcknKnotenSpringer[i].m_nKnGroesse);
    			strItem=text;
    			lvi.iSubItem =1;
    			lvi.pszText = (LPTSTR)(LPCTSTR)(strItem);
    			AusgabeListe.SetItem(&lvi);
    			int f=0;
    			for(int e=2;e<(2+(pDoc->m_pcks.m_ckmKnMenge.m_pcknKnotenSpringer[i].m_nKnGroesse*2));e++)
    			{
    				if(e%2==0)
    				{
    					// Set subitem 2
    					strItem=pDoc->m_pcks.m_ckmKnMenge.m_pcknKnotenSpringer[i].m_pszKnSteck[f];
    					lvi.iSubItem =e;
    					lvi.pszText = (LPTSTR)(LPCTSTR)(strItem);
    					AusgabeListe.SetItem(&lvi);
    				}
    				else
    				{
    					wsprintf(text,"%d",pDoc->m_pcks.m_ckmKnMenge.m_pcknKnotenSpringer[i].m_pnKnPin[f]);
    					strItem=text;
    					lvi.iSubItem =e;
    					lvi.pszText = (LPTSTR)(LPCTSTR)(strItem);
    					AusgabeListe.SetItem(&lvi);
    					f++;
    				}
    
    			}
    			break;
    
    		}
    	}
    }
    ///Ende
    

    Bitte helft mir!!!
    und bitte bei Änderungsvorschlägen die Datei in welcher die Änderung statt finden soll mitangeben!

    Mit freundlichen Grüssen

    Twist



  • hate keiner ne Ahnung was die Fehlerauslösen könnte?

    bitte helft mir?

    Mit freundlichen Grüssen!
    Twist


Anmelden zum Antworten