#99 Article 980 Posted at 1995/12/05 16:41:13 by すぅすぅ (MAP5999) [NYAN]

Subject: Re:*8 プログラミングお作法の話 /979 .... /941 /940

こんにちは すぅすぅです

maleneにポストしたのですが、こちらには来なかったみたいなのでもう一度...

きっと誰も望んでいないであろう反応もないであろう(泣)MacのCで挑戦~☆

あへてANSIライブラリは使いません
スクロールはしますがスクロールバーは付きません
大きくなるのでエラー処理は全くしてません
イベントろーるもしません
Symantec(ThinkC)だと少しいじらないと動かないかも

-------- ここから --------
/***********************************************
 * にゃん for Macintosh  by すぅすぅ
 ***********************************************/

#include <MacHeaders.h>

/***********************************************
 * まずResEditで'DLOG'リソースをID=128で作る
 * ItemNumber=1でOKボタン,2でCancelボタン,
 * 3でEditTextアイテムという構成
 * ('DITL'リソースも出来上がる)
 ***********************************************/
#define D_GETNUM    128 /* DLOG resource ID */
#define DI_OK       1   /* OK Button ItemNumber */
#define DI_CANCEL   2   /* Cancel Button ItemNumber */
#define DI_EDITTEXT 3   /* EditText ItemNumber */

#define CWITH       400 /* 表示ウィンドウの横幅 */
#define CHEIGHT     300 /* 表示ウィンドウの高さ */

typedef struct {
    WindowPtr   wp;
    TEHandle    teh;
} ConsoleData, *ConsolePtr;

/* ToolBoxのイニシャライズ */
void init_toolbox( void )
{
    InitGraf(&qd.thePort);
    InitFonts();
    InitWindows();
    InitDialogs(NULL);
    InitMenus();
    TEInit();
    FlushEvents(everyEvent,0);
    SetPort(qd.thePort);
    InitCursor();
}

/* 数値入力 */
long get_num( void )
{
    DialogPtr   dp;
    Handle      item;
    Str255      text;
    short       num;
    Rect        rct;
    long        val;

    dp=GetNewDialog(D_GETNUM,(void *)0,(WindowPtr)-1);
    SetPort(dp);
    GetDItem(dp,DI_EDITTEXT,&num,&item,&rct);
    SetIText(item,"\p");
    num=0;
    while(!num) {
        ModalDialog((ModalFilterUPP)0,&num);
        switch(num) {
        case DI_OK:     /* OK ボタン */
        case DI_CANCEL: /* Cancel ボタン */
            break;
        default:
            num=0;
            break;
        }
    }
    if (num==DI_OK) { /* OK */
        GetIText(item,text);
        StringToNum(text,&val);
    }
    DisposeDialog(dp);
    if (num==DI_CANCEL) { /* Cancel */
        ExitToShell(); /* 終了 */
    }
    return(val);
}

/* 表示ウィンドウを作る,ほか下準備 */
ConsolePtr open_console( void )
{
    ConsolePtr  cp;
    Rect        rct1,rct2;

    cp=(ConsolePtr)NewPtr(sizeof(ConsoleData));
    SetRect(&rct1,0,0,CWITH,CHEIGHT);
    rct2=rct1;
    OffsetRect(&rct2,20,40);
    cp->wp=NewCWindow((void *)0,&rct2,"\p",true,
                    dBoxProc,(WindowPtr)-1,false,0);
    SetPort(cp->wp);
    cp->teh=TEStyleNew(&rct1,&rct1);
    TEUpdate(&rct1,cp->teh);
    return(cp);
}

/* 文字列をウィンドウへ出力する */
void print_str( ConsolePtr cp , Str255 str )
{
    TEInsert(str+1,(long)*str,cp->teh);
    TEPinScroll(0,-32000,cp->teh);
}

/* 表示ウィンドウを閉じる */
void close_console( ConsolePtr cp )
{
    TEDispose(cp->teh);
    DisposeWindow(cp->wp);
    DisposePtr((Ptr)cp);
}

/* メイン */
void main( void )
{
    ConsolePtr  cp;
    Str255      str;
    long        q1,q2,n;

    init_toolbox();    /* イニシャライズ */
    n=get_num();       /* 数値を入力 */
    cp=open_console(); /* 表示ウィンドウを開く */
    for(q1=1; q1<=n; q1++) {
        if ((q1==3)||(q1==5)||(q1==n)) {
            q2=q1;
            while(q2>0)
                print_str(cp,"\pにゃん"); /* にゃん */
                q2--;
            }
        }
        else {
            NumToString(q1,str);
            print_str(cp,str); /* 数字を表示 */
        }
        print_str(cp,"\p\r"); /* 改行 */
    }
    while(!Button()) ; /* マウスのボタンが押されるまで待つ */
    close_console(cp); /* 表示ウィンドウを閉じる */
    ExitToShell(); /* 終了 */
}

-------- ここまで --------

1. MacらしくPascal文字列を使った(文字数数えなくて良いとこは便利)
2. if, for, while は一行でも{}で囲む
3. きちきちに詰まっていて見にくい

ゴミでした。

MAP5999 すぅすぅ