連番付与

[戻る]
ロンブー 2008/04/22(火) 22:01:15
タイトルでは分からないと思うのでやりたいことを説明いたします。
エディットボックス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です。

rin 2008/04/22(火) 22:33:55
押された回数を保持する「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の終了とともに消えてしまいます


まずは
「変数」「寿命」「スコープ」といった単語でグーグルで調べてみてください。

wood 2008/04/22(火) 22:42:10
イニシャルダイアログ関数あたりで前回状態をファイルから読み込む
WM_CLOSEか?のイベントを受けたら、現状をファイルに保存する

>void CCountDlg::OnBnClickedSokutei()
>{
> char    cWk0[50];
> int Count = 0;  ←ここ

クリックイベント処理内で初期化したら意味がなくありませんか
CCountDlgクラス内メンバ変数として値を保持して
それを終了時にファイルへ保存したらどうですか

ファイルじゃなくてレジストリやINIファイルでもよいですけど

ロンブー 2008/04/22(火) 22:56:36
rinさん、 woodさん

ありがとうございます。
確かに、お2人がおっしゃるようにボタンが押下される度に初期化しているとおかしい
ですね。

ちなみに、woodさんの言う
>クリックイベント処理内で初期化したら意味がなくありませんか
>CCountDlgクラス内メンバ変数として値を保持して
>それを終了時にファイルへ保存したらどうですか

とはどのようにすればよいのですか?

επιστημη [HomePage] 2008/04/22(火) 23:49:25
>> CCountDlgクラス内メンバ変数として値を保持して
>> それを終了時にファイルへ保存したらどうですか
> とはどのようにすればよいのですか?

どう答えればいいんだろ。
1) 終了時にファイルに書いて。
2) 起動時にファイルから読む。
そんだけ。

※ (2)において「ファイルがなければ0とする」を付け足せばおっけぃ。

wood 2008/04/23(水) 05:31:55
>ちなみに、woodさんの言う
>(1)>クリックイベント処理内で初期化したら意味がなくありませんか
>(2)>CCountDlgクラス内メンバ変数として値を保持して
>(3)>それを終了時にファイルへ保存したらどうですか

(1)再質問は不要と思いますが、理解できないと言うことでしょうか(自分で解決してる
と思いますが?)

(2)CCountDlgクラスヘッダファイルに記述すると良いのではないですか?
 
(3)「επιστημη さん」が回答してくれてますけど
  ファイルの入出力方法がわからないと言うことでしょうか?

文章のどこがどのように分からないのか、自分ことばでも良いので
具体的質問にしてください
(2)のように記述する場所が分からない、とか

ロンブー 2008/04/23(水) 09:01:56
>(2)>CCountDlgクラス内メンバ変数として値を保持して
の方法が分かりません。

>(3)>それを終了時にファイルへ保存したらどうですか
ファイルへ保存というのはファイル名を連番表示したものを出力して
FindfirstやFindnextの関数を使用しなければ0もしくは次の番号から
カウントするようにするということですか?

たいちう 2008/04/23(水) 09:33:34
> >(2)>CCountDlgクラス内メンバ変数として値を保持して
> の方法が分かりません。

メンバ変数について調べてみましたか?
http://www7b.biglobe.ne.jp/robe/
http://www7b.biglobe.ne.jp/robe/cpphtml/index.html


> >(3)>それを終了時にファイルへ保存したらどうですか
> ファイルへ保存というのはファイル名を連番表示したものを出力して
> FindfirstやFindnextの関数を使用しなければ0もしくは次の番号から
> カウントするようにするということですか?

保存したい数値データをファイル名の一部にするよりも、
固定ファイル名のファイルの中に数値データを書き込むのが一般的です。

επιστημη [HomePage] 2008/04/23(水) 09:34:36
>> (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を書けば/読めばいい。

ITO 2008/04/23(水) 10:55:21
> >(2)>CCountDlgクラス内メンバ変数として値を保持して
> の方法が分かりません。
クラスウインドウで「CCountDlg」を右クリック変数の追加

> ファイルへ保存というのはファイル名を連番表示したものを出力して
> FindfirstやFindnextの関数を使用しなければ0もしくは次の番号から
> カウントするようにするということですか?
やり方はいろいろあります。
ファイル名、パス名を固定にしてカウント値を書き込む手もあります。

PATIO 2008/04/23(水) 15:52:30
このところ、同じ内容を何回も書いているような気がする。

C++言語自体の知識が怪しいような気がします。
確かにウインドウの制御とかの方が見た目面白いのは
わかるんですが、保持する方法がメンバー変数にする
という部分がポンと出てこないと言うのは、
C++言語その物の理解が多分足りない所為ではないかと思います。

C++言語の知識とウインドウの制御に関する知識は別物です。
で、MFCでウインドウの制御をするにはC++言語の知識は必須です。

なので、MFCでウインドウの制御を勉強する以前に
C++言語のお勉強をしておかないと掲示板で質問をしても
多分、レスの内容が理解できないと思います。

C++言語の勉強を先にされることをお勧めします。

wood 2008/04/23(水) 20:08:23
基礎学習すっ飛ばしでイキナリ、アプリを作りたい人は

日経BPソフトプレス・マイクロソフト公式解説書
ひと目でわかる シリーズの
Microsoft Visual C++ 2005
アプリケーション開発入門

価格 2860円
くらいの書籍は読みましょう

用語などもかなり身に着くと思いますよ

あんど 2008/04/24(木) 00:13:38
ん〜…
まぁ、みなさんのおっしゃりたいこともわかりますが
簡単に説明するとローカル変数とは
そのエリア内(関数内やスコープ内 -> スコープとはここでは↓)
void CCountDlg::OnBnClickedSokutei()
{
  ■この間がOnBn…のスコープです■
 }
でしか使えません。
さらに

void CCountDlg::OnBnClickedSokutei()
{

}

あんど 2008/04/24(木) 00:24:10
(^^;)間違えて送信してしまった…

ん〜…
まぁ、みなさんのおっしゃりたいこともわかりますが
簡単に説明するとローカル変数とは
そのエリア内(関数内やスコープ内 -> スコープとはここでは↓)
void CCountDlg::OnBnClickedSokutei()
{
  ■この間がOnBn…のスコープです■
 }
でしか使えません。
さらに

void CCountDlg::OnBnClickedSokutei()
{
   int i = 0;     // この関数の大域変数(グローバル変数または関数内ローカル変
数)
   if(…)
      {
          int j = 0; // このifスコープでしか使えません(ローカル変数)
     j = i;     // 変数iはこの関数内ではどこでも使用できる
      }
}
ってな具合です。

メンバ変数に持たすとそのクラスのインスタンス(オブジェクト)を
生成したタイミングから(new)、
オブジェクトが消えるまで生き続ける変数のことです。

応用としてはstatic修飾子などを用いると
静的メンバ変数などとして持たすことも出来ます。
そのあたりの使用方法はもっとクラスの使い方が
わかるようになってからご自分で勉強してみてください

たいちう 2008/04/24(木) 09:33:55
> void CCountDlg::OnBnClickedSokutei()
> {
>     int i = 0;     // この関数の大域変数(グローバル変数または関数内ローカル変数)

このような変数を大域変数・グローバル変数とは呼びません。

あんど 2008/04/24(木) 20:24:06
>たいちう

たまにこういう人がいるので
あえて突っ込んどきますが
グローバル変数の定義をご存知ですか??
上記のような変数を関数内のグローバル変数といいます。
ローカル変数とはその名の通りです。
知らないくせにあんまり突っ込まないほうが
いいですよ。

グローバル変数にも様々なグローバル変数定義がありますので
その一例です。
パッケージ間、クラス間、メソッド間、メソッド内etc…

以上。

通りすがり 2008/04/24(木) 21:05:42
いや、グローバル変数ではないっしょ

ITO 2008/04/24(木) 21:46:40
> グローバル変数にも様々なグローバル変数定義がありますので
> その一例です。
あんどさんのようにこれでもかとゆうように探せば違ったグローバル変数定義
があるのかもしてません。
一般的に皆が納得することで考えればグローバル変数ではないです。
>パッケージ間、クラス間、メソッド間、メソッド内etc…

VBですが、MSDNでのグローバル変数の定義です。
> グローバル変数は、メイン レポート全体にわたって1 つの値を同じ
> メモリ ブロックに格納します。
> したがって、サブレポートの中の式を除き、グローバル変数を宣言した
> すべての式でこの値を使用できます。

2008/04/24(木) 21:59:01
私も始めてみました。

#このまま続けると質問とかけ離れてしまうかもしれないので
#この話は雑談ラウンジのほうがいいかもしれませんね。

#http://rararahp.cool.ne.jp/cgi-bin/zatulng/zatulng.cgi

ITO 2008/04/26(土) 09:50:46
> ファイルへ保存というのはファイル名を連番表示したものを出力して
> FindfirstやFindnextの関数を使用しなければ0もしくは次の番号から
> カウントするようにするということですか?
SDKなら
 CreateFile,ReadFile,WriteFileですね。
MFCなら
 CFile等

CFile サンプル
 http://msdn2.microsoft.com/ja-jp/library/ms177533(VS.80).aspx

メンバ変数はともかくこれをやって見るといいです。
 クラスウインドウで「CCountDlg」を右クリック変数の追加
 ヘッダファイルをみると方法がわかると思います。

あー 2008/04/26(土) 10:53:22
>あんど

>グローバル変数の定義をご存知ですか??
>上記のような変数を関数内のグローバル変数といいます。

C++標準内ではそんなこと定義されてないね

あー 2008/04/26(土) 11:31:48
ISO/IEC14882:2003
ISO/IEC2382
ISO/IEC 9899:1999
http://en.wikipedia.org/wiki/Global_variable
http://en.wikipedia.org/wiki/Local_variable
http://e-words.jp/w/E382B0E383ADE383BCE38390E383ABE5A489E695B0.html
http://e-words.jp/w/E383ADE383BCE382ABE383ABE5A489E695B0.html

辺りざっと眺めてみたけどそんな定義みつからねー
どこで定義されてるのかご教示いただけると大変ありがたい

あー 2008/04/26(土) 11:39:17
おっと別の場所に移ってたのか

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