. 필요성

bModified 변수는 문서가 변경되었는지를 기록하는 플래그이다. 최초 InitDoc에서 FALSE로 초기화되며 문서가 편집되는 시점인 Insert, Delete에서 무조건 TRUE로 바꾸어 문서가 변경되었음을 기록해놓는다. ApiEdit는 문서가 변경될 때 이 값을 무조건 TRUE로 바꾸기만 할 뿐 다시 FALSE로 바꾸지는 않는다. 오로지 호스트만 SetModified 함수로 이 플래그를 변경할 수 있다. ApiEdit는 문서가 조금이라도 바뀌면 그 흔적을 bModified에 남기기만 하면 되었다.

하지만 취소/재실행 기능이 들어감으로써 사정이 달라졌다. 편집 동작을 거꾸로 취소할 수 있기 때문에 취소에 의해 이미 변경된 문서가 변경되지 않은 상태로 복원될 수 있다. 그래서 ApiEdit는 취소/재실행시 bModified 플래그를 적절하게 관리해야 한다. 호스트의 도움없이 컨트롤 스스로 변경을 관리해야 하는 것이다.

이런 경우를 생각해보자. 문서를 편집하다가 저장하면 호스트에 의해 bModified FALSE가 된다. 저장한 후 실수로 키보드를 건드려 문자가 삽입되었고 따라서 bModified TRUE가 되었다. 이때 <Ctrl+Z>로 삽입을 취소한다 하더라도 bModified는 여전히 TRUE로 남아 있게 되며 이 상태에서 문서를 닫으려고 하면 저장되지 않았다는 잘못된 경고를 하게 될 것이다.

자신의 실수로 키보드가 눌러졌다는 것을 확실히 알고 있다면 사용자가 알아서 이 경고를 무시하겠지만 그렇지 않은 경우는 무엇이 어떻게 바뀐 것인지 몰라 어리둥절할 것이다. 파일의 수정 여부가 아주 중요한 의미가 있는 경우도 있는데 지금 여러분들이 사용하고 있는 비주얼 스튜디오가 대표적인 예이다. 이 프로그램은 소스파일이 변경되었으면 재 컴파일하고 그렇지 않으면 무시한다. bModified 플래그가 소스를 다시 컴파일할 것인가 아닌가를 결정하는 중요한 역할을 하고 있는 것이다.

디버깅중에 소스를 잘못 건드리는 실수는 누구나 할 수 있으며 여러분들도 경험이 있을 것이다. 이때 디버깅을 계속하면 소스가 바뀌었으니 재컴파일하라는 경고를 받게 된다. 이런 경고를 받지 않으려면 소스 편집을 취소하여 디버깅을 시작할 때의 상태로 돌아갈 수 있어야 하며 그러기 위해서는 취소시 bModified FALSE로 바꿔야 한다. 비주얼 스튜디오는 이 기능이 아주 잘 작성되어 있다.

이 기능은 사실 굉장히 고급 기능이며 없어도 편집기를 사용하는 데는 큰 지장이 없다. 하지만 가능하다면 사용자의 편의를 위해 제공하는 것이 좋을 것이다. 아주 작은 차이지만 취소에 의해 변경플래그가 관리되는 것은 사용자를 감동시킬만한 기능이다. 기능의 크기에 비해 코드는 굉장히 복잡한 편이므로 관심없는 사람은 이 실습을 생략해도 좋다.