CTabCtrl & msflexGrid mit MFC

Drei

Grünschnabel
Ich habe ein Problem mit der übergabe von CStringswert aus ein Tab1 in andere Tab2!
meine Tab1 ist ein CDialog mit name CSeite1 ohne Titel und als Child definiert, in diese habe ich ein CListCtrl mit member Variable m_cListCtrl erstellt.
Aus der Liste kann ich elemente auswählen. und mit Button Selected gebe ich Items in eine
CString liste.
Dann habe ich in Tab2 "CSeite2" ein Tabelle "MSFlexGrid" erstellt und als member Variable m_ctlFGrid definiert.
Zum testen habe ich in Code die ausgabe in ein Messagbox versucht es funktionieret aber ich weis nicht :

*** Frage ?
Wie kann ich die Elemente aus CString liste in meine Tab2 "CSeite2" in Zellen von MSFlexGrid hinein schreiben und dies Seite2 anzeigen.
Kann Bitte jemand helfen?

***Cod #

void CSeite1::OnSelectbutton()
{
UpdateData(TRUE);
// TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
// Get the selected items in the control
int nSelected;
CString liste;
CString list2;
POSITION p = m_cListCtrl.GetFirstSelectedItemPosition();
if(p)
{
int i;
while (p)
{
nSelected = m_cListCtrl.GetNextSelectedItem(p);
if(m_Radio1.GetCheck())
{
liste = m_cListCtrl.GetItemText(nSelected,0);
m_sResults = liste;
}
else
{
liste = m_cListCtrl.GetItemText(nSelected,2);
}
list2 = list2+"\n" + liste;
}
MessageBox(list2,"Warning!",MB_OK);
}
else
{
MessageBox("Keine Element aus der Liste wurde ausgewählt\nBitte mindestes eine Element auswählen!","Warning!",MB_OK);
}

UpdateData(FALSE);
}
 
Du verwendest wahrscheinlich CTabCtrl als Parent für deine Tabs?
Um von einen Tab auf ein anderes zuzugreifen könntest du folgenden Code innerhalb eines Tabs verwenden:

Code:
CTabCtrl *pTabCtrl = (CTabCtrl *)GetParent();

TCITEM   item;
item.mask = TCIF_PARAM;

pTabCtrl->GetItem(nTabIndex, &item);

if( iItem.lParam )
{
    CWnd *pWnd = reinterpret_cast<CWnd*> (item.lParam);
    
    // ...
}

nTabIndex ist die Nummer des Tabs.
pWnd ist das Tab-Fenster. Hier musst du dann statt auf CWnd auf die Dialogklasse des Tabs casten.

Gruß
MCoder
 
Danken für den Tip!
Das Probelm hab ich noch immer ich habe dein Code so verwendet aber es sunkioniert noch immer nicht :confused:

HTML:
void CSeite1::OnSelectbutton() // Wenn man auf Select Button im  Tab1 drückt
{                                                       // wird diese Methode aufgerufen um ein String
                                                        // in eine Zelle von MSGridFlex im Tab2 einfügen
                                                        // es soll dann die Tab2 angezeigt werden mit dem
                                                        // aktuellen Eintrag !?
	UpdateData(TRUE);	
	int nSelected; 
	CString liste;
	CString list2;

	POSITION p = m_cListCtrl.GetFirstSelectedItemPosition();
	if(p)
	{
		int i;
		while (p)
		{	
			nSelected = m_cListCtrl.GetNextSelectedItem(p);
			if(m_Radio1.GetCheck())
			{
				liste = m_cListCtrl.GetItemText(nSelected,0);
			}
			else
			{
				liste = m_cListCtrl.GetItemText(nSelected,2);
			}
			list2 = list2 + liste;
		}
	
		m_sResults = list2;
                CTabCtrl *pTabCtrl = (CTabCtrl *)GetParent();

               TCITEM   item;
               item.mask = TCIF_PARAM;

               pTabCtrl->GetItem(1, &item);   //Tab1=CSeite1=0
                                                            //Tab2=CSeite2=1
               if( iItem.lParam )                     //Tab3=CSeite3=2
               {
                      CWnd *pWnd = reinterpret_cast<CSeite2*> (item.lParam); //?
                      //m_ctlFGrid.SetTextArray(6, "TextNeue");  // Wie rufe ich diese Methode 
                      //auf m_ctlFGrid ind ein Membervariable der CSeite2 von Typ CMSFlexGrid	
                      //m_ctlFGrid;
                      // ...
              }	
        }
	else
	{
		MessageBox("Keine Element ausgewählt!","Warning!",MB_OK);
	}
	
	UpdateData(FALSE);
}
und in CSeite2 wird durch OnInitDialog() am Anfang diese wert in Zelle 6 hinein geschrieben !
HTML:
BOOL CSeite2::OnInitDialog() 
{
       	CDialog::OnInitDialog();

	m_ctlFGrid.SetTextArray(6, "TextAlt");
	
	return FALSE;
	              
}
Also Ich habe noch keine Ahnung wie ich es hinbekommen kann!
Kann jemand vieleich mir Helfen?
 
Der Zugriff auf mCtlFGrid sollte so funktionieren:

Code:
CSeite2 *pWnd = reinterpret_cast<CSeite2*> (item.lParam);
pWnd->mCtlFGrid.SetTextArray(6, "TextNeue");
 
Es kommet zum Fehler:

Unbehandelte Aussnahme in TabCtrl.exe (MFC42D.DLL): 0xC0000005 ; ACCESS VIOLATION


void AFX_CDECL CWnd::InvokeHelper(DISPID dwDispID, WORD wFlags, VARTYPE vtRet,
HTML:
void* pvRet, const BYTE* pbParamInfo, ...)
{
	ASSERT(m_pCtrlSite != NULL);    // not an OLE control (not yet, at least) //Fehler

	if (m_pCtrlSite == NULL)
		return;

	va_list argList;
	va_start(argList, pbParamInfo);
	m_pCtrlSite->InvokeHelperV(dwDispID, wFlags, vtRet, pvRet, pbParamInfo,
		argList);
	va_end(argList);
}
welche wert soll item.lParam liefern?
 
item.lParam liefert ein Handle auf den Tab-Dialog (CSeite2). Durch welche Codezeile bei void CSeite1::OnSelectbutton() wird denn der Fehler ausgelöst?
 
Ich habe dein Code wie unten in meine Program geschrieben dann habe damit versucht und habe fest gestellt dass item.lParam nicht True ist oder hat keine Wert!
Also ist dass Program damit den if() anweisung übersprungen und deswegen hat keine Fehler gezeigt. um fest zustellen Ob Mit auskommentierte if() was passiert habe dann die Fehlermeldung bekommen und dass kommt genau an diese Zeile vor!

pWnd->m_ctlFGrid.SetTextArray(6, "TextNeue");

Jetzt habe ich mit ein paar änerung geschaft nur mit Select Buttob den Focus auf Tab2 zurichten und diese als WS_SHOW zu initialisieren.

Problem mit Wertübergabe an der Tabell besteht noch. :(

HTML:
void CSeite1::OnSelectbutton() 
{
	UpdateData(TRUE);	

	int nSelected; 
	CString liste;
	CString list2;

	POSITION p = m_cListCtrl.GetFirstSelectedItemPosition();
	if(p)
	{
		int i;
		while (p)
		{	
			nSelected = m_cListCtrl.GetNextSelectedItem(p);
			if(m_Radio1.GetCheck())
			{
				liste = m_cListCtrl.GetItemText(nSelected,0);
			}
			else
			{
				liste = m_cListCtrl.GetItemText(nSelected,2);
			}
			list2 = list2 + liste;
		}
	
		m_sResults = list2;
		CMyTabCtrl *pTabCtrl = (CMyTabCtrl *)GetParent();
			
		TCITEM item = {0,1,2};
		TCHAR s[255]; 

		item.mask = TCIF_TEXT|TCIF_PARAM;
		item.pszText=s; 
		item.cchTextMax=255;
		pTabCtrl->GetItem(1, &item);
					
	//	if( item.lParam )    // iten.lParam hat kein Wert oder ist FALSE!         
        //      {        
			CSeite2 *pWnd = reinterpret_cast<CSeite2*> (item.lParam);
                        pWnd->m_ctlFGrid.SetTextArray(6, "TextNeue");  //Fehler Stelle!! :confused:              
        //      }
		pTabCtrl->m_aktuelleSeite=pTabCtrl->GetCurFocus();
		pTabCtrl->m_tabellenSeite[pTabCtrl->m_aktuelleSeite]->ShowWindow(SW_HIDE);
		pTabCtrl->m_aktuelleSeite = 1;
		pTabCtrl->m_tabellenSeite[pTabCtrl->m_aktuelleSeite]->ShowWindow(SW_SHOW);
		pTabCtrl->SetCurFocus(1);
		pTabCtrl->SetCurSel(1);
	}
	else
	{
		MessageBox("Keine Element aus der Liste wurde ausgewählt\nBitte mindestes eine Element auswählen!","Warning!",MB_OK);
	}
	
	UpdateData(FALSE);
}
 
Hallo,

ja du hast recht, item.lParam ist leer, sofern man den Wert nicht selber einträgt.
Ich habe für meine TabControls mal vor langer Zeit eine AddTab-Methode geschrieben, die das mit erledigt und die ich immer verwende. Da hab ich gar nicht mehr dran gedacht, dass der Eintrag gar nicht so von alleine entsteht :)

Hier der Code mit einem einfachen Beispiel:
Code:
// Deklaration in MyDialog.h
CSeite1 dlgSeite1;
CSeite2 dlgSeite2;

// Funktion zum hinzufügen eines Tabs

void CMyDialog::AddTab(CDialog *pDialog, UINT uiDialogID, CString strText, int iIndex)
{
    if( !pDialog->GetSafeHwnd() ) // Fenster darf noch nicht erzeugt worden sein
    {
        pDialog->Create(uiDialogID, &m_tabcontrol);

        TCITEM item;
        item.mask    = TCIF_TEXT | TCIF_PARAM;
        item.lParam  = (LPARAM)pDialog;
        item.pszText = (LPTSTR)(LPCTSTR)strText;

        m_tabcontrol.InsertItem(iIndex, &item);

        CRect rcItem;
        m_tabcontrol.GetItemRect(0, &rcItem);

        pDialog->SetWindowPos( NULL,
                               rcItem.left,
                               rcItem.bottom + 1,
                               0,
                               0,
                               SWP_NOSIZE | SWP_NOZORDER );

        // Der erste Tab (Index 0) wird angezeigt
        pDialog->ShowWindow(iIndex ? SW_HIDE : SW_SHOW);
    }
}

// Tabs bei InitDialog erzeugen

BOOL CMyDialog::OnInitDialog()
{
    AddTab(&dlgSeite1, IDD_SEITE1, _T("Seite 1"), 0);
    AddTab(&dlgSeite2, IDD_SEITE2, _T("Seite 2"), 1);
    
    // ...
 
    return TRUE;   
}

Gruß
MCoder
 
Hallo

Ich kann leider mit dem Code nichts anfangen, bei mir funktioniert die Tabs mit alle dazu gehörige Steuerelementen!

Was in mein Program Problem macht, ist hinfügen von neue Wert in eine Zelle von MSFlexGrid der von Tab1 mit aufruf diese Metohde geschehen soll was leider zu eine Fehler führt.

Bitte um Hilfe in diese Bereich.

lg Drei
 
Hallo,

an irgendeiner Stelle musst du ja die Tabs erzeugen, bei der Gelegenheit speicherst du dann den Zeiger auf das CWnd-Objekt in item.lParam, damit du später mit GetItem() darauf zugreifen kannst.

Oder hast du in dem Dialog, welcher das TabControl enthält, eine Membervariable für CSeite2 angelegt?
Dann könnte es vielleicht auch so klappen:
Code:
CSeite2 *pWnd = &GetParent()->m_Seite2;
pWnd->mCtlFGrid.SetTextArray(6, "TextNeue");
 
Zurück