• ベストアンサー

MFC・ダイアログベースで、ダイアログの変更内容が反映されない・・・

初めて質問させていただきます。よろしくお願いします。 当方、VisualStdio2005内のC++2005で、 ダイアログベースにてツールを開発していました。 ある日、ダイアログ上に多くのEditコントロールを作成(追加)することになり、 ダイアログリソースをVC内のリソースエディタにて、 テキスト形式でコントロールを追加していきました。 そのときは、テキストでの変更内容がダイアログにも反映されていたのですが、 その後はダイアログにツールボックスでのコントロールの追加やサイズ変更など、 見た目には反映されてもビルド後に反映されなくなってしまいました。 クリーン後のリビルドでも、問題は解決しません。 原因と対策をご存知の方、いらっしゃいましたらご教授いただけませんでしょうか。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • chaigon
  • ベストアンサー率50% (4/8)
回答No.1

VC2005は初心者です。VC6.0は仕事で使っていました。 私はダイアログリソースをテキスト形式でコントロールを追加したことがないので、基本的にご期待に添える回答ではないと思いますが、ご参考までに。 回答する前に質問ですが、もっと詳しい問題の状況、状態を教えていただけませんか?「ビルド後に反映」とは?実行までおこなっていない、ということですか? 以下、回答です。 ダイアログリソースとダイアログのウィンドウの関連付けは正しいですか?ダイアログIDが間違って指定されていませんか?変更対象のダイアログとビルド後の実行したダイアログが違っているなんてことがあったりします。 上記のような間違いがなければ、Editコントロールを1つだけにしてビルド&実行してみてください。それで問題があれば、Editコントロールの書き方に問題があるかも?(いや、その場合はコンパイルでエラーになるはずだけど)。問題がなければ、Editコントロールを1つずつ増やしてビルド&実行する。ある程度増やしたら、思い切って半分くらい増やしてみたりしてもいいと思います。

noname#62469
質問者

補足

chaigon様、ご回答いただきありがとうございます。 また、お返事が遅れまして申し訳ございません。 説明の日本語が少々不明瞭だったようで、こちらもお詫びさせていただきます。 「ビルド後に反映されない」というのは、 一般的にボタンやエディットボックスなどを配置するグラフィカルなエディタ(すみません、正式名称はわかりません)上で、 ・コントロールの位置を移動する、サイズを変更する ・コントロールを新しく追加する などの「変更」を行っても、ビルド後のexeでは「変更」が行われない、ということです。 Aというデザインを修正してA'というデザインをつくり、ビルドしてexeを生成。 exeのデザインはA'になっているはずなのに、Aのまま・・・という感じです。 自分の拙い知識と技術の範囲内ですが、 ダイアログリソースとダイアログのウインドウの関連付け、またダイアログ自身のIDも間違ってないと思っております・・・(後述します) ご指摘の実験を行ってみました。 バックアップを取り(もちろん関連のないフォルダで)、 Editコントロールをひとつにして(それ以外のコントロールを全部削除)ビルド・実行しましたが、 ダイアログ上にeditがひとつあるだけ・・・の状態のはずなのに、やはりほかのコントロールの削除前の状態になってしまいます。 ボタンに割り当てた関数などのソース自体は消していないので、 残っているボタンを押すと、それらの関数が走ります。 ちなみに、私も最近までVC6.0を使用しておりました。 当時も似たような状況になったこと(コントロールを大量に追加しなければいけなくなった)がありまして、 ひとつずつ追加するのが面倒なので、テキストでガンガンコントロールを増やしましたが、 テキストの変更結果も反映されるし、当然グラフィカルなエディタでの修正も反映されていたので、 今回の原因がさっぱりわからないのです。 先ほど後述と書いたことですが、 chaigon様の >ダイアログリソースとダイアログのウィンドウの関連付けは正しいですか?ダイアログIDが間違って指定されていませんか?変更対象のダイアログとビルド後の実行したダイアログが違っているなんてことがあったりします。 のご指摘を、自分が正しく確認できていないと思いますし、 状況を冷静に考えても、この指摘が正しいように思います。 そこでぜひご教授願いたいのですが、 リソースとウィンドウの関連付けは、どのようにすれば確認できるでしょうか。 自分は、ダイアログヘッダ内、ダイアログデータの宣言部で、 enumにて配置されている一番先頭のIDが、 Resource.hにて割り当てられており、 ダイアログリソースファイル(.rcファイル)にてそのIDで各コントロールが配置されている →関連付けられている だと思っていますが、ちょっと違うのでしょうか・・・ ちなみに現在は、テキストでの変更はexeに反映されるので、 とりあえずの応急処理としてはテキスト上でコントロール配置(座標を全部計算・・・)し、 Resource.hにて割り当てを確認、という作業をひたすら繰り返しています。 ・・・つまり、根本的な解決には至っていないのです(;;) よろしくお願いします。

その他の回答 (3)

noname#75489
noname#75489
回答No.4

> 直接編集したモノは保存後にダイアログエディタで見るリソースに反映されています(逆は反映されません)。 > ダイアログエディタでの変更を保存する対象となるリソースファイルも同じです(保存結果はなにもかわりませんが)。 後者のリソースエディタで編集した場合に「保存結果はなにもかわりません」ということは、変更内容がリソースファイルに反映(保存)されないということでしょうか? 保存されないのであれば以下のような原因が考えられますが、どれも可能性は低いです。 ・エディタなどでリソースファイルが開かれていて保存に失敗している(この場合は通常警告が出るはずなので可能性低いですが...) ・別ファイルに保存している(同じファイルということなので可能性低いですが...) ・保存する前にファイルを見ている(まさかとは思いますが...) 保存されるのにコンパイルしても実行時は編集前のダイアログが表示されるということであれば、リソースがコンパイルされていないとしか考えられません。 ・メニュー「ビルド」⇒「ソリューションの消去」 ・メニュー「ビルド」⇒「ソリューションのリビルド」 を行っても編集前のダイアログが表示される(=リソースファイルのダイアログの定義内容と実行ファイルで表示されるダイアログが異なる)というのであれば、もうわかりません。Microsoftに聞いた方がよいと思います。

noname#62469
質問者

補足

itohoo様、度々ありがとうございます。 >後者のリソースエディタで編集した場合に「保存結果はなにもかわりません」ということは、変更内容がリソースファイルに反映(保存)されないということでしょうか? そうなのです。 >・エディタなどでリソースファイルが開かれていて保存に失敗している(この場合は通常警告が出るはずなので可能性低いですが...) 警告も出ず、保存した旨のメッセージが出ます。 >・別ファイルに保存している(同じファイルということなので可能性低いですが...) 当然ですが、パスもファイル名も同じです。 違うならば新たにファイルが増えるはずですが、これもありません。 >・保存する前にファイルを見ている(まさかとは思いますが...) さすがにいくらなんでも… 保存後に古いものを保存なども当然してません。 今回はとりあえず必死にテキストで全部整えて事なきを得たので、 次回作成時はゼロから作成することで対応しようと思います。 Microsoftに聞くのも一つの解決法かと思いますが、 この解決までにかかる時間とコストを考えると、 組み立てなおしたほうが早いと思われるので、 時間ができたら再度調べてみようと思います。

noname#75489
noname#75489
回答No.3

>>実行時に表示させているダイアログと手動で編集したダイアログは、そもそも同じものなのでしょうか? >テキストでの変更はexeに反映できることと、ANo.1の補足内容から、 >同じだと思っています。 >他に確認する方法があるならば、その限りではないのですが・・・ これが同じと思ってる根拠がわかりません。 リソースエディタで編集したモノが実行時に表示されない、直接編集したものが実行時に表示される、ということから、リソースエディタで編集しているダイアログリソースと直接編集したものが異なるものである、と考える方が自然ではないですか? >>リソースエディタで編集する際に、エディットボックスではないID(検索しやすいユニークな名称にする)を持ったコントロールを追加してプロジェクトを保存し、 >>リソースファイルをテキストエディタで開いてそのIDを検索したときに、 >>それが自分で直接追加したエディットコントロールと同じダイアログリソース内にありますか? > >VC内のリソースエディタを使用しているため、 >同時にResource.hも変更(この場合は追加したIDのナンバーの定義を追加)した上で、プロジェクトを保存、 >外部よりテキストエディタにてリソースファイルを開いてみましたが、 >問題のダイアログリソース内に存在していました。 「問題のダイアログリソース」が何を指しているのかわかりませんが、このときにリソースエディタから追加したコントロールは実行時に表示されないと思いますので、試しにテキストエディタでリソースファイルを開いてこのコントロールを検索して、その直下にエディットコントロールを入れてみても表示されないと思いますが、いかがでしょうか?

noname#62469
質問者

補足

itohoo様、再度のご回答ありがとうございます。 言葉が足りなかったようで、お詫びいたします。 >これが同じと思ってる根拠がわかりません。 直接編集したモノは保存後にダイアログエディタで見るリソースに反映されています(逆は反映されません)。 ダイアログエディタでの変更を保存する対象となるリソースファイルも同じです(保存結果はなにもかわりませんが)。 以上から自分は「同じ」だと思っています。 >リソースエディタで編集したモノが実行時に表示されない、直接編集したものが実行時に表示される、ということから、リソースエディタで編集しているダイアログリソースと直接編集したものが異なるものである、と考える方が自然ではないですか? 上記から、とてもそう思えないのです。 それが無知故の妄想だと言われればそれまでですが、 逆に何(どこの情報、何の記述など)を調べれば「同一」かそうでないか判断できるか、ご教授願えませんでしょうか。 「問題のダイアログリソース」とは、 ダイアログの宣言部で、今回の現象が起こっているダイアログの宣言の部分、「BEGIN」~「END」内です。 記述が足らず、申し訳ありません。 >試しにテキストエディタでリソースファイルを開いてこのコントロールを検索して、その直下にエディットコントロールを入れてみても表示されないと思いますが、いかがでしょうか? エディットコントロールの位置・サイズは妥当な数字(適当でなく、ダイアログのサイズ内におさまる数字)を入れ、保存してみました。 保存後にはダイアログエディタ上で表示されています(妥当な場所、サイズ)。 また、exeでも表示されています。

noname#75489
noname#75489
回答No.2

> 自分の拙い知識と技術の範囲内ですが、 > ダイアログリソースとダイアログのウインドウの関連付け、またダイアログ自身のIDも間違ってないと思っております・・・(後述します) たぶんこの辺りが間違っているために意図した結果にならないのだと思います。 > 「ビルド後に反映されない」というのは、 > 一般的にボタンやエディットボックスなどを配置するグラフィカルなエディタ(すみません、正式名称はわかりません)上で、 > ・コントロールの位置を移動する、サイズを変更する > ・コントロールを新しく追加する > などの「変更」を行っても、ビルド後のexeでは「変更」が行われない、ということです。 実行時に表示させているダイアログと手動で編集したダイアログは、そもそも同じものなのでしょうか? リソースエディタで編集する際に、エディットボックスではないID(検索しやすいユニークな名称にする)を持ったコントロールを追加してプロジェクトを保存し、リソースファイルをテキストエディタで開いてそのIDを検索したときに、それが自分で直接追加したエディットコントロールと同じダイアログリソース内にありますか?

noname#62469
質問者

補足

itohoo様、ご回答いただきありがとうございます。 引用で失礼いたします。 >実行時に表示させているダイアログと手動で編集したダイアログは、そもそも同じものなのでしょうか? テキストでの変更はexeに反映できることと、ANo.1の補足内容から、 同じだと思っています。 他に確認する方法があるならば、その限りではないのですが・・・ >リソースエディタで編集する際に、エディットボックスではないID(検索しやすいユニークな名称にする)を持ったコントロールを追加してプロジェクトを保存し、 >リソースファイルをテキストエディタで開いてそのIDを検索したときに、 >それが自分で直接追加したエディットコントロールと同じダイアログリソース内にありますか? VC内のリソースエディタを使用しているため、 同時にResource.hも変更(この場合は追加したIDのナンバーの定義を追加)した上で、プロジェクトを保存、 外部よりテキストエディタにてリソースファイルを開いてみましたが、 問題のダイアログリソース内に存在していました。 ANo.1の補足にも記述しましたが、 ダイアログエディタ(グラフィカルなエディタ)での変更が反映されず、 リソースエディタでの変更は反映されているのです。 (なので、まだ助かっているのかもしれませんが・・・)