1: /* $Id: 1048606.html,v 1.1.1.1 2000/08/28 11:39:25 hidetosi Exp $ */ 2: #include <btron/btron.h> 3: #include <btron/hmi.h> 4: #include <btron/vobj.h> 5: #include <typedef.h> 6: #include <bstdlib.h> 7: #include <errcode.h> 8: #include "paperbox.h" 9: #include "file.h" 10: #include "doc.h" 11: #include "view.h" 12: #include "databox.h" 13: 14: #define COORDINATE_MIN 5 15: 16: /* 仮身1つのデータ構造 */ 17: typedef struct tag_VOBJDATA{ 18: struct tag_VOBJDATA* next; 19: struct tag_VOBJDATA* previous; 20: W idVirtualObj; /* 仮身 ID */ 21: BOOL isFusen; /* TRUE=付箋 FALSE=仮身 */ 22: RECT rctView; /* 表示位置 */ 23: } VOBJDATA; 24: 25: 26: typedef struct{ 27: VOBJDATA* vdFirst; /* 最初の仮身 */ 28: VOBJDATA* vdLast; /* 最後の仮身 */ 29: RECT rctView; /* すべての仮身を囲む領域 */ 30: W idVirtualObj; /* このファイルの仮身ID */ 31: W wFileDscr; /* ファイルディスクリプタ */ 32: int iVobjNum; /* 仮身の数 */ 33: int iFusenNum; /* 付箋の数 */ 34: VOBJDATA* vdSelected; 35: BOOL isReadOnly; 36: } DOCDATA; 37: 38: DOCDATA document={NULL,NULL,{{0,0,0,0}},0,-1,0,0,NULL,FALSE}; 39: 40: 41: /* データ全体の RECT の大きさより外に新たなデータが出来たら 42: document.rctView を大きくする。 43: (大きくするだけ。小さくするには他の関数を使う。 */ 44: void CheckViewSize(RECT arctNew) 45: { 46: if(arctNew.c.left<document.rctView.c.left+COORDINATE_MIN) 47: document.rctView.c.left=arctNew.c.left-COORDINATE_MIN; 48: if(arctNew.c.top<document.rctView.c.top+COORDINATE_MIN) 49: document.rctView.c.top=arctNew.c.top-COORDINATE_MIN; 50: if(arctNew.c.right>document.rctView.c.right-COORDINATE_MIN) 51: document.rctView.c.right=arctNew.c.right+COORDINATE_MIN; 52: if(arctNew.c.bottom>document.rctView.c.bottom-COORDINATE_MIN) 53: document.rctView.c.bottom=arctNew.c.bottom+COORDINATE_MIN; 54: } 55: 56: 57: /* 仮身のデータ(VOBJDATA)を追加する */ 58: void AddVobjData(VOBJDATA* avdData,BOOL aisLast) 59: /* BOOL aisLast; TRUE=最後に追加する FALSE=最初に追加する */ 60: { 61: if(document.vdFirst!=NULL) /* 2つ目以降なら */ 62: { 63: if(aisLast) 64: { /* 最後に追加する */ 65: avdData->previous=document.vdLast; 66: avdData->next=NULL; 67: document.vdLast->next=avdData; 68: document.vdLast=avdData; 69: }else{ /* 最初に追加する */ 70: avdData->next=document.vdFirst; 71: avdData->previous=NULL; 72: document.vdFirst->previous=avdData; 73: document.vdFirst=avdData; 74: } 75: }else{ /* 最初の項目なら */ 76: document.vdFirst=avdData; 77: document.vdLast=avdData; 78: avdData->next=NULL; 79: avdData->previous=NULL; 80: } 81: 82: CheckViewSize(avdData->rctView); 83: 84: if(avdData->isFusen) 85: document.iFusenNum++; 86: else 87: document.iVobjNum++; 88: } 89: 90: 91: /* --------------------ファイルロード関連-------------------- */ 92: 93: 94: BOOL FileOpen(W aidVirtual,LINK alnkOpen) 95: { 96: W wFileDscr; 97: 98: document.idVirtualObj=aidVirtual; 99: 100: if(chk_fil(&alnkOpen,F_READ|F_EXCUTE,NULL)<0) 101: { 102: ErrPanel(ID_ST_NACSES,FALSE); 103: return FALSE; 104: } 105: if(chk_fil(&alnkOpen,F_WRITE,NULL)<0) 106: { /* リードオンリー */ 107: wFileDscr=oopn_obj(aidVirtual,NULL,F_READ|F_WEXCL,NULL); 108: if(wFileDscr<0) 109: { 110: ErrPanel(ID_ST_NOPENFILE,FALSE); 111: return FALSE; 112: } 113: document.isReadOnly=TRUE; 114: }else{ 115: /* ファイルのオープン */ 116: wFileDscr=oopn_obj(aidVirtual,NULL,F_UPDATE|F_WEXCL,NULL); 117: if(wFileDscr<0) 118: { 119: switch(wFileDscr) 120: { 121: case EC_BUSY: /* 他のアプリですでに開かれている */ 122: wFileDscr=opn_fil(&alnkOpen,F_READ,NULL); 123: if(wFileDscr<0) 124: { 125: ErrPanel(ID_ST_NOPNBUSY,TRUE); 126: return FALSE; 127: } 128: document.isReadOnly=TRUE; 129: break; 130: case EC_ACCES: /* アクセス権限がない */ 131: ErrPanel(ID_ST_NACSES,FALSE); 132: return FALSE; 133: default: 134: ErrPanel(ID_ST_NOPENFILE,FALSE); 135: return FALSE; 136: } 137: } 138: } 139: document.wFileDscr=wFileDscr; 140: return TRUE; 141: } 142: 143: BOOL ReadVobj(FILECONTEXT* afcFile,W aidWnd,BOOL aisFusen) 144: { 145: VOBJDATA* pvdItem; 146: VFPTR vfItem; 147: VLINK* plnkLink; 148: VLINK lnkData; 149: W idVobj; 150: int iSize; 151: W lOffset; 152: 153: lOffset=afcFile->offset; 154: 155: /* 仮身セグメントの読み込み(あまり良くない方法) */ 156: iSize=afcFile->length; 157: /* if(get_lmb(&(vfItem.vobj),(LONG)iSize,NOCLR)<0) */ 158: if((vfItem.vobj=(VOBJSEG*)malloc(iSize))==NULL) 159: { 160: ErrPanel(0,FALSE); 161: return FALSE; 162: } 163: ReadData(afcFile,(B*)vfItem.vobj,iSize); 164: 165: /* リンクレコードの読み込み */ 166: if(aisFusen) 167: plnkLink=NULL; 168: else{ 169: if(!ReadLinkRecode(afcFile,&lnkData)) 170: { 171: /* rel_lmb(vfItem.vobj); */ 172: free(vfItem.vobj); 173: return FALSE; 174: } 175: plnkLink=&lnkData; 176: } 177: 178: /* 仮身の登録 */ 179: if(aidWnd<0) /* 開いた仮身の時 */ 180: idVobj=oreg_vob(plnkLink,(VP)vfItem.vobj,-aidWnd,V_NODISP); 181: else /* 仮身のオープンの時 */ 182: idVobj=oreg_vob(plnkLink,(VP)vfItem.vobj,aidWnd,V_NODISP); 183: if(idVobj<0) /* 登録できなかったら */ 184: { 185: ErrPanel(ID_ST_NREGVOBJ,FALSE); 186: /* rel_lmb(vfItem); */ 187: free(vfItem.vobj); 188: return FALSE; 189: } 190: 191: /* 項目へメモリー割り当て */ 192: /* if(get_lmb(&pvdItem,(LONG)sizeof(VOBJDATA),NOCLR)<0) */ 193: if((pvdItem=(VOBJDATA*)malloc(sizeof(VOBJDATA)))==NULL) 194: { 195: ErrPanel(0,FALSE); 196: /* rel_lmb(vfItem); */ 197: free(vfItem.vobj); 198: return FALSE; 199: } 200: 201: /* 項目の要素をセット */ 202: pvdItem->rctView=vfItem.vobj->view; /* 仮身も付箋もここだけ共通 */ 203: pvdItem->idVirtualObj=idVobj; 204: if(aisFusen) 205: { 206: pvdItem->isFusen=TRUE; 207: }else{ 208: pvdItem->isFusen=FALSE; 209: } 210: 211: AddVobjData(pvdItem,TRUE); 212: 213: /* rel_lmb(vfItem); */ 214: free(vfItem.vobj); 215: 216: return TRUE; 217: } 218: 219: /* 主 TAD レコードに対応してない仮身レコードと機能付箋レコードを読み込む */ 220: BOOL ReadNotInTADRecord(FILECONTEXT* afcFile,W aidWnd) 221: { 222: /* 仮身レコードを読み込む */ 223: see_rec(afcFile->fd,afcFile->LinkRecode,1,NULL); 224: while(fnd_rec(afcFile->fd,F_FWD,1,0,NULL)==0) 225: { 226: VOBJDATA* pvdItem; 227: VFPTR vfItem; 228: VLINK lnkLink; 229: W idVobj; 230: 231: /* 仮身セグメントを適当に作成する */ 232: /* if(get_lmb(&(vfItem.vobj),(LONG)sizeof(VOBJSEG),NOCLR)<0) */ 233: if((vfItem.vobj=(VOBJSEG*)malloc(sizeof(VOBJSEG)))==NULL) 234: { 235: ErrPanel(0,FALSE); 236: return FALSE; 237: } 238: vfItem.vobj->view.c.left=COORDINATE_MIN; 239: vfItem.vobj->view.c.right=150+COORDINATE_MIN; 240: vfItem.vobj->view.c.top=document.rctView.c.bottom+5; 241: vfItem.vobj->view.c.bottom=document.rctView.c.bottom+5+22; 242: vfItem.vobj->height=0; 243: vfItem.vobj->chsz=0; 244: vfItem.vobj->frcol=15; 245: vfItem.vobj->tbcol=0x10DFDFDF; 246: vfItem.vobj->chcol=15; 247: vfItem.vobj->bgcol=0; 248: vfItem.vobj->dlen=0; 249: 250: /* リンクレコードの読み込み */ 251: if(rea_rec(afcFile->fd,0,(B*)&lnkLink,sizeof(VLINK),NULL,NULL)<0) 252: { 253: /* rel_lmb(vfItem.vobj); */ 254: free(vfItem.vobj); 255: return FALSE; 256: } 257: see_rec(afcFile->fd,1,0,NULL); /* 次のレコードへ */ 258: 259: /* 仮身の登録 */ 260: if(aidWnd<0) /* 開いた仮身の時 */ 261: idVobj=oreg_vob(&lnkLink,(VP)vfItem.vobj, 262: -aidWnd,V_NODISP); 263: else /* 仮身のオープンの時 */ 264: idVobj=oreg_vob(&lnkLink,(VP)vfItem.vobj, 265: aidWnd,V_NODISP); 266: if(idVobj<0) /* 登録できなかったら */ 267: { 268: ErrPanel(ID_ST_NREGVOBJ,FALSE); 269: /* rel_lmb(vfItem); */ 270: free(vfItem.vobj); 271: return FALSE; 272: } 273: 274: /* 項目へメモリー割り当て */ 275: /* if(get_lmb(&pvdItem,(LONG)sizeof(VOBJDATA),NOCLR)<0) */ 276: if((pvdItem=(VOBJDATA*)malloc(sizeof(VOBJDATA)))==NULL) 277: { 278: ErrPanel(0,FALSE); 279: /* rel_lmb(vfItem); */ 280: free(vfItem.vobj); 281: return FALSE; 282: } 283: 284: /* 項目の要素をセット */ 285: pvdItem->rctView=vfItem.vobj->view; 286: pvdItem->idVirtualObj=idVobj; 287: pvdItem->isFusen=FALSE; 288: 289: AddVobjData(pvdItem,TRUE); 290: 291: /* rel_lmb(vfItem); */ 292: free(vfItem.vobj); 293: } 294: 295: /* 機能付箋レコードを読み込む */ 296: see_rec(afcFile->fd,0,1,NULL); 297: while(fnd_rec(afcFile->fd,F_FWD,128,0,NULL)==7) 298: { 299: VOBJDATA* pvdItem; 300: VFPTR vfItem; 301: W idVobj; 302: W lSize; 303: 304: rea_rec(afcFile->fd,0,NULL,0,&lSize,NULL); /* レコードサイズを得る */ 305: 306: /* メモリ割り当て */ 307: /* if(get_lmb(&(vfItem.fsn),lSize,NOCLR)<0) */ 308: if((vfItem.fsn=(FUSENSEG*)malloc(lSize))==NULL) 309: { 310: ErrPanel(0,FALSE); 311: return FALSE; 312: } 313: 314: /* 機能付箋レコードの読み込み */ 315: if(rea_rec(afcFile->fd,0,(B*)vfItem.fsn,lSize,NULL,NULL) < 0) 316: { 317: /* rel_lmb(vfItem.fsn); */ 318: free(vfItem.fsn); 319: return FALSE; 320: } 321: 322: see_rec(afcFile->fd,1,0,NULL); /* 次のレコードへ */ 323: 324: /* 付箋の登録 */ 325: if(aidWnd<0) /* 開いた仮身の時 */ 326: idVobj=oreg_vob(NULL,(VP)vfItem.fsn,-aidWnd,V_DISPALL|V_NOFRAME); 327: else /* 仮身のオープンの時 */ 328: idVobj=oreg_vob(NULL,(VP)vfItem.fsn,aidWnd,V_DISPALL); 329: if(idVobj<0) /* 登録できなかったら */ 330: { 331: ErrPanel(ID_ST_NREGVOBJ,FALSE); 332: /* rel_lmb(vfItem); */ 333: free(vfItem.fsn); 334: return FALSE; 335: } 336: 337: /* 項目へメモリー割り当て */ 338: /* if(get_lmb(&pvdItem,(LONG)sizeof(VOBJDATA),NOCLR)<0) */ 339: if((pvdItem=(VOBJDATA*)malloc(sizeof(VOBJDATA)))==NULL) 340: { 341: ErrPanel(0,FALSE); 342: /* rel_lmb(vfItem); */ 343: free(vfItem.fsn); 344: return FALSE; 345: } 346: 347: /* 項目の要素をセット */ 348: pvdItem->rctView=vfItem.vobj->view; 349: pvdItem->idVirtualObj=idVobj; 350: pvdItem->isFusen=TRUE; 351: 352: AddVobjData(pvdItem,TRUE); 353: 354: /* rel_lmb(vfItem); */ 355: free(vfItem.fsn); 356: } 357: 358: return TRUE; 359: } 360: 361: BOOL ReadFile(W aidWnd) 362: { 363: W lTADRecode; 364: FILECONTEXT* fcFile; 365: BOOL isStartSegCame; 366: BOOL isText; 367: BOOL isRightTAD; /* 想定したとおりの TAD かどうか */ 368: BOOL isErrLink; 369: W lLastOffset; /* 追加書き込みの時に書き込み始めるオフセット */ 370: 371: /* TAD 主レコードを探す */ 372: if(fnd_rec(document.wFileDscr,F_TOPEND,2,0,&lTADRecode)<0) 373: { /* 見つからなかったら */ 374: return TRUE; 375: } 376: 377: fcFile=StartFile(document.wFileDscr,lTADRecode); 378: if(fcFile==NULL) 379: return FALSE; 380: 381: isStartSegCame=FALSE; 382: isRightTAD=TRUE; 383: isErrLink=FALSE; 384: /* セグメントを1つずつ読んでいく */ 385: while(NextSegment(fcFile,TRUE)) 386: { 387: /*b_printf("ID=%d\n",fcFile->ID);*/ 388: switch(fcFile->ID) 389: { 390: case TS_FIG: /* 図形開始セグメントの時 */ 391: if(isStartSegCame) 392: { 393: isRightTAD=FALSE; 394: break; 395: } 396: isStartSegCame=TRUE; 397: isText=FALSE; 398: SkipData(fcFile,16); 399: SkipData(fcFile,4); 400: break; 401: 402: case TS_TEXT: /* 文章開始セグメントの時 */ 403: isRightTAD=FALSE; 404: if(isStartSegCame) 405: break; 406: isStartSegCame=TRUE; 407: isText=TRUE; 408: SkipData(fcFile,16); 409: SkipData(fcFile,4); 410: break; 411: 412: case TS_FIGEND: /* 図形終了セグメントの時 */ 413: if(isStartSegCame && !isText) 414: lLastOffset=fcFile->SegOffset; 415: else 416: isRightTAD=FALSE; 417: break; 418: 419: case TS_TEXTEND: /* 文章終了セグメントの時 */ 420: isRightTAD=FALSE; 421: if(isStartSegCame && isText) 422: lLastOffset=fcFile->SegOffset; 423: break; 424: 425: case TS_VOBJ: /* 仮身セグメントの時 */ 426: if(!isStartSegCame) 427: break; 428: lLastOffset=fcFile->NextOffset; 429: if(!ReadVobj(fcFile,aidWnd,FALSE)) 430: { 431: isErrLink=TRUE; 432: isRightTAD=FALSE; 433: break; 434: } 435: break; 436: 437: case TS_FFUSEN: /* 機能付箋の時 */ 438: if(!isStartSegCame) 439: break; 440: lLastOffset=fcFile->NextOffset; 441: if(!ReadVobj(fcFile,aidWnd,TRUE)) 442: { 443: isRightTAD=FALSE; 444: break; 445: } 446: break; 447: 448: case TS_INFO: 449: break; 450: default: 451: isRightTAD=FALSE; 452: } 453: } 454: 455: /* 主 TAD レコードに対応してない仮身レコードと機能付箋レコードを読み込む */ 456: ReadNotInTADRecord(fcFile,aidWnd); 457: 458: EndFile(fcFile); 459: /* cls_fil(document.wFileDscr); */ 460: 461: return TRUE; 462: } 463: 464: 465: 466: /* --------------------データ管理-------------------- */ 467: 468: 469: BOOL IsFusen(DOCITERATOR adiCurrent) 470: { 471: return ((VOBJDATA*)adiCurrent)->isFusen; 472: } 473: 474: DOCITERATOR GetIterator(W aidVobj) 475: { 476: VOBJDATA* vdCurrent; 477: 478: vdCurrent=document.vdFirst; 479: while(vdCurrent!=NULL) 480: { 481: if(vdCurrent->idVirtualObj==aidVobj) 482: return (DOCITERATOR)vdCurrent; 483: vdCurrent=vdCurrent->next; 484: } 485: return NULL; 486: } 487: 488: DOCITERATOR GetNext(DOCITERATOR adiCurrent) 489: { 490: if(adiCurrent==NULL) 491: return document.vdFirst; 492: return ((VOBJDATA*)adiCurrent)->next; 493: } 494: 495: DOCITERATOR GetPrevious(DOCITERATOR adiCurrent) 496: { 497: if(adiCurrent==NULL) 498: return document.vdLast; 499: return ((VOBJDATA*)adiCurrent)->previous; 500: } 501: 502: W GetVID(DOCITERATOR adiCurrent) 503: { 504: return ((VOBJDATA*)adiCurrent)->idVirtualObj; 505: } 506: 507: RECT GetRect(DOCITERATOR adiCurrent) 508: { 509: return ((VOBJDATA*)adiCurrent)->rctView; 510: } 511: 512: RECT GetDocRect(void) 513: { 514: return document.rctView; 515: } 516: 517: DOCITERATOR GetSelectedVobj(void) 518: { 519: return document.vdSelected; 520: } 521: 522: BOOL IsSelected(DOCITERATOR adiCurrent) 523: { 524: if(adiCurrent==document.vdSelected) 525: return TRUE; 526: else 527: return FALSE; 528: } 529: 530: void SelectVobj(DOCITERATOR adiCurrent) 531: { 532: document.vdSelected=adiCurrent; 533: } 534: 535: void UnSelectVobj(void) 536: { 537: document.vdSelected=NULL; 538: } 539: 540: 541: PNT SendSelectedDataToTray(BOOL aisTempTray,PNT aptOrigin,W aidNewVobj) 542: { 543: TRAYREC ptrTrayIndex[2]; 544: FIGSEG fsFigStart; 545: DOCITERATOR diCurrent; 546: PNT ptReturn; 547: TR_VOBJREC* ptvVobj=NULL; 548: FUSENSEG* pfsFusen=NULL; 549: UW wSize; 550: W wVobjRecSize; 551: /* W wErr; */ 552: W idSend; 553: 554: diCurrent=GetSelectedVobj(); 555: if(diCurrent==NULL) 556: { 557: ptReturn.x=0; 558: ptReturn.y=0; 559: return ptReturn; 560: } 561: 562: /* 最初に来る図形セグメントの設定 */ 563: fsFigStart.draw=GetRect(diCurrent); 564: fsFigStart.view.c.left=0; 565: fsFigStart.view.c.top=0; 566: fsFigStart.view.c.right=fsFigStart.draw.c.right-fsFigStart.draw.c.left; 567: fsFigStart.view.c.bottom=fsFigStart.draw.c.bottom-fsFigStart.draw.c.top; 568: fsFigStart.h_unit=-120; 569: fsFigStart.v_unit=-120; 570: fsFigStart.ratio=0; 571: ptrTrayIndex[0].id=TS_FIG; 572: ptrTrayIndex[0].len=sizeof(FIGSEG); 573: ptrTrayIndex[0].dt=(B*)&fsFigStart; 574: 575: 576: if(aidNewVobj==0) 577: idSend=GetVID(diCurrent); 578: else 579: idSend=aidNewVobj; 580: oget_vob(idSend,NULL,NULL,0,&wSize); 581: wVobjRecSize=sizeof(TR_VOBJREC)+wSize-sizeof(VOBJSEG); 582: if(IsFusen(diCurrent)) 583: /* wErr=get_lmb(&pfsFusen,(LONG)wVobjRecSize,NOCLR); */ 584: pfsFusen=(FUSENSEG*)malloc(wVobjRecSize); 585: else 586: /* wErr=get_lmb(&ptvVobj,(LONG)wVobjRecSize,NOCLR); */ 587: ptvVobj=(TR_VOBJREC*)malloc(wVobjRecSize); 588: if(pfsFusen==NULL && ptvVobj==NULL) 589: { 590: ErrPanel(0,FALSE); 591: /* rel_lmb(ptrTrayIndex); */ 592: ptReturn.x=0; 593: ptReturn.y=0; 594: return ptReturn; 595: } 596: if(IsFusen(diCurrent)) 597: { 598: oget_vob(idSend,NULL,pfsFusen,wSize,NULL); 599: ptrTrayIndex[1].id=TS_FFUSEN; 600: ptrTrayIndex[1].len=wVobjRecSize; 601: ptrTrayIndex[1].dt=(B*)pfsFusen; 602: }else{ 603: oget_vob(idSend,&(ptvVobj[0].vlnk), 604: &(ptvVobj[0].vseg),wSize,NULL); 605: ptrTrayIndex[1].id=TR_VOBJ; 606: ptrTrayIndex[1].len=wVobjRecSize; 607: ptrTrayIndex[1].dt=(B*)ptvVobj; 608: } 609: if(aisTempTray) 610: tset_dat(ptrTrayIndex,2); /* 一時トレーにデータを送る */ 611: else{ 612: /* W wKey; */ 613: TC* ptMessage=NULL; 614: 615: /* wKey=dget_dat(TEXT_DATA,ID_ST_TRVOBJ,0); */ /* データの名称を得る */ 616: /* smb_adr(wKey,&ptMessage); */ 617: dget_dtp(TEXT_DATA,ID_ST_TRVOBJ,(void**)ptMessage); /* データの名称を得る */ 618: tpsh_dat(ptrTrayIndex,2,ptMessage); 619: /* drel_dat(wKey); */ 620: } 621: 622: ptReturn.x=fsFigStart.draw.c.left-aptOrigin.x; 623: ptReturn.y=fsFigStart.draw.c.top-aptOrigin.y; 624: return ptReturn; 625: } 626: 627: 628: /* メモリを解放する */ 629: BOOL FreeDocument(void) 630: { 631: DOCITERATOR diCurrent,diNext; 632: 633: diCurrent=GetNext(NULL); 634: while(diCurrent) 635: { 636: diNext=GetNext(diCurrent); 637: odel_vob(GetVID(diCurrent),0); 638: /* rel_lmb(diCurrent); */ 639: free(diCurrent); 640: diCurrent=diNext; 641: } 642: 643: return TRUE; 644: } 645: 646: 647: /* --------------------固有データの処理-------------------- */ 648: 649: 650: #define UNIQUEDATASIZE 8 /* 固有データの大きさ */ 651: /* 実行機能付箋からの固有データの読み込み */ 652: BOOL ReadUniqueData(W* awUniqueData,RECT* aprctWnd,RECT* aprctWork) 653: { 654: H* wData; 655: H wBuf[UNIQUEDATASIZE+1]; 656: 657: if(awUniqueData==NULL) 658: { 659: wData=wBuf; 660: oget_fsn(document.idVirtualObj,document.wFileDscr,wData, 661: (UW)(UNIQUEDATASIZE+1)*sizeof(H)); 662: }else 663: wData=(H*)awUniqueData; 664: 665: if(wData[0]!=UNIQUEDATASIZE*sizeof(H)) 666: return FALSE; 667: 668: aprctWnd->c.left=wData[1]; 669: aprctWnd->c.top=wData[2]; 670: aprctWnd->c.right=wData[3]; 671: aprctWnd->c.bottom=wData[4]; 672: aprctWork->c.left=wData[5]; 673: aprctWork->c.top=wData[6]; 674: aprctWork->c.right=wData[7]; 675: aprctWork->c.bottom=wData[8]; 676: 677: return TRUE; 678: } 679: 680: void WriteUniqueData(RECT arctWnd,RECT arctWork) 681: { 682: H wData[UNIQUEDATASIZE+1]; 683: 684: wData[0]=UNIQUEDATASIZE*sizeof(H); 685: wData[1]=arctWnd.c.left; 686: wData[2]=arctWnd.c.top; 687: wData[3]=arctWnd.c.right; 688: wData[4]=arctWnd.c.bottom; 689: wData[5]=arctWork.c.left; 690: wData[6]=arctWork.c.top; 691: wData[7]=arctWork.c.right; 692: wData[8]=arctWork.c.bottom; 693: 694: if(!document.isReadOnly) 695: { 696: W wFileDscr; 697: 698: wFileDscr=oopn_obj(document.idVirtualObj,NULL,F_UPDATE,NULL); 699: if(wFileDscr>=0) 700: { 701: oput_fsn(document.idVirtualObj,wFileDscr,wData); 702: cls_fil(wFileDscr); 703: } 704: } 705: 706: oend_prc(document.idVirtualObj,wData,0); /* 実身の処理終了 */ 707: } 708: 709: void CloseFile(void) 710: { 711: if(document.wFileDscr>=0) 712: { 713: cls_fil(document.wFileDscr); 714: document.wFileDscr=-1; 715: } 716: } 717: