Visual Studio — проблемы с «повторить / отменить» функция (MFC, C ++)

Я пытаюсь создать функцию Redo / Undo в моем приложении MFC, но когда я пытаюсь отменить объект CLine — он не работает правильно. Что я делаю не так? Извините за мой английский!

введите описание изображения здесь

void CKonokhovDoc::OnEditUndo()
{
// TODO: Add your command handler code here
int Index = (int)m_LineArray.GetUpperBound();
int Index2 = (int)m_LineArray_redo.GetUpperBound();
if (Index>-1){
redoLine = m_LineArray.GetAt(Index);
m_LineArray_redo.SetAt(Index2+1,redoLine);
m_LineArray.RemoveAt(Index);
}
UpdateAllViews(0);
SetModifiedFlag();
}void CKonokhovDoc::OnUpdateEditUndo(CCmdUI *pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable((int)m_LineArray.GetSize());

}void CKonokhovDoc::OnEditRedo()
{
// TODO: Add your command handler code here
int Index = (int)m_LineArray.GetUpperBound();
int Index2 = (int)m_LineArray_redo.GetUpperBound();
m_LineArray.SetAt(Index+1, m_LineArray_redo.GetAt(Index2));
m_LineArray_redo.RemoveAt(Index2);
//redoLine = NULL;
UpdateAllViews(0);
SetModifiedFlag();
}

0

Решение

Как уже упоминалось, SetAt получил доступ к индексу out of bounds, что привело к вызову assert из VS. С помощью Add Естественно решает проблему, так как массив расширяется.

Это было упомянуто ОП

1

Другие решения

Этот код работает нормально

void CLab1_LeshikDoc::OnEditUndo()
{
int Index = (int)m_LineArray.GetUpperBound();
int Index2 = (int)m_LineArray_redo.GetUpperBound();
if (Index>-1) {
m_LineArray_redo.Add(m_LineArray.GetAt(Index));
m_LineArray.RemoveAt(Index);
}
UpdateAllViews(0);
SetModifiedFlag();
}void CLab1_LeshikDoc::OnUpdateEditUndo(CCmdUI *pCmdUI)
{
pCmdUI->Enable((int)m_LineArray.GetSize());
}

void CLab1_LeshikDoc::OnRedo()
{
int Index2 = (int)m_LineArray_redo.GetUpperBound();
m_LineArray.Add(m_LineArray_redo.GetAt(Index2));
m_LineArray_redo.RemoveAt(Index2);
UpdateAllViews(0);
SetModifiedFlag();
}

void CLab1_LeshikDoc::OnUpdateRedo(CCmdUI *pCmdUI)
{
pCmdUI->Enable((int)m_LineArray.GetSize());
}
0

По вопросам рекламы [email protected]