SetItemData, Konvertierung vom unsigned long zu DWORD_PTR



  • Hallo Zusammen,

    sowie es in der Methodenbeschreibung von SetItemData fuer die Klasse CComboBox
    steht, eine int idx Wert und DWORD_PTR benoetigt. DWORD_PTR zeigt auf die
    assozierten Data.

    So ich habe einen long Wert, den ich mit einem String assozieren moechte. Deswegen
    muss ich diesen long zu DWORD umwandeln und dann die addresse in der SetItemData
    angeben.

    Eine direkte Konvertierung:

    DWORD test = (DWORD) products[i-1].id ; // geht nicht
    

    ging nicht. Ich habe lange gegoogelt und folgedes gefunden:

    DWORD what = reinterpret_cast<DWORD>(products[i-1].id) ;
    m_produkt_combo.SetItemData(i, &what); // C2440 Error..
    

    Nun das funktioniert auch nicht.. Welche Moeglichkeiten gibt es fuer
    Konvertierung vom long,int,double,float Werten zu DWORD bzw. DWORD_PTR?

    Danke im voraus,
    jsbach



  • DWORD ist nichts anderes als unsigned long, deshalb braucht man long/int eigentlich nicht zu casten, denke ich.

    In der Beschreibung zu SetItemData (http://msdn2.microsoft.com/de-de/library/0ekb53ey(VS.80).aspx) wird folgendermaßen aufgerufen:

    for (int i=0;i < pmyComboBox->GetCount();i++)
    {
       pmyComboBox->SetItemData(i, i);
    }
    

    Es wird also einfach ein numerischer Wert (ohne Adressoperator) übergeben. Probier mal aus, ob das bei dir klappt.

    Btw, ich meine auch mal defines der Marke "typedef DWORD DWORD_PTR" gesehen zu haben (hatte glaube ich mit Win x64 zu tun?). Das würde ja einiges erklären...


  • Mod

    DWORD what = reinterpret_cast<DWORD>(products[i-1].id) ; 
    m_produkt_combo.SetItemData(i, &what); // C2440 Error..
    

    Das macht ja auch wirklich keinen Sinn!
    Einen Zeiger auf eine temporäre Variable zu übergeben.

    Ansonsten kommt man sicherlich ohne cats aus.

    @_matze: Sofern Du für 32bit entwickelst ist DWORD_PTR ein DWORD. Ab 64bit nicht mehr.



  • Hallo Zusammen,

    _matze schrieb:

    DWORD ist nichts anderes als unsigned long, deshalb braucht man long/int eigentlich nicht zu casten, denke ich.

    ja du hast recht. Ich bin wegen dem Namensvergabe bissle durcheinander gekommen.
    Nach deinem Hinweis habe ich mit unsigned longs ausprobiert: klappt wunderbar. Danke!

    Martin Richter schrieb:

    Das macht ja auch wirklich keinen Sinn!
    Einen Zeiger auf eine temporäre Variable zu übergeben.

    Im grunde genommen, habe ich versucht, Kern des Problems kurz wie moeglich zu
    beschreiben . Deswegen ungewoehnliche `Codeschnippsel` ;). Das Programblock
    sieht so aus:

    // Native Initializer for ComboBox
    // Adds Banner and Elements from DBResEelement
    // in given order.
    void OutDlg::initNComboBox(CComboBox* combo, char *banner, DBResElement* resPointer, 
    						   int* length)
    {
    	if(!combo)
    		return ;
    
    	// 0th element is set to be a banner always.
    	// for performance reasons left out of loop.
    	combo->AddString(banner);					//SetItemData is automagically NULL 
    
    	// Adding to Combo Box from the 1st element
    	for(int i=1 ; i <= *length ; i++){
    		combo->InsertString(i, *(resPointer[i-1].getElementString()));
    		combo->SetItemData(i, resPointer[i-1].getElementId()); // was getElementIdStr()
    
    	}
    
    	combo->SetCurSel(0);
    	this->UpdateData(FALSE);
    }
    

    danke noch mal & Gruss,
    jsbach


Anmelden zum Antworten