Daten an Listenelement hängen



  • ich versuche gerade in einer WinApi anwendung Daten an ein Listenelement zu hängen.
    Damit es keine missverständnisse gibt bei CListCtrl wäre das SetItemData.

    Laut MSDN würde/soll das mit der LVITEM strucktur gehn. Nur bin ich mir nicht ganz im klaren wie.
    alle meine versuche schlugen bislang fehl, indem nichts an das Element gefügt wurde.

    wie folgt sind meine versuche die Daten an das Element zu hängen bzw. diese wieder abzurufen.

    BOOL SetListItemData(HWND hWnd, UINT uiID, DWORD dwData,int iItem)
    {	/**********************************************************************************************
    		- hWnd Handle auf das Dialogfenster indem die Liste erstellt wird
    		- uiID definition der Liste
    		- dwData Informationen die im Element gespeichert werden
    		- iItem Nr des Elementes in das gespeichert wird
    	**********************************************************************************************/
    	LVITEM LvItem;
    	memset(&LvItem,0,sizeof(LvItem));			
    
    	HWND hList			= GetDlgItem(hWnd,uiID);//Handle auf die Liste holen
    
    	LvItem.mask			= LVIF_PARAM;			
    
    	LvItem.iItem		= iItem;				// Element Nr das gesetzt wird 
    
    	LPARAM lParam		= MAKELPARAM(dwData,sizeof(dwData));
    	LvItem.lParam		= lParam;			
    
    	SendMessage(hList,LVM_SETITEM,(WPARAM)0,(LPARAM)&LvItem); // füge Element ein
    
    	return TRUE;
    }
    BOOL GetListItemData(HWND hWnd, UINT uiID,int iItem,DWORD &dwData,DWORD &dwSizeData)
    {	/**********************************************************************************************
    
    		- hWnd Handle auf das Dialogfenster indem die Liste erstellt wird
    		- uiID definition der Liste
    		- iItem Nr des Elementes das gesucht wird
    		- dwData gespeicherte Informationen im Element
    		- dwSizeData größe der gespeicherte Informationen im Element
    	**********************************************************************************************/
    
    	LVITEM LvItem;
        	memset(&LvItem,0,sizeof(LvItem));			
    
    	HWND hList			= GetDlgItem(hWnd,uiID);//Handle auf die Liste holen
    
    	LvItem.mask			= LVIF_PARAM;			
    
    	LvItem.iItem		= iItem;				// Element Nr das gesucht wird 
    
    	SendMessage(hList,LVM_GETITEMTEXT,(WPARAM)iItem,(LPARAM)&LvItem); 
    
    	CString sFormat;
    	sFormat.Format("0x%08X\n%i",LOWORD(LvItem.lParam),HIWORD(LvItem.lParam));
    	MsgBox(sFormat);
    
    	dwData				= LOWORD(LvItem.lParam);	         
    	dwSizeData			= HIWORD(LvItem.lParam);
    
    	return TRUE;
    }
    


  • schiebung
    keinder eine Idee wie das geht bzw was ich falsch mach?



  • Hoi,

    Also, dieser Codeabschnitt könnte Probleme machen:

    LPARAM lParam        = MAKELPARAM(dwData,sizeof(dwData));
    LvItem.lParam        = lParam;
    

    dwData, also der Typ DWORD verbraucht i.d.R. (auf einem 32-Bit Rechner) sizeof(DWORD) = 4 Bytes. LPARAM ist definiert als long, verbraucht also auch 4 Bytes...das wird eng. Was soll diese Art der Zuweisung überhaupt ?
    Machs einfach so:

    LvItem.lParam = dwData;
    

    In Deinem Post ist übrigens keine Fehlerbeschreibung vorhanden 👎 ... WAS ist denn überhaupt das Problem 🙄 ? WO läuft etwas schief ? Gegebenenfalls mal mit dem Debugger geschaut ?



  • Naja fehlerbeschreibung gibt es keine, denn es passiert kein fehler, die Liste wird problemlos erstellt nur wird nichts
    an das Listenelement drangehängt.

    Zu meiner schande mus ich gestehn das ich nicht gerade per du mit dem Debugger bin.

    und mit der art der zuweisung wollte ich versuchen, zwei fliegen mit einer klappe zu schlagen. ging wohl nach hinten los.
    Danke für den tip werd das nacher gleich mal versuchen.



  • aus dem nacher ist dann doch etwas später geworden.
    so, hab das mal versucht wie CodeFinder es vorgeschlagen hat.

    anscheinend bin ich zu blöd das zu bewerkstelligen, denn ich krieg es nicht gebacken daten an das Listenelement zu klemmen.
    was ich zumindest mal geschaft hab ist das SetCheck/Getcheck für Checkboxen in der Liste zu bewerkstelligen.
    dabei versteh ich noch nicht ganz was da passiert. anbei vieleicht kann mir das jemand mal erklären.

    #define LV_SETCHECKBOX(x) ((int(x) + 1) << 12)
    #define LV_GETCHECKBOX(x) ((int(x) - 1) >> 12)
    
    void CCtrlList::SetListItemCheck(HWND hWnd, UINT uiID,int iItem,BOOL bCheck)
    {	/**********************************************************************************************
    									SET LIST ITEM CHECK
    					Setzt die Checkbox des Elements
    
    				- hWnd Handle auf das Dialogfenster indem die Liste erstellt wird
    				- uiID definition der Liste
    				- iItem Nr des Elementes das gesucht wird
    				- bCheck Wert auf den die Checkbox gesetzt wird
    	**********************************************************************************************/
    	LVITEM LvItem;
        memset(&LvItem,0,sizeof(LvItem));			// Setze Element Struct zurück
    
    	HWND hList			= GetDlgItem(hWnd,uiID);//Handle auf die Liste holen
    	LvItem.mask			= LVIF_STATE ;			// Text Style
    	LvItem.state		= LV_SETCHECKBOX(bCheck);//((int(bCheck) + 1) << 12);
    	LvItem.stateMask	= LVIS_STATEIMAGEMASK;
    
    	SendMessage(hList,LVM_SETITEMSTATE,(WPARAM)iItem,(LPARAM)&LvItem); // Setze Element Status
    
    }
    BOOL CCtrlList::GetListItemCheck(HWND hWnd, UINT uiID,int iItem)
    {	/**********************************************************************************************
    									GET LIST ITEM CHECK
    					gibt zurück ob die Checkbox des Elements angehackt ist
    
    				- hWnd Handle auf das Dialogfenster indem die Liste erstellt wird
    				- uiID definition der Liste
    				- iItem Nr des Elementes das gesucht wird
    	**********************************************************************************************/
    	LVITEM LvItem;
       memset(&LvItem,0,sizeof(LvItem));			// Setze Element Struct zurück
    
    	HWND hList			= GetDlgItem(hWnd,uiID);//Handle auf die Liste holen
    	LvItem.mask			= LVIF_STATE ;			// Text Style
    	LvItem.stateMask	= LVIS_STATEIMAGEMASK;
        LvItem.iItem		= iItem; 
    
    	SendMessage(hList,LVM_GETITEM,(WPARAM)0,(LPARAM)&LvItem); // Setze Element Status
    
    	return 	LV_GETCHECKBOX(LvItem.state);//((int(LvItem.state) - 1) >> 12);
    
    }
    

    bevor missverständniss auftreten was ich nicht versteh ist ((int(TRUE) + 1) << 12) bzw. ((int(LvItem.state) - 1) >> 12)
    was passiert da

    ferner bräuchte ich wirklich dringend, wie ich daten an ein listenelement hängen kann. durch googlen und lesen in der
    MSDN <-(werd daraus leider nicht soo ganz schlau) denke ich das es ähnlich gehen muss wie den Status der CheckBox an das Element
    zu hängen. ich muss daten in der form von Flags

    #define	OPEN_EDIT		0x1000	
    #define	OBEN_COMBO	0x2000
    

    an das Listenelement hängen. aber ich hab keinen schimmer unter was LVIS_STATEIMAGEMASK o. LVIS_OVERLAYMASK bzw. wie

    LvItem.state = OPEN_EDIT;
    LvItem.state = ((OPEN_EDIT)<<8);
    

    da alle versuche in der form fehlschlugen das ich keine Daten zurückbekommen hab. aus diesem grund hab ich auch keine code
    den ich hier posten könnte. Ich weis also nicht, ob ich die daten schon falsch zuweise oder nur die abfrage falsch ist.

    wie gesagt ich bräuchte es echt dringend.
    bin für jede hilfe dankbar.


Log in to reply