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 beim_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; } } } ///EndeBitte 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