Index: ProjectEditor/Backup.cpp
===================================================================
--- ProjectEditor/Backup.cpp	(revision 22)
+++ ProjectEditor/Backup.cpp	(revision 24)
@@ -55,5 +55,5 @@
 			//ファイルを保存
 			sprintf(temporary,"%sdocument%02d.txt",szBackupDirPath,iNum);
-			WriteBuffer(temporary,MdiInfo[WndNum].pmti->buffer,lstrlen(MdiInfo[WndNum].pmti->buffer));
+			WriteBuffer(temporary,MdiInfo[WndNum].pMdiTextEdit->buffer,lstrlen(MdiInfo[WndNum].pMdiTextEdit->buffer));
 
 			//情報を追加
@@ -142,8 +142,8 @@
 		COLORREF TabColor;
 		TabColor=pobj_nv->pobj_ExtLink->GetTabColorFromFilePath(MdiInfo[WndNum].path);
-		pobj_MainTab->delete_item(szOldTitle,0);
-		pobj_MainTab->insert(MdiInfo[WndNum].title,0,TabColor);
-
-		MdiInfo[WndNum].pmti->bModify=1;
+		pobj_MainTab->DeleteItem( szOldTitle, false );
+		pobj_MainTab->InsertItem( MdiInfo[WndNum].title, false, TabColor );
+
+		MdiInfo[WndNum].pMdiTextEdit->Modify();
 
 
Index: ProjectEditor/Caret.cpp
===================================================================
--- ProjectEditor/Caret.cpp	(revision 22)
+++ ProjectEditor/Caret.cpp	(revision 24)
@@ -123,10 +123,10 @@
 
 	pCharRange->cpMin=GetBufferIndexFromCaretPos(
-		MdiInfo[WndNum].pmti->buffer,
-		MdiInfo[WndNum].pmti->StartCaretPos.x,
-		MdiInfo[WndNum].pmti->StartCaretPos.y);
-
-	if(MdiInfo[WndNum].pmti->StartCaretPos.x==MdiInfo[WndNum].pmti->EndCaretPos.x&&
-		MdiInfo[WndNum].pmti->StartCaretPos.y==MdiInfo[WndNum].pmti->EndCaretPos.y){
+		MdiInfo[WndNum].pMdiTextEdit->buffer,
+		MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x,
+		MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y);
+
+	if(MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x==MdiInfo[WndNum].pMdiTextEdit->EndCaretPos.x&&
+		MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y==MdiInfo[WndNum].pMdiTextEdit->EndCaretPos.y){
 		//選択されていないとき
 		pCharRange->cpMax=pCharRange->cpMin;
@@ -134,7 +134,7 @@
 	else{
 		pCharRange->cpMax=GetBufferIndexFromCaretPos(
-			MdiInfo[WndNum].pmti->buffer,
-			MdiInfo[WndNum].pmti->EndCaretPos.x,
-			MdiInfo[WndNum].pmti->EndCaretPos.y);
+			MdiInfo[WndNum].pMdiTextEdit->buffer,
+			MdiInfo[WndNum].pMdiTextEdit->EndCaretPos.x,
+			MdiInfo[WndNum].pMdiTextEdit->EndCaretPos.y);
 	}
 
@@ -150,5 +150,5 @@
 
 	memcpy(buffer,
-		MdiInfo[WndNum].pmti->buffer+pCharRange->cpMin,
+		MdiInfo[WndNum].pMdiTextEdit->buffer+pCharRange->cpMin,
 		pCharRange->cpMax-pCharRange->cpMin);
 	buffer[pCharRange->cpMax-pCharRange->cpMin]=0;
@@ -159,5 +159,5 @@
 
 	HWND hEdit;
-	hEdit=MdiInfo[WndNum].pmti->hEdit;
+	hEdit=MdiInfo[WndNum].pMdiTextEdit->hEdit;
 
 	//垂直スクロールバーの位置
@@ -195,12 +195,12 @@
 
 	GetCaretPosFromBufferIndex(
-		MdiInfo[WndNum].pmti->buffer,
+		MdiInfo[WndNum].pMdiTextEdit->buffer,
 		StartIndex,
-		&MdiInfo[WndNum].pmti->StartCaretPos);
+		&MdiInfo[WndNum].pMdiTextEdit->StartCaretPos);
 
 	GetCaretPosFromBufferIndex(
-		MdiInfo[WndNum].pmti->buffer,
+		MdiInfo[WndNum].pMdiTextEdit->buffer,
 		EndIndex,
-		&MdiInfo[WndNum].pmti->EndCaretPos);
+		&MdiInfo[WndNum].pMdiTextEdit->EndCaretPos);
 
 	HWND hEdit;
@@ -222,10 +222,10 @@
 	int iStartPos;
 	iStartPos=code_pos;
-	while(MdiInfo[WndNum].pmti->buffer[iStartPos]!='\n'&&iStartPos>0) iStartPos--;
-	if(MdiInfo[WndNum].pmti->buffer[iStartPos]=='\n') iStartPos++;
+	while(MdiInfo[WndNum].pMdiTextEdit->buffer[iStartPos]!='\n'&&iStartPos>0) iStartPos--;
+	if(MdiInfo[WndNum].pMdiTextEdit->buffer[iStartPos]=='\n') iStartPos++;
 
 	int iEndPos;
 	iEndPos=code_pos;
-	while(MdiInfo[WndNum].pmti->buffer[iEndPos]!='\r'&&MdiInfo[WndNum].pmti->buffer[iEndPos]!='\0') iEndPos++;
+	while(MdiInfo[WndNum].pMdiTextEdit->buffer[iEndPos]!='\r'&&MdiInfo[WndNum].pMdiTextEdit->buffer[iEndPos]!='\0') iEndPos++;
 
 	TextEdit_SetSel(WndNum,iStartPos,iEndPos,bShowCenter);
@@ -239,15 +239,15 @@
 	GetCaretPos(&OldPos);
 
-	x=MdiInfo[WndNum].pmti->StartCaretPos.x;
-	y=MdiInfo[WndNum].pmti->StartCaretPos.y;
+	x=MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x;
+	y=MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y;
 	GetScrollBaseCaretPos(WndNum,&x,&y);
 
 	//エディタ画面左端のコントロールタブ
 	int iControlTabSpace;
-	iControlTabSpace=MdiInfo[WndNum].pmti->iWidth_ControlTabSpace;
+	iControlTabSpace=MdiInfo[WndNum].pMdiTextEdit->iWidth_ControlTabSpace;
 
 	//コントロールタブ上にカーソルがきたときに、非表示にする
-	if(OldPos.x>=iControlTabSpace&&x<0) HideCaret(MdiInfo[WndNum].pmti->hEdit);
-	else if(OldPos.x<iControlTabSpace&&x>=0) ShowCaret(MdiInfo[WndNum].pmti->hEdit);
+	if(OldPos.x>=iControlTabSpace&&x<0) HideCaret(MdiInfo[WndNum].pMdiTextEdit->hEdit);
+	else if(OldPos.x<iControlTabSpace&&x>=0) ShowCaret(MdiInfo[WndNum].pMdiTextEdit->hEdit);
 
 	SetCaretPos(
@@ -263,12 +263,12 @@
 	if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
 		int start,end;
-		if(MdiInfo[WndNum].pmti->StartCaretPos.x==MdiInfo[WndNum].pmti->EndCaretPos.x&&
-			MdiInfo[WndNum].pmti->StartCaretPos.y==MdiInfo[WndNum].pmti->EndCaretPos.y){
+		if(MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x==MdiInfo[WndNum].pMdiTextEdit->EndCaretPos.x&&
+			MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y==MdiInfo[WndNum].pMdiTextEdit->EndCaretPos.y){
 			//文字列を選択中でないとき
 
 			int sw=0;
 			if(bInputAndReset){
-				if(MdiInfo[WndNum].pmti->StartCaretPos.x>1){
-					MdiInfo[WndNum].pmti->StartCaretPos.x-=2;
+				if(MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x>1){
+					MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x-=2;
 					sw=1;
 				}
@@ -276,29 +276,29 @@
 
 			TextEdit_GetWordCaret(
-				MdiInfo[WndNum].pmti->hEdit,
+				MdiInfo[WndNum].pMdiTextEdit->hEdit,
 				WndNum,
-				&MdiInfo[WndNum].pmti->StartCaretPos,
+				&MdiInfo[WndNum].pMdiTextEdit->StartCaretPos,
 				&start,&end,
 				WORDCARET_BEFORE);
 
-			if(sw) MdiInfo[WndNum].pmti->StartCaretPos.x+=2;
+			if(sw) MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x+=2;
 
 			//半角文字列を選択時の全角とのズレを修正
 			POINT pos;
-			GetCaretPosFromBufferIndex(MdiInfo[WndNum].pmti->buffer,start,&pos);
-			start=GetBufferIndexFromCaretPos(MdiInfo[WndNum].pmti->buffer,pos.x,pos.y);
-			GetCaretPosFromBufferIndex(MdiInfo[WndNum].pmti->buffer,end,&pos);
-			end=GetBufferIndexFromCaretPos(MdiInfo[WndNum].pmti->buffer,pos.x,pos.y);
+			GetCaretPosFromBufferIndex(MdiInfo[WndNum].pMdiTextEdit->buffer,start,&pos);
+			start=GetBufferIndexFromCaretPos(MdiInfo[WndNum].pMdiTextEdit->buffer,pos.x,pos.y);
+			GetCaretPosFromBufferIndex(MdiInfo[WndNum].pMdiTextEdit->buffer,end,&pos);
+			end=GetBufferIndexFromCaretPos(MdiInfo[WndNum].pMdiTextEdit->buffer,pos.x,pos.y);
 		}
 		else{
 			//文字列を選択中のとき
 			start=GetBufferIndexFromCaretPos(
-				MdiInfo[WndNum].pmti->buffer,
-				MdiInfo[WndNum].pmti->StartCaretPos.x,
-				MdiInfo[WndNum].pmti->StartCaretPos.y);
+				MdiInfo[WndNum].pMdiTextEdit->buffer,
+				MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x,
+				MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y);
 			end=GetBufferIndexFromCaretPos(
-				MdiInfo[WndNum].pmti->buffer,
-				MdiInfo[WndNum].pmti->EndCaretPos.x,
-				MdiInfo[WndNum].pmti->EndCaretPos.y);
+				MdiInfo[WndNum].pMdiTextEdit->buffer,
+				MdiInfo[WndNum].pMdiTextEdit->EndCaretPos.x,
+				MdiInfo[WndNum].pMdiTextEdit->EndCaretPos.y);
 		}
 
@@ -315,5 +315,5 @@
 		if(length<0) length=0;
 		pTemp=(char *)HeapAlloc(hHeap,0,length+1024);
-		memcpy(pTemp,MdiInfo[WndNum].pmti->buffer+start,length);
+		memcpy(pTemp,MdiInfo[WndNum].pMdiTextEdit->buffer+start,length);
 		pTemp[length]=0;
 
@@ -359,7 +359,7 @@
 		char *pTemp,temporary[VN_SIZE];
 
-		i=GetBufferIndexFromCaretPos(MdiInfo[WndNum].pmti->buffer,
-			MdiInfo[WndNum].pmti->StartCaretPos.x,
-			MdiInfo[WndNum].pmti->StartCaretPos.y);
+		i=GetBufferIndexFromCaretPos(MdiInfo[WndNum].pMdiTextEdit->buffer,
+			MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x,
+			MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y);
 
 		if(i<ComplementWndInfo.iPos||ComplementWndInfo.iPos+ComplementWndInfo.iLength<i){
@@ -384,5 +384,5 @@
 			pTemp=(char *)HeapAlloc(hHeap,0,ComplementWndInfo.iLength+1);
 			memcpy(pTemp,
-				MdiInfo[WndNum].pmti->buffer+ComplementWndInfo.iPos,
+				MdiInfo[WndNum].pMdiTextEdit->buffer+ComplementWndInfo.iPos,
 				ComplementWndInfo.iLength);
 			pTemp[ComplementWndInfo.iLength]=0;
@@ -437,5 +437,5 @@
 			pTemp=(char *)HeapAlloc(hHeap,0,ComplementWndInfo.iLength+1);
 			memcpy(pTemp,
-				MdiInfo[WndNum].pmti->buffer+ComplementWndInfo.iPos,
+				MdiInfo[WndNum].pMdiTextEdit->buffer+ComplementWndInfo.iPos,
 				ComplementWndInfo.iLength);
 			pTemp[ComplementWndInfo.iLength]=0;
@@ -468,8 +468,8 @@
 
 	HWND hEdit;
-	hEdit=MdiInfo[WndNum].pmti->hEdit;
-
-	x=MdiInfo[WndNum].pmti->StartCaretPos.x;
-	y=MdiInfo[WndNum].pmti->StartCaretPos.y;
+	hEdit=MdiInfo[WndNum].pMdiTextEdit->hEdit;
+
+	x=MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x;
+	y=MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y;
 	GetScrollBaseCaretPos(WndNum,&x,&y);
 
@@ -544,5 +544,5 @@
 	if(loose_y<0) loose_y=0;
 
-	pBuf=MdiInfo[WndNum].pmti->buffer;
+	pBuf=MdiInfo[WndNum].pMdiTextEdit->buffer;
 
 	// 行の確認
@@ -668,5 +668,5 @@
 
 	POINT *pCaretPos;
-	pCaretPos=&MdiInfo[WndNum].pmti->StartCaretPos;
+	pCaretPos=&MdiInfo[WndNum].pMdiTextEdit->StartCaretPos;
 
 	if(pCaretPos->x==0&&pCaretPos->y==0){
@@ -675,5 +675,5 @@
 	}
 
-	pBuf=MdiInfo[WndNum].pmti->buffer;
+	pBuf=MdiInfo[WndNum].pMdiTextEdit->buffer;
 
 	i=GetBufferIndexFromCaretPos(pBuf,
@@ -721,5 +721,5 @@
 	char *pBuf;
 
-	pBuf=MdiInfo[WndNum].pmti->buffer;
+	pBuf=MdiInfo[WndNum].pMdiTextEdit->buffer;
 
 	i=GetBufferIndexFromCaretPos(pBuf,
@@ -779,11 +779,11 @@
 
 	//上下のキャレット移動時には、左右方向の位置を保持する
-	if(MdiInfo[WndNum].pmti->Temp_UpDown_CaretXPos==-1)
-		MdiInfo[WndNum].pmti->Temp_UpDown_CaretXPos=pCaretPos->x;
+	if(MdiInfo[WndNum].pMdiTextEdit->Temp_UpDown_CaretXPos==-1)
+		MdiInfo[WndNum].pMdiTextEdit->Temp_UpDown_CaretXPos=pCaretPos->x;
 
 	pCaretPos->y--;
 
 	CaretPos_LooseToNatural(WndNum,
-		MdiInfo[WndNum].pmti->Temp_UpDown_CaretXPos,
+		MdiInfo[WndNum].pMdiTextEdit->Temp_UpDown_CaretXPos,
 		pCaretPos->y,
 		pCaretPos);
@@ -796,11 +796,11 @@
 
 	//上下のキャレット移動時には、左右方向の位置を保持する
-	if(MdiInfo[WndNum].pmti->Temp_UpDown_CaretXPos==-1)
-		MdiInfo[WndNum].pmti->Temp_UpDown_CaretXPos=pCaretPos->x;
+	if(MdiInfo[WndNum].pMdiTextEdit->Temp_UpDown_CaretXPos==-1)
+		MdiInfo[WndNum].pMdiTextEdit->Temp_UpDown_CaretXPos=pCaretPos->x;
 
 	pCaretPos->y++;
 
 	CaretPos_LooseToNatural(WndNum,
-		MdiInfo[WndNum].pmti->Temp_UpDown_CaretXPos,
+		MdiInfo[WndNum].pMdiTextEdit->Temp_UpDown_CaretXPos,
 		pCaretPos->y,
 		pCaretPos);
@@ -818,16 +818,16 @@
 
 	//上下のキャレット移動時には、左右方向の位置を保持する
-	if(MdiInfo[WndNum].pmti->Temp_UpDown_CaretXPos==-1)
-		MdiInfo[WndNum].pmti->Temp_UpDown_CaretXPos=pCaretPos->x;
+	if(MdiInfo[WndNum].pMdiTextEdit->Temp_UpDown_CaretXPos==-1)
+		MdiInfo[WndNum].pMdiTextEdit->Temp_UpDown_CaretXPos=pCaretPos->x;
 
 	SCROLLINFO si;
 	si.cbSize=sizeof(SCROLLINFO);
 	si.fMask=SIF_PAGE;
-	GetScrollInfo(MdiInfo[WndNum].pmti->hEdit,SB_VERT,&si);
+	GetScrollInfo(MdiInfo[WndNum].pMdiTextEdit->hEdit,SB_VERT,&si);
 	pCaretPos->y-=si.nPage;
 	if(pCaretPos->y<0) pCaretPos->y=0;
 
 	CaretPos_LooseToNatural(WndNum,
-		MdiInfo[WndNum].pmti->Temp_UpDown_CaretXPos,
+		MdiInfo[WndNum].pMdiTextEdit->Temp_UpDown_CaretXPos,
 		pCaretPos->y,
 		pCaretPos);
@@ -840,15 +840,15 @@
 
 	//上下のキャレット移動時には、左右方向の位置を保持する
-	if(MdiInfo[WndNum].pmti->Temp_UpDown_CaretXPos==-1)
-		MdiInfo[WndNum].pmti->Temp_UpDown_CaretXPos=pCaretPos->x;
+	if(MdiInfo[WndNum].pMdiTextEdit->Temp_UpDown_CaretXPos==-1)
+		MdiInfo[WndNum].pMdiTextEdit->Temp_UpDown_CaretXPos=pCaretPos->x;
 
 	SCROLLINFO si;
 	si.cbSize=sizeof(SCROLLINFO);
 	si.fMask=SIF_PAGE;
-	GetScrollInfo(MdiInfo[WndNum].pmti->hEdit,SB_VERT,&si);
+	GetScrollInfo(MdiInfo[WndNum].pMdiTextEdit->hEdit,SB_VERT,&si);
 	pCaretPos->y+=si.nPage;
 
 	CaretPos_LooseToNatural(WndNum,
-		MdiInfo[WndNum].pmti->Temp_UpDown_CaretXPos,
+		MdiInfo[WndNum].pMdiTextEdit->Temp_UpDown_CaretXPos,
 		pCaretPos->y,
 		pCaretPos);
Index: ProjectEditor/ClassTree.cpp
===================================================================
--- ProjectEditor/ClassTree.cpp	(revision 22)
+++ ProjectEditor/ClassTree.cpp	(revision 24)
@@ -335,5 +335,5 @@
 	if(hChild){
 		//すでに指定されたファイルが開かれている場合
-		pBuf=MdiInfo[WndNum].pmti->buffer;
+		pBuf=MdiInfo[WndNum].pMdiTextEdit->buffer;
 	}
 	else{
Index: ProjectEditor/CodeFormatter.cpp
===================================================================
--- ProjectEditor/CodeFormatter.cpp	(revision 22)
+++ ProjectEditor/CodeFormatter.cpp	(revision 24)
@@ -36,12 +36,12 @@
 
 	char *pBuf;
-	pBuf=MdiInfo[WndNum].pmti->buffer;
+	pBuf=MdiInfo[WndNum].pMdiTextEdit->buffer;
 
 	//カーソルバッファ位置を取得
 	int i,i2;
 	i=GetBufferIndexFromCaretPos(pBuf,
-		MdiInfo[WndNum].pmti->StartCaretPos.x,
-		MdiInfo[WndNum].pmti->StartCaretPos.y);
-	int StartX=MdiInfo[WndNum].pmti->StartCaretPos.x;
+		MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x,
+		MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y);
+	int StartX=MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x;
 
 	//現在の行のインデントをコピー（iFirstIndent_Speciallyにタブ数を格納）
Index: ProjectEditor/Common.h
===================================================================
--- ProjectEditor/Common.h	(revision 22)
+++ ProjectEditor/Common.h	(revision 24)
@@ -23,4 +23,5 @@
 #include "menu.h"
 #include "LuxCtrl.h"
+#include "MdiTextEdit.h"
 #include "BREGEXP.H"
 #include "../BasicCompiler32/CommandValue.h"
@@ -380,36 +381,4 @@
 };
 
-struct MDITEXTEDITINFO{
-	HWND hEdit;
-
-	//Web検索ウィンドウ
-	CWebResult *pobj_WebResult;
-
-	//ルーラーウィンドウ
-	CRuler *pobj_Ruler;
-
-	//アイコン
-	HICON hIcon;
-
-	char *buffer;
-	COLORREF *pColorRef;
-	int iUnderStart;
-	int iUnderEnd;
-
-	POINT StartCaretPos;
-	POINT EndCaretPos;
-	int Temp_UpDown_CaretXPos;
-	BOOL bAutoScroll;
-
-	//コントロールタブスペースの幅と行番号の文字数
-	int iWidth_ControlTabSpace;
-	int iLineNumberTextCount;
-
-	int iCharCode;
-	int iLfCode;
-
-	BOOL bModify;
-};
-
 struct MDIINFO{
 	HWND hwnd;
@@ -422,9 +391,8 @@
 		MDIMENUINFO *MdiMenuInfo;
 		MDIICONEDITINFO *MdiIconEditInfo;
-		MDITEXTEDITINFO *pmti;
+		CMdiTextEdit *pMdiTextEdit;
 	};
 
 	char *IndentStr;
-	TEXTEDIT_UNDOSTATE *edit_undo;
 };
 extern MDIINFO MdiInfo[MAX_WNDNUM];
@@ -958,5 +926,5 @@
 void TextEdit_RedoCommand(int WndNum);
 void TextEdit_NoticeChanging(int WndNum,int Command,char *KeyStr,char *DelStr,CHARRANGE *Range,CHARRANGE *DelRange);
-void TextEdit_DeleteUndoData(int WndNum,int pos);
+void TextEdit_DeleteUndoData(TEXTEDIT_UNDOSTATE *pUndoState,int pos);
 
 //Search.cpp
Index: ProjectEditor/Complement.cpp
===================================================================
--- ProjectEditor/Complement.cpp	(revision 22)
+++ ProjectEditor/Complement.cpp	(revision 24)
@@ -384,10 +384,10 @@
 	//エディタ画面左端のコントロールタブ
 	int iControlTabSpace;
-	iControlTabSpace=MdiInfo[WndNum].pmti->iWidth_ControlTabSpace;
+	iControlTabSpace=MdiInfo[WndNum].pMdiTextEdit->iWidth_ControlTabSpace;
 
 	extern MDIINFO MdiInfo[MAX_WNDNUM];
 	extern int font_width,font_height;
 	POINT pos;
-	pos=MdiInfo[WndNum].pmti->StartCaretPos;
+	pos=MdiInfo[WndNum].pMdiTextEdit->StartCaretPos;
 	GetScrollBaseCaretPos(WndNum,(int *)&pos.x,(int *)&pos.y);
 
@@ -395,5 +395,5 @@
 	pos.y=(pos.y+1)*font_height;
 
-	ClientToScreen(MdiInfo[WndNum].pmti->hEdit,&pos);
+	ClientToScreen(MdiInfo[WndNum].pMdiTextEdit->hEdit,&pos);
 
 	extern HINSTANCE hInst;
@@ -621,5 +621,5 @@
 			//フォーカスをエディタに戻す
 			WndNum=GetWndNum(GetWindow(hClient,GW_CHILD));
-			SetFocus(MdiInfo[WndNum].pmti->hEdit);
+			SetFocus(MdiInfo[WndNum].pMdiTextEdit->hEdit);
 			return 0;
 		case WM_KEYDOWN:
@@ -633,5 +633,5 @@
 			//フォーカスをエディタに戻す
 			WndNum=GetWndNum(GetWindow(hClient,GW_CHILD));
-			SetFocus(MdiInfo[WndNum].pmti->hEdit);
+			SetFocus(MdiInfo[WndNum].pMdiTextEdit->hEdit);
 
 			LVHITTESTINFO lvHitTest;
@@ -659,5 +659,5 @@
 
 					for(i=ComplementWndInfo.iPos-1;;i--){
-						if(MdiInfo[WndNum].pmti->buffer[i]!='\t'){
+						if(MdiInfo[WndNum].pMdiTextEdit->buffer[i]!='\t'){
 							i++;
 							break;
@@ -665,7 +665,7 @@
 					}
 
-					GetCaretPosFromBufferIndex(MdiInfo[WndNum].pmti->buffer,
+					GetCaretPosFromBufferIndex(MdiInfo[WndNum].pMdiTextEdit->buffer,
 						i,
-						&MdiInfo[WndNum].pmti->StartCaretPos);
+						&MdiInfo[WndNum].pMdiTextEdit->StartCaretPos);
 
 					//インデント
@@ -684,7 +684,7 @@
 					//クラスメンバ補完
 
-					GetCaretPosFromBufferIndex(MdiInfo[WndNum].pmti->buffer,
+					GetCaretPosFromBufferIndex(MdiInfo[WndNum].pMdiTextEdit->buffer,
 						ComplementWndInfo.iPos,
-						&MdiInfo[WndNum].pmti->StartCaretPos);
+						&MdiInfo[WndNum].pMdiTextEdit->StartCaretPos);
 
 					//リプレース前に補完機能を破棄する
Index: ProjectEditor/Debugger.cpp
===================================================================
--- ProjectEditor/Debugger.cpp	(revision 22)
+++ ProjectEditor/Debugger.cpp	(revision 24)
@@ -252,5 +252,5 @@
 
 		char temporary[MAX_PATH];
-		sprintf(temporary,"\"%s\",%d",MdiInfo[WndNum].path,MdiInfo[WndNum].pmti->StartCaretPos.y);
+		sprintf(temporary,"\"%s\",%d",MdiInfo[WndNum].path,MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y);
 
 		char temp2[MAX_PATH];
@@ -436,5 +436,5 @@
 		if(lstrcmpi(MdiInfo[WndNum].path,ppItem[i]->lpszFileName)==0){
 			for(i2=0;i2<ppItem[i]->num;i2++){
-				if(MdiInfo[WndNum].pmti->StartCaretPos.y==ppItem[i]->piLine[i2]){
+				if(MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y==ppItem[i]->piLine[i2]){
 					sw=1;
 					break;
@@ -447,9 +447,9 @@
 	if(sw==0){
 		//ブレークポイントを追加
-		insert(MdiInfo[WndNum].path,MdiInfo[WndNum].pmti->StartCaretPos.y);
+		insert(MdiInfo[WndNum].path,MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y);
 	}
 	else{
 		//ブレークポイントを削除
-		remove(MdiInfo[WndNum].path,MdiInfo[WndNum].pmti->StartCaretPos.y);
+		remove(MdiInfo[WndNum].path,MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y);
 	}
 
@@ -462,5 +462,5 @@
 
 	//エディタを再描画
-	InvalidateRect(MdiInfo[WndNum].pmti->hEdit,NULL,0);
+	InvalidateRect(MdiInfo[WndNum].pMdiTextEdit->hEdit,NULL,0);
 }
 void CDBBreakPoint::SaveToTempFile(void){
Index: ProjectEditor/DocumentAdvice.cpp
===================================================================
--- ProjectEditor/DocumentAdvice.cpp	(revision 22)
+++ ProjectEditor/DocumentAdvice.cpp	(revision 24)
@@ -201,8 +201,8 @@
 			else{
 				//エディタから読み取る
-				FileSize=lstrlen(MdiInfo[i3].pmti->buffer);
+				FileSize=lstrlen(MdiInfo[i3].pMdiTextEdit->buffer);
 
 				temp3=(char *)HeapAlloc(hHeap,0,FileSize+MEM_SPACE);
-				memcpy(temp3,MdiInfo[i3].pmti->buffer,FileSize);
+				memcpy(temp3,MdiInfo[i3].pMdiTextEdit->buffer,FileSize);
 				temp3[FileSize]=0;
 			}
Index: ProjectEditor/DrawBuffer.cpp
===================================================================
--- ProjectEditor/DrawBuffer.cpp	(revision 22)
+++ ProjectEditor/DrawBuffer.cpp	(revision 24)
@@ -283,6 +283,6 @@
 	int iControlTabSpace;
 	int iLineNumberTextCount;
-	iControlTabSpace=MdiInfo[WndNum].pmti->iWidth_ControlTabSpace;
-	iLineNumberTextCount=MdiInfo[WndNum].pmti->iLineNumberTextCount;
+	iControlTabSpace=MdiInfo[WndNum].pMdiTextEdit->iWidth_ControlTabSpace;
+	iLineNumberTextCount=MdiInfo[WndNum].pMdiTextEdit->iLineNumberTextCount;
 
 	//一ページ中に表示できる行数を取得
@@ -301,5 +301,5 @@
 
 	//テキストバッファをコード内で参照しやすいようにポインタ変数を利用する
-	pBuf=MdiInfo[WndNum].pmti->buffer;
+	pBuf=MdiInfo[WndNum].pMdiTextEdit->buffer;
 
 	//選択範囲を取得
@@ -335,5 +335,5 @@
 		if(pBuf[i]=='\0'){
 			if(0<=y&&y<=OnePage_CharHeight){
-				if(MdiInfo[WndNum].pmti->StartCaretPos.y==y-BaseY){
+				if(MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y==y-BaseY){
 					////////////////////////////////////
 					// カーソル行では余白を塗りつぶす
@@ -375,5 +375,5 @@
 			/////////////////
 
-			if(MdiInfo[WndNum].pmti->StartCaretPos.y==y-BaseY){
+			if(MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y==y-BaseY){
 				///////////////////////////////////////////////////////////
 				//改行コードよりも右側は白いブラシで塗りつぶす（カーソル行用）
@@ -446,5 +446,5 @@
 
 		//ハイパーリンク用下線
-		if(MdiInfo[WndNum].pmti->iUnderStart<=i&&i<MdiInfo[WndNum].pmti->iUnderEnd)
+		if(MdiInfo[WndNum].pMdiTextEdit->iUnderStart<=i&&i<MdiInfo[WndNum].pMdiTextEdit->iUnderEnd)
 			bHyperLinkUnderBar=1;
 		else bHyperLinkUnderBar=0;
@@ -463,5 +463,5 @@
 			else{
 				//通常カラー
-				NextColor=MdiInfo[WndNum].pmti->pColorRef[i];
+				NextColor=MdiInfo[WndNum].pMdiTextEdit->pColorRef[i];
 			}
 
@@ -472,5 +472,5 @@
 			}
 			else{
-				if(MdiInfo[WndNum].pmti->StartCaretPos.y==y-BaseY){
+				if(MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y==y-BaseY){
 					//カーソル行
 					NextBackColor=CaretBackColor;
@@ -523,5 +523,5 @@
 
 
-				if(MdiInfo[WndNum].pmti->StartCaretPos.y==y-BaseY){
+				if(MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y==y-BaseY){
 					///////////////////////////////////////////////////////////
 					//改行コードよりも右側は白いブラシで塗りつぶす（カーソル行用）
Index: ProjectEditor/FileOperation.cpp
===================================================================
--- ProjectEditor/FileOperation.cpp	(revision 22)
+++ ProjectEditor/FileOperation.cpp	(revision 24)
@@ -423,9 +423,9 @@
 		//文字コードを復元
 		char *pBuf;
-		pBuf=nkf.RestoreBuffer(MdiInfo[WndNum].pmti->buffer,MdiInfo[WndNum].pmti->iCharCode);
+		pBuf=nkf.RestoreBuffer(MdiInfo[WndNum].pMdiTextEdit->buffer,MdiInfo[WndNum].pMdiTextEdit->iCharCode);
 
 		//改行コードを復元
-		if(MdiInfo[WndNum].pmti->iLfCode==LFCODE_LF) nkf.ToLF(pBuf);
-		else if(MdiInfo[WndNum].pmti->iLfCode==LFCODE_CR) nkf.ToCR(pBuf);
+		if(MdiInfo[WndNum].pMdiTextEdit->iLfCode==LFCODE_LF) nkf.ToLF(pBuf);
+		else if(MdiInfo[WndNum].pMdiTextEdit->iLfCode==LFCODE_CR) nkf.ToCR(pBuf);
 
 
@@ -446,6 +446,6 @@
 		HeapDefaultFree(pBuf);
 
-		//変更フラグに0をセット
-		MdiInfo[WndNum].pmti->bModify=0;
+		//変更フラグをオフにする
+		MdiInfo[WndNum].pMdiTextEdit->UnModify();
 	}
 	else if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT){
@@ -496,9 +496,9 @@
 		COLORREF color;
 		color=pobj_MainTab->GetItemColor(szOldTitle);
-		pobj_MainTab->delete_item(szOldTitle,0);
-		pobj_MainTab->insert(MdiInfo[WndNum].title,0,color);
+		pobj_MainTab->DeleteItem( szOldTitle, false );
+		pobj_MainTab->InsertItem( MdiInfo[WndNum].title, false, color );
 	}
 	else{
-		pobj_MainTab->reset_item(szOldTitle,MdiInfo[WndNum].title);
+		pobj_MainTab->RenameItem( szOldTitle, MdiInfo[WndNum].title );
 	}
 
Index: ProjectEditor/IconEditor.cpp
===================================================================
--- ProjectEditor/IconEditor.cpp	(revision 22)
+++ ProjectEditor/IconEditor.cpp	(revision 24)
@@ -383,7 +383,4 @@
 			else MdiInfo[i].path=(char *)GlobalAlloc(GPTR,1);
 
-			MdiInfo[i].edit_undo=(TEXTEDIT_UNDOSTATE *)GlobalAlloc(GPTR,sizeof(TEXTEDIT_UNDOSTATE));
-			MdiInfo[i].edit_undo->NowPos=0;
-
 			MdiInfo[i].MdiIconEditInfo=(MDIICONEDITINFO *)HeapAlloc(hHeap,0,sizeof(MDIICONEDITINFO));
 			MdiInfo[i].MdiIconEditInfo->hMain=hMain;
@@ -442,5 +439,5 @@
 
 	//タブに追加
-	pobj_MainTab->insert(str,1);
+	pobj_MainTab->InsertItem( str, true );
 
 	SetStatusText(NULL);
Index: ProjectEditor/MdiTextEdit.cpp
===================================================================
--- ProjectEditor/MdiTextEdit.cpp	(revision 24)
+++ ProjectEditor/MdiTextEdit.cpp	(revision 24)
@@ -0,0 +1,56 @@
+#include "common.h"
+
+CMdiTextEdit::CMdiTextEdit( MDIINFO *pMdiInfo ){
+	this->pMdiInfo = pMdiInfo;
+
+	isModified = false;
+
+	BaseNumOfUndoRedo = 0;
+
+	pTextEditUndoState = (TEXTEDIT_UNDOSTATE *)HeapAlloc( hHeap, HEAP_ZERO_MEMORY, sizeof( TEXTEDIT_UNDOSTATE ) );
+	pTextEditUndoState->NowPos = 0;
+}
+CMdiTextEdit::~CMdiTextEdit(){
+	for( int i=0; i<MAX_UNDONUM; i++ ){
+		if( pTextEditUndoState->Command[i] ){
+			TextEdit_DeleteUndoData( pTextEditUndoState, i );
+		}
+	}
+	HeapDefaultFree( pTextEditUndoState );
+}
+
+void CMdiTextEdit::Modify(){
+	//変更時
+	isModified = true;
+
+	//タブ文字列に変更を示すアスタリスクを付ける
+	pobj_MainTab->NofityModifyDocument( pMdiInfo->title );
+}
+void CMdiTextEdit::UnModify(){
+	//変更状態解除
+	isModified = false;
+
+	//アスタリスク表示を解除する
+	pobj_MainTab->NofityUnModifyDocument( pMdiInfo->title );
+
+	//アンドゥーリドゥーのベース番号を取得
+	BaseNumOfUndoRedo = pTextEditUndoState->NowPos;
+}
+bool CMdiTextEdit::IsModified(){
+	return isModified;
+}
+
+void CMdiTextEdit::NofityUndoRedoToModify(){
+	if( BaseNumOfUndoRedo == pTextEditUndoState->NowPos ){
+		//変更なし
+		if( IsModified() ){
+			UnModify();
+		}
+	}
+	else{
+		//変更あり
+		if( ! IsModified() ){
+			Modify();
+		}
+	}
+}
Index: ProjectEditor/MdiTextEdit.h
===================================================================
--- ProjectEditor/MdiTextEdit.h	(revision 24)
+++ ProjectEditor/MdiTextEdit.h	(revision 24)
@@ -0,0 +1,60 @@
+
+struct MDIINFO;
+struct TEXTEDIT_UNDOSTATE;
+
+class CMdiTextEdit{
+	//変更ありの状態かどうか
+	bool isModified;
+
+	//アンドゥーリドゥーのベース
+	int BaseNumOfUndoRedo;
+
+	MDIINFO *pMdiInfo;
+
+public:
+	CMdiTextEdit( MDIINFO *pMdiInfo );
+	~CMdiTextEdit();
+
+	//変更あり
+	void Modify();
+
+	//変更なし
+	void UnModify();
+
+	//変更状態を取得 ( true/変更あり, false/変更なし )
+	bool IsModified();
+
+	//アンドゥーリドゥーからの変更通知
+	void NofityUndoRedoToModify();
+
+	HWND hEdit;
+
+	//Web検索ウィンドウ
+	CWebResult *pobj_WebResult;
+
+	//ルーラーウィンドウ
+	CRuler *pobj_Ruler;
+
+	//アイコン
+	HICON hIcon;
+
+	char *buffer;
+	COLORREF *pColorRef;
+	int iUnderStart;
+	int iUnderEnd;
+
+	POINT StartCaretPos;
+	POINT EndCaretPos;
+	int Temp_UpDown_CaretXPos;
+	BOOL bAutoScroll;
+
+	//コントロールタブスペースの幅と行番号の文字数
+	int iWidth_ControlTabSpace;
+	int iLineNumberTextCount;
+
+	int iCharCode;
+	int iLfCode;
+
+	//元に戻す、やり直し機能
+	TEXTEDIT_UNDOSTATE *pTextEditUndoState;
+};
Index: ProjectEditor/MenuProc.cpp
===================================================================
--- ProjectEditor/MenuProc.cpp	(revision 22)
+++ ProjectEditor/MenuProc.cpp	(revision 24)
@@ -297,5 +297,5 @@
 
 	//タブに追加
-	pobj_MainTab->insert(pMenuInfo->IdName,1);
+	pobj_MainTab->InsertItem( pMenuInfo->IdName, true );
 
 	SetFocus(hListWnd);
Index: ProjectEditor/MessageCallOperation.cpp
===================================================================
--- ProjectEditor/MessageCallOperation.cpp	(revision 22)
+++ ProjectEditor/MessageCallOperation.cpp	(revision 24)
@@ -135,5 +135,5 @@
 	WndNum=GetWndNum(hChild);
 
-	pBuf=MdiInfo[WndNum].pmti->buffer;
+	pBuf=MdiInfo[WndNum].pMdiTextEdit->buffer;
 
 	for(i=0;;i++){
@@ -190,5 +190,5 @@
 		TextEdit_SetSel(WndNum,i+2,i+i2);
 	}
-	SetFocus(MdiInfo[WndNum].pmti->hEdit);
+	SetFocus(MdiInfo[WndNum].pMdiTextEdit->hEdit);
 }
 void InsertEventToList(HWND hList,int ItemNum,char *EventName,char *MessageName,char *OutLine){
Index: ProjectEditor/NonVolatile.cpp
===================================================================
--- ProjectEditor/NonVolatile.cpp	(revision 22)
+++ ProjectEditor/NonVolatile.cpp	(revision 24)
@@ -332,9 +332,5 @@
 	//ドキュメントを保存したときにタブを先頭に再配置するかどうか
 	if(!GetWholeValue("IsSaveTabToHead",&bSaveTabToHead)){
-#ifdef THETEXT
 		bSaveTabToHead=0;
-#else
-		bSaveTabToHead=1;
-#endif
 	}
 
@@ -608,9 +604,5 @@
 	height_ClipCompileView=130;
 	width_WebSearchView=230;
-#ifdef THETEXT
 	bSaveTabToHead=0;
-#else
-	bSaveTabToHead=1;
-#endif
 
 	BackNum_PairStatementComplement=100;
Index: ProjectEditor/ParameterHint.cpp
===================================================================
--- ProjectEditor/ParameterHint.cpp	(revision 22)
+++ ProjectEditor/ParameterHint.cpp	(revision 24)
@@ -49,6 +49,6 @@
 		else{
 			//エディタから読み込む
-			pBuf=(char *)HeapAlloc(hHeap,0,lstrlen(MdiInfo[i].pmti->buffer)+1);
-			lstrcpy(pBuf,MdiInfo[i].pmti->buffer);
+			pBuf=(char *)HeapAlloc(hHeap,0,lstrlen(MdiInfo[i].pMdiTextEdit->buffer)+1);
+			lstrcpy(pBuf,MdiInfo[i].pMdiTextEdit->buffer);
 		}
 	}
@@ -60,6 +60,6 @@
 		WndNum=GetWndNum(GetWindow(hClient,GW_CHILD));
 
-		pBuf=(char *)HeapAlloc(hHeap,0,lstrlen(MdiInfo[WndNum].pmti->buffer)+1);
-		lstrcpy(pBuf,MdiInfo[WndNum].pmti->buffer);
+		pBuf=(char *)HeapAlloc(hHeap,0,lstrlen(MdiInfo[WndNum].pMdiTextEdit->buffer)+1);
+		lstrcpy(pBuf,MdiInfo[WndNum].pMdiTextEdit->buffer);
 	}
 
@@ -686,16 +686,16 @@
 	char temp2[8192];
 
-	pBuf=MdiInfo[WndNum].pmti->buffer;
+	pBuf=MdiInfo[WndNum].pMdiTextEdit->buffer;
 
 	//キャレットが示すバッファインデックスを取得
 	iPos=GetBufferIndexFromCaretPos(
 		pBuf,
-		MdiInfo[WndNum].pmti->StartCaretPos.x,
-		MdiInfo[WndNum].pmti->StartCaretPos.y);
+		MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x,
+		MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y);
 
 	static int Before_StartCaretY;
 	BOOL Before_StartCaretSwitch=0;
-	if(MdiInfo[WndNum].pmti->StartCaretPos.y!=Before_StartCaretY){
-		Before_StartCaretY=MdiInfo[WndNum].pmti->StartCaretPos.y;
+	if(MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y!=Before_StartCaretY){
+		Before_StartCaretY=MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y;
 		Before_StartCaretSwitch=1;
 	}
@@ -967,5 +967,5 @@
 			else{
 				if(MethodCheckInfo.hWnd){
-					UpdateWindow(MdiInfo[WndNum].pmti->hEdit);	//ちらつき防止
+					UpdateWindow(MdiInfo[WndNum].pMdiTextEdit->hEdit);	//ちらつき防止
 
 					DestroyWindow(MethodCheckInfo.hWnd);
@@ -1258,5 +1258,5 @@
 		GetWindowRect(MdiInfo[i].hwnd,&rect);
 		GetCaretPos(&pos);
-		ClientToScreen(MdiInfo[i].pmti->hEdit,&pos);
+		ClientToScreen(MdiInfo[i].pMdiTextEdit->hEdit,&pos);
 		rect.left=pos.x-20;
 		rect.top=pos.y-pobj_nv->lf.lfHeight;
Index: ProjectEditor/Print.cpp
===================================================================
--- ProjectEditor/Print.cpp	(revision 22)
+++ ProjectEditor/Print.cpp	(revision 24)
@@ -91,5 +91,5 @@
 
 	char *buffer;
-	buffer=MdiInfo[WndNum].pmti->buffer;
+	buffer=MdiInfo[WndNum].pMdiTextEdit->buffer;
 	int i=0,i2=0,iPage=0;
 	for(i=0,i2=0;;i++,i2++){
Index: ProjectEditor/ProjectControl.cpp
===================================================================
--- ProjectEditor/ProjectControl.cpp	(revision 22)
+++ ProjectEditor/ProjectControl.cpp	(revision 24)
@@ -137,6 +137,6 @@
 							//ResetScrollbarが再描画時に呼び出されるので、再描画する
 							WndNum=GetWndNum(hChild);
-							InvalidateRect(MdiInfo[WndNum].pmti->hEdit,NULL,0);
-							UpdateWindow(MdiInfo[WndNum].pmti->hEdit);
+							InvalidateRect(MdiInfo[WndNum].pMdiTextEdit->hEdit,NULL,0);
+							UpdateWindow(MdiInfo[WndNum].pMdiTextEdit->hEdit);
 							TextEdit_SelectOneLine(WndNum,pobj_ClassTreeView->pProcInfo[i].code_pos,TRUE);
 
@@ -1491,6 +1491,6 @@
 
 							//ResetScrollbarが再描画時に呼び出されるので、再描画する
-							InvalidateRect(MdiInfo[WndNum].pmti->hEdit,NULL,0);
-							UpdateWindow(MdiInfo[WndNum].pmti->hEdit);
+							InvalidateRect(MdiInfo[WndNum].pMdiTextEdit->hEdit,NULL,0);
+							UpdateWindow(MdiInfo[WndNum].pMdiTextEdit->hEdit);
 
 							if(temp2[i2]=='\0') goto EndToSetWorkFile;
@@ -1520,7 +1520,7 @@
 							si.fMask=SIF_POS;
 							si.nPos=pos.x;
-							SetScrollInfo(MdiInfo[WndNum].pmti->hEdit,SB_HORZ,&si,1);
+							SetScrollInfo(MdiInfo[WndNum].pMdiTextEdit->hEdit,SB_HORZ,&si,1);
 							si.nPos=pos.y;
-							SetScrollInfo(MdiInfo[WndNum].pmti->hEdit,SB_VERT,&si,1);
+							SetScrollInfo(MdiInfo[WndNum].pMdiTextEdit->hEdit,SB_VERT,&si,1);
 
 							if(temp2[i2]=='\0') goto EndToSetWorkFile;
@@ -1802,5 +1802,5 @@
 		sw=0;
 		if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
-			if(MdiInfo[WndNum].pmti->bModify){
+			if( MdiInfo[WndNum].pMdiTextEdit->IsModified() ){
 				for(i=0;i<ProjectInfo.pobj_DBFileInfo->iNum;i++){
 					ProjectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->GetFullPath(temporary);
@@ -1859,5 +1859,8 @@
 				ProjectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->GetFullPath(temporary);
 				if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0){
-					MdiInfo[WndNum].pmti->bModify=0;
+
+					//変更フラグをオフにする
+					MdiInfo[WndNum].pMdiTextEdit->UnModify();
+
 					SendMessage(hCloseChild,WM_CLOSE,0,0);
 					break;
@@ -1993,7 +1996,7 @@
 					si.cbSize=sizeof(SCROLLINFO);
 					si.fMask=SIF_POS;
-					GetScrollInfo(MdiInfo[WndNum].pmti->hEdit,SB_HORZ,&si);
+					GetScrollInfo(MdiInfo[WndNum].pMdiTextEdit->hEdit,SB_HORZ,&si);
 					pos.x=si.nPos;
-					GetScrollInfo(MdiInfo[WndNum].pmti->hEdit,SB_VERT,&si);
+					GetScrollInfo(MdiInfo[WndNum].pMdiTextEdit->hEdit,SB_VERT,&si);
 					pos.y=si.nPos;
 
@@ -2102,5 +2105,5 @@
 		WndNum=GetWndNum(hChild);
 		if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
-			if(MdiInfo[WndNum].pmti->bModify){
+			if( MdiInfo[WndNum].pMdiTextEdit->IsModified() ){
 				for(i=0;i<ProjectInfo.pobj_DBFileInfo->iNum;i++){
 					ProjectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->GetFullPath(temporary);
Index: ProjectEditor/ProjectEditor.cpp
===================================================================
--- ProjectEditor/ProjectEditor.cpp	(revision 22)
+++ ProjectEditor/ProjectEditor.cpp	(revision 24)
@@ -135,9 +135,9 @@
 		if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
 			//コントロールタブスペースの幅と行番号の文字数を更新
-			MdiInfo[WndNum].pmti->iWidth_ControlTabSpace=
-				GetControlTabSpace(WndNum,&MdiInfo[WndNum].pmti->iLineNumberTextCount);
-
-			InvalidateRect(MdiInfo[WndNum].pmti->hEdit,NULL,0);
-			InvalidateRect(MdiInfo[WndNum].pmti->pobj_Ruler->hRulerWnd,NULL,0);
+			MdiInfo[WndNum].pMdiTextEdit->iWidth_ControlTabSpace=
+				GetControlTabSpace(WndNum,&MdiInfo[WndNum].pMdiTextEdit->iLineNumberTextCount);
+
+			InvalidateRect(MdiInfo[WndNum].pMdiTextEdit->hEdit,NULL,0);
+			InvalidateRect(MdiInfo[WndNum].pMdiTextEdit->pobj_Ruler->hRulerWnd,NULL,0);
 
 			SendTextEditResizeEvent(MdiInfo[WndNum].hwnd);
@@ -160,5 +160,5 @@
 	sw=0;
 	if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
-		if(MdiInfo[WndNum].pmti->bModify) sw=1;
+		if( MdiInfo[WndNum].pMdiTextEdit->IsModified() ) sw=1;
 	}
 	else if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT){
@@ -205,5 +205,5 @@
 
 		//サイズ
-		BufSize=(double)lstrlen(MdiInfo[WndNum].pmti->buffer);
+		BufSize=(double)lstrlen(MdiInfo[WndNum].pMdiTextEdit->buffer);
 		if(IsWindow(hChild)){
 			if(BufSize<1024) sprintf(temporary,"%s: %.0fByte",STRING_SIZE,BufSize);
@@ -225,11 +225,11 @@
 			//日本語
 			sprintf(temporary,"%d 行、%d 列",
-				MdiInfo[WndNum].pmti->StartCaretPos.y+1,
-				MdiInfo[WndNum].pmti->StartCaretPos.x+1);
+				MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y+1,
+				MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x+1);
 #else
 			//英語
 			sprintf(temporary,"%d : %d",
-				MdiInfo[WndNum].pmti->StartCaretPos.y+1,
-				MdiInfo[WndNum].pmti->StartCaretPos.x+1);
+				MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y+1,
+				MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x+1);
 #endif
 		}
@@ -238,9 +238,9 @@
 
 		//文字コード
-		nkf.GetCharCodeName(MdiInfo[WndNum].pmti->iCharCode,temporary);
+		nkf.GetCharCodeName(MdiInfo[WndNum].pMdiTextEdit->iCharCode,temporary);
 		SendMessage(hStatusBar,SB_SETTEXT,3,(LPARAM)temporary);
 
 		//文字コード
-		nkf.GetLfCodeName(MdiInfo[WndNum].pmti->iLfCode,temporary);
+		nkf.GetLfCodeName(MdiInfo[WndNum].pMdiTextEdit->iLfCode,temporary);
 		SendMessage(hStatusBar,SB_SETTEXT,4,(LPARAM)temporary);
 	}
@@ -310,7 +310,7 @@
 	}
 	else if(IS_DOCUMENT_TEXT(MdiInfo[i].DocType)){
-		i2=MdiInfo[i].edit_undo->NowPos-1;
+		i2=MdiInfo[i].pMdiTextEdit->pTextEditUndoState->NowPos-1;
 		if(i2==-1) i2=MAX_UNDONUM-1;
-		if(!MdiInfo[i].edit_undo->Command[i2]){
+		if(!MdiInfo[i].pMdiTextEdit->pTextEditUndoState->Command[i2]){
 			pobj_MainMenu->EnableItem(IDM_UNDO,MF_BYCOMMAND|MF_GRAYED);
 			EnableMenuItem(hEditMenu,IDM_UNDO,MF_BYCOMMAND|MF_GRAYED);
@@ -322,5 +322,5 @@
 			pobj_StandardToolbar->EnableItem(IDM_UNDO,1);
 		}
-		if(!MdiInfo[i].edit_undo->Command[MdiInfo[i].edit_undo->NowPos]){
+		if(!MdiInfo[i].pMdiTextEdit->pTextEditUndoState->Command[MdiInfo[i].pMdiTextEdit->pTextEditUndoState->NowPos]){
 			pobj_MainMenu->EnableItem(IDM_REDO,MF_BYCOMMAND|MF_GRAYED);
 			EnableMenuItem(hEditMenu,IDM_REDO,MF_BYCOMMAND|MF_GRAYED);
@@ -461,6 +461,6 @@
 		hChild=GetWindow(hChild,GW_CHILD);
 		if(!(
-			MdiInfo[WndNum].pmti->StartCaretPos.x==MdiInfo[WndNum].pmti->EndCaretPos.x&&
-			MdiInfo[WndNum].pmti->StartCaretPos.y==MdiInfo[WndNum].pmti->EndCaretPos.y
+			MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x==MdiInfo[WndNum].pMdiTextEdit->EndCaretPos.x&&
+			MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y==MdiInfo[WndNum].pMdiTextEdit->EndCaretPos.y
 			)){
 			MenuMsg=MF_BYCOMMAND|MF_ENABLED;
@@ -901,30 +901,26 @@
 			}
 
-			MdiInfo[i].pmti=(MDITEXTEDITINFO *)HeapAlloc(hHeap,0,sizeof(MDITEXTEDITINFO));
-
-			MdiInfo[i].pmti->hEdit=hEdit;
-			MdiInfo[i].pmti->pobj_WebResult=new CWebResult(hChild);
-			MdiInfo[i].pmti->pobj_Ruler=new CRuler(hChild,i);
-			MdiInfo[i].pmti->hIcon=shfi.hIcon;
-			MdiInfo[i].pmti->buffer=buffer;
-			MdiInfo[i].pmti->pColorRef=(COLORREF *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,sizeof(COLORREF)*lstrlen(buffer));
-			MdiInfo[i].pmti->iUnderStart=-1;
-			MdiInfo[i].pmti->iUnderEnd=-1;
-			MdiInfo[i].pmti->StartCaretPos.x=0;
-			MdiInfo[i].pmti->StartCaretPos.y=0;
-			MdiInfo[i].pmti->EndCaretPos.x=0;
-			MdiInfo[i].pmti->EndCaretPos.y=0;
-			MdiInfo[i].pmti->Temp_UpDown_CaretXPos=-1;
-			MdiInfo[i].pmti->bAutoScroll=0;
-			MdiInfo[i].pmti->iWidth_ControlTabSpace=
-				GetControlTabSpace(i,&MdiInfo[i].pmti->iLineNumberTextCount);
-			MdiInfo[i].pmti->iCharCode=iCharCode;
-			MdiInfo[i].pmti->iLfCode=iLfCode;
-			MdiInfo[i].pmti->bModify=0;
+			MdiInfo[i].pMdiTextEdit = new CMdiTextEdit( &MdiInfo[i] );
+
+			MdiInfo[i].pMdiTextEdit->hEdit=hEdit;
+			MdiInfo[i].pMdiTextEdit->pobj_WebResult=new CWebResult(hChild);
+			MdiInfo[i].pMdiTextEdit->pobj_Ruler=new CRuler(hChild,i);
+			MdiInfo[i].pMdiTextEdit->hIcon=shfi.hIcon;
+			MdiInfo[i].pMdiTextEdit->buffer=buffer;
+			MdiInfo[i].pMdiTextEdit->pColorRef=(COLORREF *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,sizeof(COLORREF)*lstrlen(buffer));
+			MdiInfo[i].pMdiTextEdit->iUnderStart=-1;
+			MdiInfo[i].pMdiTextEdit->iUnderEnd=-1;
+			MdiInfo[i].pMdiTextEdit->StartCaretPos.x=0;
+			MdiInfo[i].pMdiTextEdit->StartCaretPos.y=0;
+			MdiInfo[i].pMdiTextEdit->EndCaretPos.x=0;
+			MdiInfo[i].pMdiTextEdit->EndCaretPos.y=0;
+			MdiInfo[i].pMdiTextEdit->Temp_UpDown_CaretXPos=-1;
+			MdiInfo[i].pMdiTextEdit->bAutoScroll=0;
+			MdiInfo[i].pMdiTextEdit->iWidth_ControlTabSpace=
+				GetControlTabSpace(i,&MdiInfo[i].pMdiTextEdit->iLineNumberTextCount);
+			MdiInfo[i].pMdiTextEdit->iCharCode=iCharCode;
+			MdiInfo[i].pMdiTextEdit->iLfCode=iLfCode;
 
 			MdiInfo[i].IndentStr=0;
-
-			MdiInfo[i].edit_undo=(TEXTEDIT_UNDOSTATE *)GlobalAlloc(GPTR,sizeof(TEXTEDIT_UNDOSTATE));
-			MdiInfo[i].edit_undo->NowPos=0;
 
 			int flag;
@@ -945,5 +941,5 @@
 
 	//タブに追加
-	pobj_MainTab->insert(str,1,TabColor);
+	pobj_MainTab->InsertItem( str, true, TabColor );
 
 	SetFocus(hEdit);
@@ -1018,5 +1014,5 @@
 
 	//タブコントロールからアイテムを消去
-	if(pobj_MainTab) pobj_MainTab->delete_item(MdiInfo[WndNum].title,1);
+	if(pobj_MainTab) pobj_MainTab->DeleteItem( MdiInfo[WndNum].title, true );
 
 
@@ -1036,31 +1032,25 @@
 		}
 
-		for(i2=0;i2<MAX_UNDONUM;i2++){
-			if(MdiInfo[WndNum].edit_undo->Command[i2])
-				TextEdit_DeleteUndoData(WndNum,i2);
-		}
-		GlobalFree(MdiInfo[WndNum].edit_undo);
-
-		HeapDefaultFree(MdiInfo[WndNum].pmti->buffer);
-		HeapDefaultFree(MdiInfo[WndNum].pmti->pColorRef);
+		HeapDefaultFree(MdiInfo[WndNum].pMdiTextEdit->buffer);
+		HeapDefaultFree(MdiInfo[WndNum].pMdiTextEdit->pColorRef);
 
 		if(MdiInfo[WndNum].IndentStr) HeapDefaultFree(MdiInfo[WndNum].IndentStr);
 
 		//エディットコントロールを破棄
-		DestroyWindow(MdiInfo[WndNum].pmti->hEdit);
+		DestroyWindow(MdiInfo[WndNum].pMdiTextEdit->hEdit);
 
 		//Web検索ウィンドウを破棄
-		delete MdiInfo[WndNum].pmti->pobj_WebResult;
-		MdiInfo[WndNum].pmti->pobj_WebResult=0;
+		delete MdiInfo[WndNum].pMdiTextEdit->pobj_WebResult;
+		MdiInfo[WndNum].pMdiTextEdit->pobj_WebResult=0;
 
 		//ルーラーウィンドウを破棄
-		delete MdiInfo[WndNum].pmti->pobj_Ruler;
-		MdiInfo[WndNum].pmti->pobj_Ruler=0;
+		delete MdiInfo[WndNum].pMdiTextEdit->pobj_Ruler;
+		MdiInfo[WndNum].pMdiTextEdit->pobj_Ruler=0;
 
 		//アイコンを破棄
-		if(MdiInfo[WndNum].pmti->hIcon) DestroyIcon(MdiInfo[WndNum].pmti->hIcon);
-
-		HeapDefaultFree(MdiInfo[WndNum].pmti);
-		MdiInfo[WndNum].pmti=0;
+		if(MdiInfo[WndNum].pMdiTextEdit->hIcon) DestroyIcon(MdiInfo[WndNum].pMdiTextEdit->hIcon);
+
+		delete MdiInfo[WndNum].pMdiTextEdit;
+		MdiInfo[WndNum].pMdiTextEdit=0;
 	}
 	else if(MdiInfo[WndNum].DocType==WNDTYPE_RAD){
@@ -1122,5 +1112,5 @@
 	if(pobj_nv->bEditor_Ruler){
 		//ルーラー
-		MdiInfo[WndNum].pmti->pobj_Ruler->resize(
+		MdiInfo[WndNum].pMdiTextEdit->pobj_Ruler->resize(
 			0,
 			0,
@@ -1130,14 +1120,14 @@
 		iHeightRuler=HEIGHT_RULER;
 
-		ShowWindow(MdiInfo[WndNum].pmti->pobj_Ruler->hRulerWnd,SW_SHOW);
+		ShowWindow(MdiInfo[WndNum].pMdiTextEdit->pobj_Ruler->hRulerWnd,SW_SHOW);
 	}
 	else{
 		iHeightRuler=0;
 
-		ShowWindow(MdiInfo[WndNum].pmti->pobj_Ruler->hRulerWnd,SW_HIDE);
+		ShowWindow(MdiInfo[WndNum].pMdiTextEdit->pobj_Ruler->hRulerWnd,SW_HIDE);
 	}
 
 	//エディットウィンドウ
-	MoveWindow(MdiInfo[WndNum].pmti->hEdit,
+	MoveWindow(MdiInfo[WndNum].pMdiTextEdit->hEdit,
 		0,
 		iHeightRuler,
@@ -1147,5 +1137,5 @@
 
 	//Web検索ウィンドウ
-	MdiInfo[WndNum].pmti->pobj_WebResult->resize(
+	MdiInfo[WndNum].pMdiTextEdit->pobj_WebResult->resize(
 		0,
 		cy-WebResultWndHeight,
@@ -1687,5 +1677,5 @@
 						hGlobal=(char *)GlobalAlloc(GMEM_MOVEABLE,CharRange.cpMax-CharRange.cpMin+1);
 						pTemp=(char *)GlobalLock(hGlobal);
-						memcpy(pTemp,MdiInfo[WndNum].pmti->buffer+CharRange.cpMin,CharRange.cpMax-CharRange.cpMin);
+						memcpy(pTemp,MdiInfo[WndNum].pMdiTextEdit->buffer+CharRange.cpMin,CharRange.cpMax-CharRange.cpMin);
 						pTemp[CharRange.cpMax-CharRange.cpMin]=0;
 						GlobalUnlock(hGlobal);
@@ -1743,5 +1733,5 @@
 						hGlobal=(char *)GlobalAlloc(GMEM_MOVEABLE,CharRange.cpMax-CharRange.cpMin+1);
 						pTemp=(char *)GlobalLock(hGlobal);
-						memcpy(pTemp,MdiInfo[WndNum].pmti->buffer+CharRange.cpMin,CharRange.cpMax-CharRange.cpMin);
+						memcpy(pTemp,MdiInfo[WndNum].pMdiTextEdit->buffer+CharRange.cpMin,CharRange.cpMax-CharRange.cpMin);
 						pTemp[CharRange.cpMax-CharRange.cpMin]=0;
 						GlobalUnlock(hGlobal);
@@ -1853,11 +1843,11 @@
 						hEdit=GetWindow(hChild,GW_CHILD);
 
-						MdiInfo[WndNum].pmti->StartCaretPos.x=0;
-						MdiInfo[WndNum].pmti->StartCaretPos.y=0;
+						MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x=0;
+						MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y=0;
 
 						GetCaretPosFromBufferIndex(
-							MdiInfo[WndNum].pmti->buffer,
-							lstrlen(MdiInfo[WndNum].pmti->buffer),
-							&MdiInfo[WndNum].pmti->EndCaretPos);
+							MdiInfo[WndNum].pMdiTextEdit->buffer,
+							lstrlen(MdiInfo[WndNum].pMdiTextEdit->buffer),
+							&MdiInfo[WndNum].pMdiTextEdit->EndCaretPos);
 
 						InvalidateRect(hEdit,NULL,0);
@@ -2443,5 +2433,5 @@
 
 					//閉じる
-					MdiInfo[WndNum].pmti->bModify=0;
+					MdiInfo[WndNum].pMdiTextEdit->UnModify();
 					SendMessage(MdiInfo[WndNum].hwnd,WM_CLOSE,0,0);
 
@@ -2552,5 +2542,5 @@
 			UpdateWindow(hChild);
 
-			pTemp=MdiInfo[WndNum].pmti->buffer;
+			pTemp=MdiInfo[WndNum].pMdiTextEdit->buffer;
 
 			//行の先頭インデックスを取得（取得する行の番号はwParamで渡される）
Index: ProjectEditor/ProjectEditor.sln
===================================================================
--- ProjectEditor/ProjectEditor.sln	(revision 22)
+++ ProjectEditor/ProjectEditor.sln	(revision 24)
@@ -11,6 +11,4 @@
 		TheText_Debug|Win32 = TheText_Debug|Win32
 		TheText_Release|Win32 = TheText_Release|Win32
-		TheText_Share_Debug|Win32 = TheText_Share_Debug|Win32
-		TheText_Share_Release|Win32 = TheText_Share_Release|Win32
 	EndGlobalSection
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
@@ -25,8 +23,4 @@
 		{DC1B787E-510F-4F7D-8F9A-182600904D83}.TheText_Release|Win32.ActiveCfg = TheText_Release|Win32
 		{DC1B787E-510F-4F7D-8F9A-182600904D83}.TheText_Release|Win32.Build.0 = TheText_Release|Win32
-		{DC1B787E-510F-4F7D-8F9A-182600904D83}.TheText_Share_Debug|Win32.ActiveCfg = TheText_Share_Debug|Win32
-		{DC1B787E-510F-4F7D-8F9A-182600904D83}.TheText_Share_Debug|Win32.Build.0 = TheText_Share_Debug|Win32
-		{DC1B787E-510F-4F7D-8F9A-182600904D83}.TheText_Share_Release|Win32.ActiveCfg = TheText_Share_Release|Win32
-		{DC1B787E-510F-4F7D-8F9A-182600904D83}.TheText_Share_Release|Win32.Build.0 = TheText_Share_Release|Win32
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
Index: ProjectEditor/ProjectEditor.vcproj
===================================================================
--- ProjectEditor/ProjectEditor.vcproj	(revision 22)
+++ ProjectEditor/ProjectEditor.vcproj	(revision 24)
@@ -3797,4 +3797,16 @@
 							/>
 						</FileConfiguration>
+					</File>
+				</Filter>
+				<Filter
+					Name="MDIクライアント管理クラス"
+					>
+					<File
+						RelativePath=".\MdiTextEdit.cpp"
+						>
+					</File>
+					<File
+						RelativePath=".\MdiTextEdit.h"
+						>
 					</File>
 				</Filter>
Index: ProjectEditor/RadProc.cpp
===================================================================
--- ProjectEditor/RadProc.cpp	(revision 22)
+++ ProjectEditor/RadProc.cpp	(revision 24)
@@ -146,5 +146,5 @@
 
 	//タブに追加
-	pobj_MainTab->insert(pWindowInfo->name,1);
+	pobj_MainTab->InsertItem( pWindowInfo->name, true );
 
 	//メニュー状態を設定
Index: ProjectEditor/Replace.cpp
===================================================================
--- ProjectEditor/Replace.cpp	(revision 22)
+++ ProjectEditor/Replace.cpp	(revision 24)
@@ -8,5 +8,5 @@
 	CHARRANGE Range,cr2;
 
-	pBuf=MdiInfo[WndNum].pmti->buffer;
+	pBuf=MdiInfo[WndNum].pMdiTextEdit->buffer;
 
 	//行の先頭位置を取得
@@ -30,5 +30,5 @@
 	//初期化（すべて黒色に戻す）
 	for(i=Range.cpMin;i<Range.cpMax;i++){
-		MdiInfo[WndNum].pmti->pColorRef[i]=tci.rgbDefault;
+		MdiInfo[WndNum].pMdiTextEdit->pColorRef[i]=tci.rgbDefault;
 	}
 
@@ -59,5 +59,5 @@
 			if(bResult){
 				for(i2=cr2.cpMin;i2<cr2.cpMax;i2++){
-					MdiInfo[WndNum].pmti->pColorRef[i2]=tci.rgbStatement;
+					MdiInfo[WndNum].pMdiTextEdit->pColorRef[i2]=tci.rgbStatement;
 				}
 			}
@@ -65,5 +65,5 @@
 		if(IsStr||pBuf[i]=='\"'&&IsStr==0){
 			//文字列カラー（""で囲まれる範囲）
-			MdiInfo[WndNum].pmti->pColorRef[i]=tci.rgbString;
+			MdiInfo[WndNum].pMdiTextEdit->pColorRef[i]=tci.rgbString;
 		}
 		if(pBuf[i]=='\0') break;
@@ -90,5 +90,5 @@
 	//バッファ長を取得
 	int length;
-	length=lstrlen(MdiInfo[WndNum].pmti->buffer);
+	length=lstrlen(MdiInfo[WndNum].pMdiTextEdit->buffer);
 
 	int delta;
@@ -99,12 +99,12 @@
 		////////////////////
 
-		MdiInfo[WndNum].pmti->buffer=(char *)HeapReAlloc(hHeap,
+		MdiInfo[WndNum].pMdiTextEdit->buffer=(char *)HeapReAlloc(hHeap,
 			0,
-			MdiInfo[WndNum].pmti->buffer,
+			MdiInfo[WndNum].pMdiTextEdit->buffer,
 			length+1+delta);
 
-		MdiInfo[WndNum].pmti->pColorRef=(COLORREF *)HeapReAlloc(hHeap,
+		MdiInfo[WndNum].pMdiTextEdit->pColorRef=(COLORREF *)HeapReAlloc(hHeap,
 			0,
-			MdiInfo[WndNum].pmti->pColorRef,
+			MdiInfo[WndNum].pMdiTextEdit->pColorRef,
 			(length+1+delta)*sizeof(COLORREF));
 	}
@@ -115,5 +115,5 @@
 		ProjectInfo.pobj_DBBreakPoint->replace(
 			MdiInfo[WndNum].path,
-			MdiInfo[WndNum].pmti->buffer,
+			MdiInfo[WndNum].pMdiTextEdit->buffer,
 			&DelRange,
 			&Range,
@@ -124,5 +124,5 @@
 		pobj_DBBreakPoint->replace(
 			MdiInfo[WndNum].path,
-			MdiInfo[WndNum].pmti->buffer,
+			MdiInfo[WndNum].pMdiTextEdit->buffer,
 			&DelRange,
 			&Range,
@@ -132,10 +132,10 @@
 
 	//文字列バッファをスライドして、挿入
-	SlideString(MdiInfo[WndNum].pmti->buffer+DelRange.cpMax,
+	SlideString(MdiInfo[WndNum].pMdiTextEdit->buffer+DelRange.cpMax,
 		delta);
-	memcpy(MdiInfo[WndNum].pmti->buffer+Range.cpMin,str,lstrlen(str));
+	memcpy(MdiInfo[WndNum].pMdiTextEdit->buffer+Range.cpMin,str,lstrlen(str));
 
 	//文字カラーバッファをスライド
-	SlideBuffer(((char *)MdiInfo[WndNum].pmti->pColorRef)+DelRange.cpMax*sizeof(COLORREF),
+	SlideBuffer(((char *)MdiInfo[WndNum].pMdiTextEdit->pColorRef)+DelRange.cpMax*sizeof(COLORREF),
 		(length-DelRange.cpMax) * sizeof(COLORREF),
 		delta*sizeof(COLORREF));
@@ -144,12 +144,12 @@
 
 	//新しいキャレット位置に変更
-	GetCaretPosFromBufferIndex(MdiInfo[WndNum].pmti->buffer,
+	GetCaretPosFromBufferIndex(MdiInfo[WndNum].pMdiTextEdit->buffer,
 		Range.cpMax,
-		&MdiInfo[WndNum].pmti->StartCaretPos);
-	MdiInfo[WndNum].pmti->EndCaretPos=MdiInfo[WndNum].pmti->StartCaretPos;
+		&MdiInfo[WndNum].pMdiTextEdit->StartCaretPos);
+	MdiInfo[WndNum].pMdiTextEdit->EndCaretPos=MdiInfo[WndNum].pMdiTextEdit->StartCaretPos;
 
 	//コントロールタブスペースの幅と行番号の文字数を更新
-	MdiInfo[WndNum].pmti->iWidth_ControlTabSpace=
-		GetControlTabSpace(WndNum,&MdiInfo[WndNum].pmti->iLineNumberTextCount);
+	MdiInfo[WndNum].pMdiTextEdit->iWidth_ControlTabSpace=
+		GetControlTabSpace(WndNum,&MdiInfo[WndNum].pMdiTextEdit->iLineNumberTextCount);
 
 	if(bRedraw){
@@ -159,6 +159,6 @@
 
 		if(!TextEdit_ScrollCaret(WndNum,0)){
-			UpdateWindow(MdiInfo[WndNum].pmti->hEdit);	//ちらつき防止
-			InvalidateRect(MdiInfo[WndNum].pmti->hEdit,NULL,0);
+			UpdateWindow(MdiInfo[WndNum].pMdiTextEdit->hEdit);	//ちらつき防止
+			InvalidateRect(MdiInfo[WndNum].pMdiTextEdit->hEdit,NULL,0);
 		}
 
@@ -167,11 +167,13 @@
 
 	//上下キャレット移動時の左右位置保持機能を解除
-	MdiInfo[WndNum].pmti->Temp_UpDown_CaretXPos=-1;
+	MdiInfo[WndNum].pMdiTextEdit->Temp_UpDown_CaretXPos=-1;
 
 	//編集メニューをリセット
 	ResetState_EditMenu();
 
-	//変更フラグをセット
-	MdiInfo[WndNum].pmti->bModify=1;
+	if( ! MdiInfo[WndNum].pMdiTextEdit->IsModified() ){
+		//変更フラグをセット
+		MdiInfo[WndNum].pMdiTextEdit->Modify();
+	}
 
 
@@ -245,5 +247,5 @@
 #endif
 		char *pBuf;
-		pBuf=MdiInfo[WndNum].pmti->buffer;
+		pBuf=MdiInfo[WndNum].pMdiTextEdit->buffer;
 
 		//行全体を選択(min)
@@ -270,5 +272,5 @@
 	buffer=(char *)HeapAlloc(hHeap,0,length*3+1024);
 	temporary=(char *)HeapAlloc(hHeap,0,length*3+1024);
-	memcpy(buffer,MdiInfo[WndNum].pmti->buffer+CharRange.cpMin,length);
+	memcpy(buffer,MdiInfo[WndNum].pMdiTextEdit->buffer+CharRange.cpMin,length);
 	buffer[length]=0;
 
Index: ProjectEditor/Ruler.cpp
===================================================================
--- ProjectEditor/Ruler.cpp	(revision 22)
+++ ProjectEditor/Ruler.cpp	(revision 24)
@@ -57,5 +57,5 @@
 
 	int iControlTabSpace;
-	iControlTabSpace=MdiInfo[m_WndNum].pmti->iWidth_ControlTabSpace;
+	iControlTabSpace=MdiInfo[m_WndNum].pMdiTextEdit->iWidth_ControlTabSpace;
 
 	HBRUSH hBrush,hOldBrush;
Index: ProjectEditor/Search.cpp
===================================================================
--- ProjectEditor/Search.cpp	(revision 22)
+++ ProjectEditor/Search.cpp	(revision 24)
@@ -35,8 +35,8 @@
 	hEdit=GetWindow(GetWindow(hClient,GW_CHILD),GW_CHILD);
 
-	i=lstrlen(MdiInfo[WndNum].pmti->buffer)+1;
+	i=lstrlen(MdiInfo[WndNum].pMdiTextEdit->buffer)+1;
 
 	buffer=(char *)HeapAlloc(hHeap,0,i);
-	lstrcpy(buffer,MdiInfo[WndNum].pmti->buffer);
+	lstrcpy(buffer,MdiInfo[WndNum].pMdiTextEdit->buffer);
 
 	LineStr=(char *)HeapAlloc(hHeap,0,i+64);
@@ -106,5 +106,5 @@
 
 					char *pBuf;
-					pBuf=MdiInfo[WndNum].pmti->buffer;
+					pBuf=MdiInfo[WndNum].pMdiTextEdit->buffer;
 
 					//行の末端位置を取得
@@ -146,5 +146,5 @@
 	if(WndNum==-1) return 0;
 
-	pBuf=MdiInfo[WndNum].pmti->buffer;
+	pBuf=MdiInfo[WndNum].pMdiTextEdit->buffer;
 
 	TextEdit_GetSel(WndNum,&CharRange);
@@ -241,5 +241,5 @@
 			pTemp=(char *)HeapAlloc(hHeap,0,CharRange.cpMax-CharRange.cpMin+1);
 			memcpy(pTemp,
-				MdiInfo[WndNum].pmti->buffer+CharRange.cpMin,
+				MdiInfo[WndNum].pMdiTextEdit->buffer+CharRange.cpMin,
 				CharRange.cpMax-CharRange.cpMin);
 			pTemp[CharRange.cpMax-CharRange.cpMin]=0;
@@ -329,5 +329,5 @@
 			pTemp=(char *)HeapAlloc(hHeap,0,CharRange.cpMax-CharRange.cpMin+1);
 			memcpy(pTemp,
-				MdiInfo[WndNum].pmti->buffer+CharRange.cpMin,
+				MdiInfo[WndNum].pMdiTextEdit->buffer+CharRange.cpMin,
 				CharRange.cpMax-CharRange.cpMin);
 			pTemp[CharRange.cpMax-CharRange.cpMin]=0;
@@ -394,5 +394,5 @@
 					pTemp=(char *)HeapAlloc(hHeap,0,CharRange.cpMax-CharRange.cpMin+1);
 					memcpy(pTemp,
-						MdiInfo[WndNum].pmti->buffer+CharRange.cpMin,
+						MdiInfo[WndNum].pMdiTextEdit->buffer+CharRange.cpMin,
 						CharRange.cpMax-CharRange.cpMin);
 					pTemp[CharRange.cpMax-CharRange.cpMin]=0;
@@ -468,5 +468,5 @@
 							pTemp=(char *)HeapAlloc(hHeap,0,CharRange.cpMax-CharRange.cpMin+1);
 							memcpy(pTemp,
-								MdiInfo[WndNum].pmti->buffer+CharRange.cpMin,
+								MdiInfo[WndNum].pMdiTextEdit->buffer+CharRange.cpMin,
 								CharRange.cpMax-CharRange.cpMin);
 							pTemp[CharRange.cpMax-CharRange.cpMin]=0;
Index: ProjectEditor/StringCount.cpp
===================================================================
--- ProjectEditor/StringCount.cpp	(revision 22)
+++ ProjectEditor/StringCount.cpp	(revision 24)
@@ -23,6 +23,6 @@
 		else{
 			//すべての範囲
-			pBuf=(char *)HeapAlloc(hHeap,0,lstrlen(MdiInfo[WndNum].pmti->buffer)+1);
-			lstrcpy(pBuf,MdiInfo[WndNum].pmti->buffer);
+			pBuf=(char *)HeapAlloc(hHeap,0,lstrlen(MdiInfo[WndNum].pMdiTextEdit->buffer)+1);
+			lstrcpy(pBuf,MdiInfo[WndNum].pMdiTextEdit->buffer);
 		}
 
Index: ProjectEditor/SubOperation.cpp
===================================================================
--- ProjectEditor/SubOperation.cpp	(revision 22)
+++ ProjectEditor/SubOperation.cpp	(revision 24)
@@ -817,5 +817,5 @@
 				if(IS_DOCUMENT_TEXT(MdiInfo[i].DocType)){
 					SetTextEditWordColor(i);
-					InvalidateRect(MdiInfo[i].pmti->hEdit,NULL,0);
+					InvalidateRect(MdiInfo[i].pMdiTextEdit->hEdit,NULL,0);
 				}
 			}
@@ -1403,5 +1403,5 @@
 		}
 		else{
-			if(MdiInfo[WndNum].pmti->bModify){
+			if( MdiInfo[WndNum].pMdiTextEdit->IsModified() ){
 				if(!SaveDocument(hChild,NULL)) return 0;
 			}
Index: ProjectEditor/TabCtrl.cpp
===================================================================
--- ProjectEditor/TabCtrl.cpp	(revision 22)
+++ ProjectEditor/TabCtrl.cpp	(revision 24)
@@ -73,5 +73,5 @@
 
 
-int CMainTab::search(char *lpszText){
+int CMainTab::SearchItemIndex( const char *lpszText ){
 	int i2,i3;
 	char temporary[MAX_PATH];
@@ -86,4 +86,10 @@
 	for(i2=0;i2<i3;i2++){
 		TabCtrl_GetItem(hTab,i2,&tcItem);
+
+		//アスタリスクを取り除いて評価する
+		if( tcItem.pszText[ lstrlen( tcItem.pszText ) -1 ] == '*' ){
+			tcItem.pszText[ lstrlen( tcItem.pszText ) -1 ] = 0;
+		}
+
 		if(lstrcmpi(lpszText,tcItem.pszText)==0) break;
 	}
@@ -91,4 +97,34 @@
 
 	return i2;
+}
+void CMainTab::SetItemText( int index, const char *ItemText ){
+	TC_ITEM tcItem;
+	tcItem.mask=TCIF_TEXT;
+	tcItem.pszText=(LPSTR)ItemText;
+	tcItem.cchTextMax=MAX_PATH;
+
+	TabCtrl_SetItem(hTab,index,&tcItem);
+}
+void CMainTab::GetItemText( int index, char *ItemText ){
+	TC_ITEM tcItem;
+	tcItem.mask = TCIF_TEXT;
+	tcItem.pszText = ItemText;
+	tcItem.cchTextMax = MAX_PATH;
+	TabCtrl_GetItem( hTab, index, &tcItem );
+}
+bool CMainTab::IsModified( int index ){
+	//アスタリスク表示かどうかを判断する
+
+	//アイテム文字列を取得
+	char ItemText[MAX_PATH];
+	GetItemText( index, ItemText );
+
+	if( ItemText[ lstrlen( ItemText ) -1 ] == '*' ){
+		//アスタリスクがあったとき
+		return true;
+	}
+
+	//その他
+	return false;
 }
 
@@ -126,5 +162,5 @@
 }
 
-void CMainTab::insert(char *lpszText,BOOL bResize,COLORREF color){
+void CMainTab::InsertItem( const char *lpszText, bool isResize, COLORREF color ){
 	int sw=0;
 	if(TabCtrl_GetItemCount(hTab)==0) sw=1;
@@ -134,55 +170,75 @@
 	TC_ITEM tcItem;
 	tcItem.mask=TCIF_TEXT|TCIF_PARAM;
-	tcItem.pszText=lpszText;
+	tcItem.pszText=(LPSTR)lpszText;
 	tcItem.lParam=color;
 	TabCtrl_InsertItem(hTab,0,&tcItem);
 	TabCtrl_SetCurSel(hTab,0);
 
-	if(bResize){
+	if(isResize){
 		if(sw) ResizeOwnerWnd();
 	}
 }
 
-void CMainTab::delete_item(char *lpszText,BOOL bResize){
+void CMainTab::DeleteItem( const char *lpszText, bool isResize ){
 	int i2;
-	i2=search(lpszText);
+	i2=SearchItemIndex(lpszText);
 	if(i2==-1) return;
 
 	TabCtrl_DeleteItem(hTab,i2);
 
-	if(bResize){
+	if(isResize){
 		if(TabCtrl_GetItemCount(hTab)==0) ResizeOwnerWnd();
 	}
 }
 
-void CMainTab::reset_item(char *lpszOldText,char *lpszNewText){
+void CMainTab::RenameItem( const char *lpszOldText, const char *lpszNewText ){
 	int i2;
-	i2=search(lpszOldText);
+	i2=SearchItemIndex(lpszOldText);
 	if(i2==-1) return;
 
-	TC_ITEM tcItem;
-	tcItem.mask=TCIF_TEXT;
-	tcItem.pszText=lpszNewText;
-	tcItem.cchTextMax=MAX_PATH;
-
-	TabCtrl_SetItem(hTab,i2,&tcItem);
-}
-
-COLORREF CMainTab::GetItemColor(char *lpszText){
-	int i2,i3;
+	SetItemText( i2, lpszNewText );
+}
+
+void CMainTab::NofityModifyDocument( const char *ItemText ){
+	//ドキュメントが変更されたとき、アスタリスクを付けて表示する
+
+	//インデックスを取得
+	int index = SearchItemIndex( ItemText );
+	if( index == -1 ) return;
+
+	//既にアスタリスク表示されていた場合は抜ける
+	if( IsModified( index ) ) return;
+
+	//アスタリスクを付加
 	char temporary[MAX_PATH];
-
-	i3=TabCtrl_GetItemCount(hTab);
-
-	TC_ITEM tcItem;
-	tcItem.mask=TCIF_TEXT|TCIF_PARAM;
-	tcItem.pszText=temporary;
-	tcItem.cchTextMax=MAX_PATH;
-
-	for(i2=0;i2<i3;i2++){
-		TabCtrl_GetItem(hTab,i2,&tcItem);
-		if(lstrcmpi(lpszText,tcItem.pszText)==0) return tcItem.lParam;
-	}
-	return -1;
+	lstrcpy( temporary, ItemText );
+	lstrcat( temporary, "*" );
+
+	//タブアイテムを更新
+	SetItemText( index, temporary );
+}
+void CMainTab::NofityUnModifyDocument( const char *ItemText ){
+	//ドキュメントが保存されたとき、アスタリスクを非表示にする
+
+	//インデックスを取得
+	int index = SearchItemIndex( ItemText );
+	if( index == -1 ) return;
+
+	//既にアスタリスクが非表示の場合は抜ける
+	if( ! IsModified( index ) ) return;
+
+	//タブアイテムを更新
+	SetItemText( index, ItemText );
+}
+
+COLORREF CMainTab::GetItemColor( char *ItemText ){
+	//インデックスを取得
+	int index = SearchItemIndex( ItemText );
+	if( index == -1 ) return -1;
+
+	TC_ITEM tcItem;
+	tcItem.mask = TCIF_PARAM;
+	TabCtrl_GetItem( hTab, index, &tcItem );
+	return tcItem.lParam;
 }
 
@@ -207,5 +263,5 @@
 void CMainTab::MdiActiveEvent(char *lpszText){
 	int i2;
-	i2=search(lpszText);
+	i2=SearchItemIndex(lpszText);
 	if(i2==-1) return;
 
Index: ProjectEditor/TabCtrl.h
===================================================================
--- ProjectEditor/TabCtrl.h	(revision 22)
+++ ProjectEditor/TabCtrl.h	(revision 24)
@@ -4,5 +4,15 @@
 	HFONT hBoldFont;
 
-	int search(char *lpszText);
+	//アイテム文字列を元にインデックスを取得する
+	int SearchItemIndex( const char *lpszText );
+
+	//アイテム文字列を変更する
+	void SetItemText( int index, const char *ItemText );
+
+	//アイテム文字列を取得する
+	void GetItemText( int index, char *ItemText );
+
+	//アスタリスク表示かどうかを調べる（true/変更あり, false/変更なし）
+	bool IsModified( int index );
 
 public:
@@ -12,9 +22,20 @@
 	~CMainTab();
 
-	void insert(char *lpszText,BOOL bResize,COLORREF color=-1);
-	void delete_item(char *lpszText,BOOL bResize);
-	void reset_item(char *lpszOldText,char *lpszNewText);
+	//アイテムを挿入
+	void InsertItem( const char *lpszText, bool isResize, COLORREF color = -1 );
 
-	COLORREF GetItemColor(char *lpszText);
+	//アイテムを削除
+	void DeleteItem( const char *lpszText, bool isResize );
+
+	//アイテムの名前を変更
+	void RenameItem( const char *lpszOldText, const char *lpszNewText );
+
+	//変更あり通知
+	void NofityModifyDocument( const char *ItemText );
+
+	//変更なし通知
+	void NofityUnModifyDocument( const char *ItemText );
+
+	COLORREF GetItemColor( char *ItemText );
 
 	void SelChangeEvent();
Index: ProjectEditor/TextEditor.cpp
===================================================================
--- ProjectEditor/TextEditor.cpp	(revision 22)
+++ ProjectEditor/TextEditor.cpp	(revision 24)
@@ -10,5 +10,5 @@
 
 		char *pBuf;
-		pBuf=MdiInfo[WndNum].pmti->buffer;
+		pBuf=MdiInfo[WndNum].pMdiTextEdit->buffer;
 
 		int i,iNum=1,x=0;
@@ -85,5 +85,5 @@
 	char *pBuf;
 
-	pBuf=MdiInfo[WndNum].pmti->buffer;
+	pBuf=MdiInfo[WndNum].pMdiTextEdit->buffer;
 
 	if(MdiInfo[WndNum].DocType==WNDTYPE_TEXT){
@@ -91,5 +91,5 @@
 		for(i=0;;i++){
 			if(pBuf[i]=='\0') break;
-			MdiInfo[WndNum].pmti->pColorRef[i]=tci.rgbDefault;
+			MdiInfo[WndNum].pMdiTextEdit->pColorRef[i]=tci.rgbDefault;
 		}
 		return;
@@ -120,10 +120,10 @@
 			if(bResult){
 				for(i3=i-i2;i3<i;i3++){
-					MdiInfo[WndNum].pmti->pColorRef[i3]=tci.rgbStatement;
+					MdiInfo[WndNum].pMdiTextEdit->pColorRef[i3]=tci.rgbStatement;
 				}
 			}
 			else{
 				for(i3=i-i2;i3<i;i3++){
-					MdiInfo[WndNum].pmti->pColorRef[i3]=tci.rgbDefault;
+					MdiInfo[WndNum].pMdiTextEdit->pColorRef[i3]=tci.rgbDefault;
 				}
 			}
@@ -134,9 +134,9 @@
 			if(IsStr||pBuf[i]=='\"'&&IsStr==0){
 				//文字列カラー（""で囲まれる範囲）
-				MdiInfo[WndNum].pmti->pColorRef[i]=tci.rgbString;
+				MdiInfo[WndNum].pMdiTextEdit->pColorRef[i]=tci.rgbString;
 			}
 			else{
 				//通常カラー
-				MdiInfo[WndNum].pmti->pColorRef[i]=tci.rgbDefault;
+				MdiInfo[WndNum].pMdiTextEdit->pColorRef[i]=tci.rgbDefault;
 			}
 		}
@@ -156,5 +156,5 @@
 	//エディタ画面左端のコントロールタブ
 	int iControlTabSpace;
-	iControlTabSpace=MdiInfo[WndNum].pmti->iWidth_ControlTabSpace;
+	iControlTabSpace=MdiInfo[WndNum].pMdiTextEdit->iWidth_ControlTabSpace;
 
 	HWND hEdit;
@@ -181,6 +181,6 @@
 
 	//ルーラーを再描画
-	InvalidateRect(MdiInfo[WndNum].pmti->pobj_Ruler->hRulerWnd,NULL,0);
-	UpdateWindow(MdiInfo[WndNum].pmti->pobj_Ruler->hRulerWnd);
+	InvalidateRect(MdiInfo[WndNum].pMdiTextEdit->pobj_Ruler->hRulerWnd,NULL,0);
+	UpdateWindow(MdiInfo[WndNum].pMdiTextEdit->pobj_Ruler->hRulerWnd);
 }
 
@@ -217,5 +217,5 @@
 	char *pBuf;
 
-	pBuf=MdiInfo[WndNum].pmti->buffer;
+	pBuf=MdiInfo[WndNum].pMdiTextEdit->buffer;
 
 	//ダブルクリック位置を取得（バッファインデックス）
@@ -330,11 +330,11 @@
 
 	i=GetBufferIndexFromCaretPos(
-		MdiInfo[WndNum].pmti->buffer,
-		MdiInfo[WndNum].pmti->StartCaretPos.x,
-		MdiInfo[WndNum].pmti->StartCaretPos.y);
+		MdiInfo[WndNum].pMdiTextEdit->buffer,
+		MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x,
+		MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y);
 	GetCaretPosFromBufferIndex(
-		MdiInfo[WndNum].pmti->buffer,
+		MdiInfo[WndNum].pMdiTextEdit->buffer,
 		i-lstrlen(MdiInfo[WndNum].IndentStr),
-		&MdiInfo[WndNum].pmti->StartCaretPos);
+		&MdiInfo[WndNum].pMdiTextEdit->StartCaretPos);
 
 	TextEdit_Replace(WndNum,"",1);
Index: ProjectEditor/TextEditor_EventProc.cpp
===================================================================
--- ProjectEditor/TextEditor_EventProc.cpp	(revision 22)
+++ ProjectEditor/TextEditor_EventProc.cpp	(revision 24)
@@ -226,5 +226,5 @@
 
 			int iControlTabSpace;
-			iControlTabSpace=MdiInfo[WndNum].pmti->iWidth_ControlTabSpace;
+			iControlTabSpace=MdiInfo[WndNum].pMdiTextEdit->iWidth_ControlTabSpace;
 
 			i=max(-si.nPos,min(i,si.nMax-((rect.right-iControlTabSpace)/font_width)-si.nPos));
@@ -238,6 +238,6 @@
 
 			//ルーラーを再描画
-			InvalidateRect(MdiInfo[WndNum].pmti->pobj_Ruler->hRulerWnd,NULL,0);
-			UpdateWindow(MdiInfo[WndNum].pmti->pobj_Ruler->hRulerWnd);
+			InvalidateRect(MdiInfo[WndNum].pMdiTextEdit->pobj_Ruler->hRulerWnd,NULL,0);
+			UpdateWindow(MdiInfo[WndNum].pMdiTextEdit->pobj_Ruler->hRulerWnd);
 
 			return 0;
@@ -259,5 +259,5 @@
 				WS_CHILD|WS_VISIBLE,
 				0,0,0,0,
-				MdiInfo[wParam].pmti->pobj_WebResult->hwnd,0,hInst,0);
+				MdiInfo[wParam].pMdiTextEdit->pobj_WebResult->hwnd,0,hInst,0);
 
 			SetWindowLong(hOneTabWnd,GWL_USERDATA,(long)lParam);
Index: ProjectEditor/TextEditor_ImeEvent.cpp
===================================================================
--- ProjectEditor/TextEditor_ImeEvent.cpp	(revision 22)
+++ ProjectEditor/TextEditor_ImeEvent.cpp	(revision 24)
@@ -9,5 +9,5 @@
 
 	int iControlTabSpace;
-	iControlTabSpace=MdiInfo[WndNum].pmti->iWidth_ControlTabSpace;
+	iControlTabSpace=MdiInfo[WndNum].pMdiTextEdit->iWidth_ControlTabSpace;
 
 	HIMC hIMC;
@@ -18,5 +18,5 @@
 	COMPOSITIONFORM CompForm;
 	CompForm.dwStyle=CFS_POINT;
-	pos=MdiInfo[WndNum].pmti->StartCaretPos;
+	pos=MdiInfo[WndNum].pMdiTextEdit->StartCaretPos;
 	GetScrollBaseCaretPos(WndNum,(int *)&pos.x,(int *)&pos.y);
 	CompForm.ptCurrentPos.x=pos.x*font_width+iControlTabSpace;
@@ -36,5 +36,5 @@
 
 		int iControlTabSpace;
-		iControlTabSpace=MdiInfo[WndNum].pmti->iWidth_ControlTabSpace;
+		iControlTabSpace=MdiInfo[WndNum].pMdiTextEdit->iWidth_ControlTabSpace;
 
 		////////////////////
@@ -60,5 +60,5 @@
 		COMPOSITIONFORM CompForm;
 		CompForm.dwStyle=CFS_POINT;
-		pos=MdiInfo[WndNum].pmti->StartCaretPos;
+		pos=MdiInfo[WndNum].pMdiTextEdit->StartCaretPos;
 		GetScrollBaseCaretPos(WndNum,(int *)&pos.x,(int *)&pos.y);
 		CompForm.ptCurrentPos.x=pos.x*font_width+iControlTabSpace;
Index: ProjectEditor/TextEditor_KeyEvent.cpp
===================================================================
--- ProjectEditor/TextEditor_KeyEvent.cpp	(revision 22)
+++ ProjectEditor/TextEditor_KeyEvent.cpp	(revision 24)
@@ -12,8 +12,8 @@
 		WndNum=GetWndNum(GetParent(hwnd));
 
-		if(MdiInfo[WndNum].pmti->iUnderStart!=-1){
+		if(MdiInfo[WndNum].pMdiTextEdit->iUnderStart!=-1){
 			//ハイパーリンク下線の表示を解除
-			MdiInfo[WndNum].pmti->iUnderStart=-1;
-			MdiInfo[WndNum].pmti->iUnderEnd=-1;
+			MdiInfo[WndNum].pMdiTextEdit->iUnderStart=-1;
+			MdiInfo[WndNum].pMdiTextEdit->iUnderEnd=-1;
 
 			//再描画
@@ -147,5 +147,5 @@
 	char *pBuf;
 
-	pBuf=MdiInfo[WndNum].pmti->buffer;
+	pBuf=MdiInfo[WndNum].pMdiTextEdit->buffer;
 	for(i=iPos;i>0;i--){
 		if(pBuf[i-1]=='\r'&&pBuf[i]=='\n') return i+1;
@@ -235,5 +235,5 @@
 			}
 
-			pBuf=MdiInfo[WndNum].pmti->buffer;
+			pBuf=MdiInfo[WndNum].pMdiTextEdit->buffer;
 
 			int StartX;
@@ -241,11 +241,11 @@
 			//リプレイス前のカーソルバッファ位置を取得
 			i=GetBufferIndexFromCaretPos(pBuf,
-				MdiInfo[WndNum].pmti->StartCaretPos.x,
-				MdiInfo[WndNum].pmti->StartCaretPos.y);
-			StartX=MdiInfo[WndNum].pmti->StartCaretPos.x;
+				MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x,
+				MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y);
+			StartX=MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x;
 
 			//リプレイス
 			TextEdit_ReplaceUpdateUndoData(WndNum,temporary,0,1);
-			pBuf=MdiInfo[WndNum].pmti->buffer;
+			pBuf=MdiInfo[WndNum].pMdiTextEdit->buffer;
 
 			//リプレイス後のカーソル行のインデントをi3に取得
@@ -290,6 +290,6 @@
 			*/
 			i=GetBufferIndexFromCaretPos(pBuf,
-				MdiInfo[WndNum].pmti->StartCaretPos.x,
-				MdiInfo[WndNum].pmti->StartCaretPos.y);
+				MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x,
+				MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y);
 			if(pBuf[i]=='\r'&&
 				pBuf[i+1]=='\n'){
@@ -322,5 +322,5 @@
 	}
 	else if(nVirtualKey==VK_TAB){
-		pBuf=MdiInfo[WndNum].pmti->buffer;
+		pBuf=MdiInfo[WndNum].pMdiTextEdit->buffer;
 
 		TextEdit_GetSel(WndNum,&CharRange);
@@ -409,5 +409,5 @@
 			//リプレイス
 			TextEdit_ReplaceUpdateUndoData(WndNum,pTemp,0,0);
-			pBuf=MdiInfo[WndNum].pmti->buffer;
+			pBuf=MdiInfo[WndNum].pMdiTextEdit->buffer;
 
 			HeapDefaultFree(pTemp);
@@ -496,8 +496,8 @@
 			case VK_LEFT:
 				//上下キャレット移動時の左右位置保持機能を解除
-				MdiInfo[WndNum].pmti->Temp_UpDown_CaretXPos=-1;
-
-				if((MdiInfo[WndNum].pmti->StartCaretPos.x==MdiInfo[WndNum].pmti->EndCaretPos.x&&
-					MdiInfo[WndNum].pmti->StartCaretPos.y==MdiInfo[WndNum].pmti->EndCaretPos.y)||
+				MdiInfo[WndNum].pMdiTextEdit->Temp_UpDown_CaretXPos=-1;
+
+				if((MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x==MdiInfo[WndNum].pMdiTextEdit->EndCaretPos.x&&
+					MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y==MdiInfo[WndNum].pMdiTextEdit->EndCaretPos.y)||
 					GetKeyState(VK_SHIFT)&0x8000){
 					//選択中でないとき、またはシフトキーが押されているとき
@@ -506,13 +506,13 @@
 				else{
 					//選択中のとき
-					if(MdiInfo[WndNum].pmti->StartCaretPos.y<MdiInfo[WndNum].pmti->EndCaretPos.y)
-						MdiInfo[WndNum].pmti->EndCaretPos=MdiInfo[WndNum].pmti->StartCaretPos;
-					else if(MdiInfo[WndNum].pmti->StartCaretPos.y>MdiInfo[WndNum].pmti->EndCaretPos.y)
-						MdiInfo[WndNum].pmti->StartCaretPos=MdiInfo[WndNum].pmti->EndCaretPos;
+					if(MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y<MdiInfo[WndNum].pMdiTextEdit->EndCaretPos.y)
+						MdiInfo[WndNum].pMdiTextEdit->EndCaretPos=MdiInfo[WndNum].pMdiTextEdit->StartCaretPos;
+					else if(MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y>MdiInfo[WndNum].pMdiTextEdit->EndCaretPos.y)
+						MdiInfo[WndNum].pMdiTextEdit->StartCaretPos=MdiInfo[WndNum].pMdiTextEdit->EndCaretPos;
 					else{
-						if(MdiInfo[WndNum].pmti->StartCaretPos.x<MdiInfo[WndNum].pmti->EndCaretPos.x)
-							MdiInfo[WndNum].pmti->EndCaretPos=MdiInfo[WndNum].pmti->StartCaretPos;
+						if(MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x<MdiInfo[WndNum].pMdiTextEdit->EndCaretPos.x)
+							MdiInfo[WndNum].pMdiTextEdit->EndCaretPos=MdiInfo[WndNum].pMdiTextEdit->StartCaretPos;
 						else
-							MdiInfo[WndNum].pmti->StartCaretPos=MdiInfo[WndNum].pmti->EndCaretPos;
+							MdiInfo[WndNum].pMdiTextEdit->StartCaretPos=MdiInfo[WndNum].pMdiTextEdit->EndCaretPos;
 					}
 				}
@@ -520,24 +520,24 @@
 			case VK_RIGHT:
 				//上下キャレット移動時の左右位置保持機能を解除
-				MdiInfo[WndNum].pmti->Temp_UpDown_CaretXPos=-1;
-
-				if((MdiInfo[WndNum].pmti->StartCaretPos.x==MdiInfo[WndNum].pmti->EndCaretPos.x&&
-					MdiInfo[WndNum].pmti->StartCaretPos.y==MdiInfo[WndNum].pmti->EndCaretPos.y)||
+				MdiInfo[WndNum].pMdiTextEdit->Temp_UpDown_CaretXPos=-1;
+
+				if((MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x==MdiInfo[WndNum].pMdiTextEdit->EndCaretPos.x&&
+					MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y==MdiInfo[WndNum].pMdiTextEdit->EndCaretPos.y)||
 					GetKeyState(VK_SHIFT)&0x8000){
 					//選択中でないとき、またはシフトキーが押されているとき
 					GetNaturalCaretPos_Right(WndNum,
-						&MdiInfo[WndNum].pmti->StartCaretPos);
+						&MdiInfo[WndNum].pMdiTextEdit->StartCaretPos);
 				}
 				else{
 					//選択中のとき
-					if(MdiInfo[WndNum].pmti->StartCaretPos.y<MdiInfo[WndNum].pmti->EndCaretPos.y)
-						MdiInfo[WndNum].pmti->StartCaretPos=MdiInfo[WndNum].pmti->EndCaretPos;
-					else if(MdiInfo[WndNum].pmti->StartCaretPos.y>MdiInfo[WndNum].pmti->EndCaretPos.y)
-						MdiInfo[WndNum].pmti->EndCaretPos=MdiInfo[WndNum].pmti->StartCaretPos;
+					if(MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y<MdiInfo[WndNum].pMdiTextEdit->EndCaretPos.y)
+						MdiInfo[WndNum].pMdiTextEdit->StartCaretPos=MdiInfo[WndNum].pMdiTextEdit->EndCaretPos;
+					else if(MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y>MdiInfo[WndNum].pMdiTextEdit->EndCaretPos.y)
+						MdiInfo[WndNum].pMdiTextEdit->EndCaretPos=MdiInfo[WndNum].pMdiTextEdit->StartCaretPos;
 					else{
-						if(MdiInfo[WndNum].pmti->StartCaretPos.x<MdiInfo[WndNum].pmti->EndCaretPos.x)
-							MdiInfo[WndNum].pmti->StartCaretPos=MdiInfo[WndNum].pmti->EndCaretPos;
+						if(MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x<MdiInfo[WndNum].pMdiTextEdit->EndCaretPos.x)
+							MdiInfo[WndNum].pMdiTextEdit->StartCaretPos=MdiInfo[WndNum].pMdiTextEdit->EndCaretPos;
 						else
-							MdiInfo[WndNum].pmti->EndCaretPos=MdiInfo[WndNum].pmti->StartCaretPos;
+							MdiInfo[WndNum].pMdiTextEdit->EndCaretPos=MdiInfo[WndNum].pMdiTextEdit->StartCaretPos;
 					}
 				}
@@ -545,67 +545,67 @@
 			case VK_UP:
 				if((GetKeyState(VK_CONTROL)&0x8000)&&
-					MdiInfo[WndNum].pmti->StartCaretPos.x!=0){
+					MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x!=0){
 					//行の先頭へキャレットを移動
-					MdiInfo[WndNum].pmti->StartCaretPos.x=0;
+					MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x=0;
 
 					//上下キャレット移動時の左右位置保持機能を解除
-					MdiInfo[WndNum].pmti->Temp_UpDown_CaretXPos=-1;
+					MdiInfo[WndNum].pMdiTextEdit->Temp_UpDown_CaretXPos=-1;
 				}
 				else{
-					if((MdiInfo[WndNum].pmti->StartCaretPos.x==MdiInfo[WndNum].pmti->EndCaretPos.x&&
-						MdiInfo[WndNum].pmti->StartCaretPos.y==MdiInfo[WndNum].pmti->EndCaretPos.y)||
+					if((MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x==MdiInfo[WndNum].pMdiTextEdit->EndCaretPos.x&&
+						MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y==MdiInfo[WndNum].pMdiTextEdit->EndCaretPos.y)||
 						GetKeyState(VK_SHIFT)&0x8000){
 						//選択中でないとき、またはシフトキーが押されているとき
 						GetNaturalCaretPos_Up(WndNum,
-							&MdiInfo[WndNum].pmti->StartCaretPos);
+							&MdiInfo[WndNum].pMdiTextEdit->StartCaretPos);
 					}
 					else{
 						//選択中のとき
-						if(MdiInfo[WndNum].pmti->StartCaretPos.y<MdiInfo[WndNum].pmti->EndCaretPos.y)
-							MdiInfo[WndNum].pmti->EndCaretPos=MdiInfo[WndNum].pmti->StartCaretPos;
-						else if(MdiInfo[WndNum].pmti->StartCaretPos.y>MdiInfo[WndNum].pmti->EndCaretPos.y)
-							MdiInfo[WndNum].pmti->StartCaretPos=MdiInfo[WndNum].pmti->EndCaretPos;
+						if(MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y<MdiInfo[WndNum].pMdiTextEdit->EndCaretPos.y)
+							MdiInfo[WndNum].pMdiTextEdit->EndCaretPos=MdiInfo[WndNum].pMdiTextEdit->StartCaretPos;
+						else if(MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y>MdiInfo[WndNum].pMdiTextEdit->EndCaretPos.y)
+							MdiInfo[WndNum].pMdiTextEdit->StartCaretPos=MdiInfo[WndNum].pMdiTextEdit->EndCaretPos;
 						else{
-							if(MdiInfo[WndNum].pmti->StartCaretPos.x<MdiInfo[WndNum].pmti->EndCaretPos.x)
-								MdiInfo[WndNum].pmti->EndCaretPos=MdiInfo[WndNum].pmti->StartCaretPos;
+							if(MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x<MdiInfo[WndNum].pMdiTextEdit->EndCaretPos.x)
+								MdiInfo[WndNum].pMdiTextEdit->EndCaretPos=MdiInfo[WndNum].pMdiTextEdit->StartCaretPos;
 							else
-								MdiInfo[WndNum].pmti->StartCaretPos=MdiInfo[WndNum].pmti->EndCaretPos;
+								MdiInfo[WndNum].pMdiTextEdit->StartCaretPos=MdiInfo[WndNum].pMdiTextEdit->EndCaretPos;
 						}
 
 						GetNaturalCaretPos_Up(WndNum,
-							&MdiInfo[WndNum].pmti->StartCaretPos);
+							&MdiInfo[WndNum].pMdiTextEdit->StartCaretPos);
 					}
 				}
 				break;
 			case VK_DOWN:
-				i2=MdiInfo[WndNum].pmti->StartCaretPos.y;
-				if((MdiInfo[WndNum].pmti->StartCaretPos.x==MdiInfo[WndNum].pmti->EndCaretPos.x&&
-					MdiInfo[WndNum].pmti->StartCaretPos.y==MdiInfo[WndNum].pmti->EndCaretPos.y)||
+				i2=MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y;
+				if((MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x==MdiInfo[WndNum].pMdiTextEdit->EndCaretPos.x&&
+					MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y==MdiInfo[WndNum].pMdiTextEdit->EndCaretPos.y)||
 					GetKeyState(VK_SHIFT)&0x8000){
 					//選択中でないとき、またはシフトキーが押されているとき
 					GetNaturalCaretPos_Down(WndNum,
-						&MdiInfo[WndNum].pmti->StartCaretPos);
+						&MdiInfo[WndNum].pMdiTextEdit->StartCaretPos);
 				}
 				else{
 					//選択中のとき
-					if(MdiInfo[WndNum].pmti->StartCaretPos.y<MdiInfo[WndNum].pmti->EndCaretPos.y)
-						MdiInfo[WndNum].pmti->StartCaretPos=MdiInfo[WndNum].pmti->EndCaretPos;
-					else if(MdiInfo[WndNum].pmti->StartCaretPos.y>MdiInfo[WndNum].pmti->EndCaretPos.y)
-						MdiInfo[WndNum].pmti->EndCaretPos=MdiInfo[WndNum].pmti->StartCaretPos;
+					if(MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y<MdiInfo[WndNum].pMdiTextEdit->EndCaretPos.y)
+						MdiInfo[WndNum].pMdiTextEdit->StartCaretPos=MdiInfo[WndNum].pMdiTextEdit->EndCaretPos;
+					else if(MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y>MdiInfo[WndNum].pMdiTextEdit->EndCaretPos.y)
+						MdiInfo[WndNum].pMdiTextEdit->EndCaretPos=MdiInfo[WndNum].pMdiTextEdit->StartCaretPos;
 					else{
-						if(MdiInfo[WndNum].pmti->StartCaretPos.x<MdiInfo[WndNum].pmti->EndCaretPos.x)
-							MdiInfo[WndNum].pmti->StartCaretPos=MdiInfo[WndNum].pmti->EndCaretPos;
+						if(MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x<MdiInfo[WndNum].pMdiTextEdit->EndCaretPos.x)
+							MdiInfo[WndNum].pMdiTextEdit->StartCaretPos=MdiInfo[WndNum].pMdiTextEdit->EndCaretPos;
 						else
-							MdiInfo[WndNum].pmti->EndCaretPos=MdiInfo[WndNum].pmti->StartCaretPos;
+							MdiInfo[WndNum].pMdiTextEdit->EndCaretPos=MdiInfo[WndNum].pMdiTextEdit->StartCaretPos;
 					}
 
 					GetNaturalCaretPos_Down(WndNum,
-						&MdiInfo[WndNum].pmti->StartCaretPos);
+						&MdiInfo[WndNum].pMdiTextEdit->StartCaretPos);
 				}
 
 				if(GetKeyState(VK_CONTROL)&0x8000){
-					if(i2!=MdiInfo[WndNum].pmti->StartCaretPos.y){
+					if(i2!=MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y){
 						//行の先頭へキャレットを移動
-						MdiInfo[WndNum].pmti->StartCaretPos.x=0;
+						MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x=0;
 					}
 					else{
@@ -613,19 +613,19 @@
 						CaretPos_LooseToNatural(WndNum,
 							INT_MAX,
-							MdiInfo[WndNum].pmti->StartCaretPos.y,
-							&MdiInfo[WndNum].pmti->StartCaretPos);
+							MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y,
+							&MdiInfo[WndNum].pMdiTextEdit->StartCaretPos);
 					}
 
 					//上下キャレット移動時の左右位置保持機能を解除
-					MdiInfo[WndNum].pmti->Temp_UpDown_CaretXPos=-1;
+					MdiInfo[WndNum].pMdiTextEdit->Temp_UpDown_CaretXPos=-1;
 				}
 				break;
 			case VK_PRIOR:
 				GetNaturalCaretPos_PageUp(WndNum,
-					&MdiInfo[WndNum].pmti->StartCaretPos);
+					&MdiInfo[WndNum].pMdiTextEdit->StartCaretPos);
 				break;
 			case VK_NEXT:
 				GetNaturalCaretPos_PageDown(WndNum,
-					&MdiInfo[WndNum].pmti->StartCaretPos);
+					&MdiInfo[WndNum].pMdiTextEdit->StartCaretPos);
 				break;
 		}
@@ -633,5 +633,5 @@
 		if(!(GetKeyState(VK_SHIFT)&0x8000)){
 			//シフトキーが押されていない、通常時
-			MdiInfo[WndNum].pmti->EndCaretPos=MdiInfo[WndNum].pmti->StartCaretPos;
+			MdiInfo[WndNum].pMdiTextEdit->EndCaretPos=MdiInfo[WndNum].pMdiTextEdit->StartCaretPos;
 		}
 
@@ -660,11 +660,11 @@
 
 		//上下キャレット移動時の左右位置保持機能を解除
-		MdiInfo[WndNum].pmti->Temp_UpDown_CaretXPos=-1;
+		MdiInfo[WndNum].pMdiTextEdit->Temp_UpDown_CaretXPos=-1;
 
 		if(GetKeyState(VK_CONTROL)&0x8000){
 			//ファイルの先頭または末端へキャレットを移動
 			if(nVirtualKey==VK_HOME){
-				MdiInfo[WndNum].pmti->StartCaretPos.x=0;
-				MdiInfo[WndNum].pmti->StartCaretPos.y=0;
+				MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x=0;
+				MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y=0;
 			}
 			else if(nVirtualKey==VK_END){
@@ -673,16 +673,16 @@
 					INT_MAX,
 					INT_MAX,
-					&MdiInfo[WndNum].pmti->StartCaretPos);
+					&MdiInfo[WndNum].pMdiTextEdit->StartCaretPos);
 			}
 		}
 		else{
 			//行の先頭または末端へキャレットを移動
-			if(nVirtualKey==VK_HOME) MdiInfo[WndNum].pmti->StartCaretPos.x=0;
+			if(nVirtualKey==VK_HOME) MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x=0;
 			else if(nVirtualKey==VK_END){
 				//存在するキャレット位置に変換
 				CaretPos_LooseToNatural(WndNum,
 					INT_MAX,
-					MdiInfo[WndNum].pmti->StartCaretPos.y,
-					&MdiInfo[WndNum].pmti->StartCaretPos);
+					MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y,
+					&MdiInfo[WndNum].pMdiTextEdit->StartCaretPos);
 			}
 		}
@@ -690,5 +690,5 @@
 		if(!(GetKeyState(VK_SHIFT)&0x8000)){
 			//シフトキーが押されていない、通常時
-			MdiInfo[WndNum].pmti->EndCaretPos=MdiInfo[WndNum].pmti->StartCaretPos;
+			MdiInfo[WndNum].pMdiTextEdit->EndCaretPos=MdiInfo[WndNum].pMdiTextEdit->StartCaretPos;
 		}
 
@@ -709,5 +709,5 @@
 		TextEdit_GetSel(WndNum,&CharRange);
 
-		pBuf=MdiInfo[WndNum].pmti->buffer;
+		pBuf=MdiInfo[WndNum].pMdiTextEdit->buffer;
 
 		//キャレットがファイルの終端にあるとき
@@ -731,7 +731,7 @@
 
 			GetCaretPosFromBufferIndex(
-				MdiInfo[WndNum].pmti->buffer,
+				MdiInfo[WndNum].pMdiTextEdit->buffer,
 				CharRange.cpMax,
-				&MdiInfo[WndNum].pmti->EndCaretPos);
+				&MdiInfo[WndNum].pMdiTextEdit->EndCaretPos);
 		}
 
@@ -753,11 +753,11 @@
 
 				i=GetBufferIndexFromCaretPos(
-					MdiInfo[WndNum].pmti->buffer,
-					MdiInfo[WndNum].pmti->StartCaretPos.x,
-					MdiInfo[WndNum].pmti->StartCaretPos.y);
+					MdiInfo[WndNum].pMdiTextEdit->buffer,
+					MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x,
+					MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y);
 				GetCaretPosFromBufferIndex(
-					MdiInfo[WndNum].pmti->buffer,
+					MdiInfo[WndNum].pMdiTextEdit->buffer,
 					i-1,
-					&MdiInfo[WndNum].pmti->StartCaretPos);
+					&MdiInfo[WndNum].pMdiTextEdit->StartCaretPos);
 				TextEdit_Replace(WndNum,"",1);
 			}
@@ -789,5 +789,5 @@
 
 	char *pBuf;
-	pBuf=MdiInfo[WndNum].pmti->buffer;
+	pBuf=MdiInfo[WndNum].pMdiTextEdit->buffer;
 
 
@@ -823,6 +823,6 @@
 
 		i=GetBufferIndexFromCaretPos(pBuf,
-			MdiInfo[WndNum].pmti->StartCaretPos.x,
-			MdiInfo[WndNum].pmti->StartCaretPos.y);
+			MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x,
+			MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y);
 
 		i2=i-2;
@@ -961,5 +961,5 @@
 
 	char *pBuf;
-	pBuf=MdiInfo[WndNum].pmti->buffer;
+	pBuf=MdiInfo[WndNum].pMdiTextEdit->buffer;
 
 
@@ -972,6 +972,6 @@
  
 		i=GetBufferIndexFromCaretPos(pBuf,
-			MdiInfo[WndNum].pmti->StartCaretPos.x,
-			MdiInfo[WndNum].pmti->StartCaretPos.y);
+			MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x,
+			MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y);
 
 		if(GetNowTagInfo(pBuf,i-1)){
Index: ProjectEditor/TextEditor_MouseEvent.cpp
===================================================================
--- ProjectEditor/TextEditor_MouseEvent.cpp	(revision 22)
+++ ProjectEditor/TextEditor_MouseEvent.cpp	(revision 24)
@@ -10,15 +10,15 @@
 	if((GetKeyState(VK_CONTROL)&0x8000)&&pobj_nv->bCtrlKeyHyperLink){
 		//Ctrlキーが押されているとき
-		if(MdiInfo[WndNum].pmti->iUnderStart!=-1){
+		if(MdiInfo[WndNum].pMdiTextEdit->iUnderStart!=-1){
 			//単語が選択可能なとき
 
 			//半角文字列を選択時の全角とのズレを修正
 			int start,end;
-			start=MdiInfo[WndNum].pmti->iUnderStart;
-			end=MdiInfo[WndNum].pmti->iUnderEnd;
-			GetCaretPosFromBufferIndex(MdiInfo[WndNum].pmti->buffer,start,&pos);
-			start=GetBufferIndexFromCaretPos(MdiInfo[WndNum].pmti->buffer,pos.x,pos.y);
-			GetCaretPosFromBufferIndex(MdiInfo[WndNum].pmti->buffer,end,&pos);
-			end=GetBufferIndexFromCaretPos(MdiInfo[WndNum].pmti->buffer,pos.x,pos.y);
+			start=MdiInfo[WndNum].pMdiTextEdit->iUnderStart;
+			end=MdiInfo[WndNum].pMdiTextEdit->iUnderEnd;
+			GetCaretPosFromBufferIndex(MdiInfo[WndNum].pMdiTextEdit->buffer,start,&pos);
+			start=GetBufferIndexFromCaretPos(MdiInfo[WndNum].pMdiTextEdit->buffer,pos.x,pos.y);
+			GetCaretPosFromBufferIndex(MdiInfo[WndNum].pMdiTextEdit->buffer,end,&pos);
+			end=GetBufferIndexFromCaretPos(MdiInfo[WndNum].pMdiTextEdit->buffer,pos.x,pos.y);
 
 			int length;
@@ -30,5 +30,5 @@
 			memcpy(
 				pTemp,
-				MdiInfo[WndNum].pmti->buffer+start,
+				MdiInfo[WndNum].pMdiTextEdit->buffer+start,
 				length);
 			pTemp[length]=0;
@@ -51,5 +51,5 @@
 
 	int iControlTabSpace;
-	iControlTabSpace=MdiInfo[WndNum].pmti->iWidth_ControlTabSpace;
+	iControlTabSpace=MdiInfo[WndNum].pMdiTextEdit->iWidth_ControlTabSpace;
 
 	if(MdiInfo[WndNum].IndentStr){
@@ -58,8 +58,8 @@
 	}
 
-	MdiInfo[WndNum].pmti->bAutoScroll=0;
+	MdiInfo[WndNum].pMdiTextEdit->bAutoScroll=0;
 
 	//上下キャレット移動時の左右位置保持機能を解除
-	MdiInfo[WndNum].pmti->Temp_UpDown_CaretXPos=-1;
+	MdiInfo[WndNum].pMdiTextEdit->Temp_UpDown_CaretXPos=-1;
 
 	if(0<=(pMousePos->x) && (pMousePos->x)<iControlTabSpace){
@@ -72,6 +72,6 @@
 			0,
 			pMousePos->y,
-			&MdiInfo[WndNum].pmti->StartCaretPos);
-		MdiInfo[WndNum].pmti->EndCaretPos=MdiInfo[WndNum].pmti->StartCaretPos;
+			&MdiInfo[WndNum].pMdiTextEdit->StartCaretPos);
+		MdiInfo[WndNum].pMdiTextEdit->EndCaretPos=MdiInfo[WndNum].pMdiTextEdit->StartCaretPos;
 
 		////////////
@@ -80,5 +80,5 @@
 
 		char *pBuf;
-		pBuf=MdiInfo[WndNum].pmti->buffer;
+		pBuf=MdiInfo[WndNum].pMdiTextEdit->buffer;
 		CHARRANGE CharRange;
 		TextEdit_GetSel(WndNum,&CharRange);
@@ -99,9 +99,9 @@
 			pMousePos->x-iControlTabSpace,
 			pMousePos->y,
-			&MdiInfo[WndNum].pmti->StartCaretPos);
+			&MdiInfo[WndNum].pMdiTextEdit->StartCaretPos);
 
 		if(!(GetKeyState(VK_SHIFT)&0x8000)){
 			//シフトキーが押されていない、通常時
-			MdiInfo[WndNum].pmti->EndCaretPos=MdiInfo[WndNum].pmti->StartCaretPos;
+			MdiInfo[WndNum].pMdiTextEdit->EndCaretPos=MdiInfo[WndNum].pMdiTextEdit->StartCaretPos;
 		}
 
@@ -121,5 +121,5 @@
 
 	int iControlTabSpace;
-	iControlTabSpace=MdiInfo[WndNum].pmti->iWidth_ControlTabSpace;
+	iControlTabSpace=MdiInfo[WndNum].pMdiTextEdit->iWidth_ControlTabSpace;
 
 	if(0<=(pMousePos->x) && (pMousePos->x)<iControlTabSpace){
@@ -138,5 +138,5 @@
 
 		//オートスクロールスレッドを停止
-		MdiInfo[WndNum].pmti->bAutoScroll=0;
+		MdiInfo[WndNum].pMdiTextEdit->bAutoScroll=0;
 
 		//編集メニューをリセット
@@ -159,8 +159,8 @@
 	//エディタ画面左端のコントロールタブ
 	int iControlTabSpace;
-	iControlTabSpace=MdiInfo[WndNum].pmti->iWidth_ControlTabSpace;
-
-
-	while(MdiInfo[WndNum].pmti->bAutoScroll){
+	iControlTabSpace=MdiInfo[WndNum].pMdiTextEdit->iWidth_ControlTabSpace;
+
+
+	while(MdiInfo[WndNum].pMdiTextEdit->bAutoScroll){
 		GetCursorPos(&pos);
 		ScreenToClient(hwnd,&pos);
@@ -175,5 +175,5 @@
 			pos.x,
 			pos.y,
-			&MdiInfo[WndNum].pmti->StartCaretPos);
+			&MdiInfo[WndNum].pMdiTextEdit->StartCaretPos);
 
 		if(!TextEdit_ScrollCaret(WndNum,1))
@@ -194,5 +194,5 @@
 
 	int iControlTabSpace;
-	iControlTabSpace=MdiInfo[WndNum].pmti->iWidth_ControlTabSpace;
+	iControlTabSpace=MdiInfo[WndNum].pMdiTextEdit->iWidth_ControlTabSpace;
 
 	if(GetCapture()==hwnd){
@@ -214,5 +214,5 @@
 			////////////////////////////
 
-			if(MdiInfo[WndNum].pmti->bAutoScroll){
+			if(MdiInfo[WndNum].pMdiTextEdit->bAutoScroll){
 				//すでにオートスクロールスレッドが作動中のときは抜け出す
 				return;
@@ -220,5 +220,5 @@
 
 			//オートスクロールスレッドを起動
-			MdiInfo[WndNum].pmti->bAutoScroll=1;
+			MdiInfo[WndNum].pMdiTextEdit->bAutoScroll=1;
 
 			_beginthread((void (__cdecl *)(void *))AutoScrollThread,0,(void *)hwnd);
@@ -226,7 +226,7 @@
 			return;
 		}
-		else if(MdiInfo[WndNum].pmti->bAutoScroll){
+		else if(MdiInfo[WndNum].pMdiTextEdit->bAutoScroll){
 			//オートスクロールを解除
-			MdiInfo[WndNum].pmti->bAutoScroll=0;
+			MdiInfo[WndNum].pMdiTextEdit->bAutoScroll=0;
 		}
 
@@ -242,6 +242,6 @@
 			&pos);
 
-		if(pos.x!=MdiInfo[WndNum].pmti->StartCaretPos.x||pos.y!=MdiInfo[WndNum].pmti->StartCaretPos.y){
-			MdiInfo[WndNum].pmti->StartCaretPos=pos;
+		if(pos.x!=MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x||pos.y!=MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y){
+			MdiInfo[WndNum].pMdiTextEdit->StartCaretPos=pos;
 
 			InvalidateRect(hwnd,NULL,0);
@@ -270,8 +270,8 @@
 
 				TextEdit_GetWordCaret(
-					MdiInfo[WndNum].pmti->hEdit,
+					MdiInfo[WndNum].pMdiTextEdit->hEdit,
 					WndNum,
 					&pos,
-					&MdiInfo[WndNum].pmti->iUnderStart,&MdiInfo[WndNum].pmti->iUnderEnd,
+					&MdiInfo[WndNum].pMdiTextEdit->iUnderStart,&MdiInfo[WndNum].pMdiTextEdit->iUnderEnd,
 					WORDCARET_AFTER);
 
@@ -282,7 +282,7 @@
 			}
 			else{
-				if(MdiInfo[WndNum].pmti->iUnderStart!=-1){
-					MdiInfo[WndNum].pmti->iUnderStart=-1;
-					MdiInfo[WndNum].pmti->iUnderEnd=-1;
+				if(MdiInfo[WndNum].pMdiTextEdit->iUnderStart!=-1){
+					MdiInfo[WndNum].pMdiTextEdit->iUnderStart=-1;
+					MdiInfo[WndNum].pMdiTextEdit->iUnderEnd=-1;
 
 					InvalidateRect(hwnd,NULL,0);
@@ -300,5 +300,5 @@
 
 	int start,end;
-	TextEdit_GetWordCaret(hwnd,WndNum,&MdiInfo[WndNum].pmti->StartCaretPos,&start,&end,WORDCARET_AFTER);
+	TextEdit_GetWordCaret(hwnd,WndNum,&MdiInfo[WndNum].pMdiTextEdit->StartCaretPos,&start,&end,WORDCARET_AFTER);
 
 	//セレクト
@@ -314,5 +314,5 @@
 
 	int iControlTabSpace;
-	iControlTabSpace=MdiInfo[WndNum].pmti->iWidth_ControlTabSpace;
+	iControlTabSpace=MdiInfo[WndNum].pMdiTextEdit->iWidth_ControlTabSpace;
 
 	if(0<=(pMousePos->x) && (pMousePos->x)<iControlTabSpace){
Index: ProjectEditor/TextEditor_UndoRedo.cpp
===================================================================
--- ProjectEditor/TextEditor_UndoRedo.cpp	(revision 22)
+++ ProjectEditor/TextEditor_UndoRedo.cpp	(revision 24)
@@ -9,5 +9,5 @@
 	if(MdiInfo[WndNum].IndentStr) CancelBeforeAutoIndent(WndNum);
 
-	pUndoState=MdiInfo[WndNum].edit_undo;
+	pUndoState=MdiInfo[WndNum].pMdiTextEdit->pTextEditUndoState;
 	i=pUndoState->NowPos-1;
 	if(i==-1) i=MAX_UNDONUM-1;
@@ -19,10 +19,10 @@
 
 	//選択範囲をセット
-	GetCaretPosFromBufferIndex(MdiInfo[WndNum].pmti->buffer,
+	GetCaretPosFromBufferIndex(MdiInfo[WndNum].pMdiTextEdit->buffer,
 		pUndoState->Range[pUndoState->NowPos].cpMin,
-		&MdiInfo[WndNum].pmti->StartCaretPos);
-	GetCaretPosFromBufferIndex(MdiInfo[WndNum].pmti->buffer,
+		&MdiInfo[WndNum].pMdiTextEdit->StartCaretPos);
+	GetCaretPosFromBufferIndex(MdiInfo[WndNum].pMdiTextEdit->buffer,
 		pUndoState->Range[pUndoState->NowPos].cpMax,
-		&MdiInfo[WndNum].pmti->EndCaretPos);
+		&MdiInfo[WndNum].pMdiTextEdit->EndCaretPos);
 
 	switch(pUndoState->Command[pUndoState->NowPos]){
@@ -41,4 +41,7 @@
 	//元に戻す、やり直しメニューをリセット
 	ResetState_UndoMenu();
+
+	//変更を通知
+	MdiInfo[WndNum].pMdiTextEdit->NofityUndoRedoToModify();
 }
 void TextEdit_RedoCommand(int WndNum){
@@ -46,5 +49,5 @@
 	TEXTEDIT_UNDOSTATE *pUndoState;
 
-	pUndoState=MdiInfo[WndNum].edit_undo;
+	pUndoState=MdiInfo[WndNum].pMdiTextEdit->pTextEditUndoState;
 	if(!pUndoState->Command[pUndoState->NowPos]){
 		MessageBeep(0);
@@ -56,10 +59,10 @@
 		case TEXTEDIT_UNDO_PASTE:
 			//選択範囲をセット
-			GetCaretPosFromBufferIndex(MdiInfo[WndNum].pmti->buffer,
+			GetCaretPosFromBufferIndex(MdiInfo[WndNum].pMdiTextEdit->buffer,
 				pUndoState->Range[pUndoState->NowPos].cpMin,
-				&MdiInfo[WndNum].pmti->StartCaretPos);
-			GetCaretPosFromBufferIndex(MdiInfo[WndNum].pmti->buffer,
+				&MdiInfo[WndNum].pMdiTextEdit->StartCaretPos);
+			GetCaretPosFromBufferIndex(MdiInfo[WndNum].pMdiTextEdit->buffer,
 				pUndoState->Range[pUndoState->NowPos].cpMin,
-				&MdiInfo[WndNum].pmti->EndCaretPos);
+				&MdiInfo[WndNum].pMdiTextEdit->EndCaretPos);
 
 			TextEdit_Replace(WndNum,pUndoState->KeyStr[pUndoState->NowPos],1);
@@ -67,10 +70,10 @@
 		case TEXTEDIT_UNDO_SELKEY:
 			//選択範囲をセット
-			GetCaretPosFromBufferIndex(MdiInfo[WndNum].pmti->buffer,
+			GetCaretPosFromBufferIndex(MdiInfo[WndNum].pMdiTextEdit->buffer,
 				pUndoState->DelRange[pUndoState->NowPos].cpMin,
-				&MdiInfo[WndNum].pmti->StartCaretPos);
-			GetCaretPosFromBufferIndex(MdiInfo[WndNum].pmti->buffer,
+				&MdiInfo[WndNum].pMdiTextEdit->StartCaretPos);
+			GetCaretPosFromBufferIndex(MdiInfo[WndNum].pMdiTextEdit->buffer,
 				pUndoState->DelRange[pUndoState->NowPos].cpMax,
-				&MdiInfo[WndNum].pmti->EndCaretPos);
+				&MdiInfo[WndNum].pMdiTextEdit->EndCaretPos);
 
 			TextEdit_Replace(WndNum,pUndoState->KeyStr[pUndoState->NowPos],1);
@@ -86,4 +89,7 @@
 	//元に戻す、やり直しメニューをリセット
 	ResetState_UndoMenu();
+
+	//変更を通知
+	MdiInfo[WndNum].pMdiTextEdit->NofityUndoRedoToModify();
 }
 
@@ -102,5 +108,5 @@
 	TEXTEDIT_UNDOSTATE *pUndoState;
 
-	pUndoState=MdiInfo[WndNum].edit_undo;
+	pUndoState=MdiInfo[WndNum].pMdiTextEdit->pTextEditUndoState;
 
 	//Redoされた場合の不要なデータを削除する
@@ -108,5 +114,5 @@
 		if(i==MAX_UNDONUM) i=0;
 		if(pUndoState->Command[i]==0) break;
-		TextEdit_DeleteUndoData(WndNum,i);
+		TextEdit_DeleteUndoData(pUndoState,i);
 	}
 
@@ -141,5 +147,5 @@
 	if(pUndoState->Command[pUndoState->NowPos]){
 		//一番古い情報を切り捨てる
-		TextEdit_DeleteUndoData(WndNum,pUndoState->NowPos);
+		TextEdit_DeleteUndoData(pUndoState,pUndoState->NowPos);
 	}
 
@@ -148,9 +154,5 @@
 }
 
-void TextEdit_DeleteUndoData(int WndNum,int pos){
-	extern MDIINFO MdiInfo[MAX_WNDNUM];
-	TEXTEDIT_UNDOSTATE *pUndoState;
-
-	pUndoState=MdiInfo[WndNum].edit_undo;
+void TextEdit_DeleteUndoData(TEXTEDIT_UNDOSTATE *pUndoState,int pos){
 	if(pUndoState->KeyStr[pos]) HeapDefaultFree(pUndoState->KeyStr[pos]);
 	if(pUndoState->DelStr[pos]) HeapDefaultFree(pUndoState->DelStr[pos]);
Index: ProjectEditor/WebSearch.cpp
===================================================================
--- ProjectEditor/WebSearch.cpp	(revision 22)
+++ ProjectEditor/WebSearch.cpp	(revision 24)
@@ -321,6 +321,6 @@
 	iWindowWidth=size.cx+20;
 
-	if(MdiInfo[WndNum].pmti==0) return;
-	hTabWnd=(HWND)SendMessage(MdiInfo[WndNum].pmti->hEdit,WM_SEARCH_TAB_CREATE,(WPARAM)WndNum,(LPARAM)this);
+	if(MdiInfo[WndNum].pMdiTextEdit==0) return;
+	hTabWnd=(HWND)SendMessage(MdiInfo[WndNum].pMdiTextEdit->hEdit,WM_SEARCH_TAB_CREATE,(WPARAM)WndNum,(LPARAM)this);
 }
 COneTab::~COneTab(){
@@ -333,6 +333,6 @@
 	}
 
-	if(MdiInfo[m_WndNum].pmti)
-		SendMessage(MdiInfo[m_WndNum].pmti->hEdit,WM_SEARCH_TAB_CLOSE,0,(LPARAM)hTabWnd);
+	if(MdiInfo[m_WndNum].pMdiTextEdit)
+		SendMessage(MdiInfo[m_WndNum].pMdiTextEdit->hEdit,WM_SEARCH_TAB_CLOSE,0,(LPARAM)hTabWnd);
 }
 
@@ -483,5 +483,5 @@
 	COneTab *pobj_temp_OneTab;
 	pobj_temp_OneTab=new COneTab(WndNum,lpszSearchText);
-	if(MdiInfo[WndNum].pmti==0){
+	if(MdiInfo[WndNum].pMdiTextEdit==0){
 		delete pobj_temp_OneTab;
 		return;
@@ -577,10 +577,10 @@
 		goto exit;
 	}
-	if(MdiInfo[WndNum].pmti==0){
+	if(MdiInfo[WndNum].pMdiTextEdit==0){
 		goto exit;
 	}
 
 	//重複チェック
-	if(MdiInfo[WndNum].pmti->pobj_WebResult->DuplicateCheck(str)){
+	if(MdiInfo[WndNum].pMdiTextEdit->pobj_WebResult->DuplicateCheck(str)){
 		goto exit;
 	}
@@ -589,5 +589,5 @@
 
 	extern MDIINFO MdiInfo[MAX_WNDNUM];
-	MdiInfo[WndNum].pmti->pobj_WebResult->add(WndNum,str);
+	MdiInfo[WndNum].pMdiTextEdit->pobj_WebResult->add(WndNum,str);
 
 exit:
Index: ProjectEditor/nkf_class.cpp
===================================================================
--- ProjectEditor/nkf_class.cpp	(revision 22)
+++ ProjectEditor/nkf_class.cpp	(revision 24)
@@ -174,5 +174,5 @@
 			SendMessage(hList,LB_ADDSTRING,0,(long)"JIS");
 			SendMessage(hList,LB_ADDSTRING,0,(long)"UTF-8");
-			SendMessage(hList,LB_SETCURSEL,MdiInfo[WndNum].pmti->iCharCode,0);
+			SendMessage(hList,LB_SETCURSEL,MdiInfo[WndNum].pMdiTextEdit->iCharCode,0);
 
 			hList=GetDlgItem(hwnd,IDC_LIST_LFCODE);
@@ -180,5 +180,5 @@
 			SendMessage(hList,LB_ADDSTRING,0,(long)"LF(Unix)");
 			SendMessage(hList,LB_ADDSTRING,0,(long)"CR(Macintosh)");
-			SendMessage(hList,LB_SETCURSEL,MdiInfo[WndNum].pmti->iLfCode,0);
+			SendMessage(hList,LB_SETCURSEL,MdiInfo[WndNum].pMdiTextEdit->iLfCode,0);
 			break;
 		case WM_COMMAND:
@@ -186,9 +186,9 @@
 				case IDOK:
 					//文字コードを取得
-					MdiInfo[WndNum].pmti->iCharCode=
+					MdiInfo[WndNum].pMdiTextEdit->iCharCode=
 						(int)SendDlgItemMessage(hwnd,IDC_LIST_CHARCODE,LB_GETCURSEL,0,0);
 
 					//改行コードを取得
-					MdiInfo[WndNum].pmti->iLfCode=
+					MdiInfo[WndNum].pMdiTextEdit->iLfCode=
 						(int)SendDlgItemMessage(hwnd,IDC_LIST_LFCODE,LB_GETCURSEL,0,0);
 
Index: ProjectEditor/rebar.cpp
===================================================================
--- ProjectEditor/rebar.cpp	(revision 22)
+++ ProjectEditor/rebar.cpp	(revision 24)
@@ -290,9 +290,4 @@
 
 #ifdef THETEXT
-	//ファイル選択コンボボックス
-	psr[num].RebarID=ID_DOCCOMBO;
-	psr[num].RebarLength=150;
-	psr[num].IsBandBreak=0;
-	num++;
 
 	//スタンダードツールバー
@@ -308,9 +303,4 @@
 	num++;
 #else
-	//ファイル選択コンボボックス
-	psr[num].RebarID=ID_DOCCOMBO;
-	psr[num].RebarLength=150;
-	psr[num].IsBandBreak=0;
-	num++;
 
 	//スタンダードツールバー
