problem mit CRect



  • hallo,

    Ich hab ein Problem mit CRect und zwar:
    ich hab in einer SDI-Anwendung ein TabCtrl welches sich in der view befindet da es im Hauptfenster angezeigt werden soll. Auf jeder Seite des TabCtrl soll ein ListCtrl angezeigt werden. Dieses ListCtrl hab ich dann auf der PropertyPage inplementiert und wird auch da initialisiert.
    das TabCtrl wird in der OnDraw() funktion initialisiert.
    In der OnDraw() Funktion wird auch das CRect erstellt wo das TabCtrl rein kommt.
    im TabCtrl befindet sich eine Funktion SetRectangle(void) welche dafür zuständig ist die PropertyPage einzugrenzen.

    Das Problem ist wenn das Programm die funktion ausführt gibt es einen Assert fehler und wenn es sie nicht ausführt sitzt das ListCtrl an der falschen stelle!

    Bitte helft mir!

    //View.cpp/////////////////////////////////////////////////////
    void CKabelstPrfView::OnDraw(CDC* pDC)
    {
      :arrow:    RECT ClientRect;  //bestimmt das CRect das das TabCtrl beinhaltet!
    
        GetClientRect(&ClientRect); 
        ClientRect.bottom = 500; 
        ClientRect.left = 10; 
        ClientRect.right = 700; 
        ClientRect.top= 1; 
    
        m_AusgabeTab.Create( WS_CHILD | WS_VISIBLE, ClientRect, this, 255 ); 
        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);
    }
    //TabCtrl/////////////////////////////////////////////////////
    void CErgCtrl::m_fnInit2(CKabelstPrfDoc* pmyDoc)
    {
    //	InsertItem(0,_T("Stecker Tabelle"),0); 
    //  InsertItem(1,_T("Knoten Tabelle"),1);
    	m_nNumberOfPages=2;
    	m_DocBasisPage=new CDocBasisPage[2];
        m_tabCurrent=0;
    
     //   InsertItem(2,_T(Übersetzung));
    	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);
    	}
     :arrow: 	SetRectangle(); //Ruft die funktion zur eingrenzung der PropertyPages
    }
    
     :arrow: 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); 
    	}
    }
    //PropertyPage welche sich in der Propertysheet befindet/////////
    void CAusgabe::Pageinit(CKabelstPrfDoc* pmyDoc, int PageTyp)
    {
    	pDoc=pmyDoc;
    	int KnGroesse=0;
    	int SpaltenZahl=0;
    	int nColInterval=0;
    	int e=0;
    	char msg[20]="";
    	AusgabeListe.ModifyStyle(0, LVS_REPORT);
     :arrow: 	CRect rect;                         //für den inhalt der ListCtrl!
    	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)
    {
    	AusgabeListe.DeleteAllItems();
    
    	// 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
    			strItem.Format(_T("%i"), i);
    			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
    			strItem.Format((_T("%d"),pDoc->m_pcks.m_csmStMeng.m_pcstSteckEingang[i].m_nPinAnz));
    			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
    			strItem.Format(_T("%i"), i);
    			lvi.iItem = i;
    			lvi.iSubItem = 0;
    			lvi.pszText = (LPTSTR)(LPCTSTR)(strItem);
    			AusgabeListe.InsertItem(&lvi);
    
    			// Set subitem 1
    			strItem.Format(_T("%d"),pDoc->m_pcks.m_ckmKnMenge.m_pcknKnotenSpringer[i].m_nKnGroesse);
    			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
    				{
    					strItem.Format(_T("%d"),pDoc->m_pcks.m_ckmKnMenge.m_pcknKnotenSpringer[i].m_pnKnPin[f]);
    					lvi.iSubItem =e;
    					lvi.pszText = (LPTSTR)(LPCTSTR)(strItem);
    					AusgabeListe.SetItem(&lvi);
    					f++;
    				}
    
    			}
             }
    }
    

    Was ist da Falsch gelaufen?

    Bitte helft mir!!!

    Mit freundlichen Grüssen!

    Twist



  • 1. Ob das da richtig is weis ich net, kann es aber auch so lauten?:

    m_DocBasisPage[i].SetRectangle(); //Ruft die funktion zur eingrenzung der PropertyPages
    

    2. Müsste es zuoberst nicht das heissen?:

    CRect ClientRect;
    

    ➡ hast nur RECT geschrieben... ?

    Und 3.
    Ich weiss es ja nicht aber könnte es auch an dieser Stelle da liegen?
    Bitte erst obiges versuchen, und dann mal hier unten weiterfahrn. Will Dir net den Code verpfuschen *grins* 😃

    CRect rect;                         //für den inhalt der ListCtrl! 
        AusgabeListe.GetClientRect(&rect);
    

    Du definierst eine Variable CRect rect; und schreibst untendrann ▭ aber die Variable ist leer. Da die Variable mindestens 1 ("Nenner" ?) haben muss, könnte das Progg dann abstürzen. ?

    Vielleicht das da:

    CRect rect;
    rect.bottom = -1;
    rect.right = -1;
    rect.left = -1;
    rect.top = -1;¨
    
        AusgabeListe.GetClientRect(&rect);
    

    Eventuell 0 oder 1 einsetzen.
    Versuchs mal so.

    mfg
    Pro



  • Ja. 😃 RECT war aus nem alten Quelltext rauskopiert worden und da war das ein Typdev.

    Danke vielmals!
    hast mir sehr geholfen.
    Funzt jetzt!



  • Gerngeschehen 😃


Anmelden zum Antworten