メンバ変数について質問いたします。
私は、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に入っていないのでしょうか。
Win2000 VC6.0SP2 MFC
<対象:VC++ラウンジ>
開発環境を書き忘れてしまいました。
大変申し訳ございませんでした。
qaqaのソースファイルのどこで、GetModuleFileName()を呼んでいるのでしょう?
コンストラクタ?
OnInitDialog()?
OnShowWindow(BOOL bShow, UINT nStatus)で呼んでいます。
qaqa::OnShowWindow関数が呼ばれる前に
fin1.open(myDL.ssa);
を呼ぼうとしているからです
それぞれにブレークポイントを置いて
デバッカで追えばわかるのでは・・
あなたのやってること(やりたいこと?)は
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を文字列ポインタに直して渡す
}
やはり、タイミングが問題だったようです。
OnShowWindow関数ではなく、
qaqaのダイアログを表示させる関数内で、ssaに値を代入したら、うまく動きました。
どのような順序で、値が変数に代入されたり、ダイアログが呼ばれたりするのか、
もう少し、考えてみる必要がありそうです。
返信してくださったみなさま、ありがとうございました。