スクリプトのaddmenuで..?No.01206
よこしま さん 98/09/30 00:04
 
こんにちは, 秀まるおさん.

addmenu なんですが, 不思議な動作をするので教えてください.

---------------

##k == 78
##a == 1

while( ##a < ##k)
addmenu ##a
##a == ##a + 1
endwhile

showmenu
return

---------------

のようなスクリプトを作った場合, このスクリプトは
動きますが, ##k を ##k == 79 に書き換えると
メニューが表示されません. なぜでしょう...?

よこしま

Send 98/09/29


[ ]
RE:01206 スクリプトのaddmenuで..?No.01207
秀まるお さん 98/09/30 10:42
 
 えっと、その前に、

> ##k == 78
> ##a == 1

 の所は、==じゃなくて、=にしないといけないはずなんですが、なぜかうまく動い
てしまうようで。まぁそれはいいとして、

 うちの環境だと##k = 500でもちゃんと動作しました。1000にしたらUSER.EXEで死
んでしまいました。

 画面の解像度のせいかと思ったんですが、640x480の画面でも出るようです。

 ってことは、OSR1とOSR2の違いとか…。うちのWindows95はOSR2です。


[ ]
RE:01207 スクリプトのaddmenuで..?No.01208
よこしま さん 98/09/30 13:58
 
こんにちは, 秀まるおさん.

> えっと、その前に、
>
>> ##k == 78
>> ##a == 1
>
> の所は、==じゃなくて、=にしないといけないはずなんですが、なぜかうまく動い
>てしまうようで。まぁそれはいいとして、

あれ, = と == って区別があったのですか...?
なんか経験的にないと思っていたので,
自分で勝手に等式と代入を区別していました.

そういえばいつだったか === とかいても
動くように直していただいたような気が....


> うちの環境だと##k = 500でもちゃんと動作しました。1000にしたらUSER.EXEで死
>んでしまいました。
>
> 画面の解像度のせいかと思ったんですが、640x480の画面でも出るようです。
>
> ってことは、OSR1とOSR2の違いとか…。うちのWindows95はOSR2です。

えー, うちは Windows98 です.
以前は Windows95 OSR2 だったのですが, そのときは
動いていたような気がするんですよ. たぶん......

よこしま

Send 98/09/30


[ ]
RE:01208 スクリプトのaddmenuで..?No.01209
秀まるお さん 98/09/30 14:49
 
 んじゃ、Windows98になって何かメニュー関係が変わったということなんでしょう
ね。これは困った。

 テスト用のマシンを使って今度テストしてみます。

 (でも、たぶん直らない可能性が高いです)


[ ]
RE:01209 スクリプトのaddmenuで..?No.01210
よこしま さん 98/09/30 16:28
 
こんにちは, 秀まるおさん.

> んじゃ、Windows98になって何かメニュー関係が変わったということなんでしょう
>ね。これは困った。
>
> テスト用のマシンを使って今度テストしてみます。
>
> (でも、たぶん直らない可能性が高いです)


うーむ, そうですかぁ.....
実は例の ##k = 79 というのはメニューに追加する項目に
よって様々で, 50 だったり38だったりします.

で, 実はNIFTYエクスプローラで実害がでてしまい,
ユーザーが登録している会議室の個数が
40を超えるとメニューがでなくなってしまうという.....

NIFTYエクスプローラでは, メニューに表示する項目が多すぎる場合は,
マクロサーバを使ってリストボックスに自動で
切り替えるように直してしまいました.


ちなみにこの現象は addmenu だけでなく, menu でも
でるようです.(当たり前かもしれませんが...)


よこしま

Send 98/09/30


[ ]
RE:01210 スクリプトのaddmenuで..?No.01214
秀まるお さん 98/10/05 11:13
 
 最近、マシンのマザーボード入れ替えとかやってる関係で、実はまだWindows98の
マシンがちゃんと動いてません(今、横でセットアップ中です)

 動きしだいテストしますので…。(他にもテスト項目が溜まってることだし)

 あ、僕のマシンはついにPentium II 300MHzになってしまいました。


[ ]
RE:01210 スクリプトのaddmenuで..?No.01215
秀まるお さん 98/10/05 12:21
 
 先ほどテストしてみたんですが、Windows98で、メニュー数を500にしても正常に動
作してしまいました。

 おかしいのはよこしまさんのマシンだけじゃなくて他の所でも同じなんでしょか?。
だとすると、どうしましょ?

 とりあえずソースコードを載せてしまいます。ScriptAddMenu()とScriptShowMenu
()がスクリプトに対応して呼ばれる関数です。

---------------------------------------------------------------------
static HMENU    hmenuScript;
static int  cMenu;
static int  iMenuNumber;
static int  cyMenu;
static int  id = CMD_SCRIPTMENU;

static void CreateScriptMenu( void ) {
    if( hmenuScript == NULL ) {
        hmenuScript = CreatePopupMenu();
    }
}

static void AddSeparator( void ) {
    CreateScriptMenu();
    AppendMenu( hmenuScript, MF_SEPARATOR, 0, szNone );
    cyMenu += GetSystemMetrics( SM_CYMENU ) / 2;
    cMenu ++;
}

static void AddMenuItem( char* psz ) {
    CreateScriptMenu();
    if( *psz != '\0' ) {
        AppendMenu( hmenuScript, MF_STRING, id, psz );
        cyMenu += GetSystemMetrics( SM_CYMENU );
        if( cyMenu > cyScreen - 50 ) {
            AppendMenu( hmenuScript, MF_MENUBARBREAK, 0, szNone );
            cyMenu = 0;
        }
    }
    id ++;
    cMenu ++;
    iMenuNumber ++;
}

static void ShowMenu( void ) {
    pos.value = -1;
    if( hmenuScript != NULL ) {
        if( cMenu != 0 ) {
            SetForegroundWindow( hwndFrame );
            RECT    rc;
            GetWindowRect( hwndFrame, &rc );
            pos.fSleeping = TRUE;
            pos.timeout = 0;
            POINT   pt;
            if( fOnline ) {
                GetCaretPos( &pt );
                ClientToScreen( GetFocus(), &pt );
            } else {
                pt.x = (rc.right + rc.left) / 2;
                pt.y = (rc.bottom + rc.top) / 2;
            }
            fSelectPopupMenu = TRUE;
            DebugPrint( "TrackPopupMenu\n" );
            int cmd = TrackPopupMenu( hmenuScript
                , TPM_CENTERALIGN | TPM_LEFTBUTTON | TPM_RETURNCMD
                , pt.x, pt.y, 0, hwndFrame, NULL );
            pos.fSleeping = FALSE;
            timeLoopCheck = GetTickCount();
            if( cmd != 0 ) {
                pos.value = cmd - CMD_SCRIPTMENU;
            }
        }
        DestroyMenu( hmenuScript );
        hmenuScript = NULL;
        id = CMD_SCRIPTMENU;
        cyMenu = 0;
        cMenu = 0;
        iMenuNumber = 0;
    }
}

static BOOL ScriptMenuSub( BOOL fNumber ) {
    while( (SCRIPTATOM)*(pos.pbCur) != SCR_LINENO ) {
        while( (SCRIPTATOM)*(pos.pbCur) == F_COMMA ) {
            pos.pbCur ++;
        }
        if( !pos.GetValue() ) {
            ParamError( SCR_MENU );
            return FALSE;
        }
        if( pos.szToken[0] != '\0' ) {
            if( pos.fNum && pos.num == 0 ) {
                AddSeparator();
            } else {
                if( fNumber ) {
                    szVarValue[0] = '&';
                    szVarValue[1] = (char)(iMenuNumber + '1');
                    if( szVarValue[1] > '9' ) {
                        szVarValue[1] = (char)(szVarValue[1]-'9'+'A'-1);
                    }
                    szVarValue[2] = '\t';
                    strcpy( szVarValue + 3, pos.szToken );
                    AddMenuItem( szVarValue );
                } else {
                    AddMenuItem( pos.szToken );
                }
            }
        }
    }
    ShowMenu();
    if( pos.value == -1 ) {
        pos.timeout = 1;
        pos.fSleeping = TRUE;
        StartTimer();
        client.SetPortAccessFast();
        return FALSE;                   // millisleep 1を実行したのと同じ
    }
    return TRUE;
}

static BOOL ScriptMenu( void ) {
    return ScriptMenuSub( FALSE );
}

static BOOL ScriptNumberMenu( void ) {
    return ScriptMenuSub( TRUE );
}

static BOOL ScriptAddMenuSub( BOOL fNumber ) {
    if( !pos.GetValue() ) {
        ParamError( SCR_ADDMENU );
        return FALSE;
    }
    if( pos.szToken[0] != '\0' ) {
        if( pos.fNum && pos.num == 0 ) {
            AddSeparator();
        } else {
            if( fNumber ) {
                szVarValue[0] = '&';
                szVarValue[1] = (char)(iMenuNumber + '1');
                if( szVarValue[1] > '9' ) {
                    szVarValue[1] = (char)(szVarValue[1] - '9' + 'A' - 1);
                }
                szVarValue[2] = '\t';
                strcpy( szVarValue + 3, pos.szToken );
                AddMenuItem( szVarValue );
            } else {
                AddMenuItem( pos.szToken );
            }
        }
    }
    return TRUE;
}

static BOOL ScriptAddMenu( void ) {
    return ScriptAddMenuSub( FALSE );
}

static BOOL ScriptAddNumberMenu( void ) {
    return ScriptAddMenuSub( TRUE );
}

static BOOL ScriptShowMenu( void ) {
    ShowMenu();
    return TRUE;
}

---------------------------------------------------------------------


[ ]
RE:01215 スクリプトのaddmenuで..?No.01216
よこしま さん 98/10/05 20:56
 
こんにちは, 秀まるおさん.

(あ, いつのまにか↑元に戻ってる!)


> 先ほどテストしてみたんですが、Windows98で、メニュー数を500にしても正常に動
>作してしまいました。
>
> おかしいのはよこしまさんのマシンだけじゃなくて他の所でも同じなんでしょ
か?。
>だとすると、どうしましょ?

うーむ, そうするとこちらの環境の問題でしょうか...?
結構安定して動いているようなきがするんですけど....

Visual Basic 5.0 SP3 をインストールしているせいとか...?
Delphi インストールしているせいとか...?
一太郎9インストールしたせいとか.....?

再現できないのでしたらなんともなりませんね(;;)

こちらでも引き続き調べてみます.

P.S. もう4回ぐらい Windows98をセットアップし直してるのですが,
その度に動作が違うのはなんででしょうねぇ...


よこしま

Send 98/10/05


[ ]
RE:01216 スクリプトのaddmenuで..?No.01217
秀まるお さん 98/10/06 10:09
 
 そちらで試しにCreatePopupMenu()してAppendMenuを100回繰り返すような
プログラムを作ってみて、それでも死ぬならやはりWindows98がそういうものだと
言えるのではということで、そういうの試してみませんかぁ?(っと振ってしまう)


[ ]
RE:01217 スクリプトのaddmenuで..?No.01218
よこしま さん 98/10/06 23:04
 
こんにちは, 秀まるおさん.

> そちらで試しにCreatePopupMenu()してAppendMenuを100回繰り返すような
>プログラムを作ってみて、それでも死ぬならやはりWindows98がそういうものだと
>言えるのではということで、そういうの試してみませんかぁ?(っと振ってしま
う)

よこしまの家には今はCコンパイラーが一個もないので
Cでって分けにはいかないですが, とりあえず
時間をみてDelphiでやってみます.

そんでよくわかんないときはVBでやってみます.
(ってVBはあんまりしらないですが...)


よこしま

Send 98/10/06


[ ]