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 nichtging 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...
-
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