VCでの動作確認には
①DebugビルドでVC実行ボタンで実行
②Debugビルドでexeファイルで実行
③ReleaseビルドでVC実行ボタンで実行
④Releaseビルドでexeファイルで実行
の4種類があると思うのですが、この中で④の場合だけ出る不具合があります。
具体的にはダイアログ上のActiveXコントロールの表示がおかしくなります。
(縦横サイズが0になる)
このような場合、どういう原因を考えればいいのでしょうか?
デバッグ方法、注意すべきポイントなど何でもいいので
アドバイスお願いします。
環境は Win2000/VC.NET/MFC です。
exeファイルで実行と言うのがよくわからないのですけれど、
エクスプローラーでダブルクリックでもするって事でしょうか?
1、3と2、4は実行時のカレントディレクトリが違うのですが、
これは認識されているでしょうか?
何か必要なファイルが、DebugフォルダにはあってReleaseフォルダにはないとか
ないでしょうか。
書き込まれている内容からはこれくらいしか想像できないです。
あと、丸付き数字は機種依存文字なのでネットワークでは使わないほうがいいです。
Macの人とかは読めませんので。
> 1、3と2、4は実行時のカレントディレクトリが違う
これはエクスプローラーでダブルクリックで起動した時を想定しています。
初期化するべき変数を初期化していない可能性があります。
初期化していない変数を使っていないかチェックしてみて下さい。
例えばこんな感じのコードはないでしょうか。
int x;
if (x < 0) {
// 色々処理
}else {
// 色々処理
};
初期化されていない変数の値は未定義です。
①②③④でそれぞれ異なる値が設定される可能性があります。
(①②ではデバッグ用の値(0xcdcdcdcd...)になる場合が多いようです。)
初期化されてない変数が負の場合は正しく動作し、正の場合はうまく動作しないようなプ
ログラムになっていたりすると、④だけうまく動作しないということがありえます。
PATIOさんMASATOさん レスありがとうございます。
>>あと、丸付き数字は機種依存文字なのでネットワークでは使わないほうがいいです。
>>Macの人とかは読めませんので。
>①DebugビルドでVC実行ボタンで実行
>②Debugビルドでexeファイルで実行
>③ReleaseビルドでVC実行ボタンで実行
>④Releaseビルドでexeファイルで実行
すいません。以下に修正します。
1.DebugビルドでVC実行ボタンで実行
2.Debugビルドでexeファイルで実行
3.ReleaseビルドでVC実行ボタンで実行
4.Releaseビルドでexeファイルで実行
>exeファイルで実行と言うのがよくわからないのですけれど、
>エクスプローラーでダブルクリックでもするって事でしょうか?
はい。そのとおりです。
>初期化するべき変数を初期化していない可能性があります。
>初期化していない変数を使っていないかチェックしてみて下さい。
1,2と3,4で動作が違うなら初期化を疑うのですが、1,2,3と4で動作が
違うので困っています。
けれど初期化ももう一度チェックしてみます。
>1、3と2、4は実行時のカレントディレクトリが違うのですが、
>これは認識されているでしょうか?
>何か必要なファイルが、DebugフォルダにはあってReleaseフォルダにはないとか
>ないでしょうか。
カレントディレクトリの違いは認識しています。
試しに4.のexeファイルをVCプロジェクトファイルと同じDirに置いて
実行してみたのですが、やはり表示がおかしくなりました。
>書き込まれている内容からはこれくらいしか想像できないです。
あと、メイン画面から二枚ダイアログを表示させているのですが(モーダレス)
一枚目の表示がおかしくなり、二枚目は正常な表示になります。
さらに再表示させると二枚とも正常な表示になります。
このあたりが何かポイントになるのでしょうか?
>あと、メイン画面から二枚ダイアログを表示させているのですが(モーダレス)
>一枚目の表示がおかしくなり、二枚目は正常な表示になります。
>さらに再表示させると二枚とも正常な表示になります。
>
>このあたりが何かポイントになるのでしょうか?
であるならば、MASATOさんご指摘の内容が有力です。
全体を覆っているようなタブコントロールの様なコントロールがある場合
そのコントロールの後ろに描画されるのが原因かもしれませんね。
描画順を確定させるために一番後ろに描画させたいコントロール(タブコントロールなど)
のZオーダーを変更してみてはどうでしょう。
OnPaint 内で
{
CTabCtrl* ptab = static_cast<CTabCtrl*>(GetDlgItem(IDC_HOGEHOGETAB));
ptab->SetWindowPos(&ChogehogeDlg::wndBottom, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE);
}
REE様、J様、レスありがとうございます。
>J様
タブコントロールは使っていません。
しかし(もし使用していたら)そのようなパターンは充分考えられますので
今後の参考にしたいと思います。ありがとうございました。
原因はMASATO様、REE様のご指摘通り、初期化でした。
ShowWindow時に各コントロールのサイズを調整しているのですが、その時に
使用している変数の値が不定だったため、コントロールサイズがマイナスに
なり上記の現象が起こっていたようです。
コンストラクタで変数の初期化を行うことで解決しました。
ただ少し気になるのが、上記の3.(実行ボタンで実行)と4.(exeファイルで実行)
で挙動が違う点です。
初期化を行わない場合、変数に入っている値が3.と4.で違ったのですが(正数と負数でした)
これは「不定」ということで何が入るかわからないからでしょうか?
それとも普通は初期化されない変数は3.と4.で同じ値が入るものなのでしょうか?
後学のためこのあたりをきちんと理解したいのですが、
どなたか解説をお願いできないでしょうか?
もしくはその事について説明しているサイトのURLなどを教えていただけると
幸いです。
申し訳ありません。
下記についてはMASATO様から既に説明いただいてました。
>初期化を行わない場合、変数に入っている値が3.と4.で違ったのですが(正数と負数でした)
>これは「不定」ということで何が入るかわからないからでしょうか?
>それとも普通は初期化されない変数は3.と4.で同じ値が入るものなのでしょうか?