. 이동 기록

이동 기록은 레코드를 병합하지 않기 때문에 삭제나 삽입에 비해 상대적으로 간단하며 순서도를 그려 볼 필요도 없을 정도다. 다음 함수는 이동 기록을 작성하는 URMove 함수이다.

 

void CApiEdit::URMove(int nPos, int Dest,TCHAR *str)

{

     if (CanRedo()) {

          ClearRedo();

     } else {

          if (pUR[nowur].action != UR_NONE) {

              NextRecord();

          }

     }

 

     AllocURData(nowur,sizeof(int)*2,0);

     pUR[nowur].action=UR_MOVE;

     pUR[nowur].pos=nPos;

     pUR[nowur].dest[0]=Dest;

     pUR[nowur].dest[1]=lstrlen(str);

}

 

취소된 레코드가 있으면 모두 삭제한다. 작성중인 레코드가 있으면 NextRecord 함수로 다음 레코드로 이동하고 현재 레코드가 빈 레코드이면 그냥 이동 기록을 작성하면 된다. action UR_MOVE를 기록하고 pos에는 이동을 시작한 위치를, dest[0]에는 이동한 위치를, dest[1]에는 이동한 문자열의 길이를 기록하였다.

data 멤버에는 정수형 변수의 크기 2개분만큼(8바이트)을 할당하여 이 멤버와 같은 공간을 차지하고 있는 dest 정수배열이 크기 2를 가지도록 하였다. data를 할당하든지 dest를 할당하든지 두 멤버는 결국 같은 포인터이기 때문에 결과는 동일하다. 이동 레코드의 편집기록은 길이가 미리 정해져 있고 병합되지 않기 때문에 여분을 추가로 더 할당할 필요가 없다.