***View.h をインクルードできません。

[戻る]
H.H 2007/12/14(金) 13:15:40
VC++6.0 MFC SDI
基本クラス CFormView

通信を行うクラスを作成し、通信で受信したデータを
画面に表示したいのですが、どうしたら出来るのか悩んでいます。

@表示方法は解ります。データはちゃんと受信しています。

A通信は、断続的に送られてくるデータをマルチスレッドで受信します。
 受信する度に、画面(エディットボックス)に表示させたいと思っています。

BRS_232CView.h で、エディットボックスの表示とか行うのですが、
 通信を行うクラスで、#include "RS_232CView.h"とするとエラーに
 なってしまい、受信したデータをエディットボックスが使えるRS_232CView
 クラスに送る方法がわかりません。

よろしくお願いします。

とおりすがり 2007/12/14(金) 13:38:08
エラーメッセージがわからないと回答できない。常考(ry
コンパイルエラー?
実行時エラー?

H.H 2007/12/14(金) 14:53:16
とおりすがりさんありがとうございます。

エラーはコンパイルエラーです。

エラーメッセージは以下の通りです。
RS_232CView.h:
error C2065: 'IDD_RS_232C_FORM' : 定義されていない識別子です。
error C2057: 定数式が必要です。
error C2143: 構文エラー : ';' が '*' の前に必要です。
error C2501: 'CRS_232CDoc' : 識別名を宣言するのに、型が指定されていません。
error C2501: 'GetDocument' : 識別名を宣言するのに、型が指定されていません。

試しに、test.cppと言うファイルを作り、
この2行だけ書いた場合でも同じエラーメッセージがでます。
#include "stdafx.h"
#include "RS_232CView.h"

RS_232CView.hは自動生成されたままの状態で、
何も追記していません。

class CRS_232CView : public CFormView
{
protected: // シリアライズ機能のみから作成します。
    CRS_232CView();
    DECLARE_DYNCREATE(CRS_232CView)

public:
    //{{AFX_DATA(CRS_232CView)
    enum{ IDD = IDD_RS_232C_FORM };
    // メモ: ClassWizard によってこの位置にデータ メンバが追加されます。
    //}}AFX_DATA

// アトリビュート
public:
    CRS_232CDoc* GetDocument();

Blue 2007/12/14(金) 14:55:28
RS_232CView.cppの

>#include "RS_232CView.h"

より上に#includeしているヘッダファイルがありませんか?

とおりすがり 2007/12/14(金) 15:00:05
>error C2065: 'IDD_RS_232C_FORM' : 定義されていない識別子です。
推測ですが、そのViewは別のプロジェクトからコピーしてきた
クラスだったりしませんか?

その場合は新しいものに合わせてDocumentを取得するならそのようにする
必要がありますし
リソースの*.h *.rc ファイルを手動で修正・追加しなければなりません。

H.H 2007/12/14(金) 15:47:42
Blueさん、とおりすがりさんありがとうございます。

>RS_232CView.cppの

>>#include "RS_232CView.h"

>より上に#includeしているヘッダファイルがありませんか?


RS_232CView.cppは自動で生成されたままの状態で、
このように書かれています。

#include "stdafx.h"
#include "RS_232C.h"

#include "RS_232CDoc.h"
#include "RS_232CView.h"


>error C2065: 'IDD_RS_232C_FORM' : 定義されていない識別子です。
自動生成されたままで、ただこのRS_232CView.hを
自作のファイルでインクルードするとコンパイルエラーになります。
コメントにするとエラー0になります。

やった事は、VC++6.0で、
MFC Appwizard(exe) で、
作成するアプリケーションを、MDI ⇒ SDI に変更。
基本クラスを、CView ⇒ CFormView に変更。
OKしました。 
これでダイアログに、IDD_RS_232C_FORM が自動で作られていました。

Blue 2007/12/14(金) 15:53:05
>#include "stdafx.h"
>#include "RS_232C.h"
>
>#include "RS_232CDoc.h"
>#include "RS_232CView.h"
より

RS_232CView.h では
・stdafx.h
・RS_232C.h
・RS_232CDoc.h
があるものとして扱われる。
(#include "〜.h"をファイルに記述されているテキストすべてが展開されている
と考えればすぐわかると思います。)

よって、自作ファイル test.cpp でも

#include "stdafx.h"
#include "RS_232C.h"

#include "RS_232CDoc.h"
#include "RS_232CView.h"

とすればうまくいくのではないでしょうか?

PATIO 2007/12/14(金) 17:10:18
基本的にスレッドを跨いでウインドウクラスの操作をするのは
Microsoftが公式にしないようにと書いていますので
受信スレッドにViewクラスのヘッダを書く必要は無いような気がします。
ViewクラスのHWNDだけをスレッドに渡すようにして
ユーザー定義メッセージとかでやり取りするようにする方が
良いと思いますよ。
スレッドが直接エディットボックスの更新をするのではなくて
Viewに対して更新を依頼するようにしてエディットボックスの更新は
Viewがやるようにした方が良いと思います。

H.H 2007/12/14(金) 17:22:15
[[解決]]
Blueさんのありがとうございます。

コンパイル通りました!!
とても勉強になりました。

これから表示させる為のコード書いてみます。
とりあえず見通しがたったので、
解決とします。

本当にありがとうございました。

x 2007/12/15(土) 00:09:36
H.H氏の2回目の質問でresource.hをインクルードしてないことが分かるのに
なんでこんなに回りくどい回答を?

「resource.hが足らない。resource.hをインクルードしてるxxx.hをインクルードすれ
ば?」
の一言で済むのに・・・

古いスレッドには追加発言できません。