none
for文の処理回数をフォームに表示させる方法他について RRS feed

  • 質問

  • MFCのダイアログベースに関する質問です

    for文の「現在の」処理回数をフォームウインドウのテキストボックスに出力するプログラムを作りたく思い、以下のようなプログラムを書きました。

    ところが、この方法だと最終的な処理回数しかウインドウに表示されませんでした(全部終わってから999とだけ表示される)

    「現在の処理回数」を連続で表示していく(1,2,3・・・と増えて行き、最後に999になる)ようにするにはどのようにすれば良いのでしょうか?

    ご回答よろしくお願いします

     

    後、全部の処理が終わった後にその内容を保存したいのですが、このときのファイル名は(nameの中身)edit2から取得するようにしています。このときにedit2になにも書かれていない場合、その旨を示すメッセージボックスを出して警告するようにしたいのですが、強制停止してしまいます。

    こちらもわかる方ご回答お願いします

    for(int i=0; i<1000; i++)
     {

    (略)


     CString c;
     c.Format("%d",i);
     m_edit1.SetWindowText(c);
     }

     FILE *fp;
     CString name;
     m_edit2.GetWindowText(name); 
     if((fp=fopen(name,"w"))==NULL)
     {
      AfxMessageBox("保存するファイル名を指定してください");
      return;
     }
     

    (略) 


     fclose(fp);

     

    2006年4月6日 5:58

すべての返信

  • 描画が行われていないからですね。
    強制描画してください。

    2006年4月6日 6:01
  • では私はもう一つを。


    CString name;
    m_edit2.GetWindowText( name );
    if( name == "" )
    {
      AfxMessageBox("保存するファイル名を指定してください");
      return;
    }

    2006年4月6日 6:35
  • TextOut関数のような描画用の関数を使えばよいということでしょうか?

    よろしければ適切な描画用関数と使用法を教えていただけないでしょうか?

    よろしくお願いします。(TextOutではエディットボックスは指定できないようなので)

    2006年4月6日 6:36
  • コントロール変数で値を取得/設定している場合、ダイアログに更新してくれという

    命令をしてあげないといけません。

    CWndクラスのUpdateDataを調べてみてください。

     

     

    ちなみに、MFCということは VC++ Express Edtion ではないですよね?

    次の質問は、該当の掲示板にしましょう。

    2006年4月6日 6:38
  •  蒼の洞窟 さんからの引用

    コントロール変数で値を取得/設定している場合、ダイアログに更新してくれという

    命令をしてあげないといけません。

    CWndクラスのUpdateDataを調べてみてください。

    間違えました。これは値のときでした。コントロール変数は別に更新してくれますね。

    処理がシステムに戻ってこないので、描画されないという状態だと思います。

    やっぱり、スレッドかタイマー処理にするしかないのかなぁ。。。

    2006年4月6日 6:51
  • とっちゃんです。

    乗り遅れるところだった。。

    m_edit1.SetWindowText(c);

    の次の行で

    m_edit1.UpdateWindow();

    としてみてください。

    何も出来ないことには変わりありませんが、更新だけはされるはずです。

    類似の機能に「メッセージポンプを回す」というのもありますが、副作用が大きいので単なる再描画だけなら、こちらのほうが都合が良いです。

    本当はこういう部分は

    1. ループ処理の直前にモーダル風モードレスを出してメッセージをポンプしながらループする
    2. ループ処理をスレッド化してUIではモーダルダイアログで終わるのを待つ

    という手法を使います。

    前者は、いわゆるハードワークでもシステムストレスを軽減するために用いられてきた古の技術です。

    後者は、マルチスレッドな対応の最初の一歩ですね。

    さらに、近未来風に行くなら「ループ処理を OpenMP でマルチスレッド化して、メニーコアに対応!?」というのもありますが...

    現状では多くて4個、普通なら2個以下なのであまり現実味はありませんけどw

     

    2006年4月6日 7:08
  • なるほど、おかげで巧くいきました。ありがとうございます

    UpdateWindowのコマンドは初耳でした。

    nameの中身が空というのは””で良かったのですね

    >開発環境

     Visual Stdio2003を使用しています。新しく変わってからVC++専用の掲示板とどっちに書けばよいか解らなかったのでこちらに書いてしまいました。次からは其方に書きます

    2006年4月6日 7:18
  •  とっちゃん さんからの引用

    m_edit1.UpdateWindow();

    UpdateWindowがありましたね。スッカリ忘れていました。

    # AfxBeginThread使って、実験しちゃってましたゎ。

    2006年4月6日 7:22
  •  OROCHI-TUNGUS さんからの引用

    nameの中身が空というのは””で良かったのですね

    CStringクラスのIsEmptyメソッドを使っても判定できます。

     

     OROCHI-TUNGUS さんからの引用

     Visual Stdio2003を使用しています。新しく変わってからVC++専用の掲示板とどっちに書けばよいか解らなかったのでこちらに書いてしまいました。次からは其方に書きます

    ここの掲示板は、VS2005がデフォルトなので、VS2003よりも前のバージョンの質問の場合は、必ず最初に環境を書いたほうが無難です。

    ※何度も質問するときも、必ず書きましょう。前のスレをみんながみんなみているわけではないので。

     

    環境ですけど、OSやVSのバージョン、プロジェクトの種類までを書くとベストです。

    例) Windows XP SP2 Pro / Visual Studio2005 Pro / MFC Application ダイアログベース

    2006年4月6日 7:28
  • とっちゃんです。

     蒼の洞窟 さんからの引用

    UpdateWindowがありましたね。スッカリ忘れていました。

    普通は使わなくてもいいようにプログラミングしますし、即座に画面更新が必要ってこと自体まれですから(^^;

     OROCHI-TUNGUS さんからの引用

    Visual Stdio2003を使用しています。新しく変わってからVC++専用の掲示板とどっちに書けばよいか解らなかったのでこちらに書いてしまいました。次からは其方に書きます

    どこで聞けばいいかわからないという場合や、言語に依存しない話題(IDEそのものやセットアップなど)なら、共通フォーラムへどうぞ。

    必要があれば管理者のほうで、適切に移動してくれると思います。

    2006年4月6日 8:29