メンバ変数について

[戻る]
mua 2002/11/21(木) 00:21:19
メンバ変数について質問いたします。
私は、qaqaクラスにメンバ変数path_aを定義して、別クラスから呼び出そうと思っている
のですが、どうしてもうまくいかないところがあります。

実行順序は、まずqaqaのダイアログを表示させ、ssaにパスを代入します。
その後、呼び出し側のダイアログを表示させ、ボタンをクリックします。
そうするとssaに代入されたパスに、ファイルアクセスしようとします。

qaqaのヘッダファイルには以下のように定義が記述されました。

// コンストラクション
public:
  char ssa[MAX_PATH];

そしてqaqaのソースファイルには以下のように

  GetModuleFileName( NULL, ssa, MAX_PATH );

と、記述しパスを挿入しました。

呼び出し側のソースファイルには以下のように記述されています。
このファイルオープンは、ダイアログ上のボタンをクリックしたときに実行されます。

  #include "qaqa.h"

  ifstream fin1;
  qaqa myDL;
  fin1.open(myDL.ssa);

この状態で、myDL.ssaの中身を表示させてみると、パスが入っていませんでした。
そして不思議なことに、以下のように記述して、myDL.ssaの中身を表示させてみると、
なんと、パスが表示されたのです。

  qaqa myDL;
  myDL.DoModal();
  fin1.open(myDL.ssa);

これはいったいどういうことなのでしょうか?
なぜmyDL.DoModal();と記述しなければ、パスがmyDL.ssaに入っていないのでしょうか。

mua 2002/11/21(木) 00:24:24
Win2000 VC6.0SP2 MFC
<対象:VC++ラウンジ>

開発環境を書き忘れてしまいました。
大変申し訳ございませんでした。

tib 2002/11/21(木) 00:37:01
qaqaのソースファイルのどこで、GetModuleFileName()を呼んでいるのでしょう?
 コンストラクタ?
 OnInitDialog()?

mua 2002/11/21(木) 20:47:02
OnShowWindow(BOOL bShow, UINT nStatus)で呼んでいます。

不良PG 2002/11/21(木) 21:27:10
qaqa::OnShowWindow関数が呼ばれる前に
fin1.open(myDL.ssa);
を呼ぼうとしているからです

それぞれにブレークポイントを置いて
デバッカで追えばわかるのでは・・

n [E-Mail] 2002/11/21(木) 21:56:22
あなたのやってること(やりたいこと?)は

 ifstream fin1;
 char ssa[ MAX_PATH ];
 GetModuleFileName( NULL, ssa, MAX_PATH );
 fin1.open( ssa );

と同じなのでは?

そうでなければこっちを試してみては?

 CFileDialog fd( TRUE );//「ファイルダイアログ」を使う
 int val = fd.DoModal();//ファイルダイアログを表示し、
 if ( val == IDOK )//ファイルが選択され「開く」ボタンが押されると
 {
  CString path = fd.GetPathName();//選択されたファイルのフルパス(CString形式)
  ifstream fin1;
  fin1.open( LPCTSTR( path ) );//CStringを文字列ポインタに直して渡す
 }

mua 2002/11/22(金) 00:38:26
[[解決]]
やはり、タイミングが問題だったようです。
OnShowWindow関数ではなく、
qaqaのダイアログを表示させる関数内で、ssaに値を代入したら、うまく動きました。
どのような順序で、値が変数に代入されたり、ダイアログが呼ばれたりするのか、
もう少し、考えてみる必要がありそうです。

返信してくださったみなさま、ありがとうございました。

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