Я пытаюсь создать функцию 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();
}
Как уже упоминалось, SetAt
получил доступ к индексу out of bounds, что привело к вызову assert из VS. С помощью Add
Естественно решает проблему, так как массив расширяется.
Этот код работает нормально
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());
}