将 std::map 迭代对象存储为 CGridCtrl 中的项目数据
Storing std::map iteration object as itemdata in CGridCtrl
我一直在努力决定如何传达我的问题。
我有一些地图:
typedef struct tagDemoEntryAssign
{
COleDateTime datMeeting;
CString strAssignment;
int iAssignmentType; // AJT v16.0.9
int iStudyPoint; // AJT v16.0.3
int iNextStudyPoint; // AJT v16.0.9
} S_DEMO_ENTRY_ASSIGN;
typedef std::vector<S_DEMO_ENTRY_ASSIGN> PublisherAssignments;
typedef struct tagDemoEntryEx
{
CString strName;
E_GENDER eGender;
E_POSITION ePosition;
E_APPOINTED eAppointed;
BOOL bDemonstrations; // AJT v16.0.3
PublisherAssignments vectorItemAssign; // Sorted array of S_DEMO_ENTRY_ASSIGN structures.
} S_DEMO_ENTRY_EX;
typedef std::map<CString, S_DEMO_ENTRY_EX> PublisherMap;
typedef std::map<CString, S_DEMO_ENTRY_EX>::iterator PublisherMapIter;
我最终得到了一些数据,并填写了 CGridCtrl
。我尝试为单元格设置项目数据。具体来说:
m_Grid.SetItemData(iRowCount - 1, DEMO_COLUMN_NAME, (LPARAM)&iter->second);
当我尝试访问 LPARAM 数据时,它是否无效。
为什么?
更新
我认为问题与这行代码有关:
S_DEMO_ENTRY_ASSIGN sAssign = iter->second.vectorItemAssign.back();
我将其分配为项目数据:
m_Grid.SetItemData(iRowCount - 1, DEMO_COLUMN_LAST_USED, (LPARAM)&sAssign);
随后在这里使用:
int CALLBACK CDemoPickerDlg::pfnCellCompareDate(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
CGridCellBase* pCell1 = (CGridCellBase*)lParam1;
CGridCellBase* pCell2 = (CGridCellBase*)lParam2;
if (!pCell1 || !pCell2) return 0;
S_DEMO_ENTRY_ASSIGN *psItem1 = (S_DEMO_ENTRY_ASSIGN*)pCell1->GetData();
S_DEMO_ENTRY_ASSIGN *psItem2 = (S_DEMO_ENTRY_ASSIGN*)pCell2->GetData();
// If a name has never been used the structure pointer will be null.
if (psItem1 == NULL && psItem2 == NULL)
return 0;
else if (psItem1 == NULL)
return -1;
else if (psItem2 == NULL)
return 1;
else if (psItem1->datMeeting < psItem2->datMeeting)
return -1;
else if (psItem1->datMeeting == psItem2->datMeeting)
return 0;
else
return 1;
}
我认为这是错误的:
S_DEMO_ENTRY_ASSIGN sAssign = iter->second.vectorItemAssign.back();
如果我对机制的理解正确,上面是对结构进行复制。然后我正在分配这个副本的指针。并且副本在地图的迭代循环中超出范围。
我认为我需要存储指向实际 iter->second.vectorItemAssign.back()
对象的指针。
我不得不将一行代码更改为:
m_Grid.SetItemData(iRowCount - 1, DEMO_COLUMN_LAST_USED, (LPARAM)&iter->second.vectorItemAssign.back());
我一直在努力决定如何传达我的问题。
我有一些地图:
typedef struct tagDemoEntryAssign
{
COleDateTime datMeeting;
CString strAssignment;
int iAssignmentType; // AJT v16.0.9
int iStudyPoint; // AJT v16.0.3
int iNextStudyPoint; // AJT v16.0.9
} S_DEMO_ENTRY_ASSIGN;
typedef std::vector<S_DEMO_ENTRY_ASSIGN> PublisherAssignments;
typedef struct tagDemoEntryEx
{
CString strName;
E_GENDER eGender;
E_POSITION ePosition;
E_APPOINTED eAppointed;
BOOL bDemonstrations; // AJT v16.0.3
PublisherAssignments vectorItemAssign; // Sorted array of S_DEMO_ENTRY_ASSIGN structures.
} S_DEMO_ENTRY_EX;
typedef std::map<CString, S_DEMO_ENTRY_EX> PublisherMap;
typedef std::map<CString, S_DEMO_ENTRY_EX>::iterator PublisherMapIter;
我最终得到了一些数据,并填写了 CGridCtrl
。我尝试为单元格设置项目数据。具体来说:
m_Grid.SetItemData(iRowCount - 1, DEMO_COLUMN_NAME, (LPARAM)&iter->second);
当我尝试访问 LPARAM 数据时,它是否无效。
为什么?
更新
我认为问题与这行代码有关:
S_DEMO_ENTRY_ASSIGN sAssign = iter->second.vectorItemAssign.back();
我将其分配为项目数据:
m_Grid.SetItemData(iRowCount - 1, DEMO_COLUMN_LAST_USED, (LPARAM)&sAssign);
随后在这里使用:
int CALLBACK CDemoPickerDlg::pfnCellCompareDate(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
CGridCellBase* pCell1 = (CGridCellBase*)lParam1;
CGridCellBase* pCell2 = (CGridCellBase*)lParam2;
if (!pCell1 || !pCell2) return 0;
S_DEMO_ENTRY_ASSIGN *psItem1 = (S_DEMO_ENTRY_ASSIGN*)pCell1->GetData();
S_DEMO_ENTRY_ASSIGN *psItem2 = (S_DEMO_ENTRY_ASSIGN*)pCell2->GetData();
// If a name has never been used the structure pointer will be null.
if (psItem1 == NULL && psItem2 == NULL)
return 0;
else if (psItem1 == NULL)
return -1;
else if (psItem2 == NULL)
return 1;
else if (psItem1->datMeeting < psItem2->datMeeting)
return -1;
else if (psItem1->datMeeting == psItem2->datMeeting)
return 0;
else
return 1;
}
我认为这是错误的:
S_DEMO_ENTRY_ASSIGN sAssign = iter->second.vectorItemAssign.back();
如果我对机制的理解正确,上面是对结构进行复制。然后我正在分配这个副本的指针。并且副本在地图的迭代循环中超出范围。
我认为我需要存储指向实际 iter->second.vectorItemAssign.back()
对象的指针。
我不得不将一行代码更改为:
m_Grid.SetItemData(iRowCount - 1, DEMO_COLUMN_LAST_USED, (LPARAM)&iter->second.vectorItemAssign.back());