タイトルでは分からないと思うのでやりたいことを説明いたします。
エディットボックス1とボタン2個をセット
↓
ボタン1を押す
↓
エディットボックスに001が描かれる
↓
ボタン2でエディットボックス内をクリア
↓
ボタン1を押す
↓
エディットボックスに002が描かれる
という流れです。
ボタン1の押下回数を記憶してその回数をエディットボックスに表示ということです。
しかし、自分が書いたソースだとアプリケーションを終了し、次の起動時にはまた00
1からになってしまいます。
アプリを終了しても前回の続きからカウントされるようにしたいのですが、よい方法は
ありませんか?
ソースを記します。
//エディットボックス内連番表示
void CCountDlg::OnBnClickedSokutei()
{
char cWk0[50];
int Count = 0;
Count = Count+1;
sprintf(cWk0,ID%4.4d,Count);
m_sampleno.SetWindowText(cWk0); //m_samplenoはエディットボックス1を指す
}
また、同様にエディットボックス2内をテキストファイル保存する際連番で保存したい
のですが、同じようにアプリを終了すると001からになってしまいます。
ご教授お願いいたします。
//ファイル保存
void CCountDlg::OnBnClickedSave()
{
CString str;
int Count;
GetDlgItemText(IDC_TEXT, str); //IDC_TEXTはエディットボックス2を指す
Count = Count+1;
strcpy(cPath,C:\\DATE\\);
CreateDirectory(cPath,NULL);
strcpy(cPath,C:\\DATE\\test%d.txt,Count);
file.Open(cPath,CFile::modeReadWrite|CFile::modeNoTruncate|CFile::modeCreate);
m_text.GetWindowText(str);
file.WriteString(str);
file.Close();
}
という感じです。
なんか2つの質問があるような感じで分かりづらくて申し訳ないのですが、
方法は同じだと思うので、教えてください。
環境はWin XP,VC++2005です。
押された回数を保持する「int Count;」がおかしい。
例えば
void CCountDlg::OnBnClickedSokutei()
{
char cWk0[50];
int Count = 0;
Count = Count+1;
sprintf(cWk0,ID%4.4d,Count);
m_sampleno.SetWindowText(cWk0); //m_samplenoはエディットボックス1を指す
}
これだと、Count変数は、
OnBnClickedSokuteiが呼ばれる度(ボタンが押される度)に、
0に初期化された状態で生成し、
OnBnClickedSokuteiの終了とともに消えてしまいます
まずは
「変数」「寿命」「スコープ」といった単語でグーグルで調べてみてください。
イニシャルダイアログ関数あたりで前回状態をファイルから読み込む
WM_CLOSEか?のイベントを受けたら、現状をファイルに保存する
>void CCountDlg::OnBnClickedSokutei()
>{
> char cWk0[50];
> int Count = 0; ←ここ
クリックイベント処理内で初期化したら意味がなくありませんか
CCountDlgクラス内メンバ変数として値を保持して
それを終了時にファイルへ保存したらどうですか
ファイルじゃなくてレジストリやINIファイルでもよいですけど
rinさん、 woodさん
ありがとうございます。
確かに、お2人がおっしゃるようにボタンが押下される度に初期化しているとおかしい
ですね。
ちなみに、woodさんの言う
>クリックイベント処理内で初期化したら意味がなくありませんか
>CCountDlgクラス内メンバ変数として値を保持して
>それを終了時にファイルへ保存したらどうですか
とはどのようにすればよいのですか?
>> CCountDlgクラス内メンバ変数として値を保持して
>> それを終了時にファイルへ保存したらどうですか
> とはどのようにすればよいのですか?
どう答えればいいんだろ。
1) 終了時にファイルに書いて。
2) 起動時にファイルから読む。
そんだけ。
※ (2)において「ファイルがなければ0とする」を付け足せばおっけぃ。
>ちなみに、woodさんの言う
>(1)>クリックイベント処理内で初期化したら意味がなくありませんか
>(2)>CCountDlgクラス内メンバ変数として値を保持して
>(3)>それを終了時にファイルへ保存したらどうですか
(1)再質問は不要と思いますが、理解できないと言うことでしょうか(自分で解決してる
と思いますが?)
(2)CCountDlgクラスヘッダファイルに記述すると良いのではないですか?
(3)「επιστημη さん」が回答してくれてますけど
ファイルの入出力方法がわからないと言うことでしょうか?
文章のどこがどのように分からないのか、自分ことばでも良いので
具体的質問にしてください
(2)のように記述する場所が分からない、とか
>(2)>CCountDlgクラス内メンバ変数として値を保持して
の方法が分かりません。
>(3)>それを終了時にファイルへ保存したらどうですか
ファイルへ保存というのはファイル名を連番表示したものを出力して
FindfirstやFindnextの関数を使用しなければ0もしくは次の番号から
カウントするようにするということですか?
> >(2)>CCountDlgクラス内メンバ変数として値を保持して
> の方法が分かりません。
メンバ変数について調べてみましたか?
http://www7b.biglobe.ne.jp/robe/
http://www7b.biglobe.ne.jp/robe/cpphtml/index.html
> >(3)>それを終了時にファイルへ保存したらどうですか
> ファイルへ保存というのはファイル名を連番表示したものを出力して
> FindfirstやFindnextの関数を使用しなければ0もしくは次の番号から
> カウントするようにするということですか?
保存したい数値データをファイル名の一部にするよりも、
固定ファイル名のファイルの中に数値データを書き込むのが一般的です。
>> (2)>CCountDlgクラス内メンバ変数として値を保持して
> の方法が分かりません。
void CCountDlg::OnBnClickedSokutei()
{
char cWk0[50];
int Count = 0; // ← これをメンバ変数にしろ
Count = Count+1;
sprintf(cWk0,ID%4.4d,Count);
m_sampleno.SetWindowText(cWk0); //m_samplenoはエディットボックス1を指す
}
>> (3)>それを終了時にファイルへ保存したらどうですか
> ファイルへ保存というのはファイル名を連番表示したものを出力して
> FindfirstやFindnextの関数を使用しなければ0もしくは次の番号から
> カウントするようにするということですか?
ハァ? テキトーなファイル、たとえばCount.datなんてファイルこさえて、
そん中にCountを書けば/読めばいい。
> >(2)>CCountDlgクラス内メンバ変数として値を保持して
> の方法が分かりません。
クラスウインドウで「CCountDlg」を右クリック変数の追加
> ファイルへ保存というのはファイル名を連番表示したものを出力して
> FindfirstやFindnextの関数を使用しなければ0もしくは次の番号から
> カウントするようにするということですか?
やり方はいろいろあります。
ファイル名、パス名を固定にしてカウント値を書き込む手もあります。
このところ、同じ内容を何回も書いているような気がする。
C++言語自体の知識が怪しいような気がします。
確かにウインドウの制御とかの方が見た目面白いのは
わかるんですが、保持する方法がメンバー変数にする
という部分がポンと出てこないと言うのは、
C++言語その物の理解が多分足りない所為ではないかと思います。
C++言語の知識とウインドウの制御に関する知識は別物です。
で、MFCでウインドウの制御をするにはC++言語の知識は必須です。
なので、MFCでウインドウの制御を勉強する以前に
C++言語のお勉強をしておかないと掲示板で質問をしても
多分、レスの内容が理解できないと思います。
C++言語の勉強を先にされることをお勧めします。
基礎学習すっ飛ばしでイキナリ、アプリを作りたい人は
日経BPソフトプレス・マイクロソフト公式解説書
ひと目でわかる シリーズの
Microsoft Visual C++ 2005
アプリケーション開発入門
価格 2860円
くらいの書籍は読みましょう
用語などもかなり身に着くと思いますよ
ん~…
まぁ、みなさんのおっしゃりたいこともわかりますが
簡単に説明するとローカル変数とは
そのエリア内(関数内やスコープ内 -> スコープとはここでは↓)
void CCountDlg::OnBnClickedSokutei()
{
■この間がOnBn…のスコープです■
}
でしか使えません。
さらに
void CCountDlg::OnBnClickedSokutei()
{
}
(^^;)間違えて送信してしまった…
ん~…
まぁ、みなさんのおっしゃりたいこともわかりますが
簡単に説明するとローカル変数とは
そのエリア内(関数内やスコープ内 -> スコープとはここでは↓)
void CCountDlg::OnBnClickedSokutei()
{
■この間がOnBn…のスコープです■
}
でしか使えません。
さらに
void CCountDlg::OnBnClickedSokutei()
{
int i = 0; // この関数の大域変数(グローバル変数または関数内ローカル変
数)
if(…)
{
int j = 0; // このifスコープでしか使えません(ローカル変数)
j = i; // 変数iはこの関数内ではどこでも使用できる
}
}
ってな具合です。
メンバ変数に持たすとそのクラスのインスタンス(オブジェクト)を
生成したタイミングから(new)、
オブジェクトが消えるまで生き続ける変数のことです。
応用としてはstatic修飾子などを用いると
静的メンバ変数などとして持たすことも出来ます。
そのあたりの使用方法はもっとクラスの使い方が
わかるようになってからご自分で勉強してみてください
> void CCountDlg::OnBnClickedSokutei()
> {
> int i = 0; // この関数の大域変数(グローバル変数または関数内ローカル変数)
このような変数を大域変数・グローバル変数とは呼びません。