こんにちわ!
WinXP VC++ Visual Studio6.0
(MFC)ダイアログベースで開発をしております。
まだVC++をはじめて1月たらずの初心者ですが、よろしくお願いします。
質問内容ですが、キーワード(4桁の数値など)をエディットBOXに入力することで
そのキーワードに関連するデータを読み込むような画面を開発しています。
例えば、以下のようなデータ(data.csv)があります。
*************
番号 名前 金額
101 みかん 100円
105 りんご 200円
512 いちご 50円
4235 バナナ 10000円
*************
ダイアログ画面にエディットボックスを3つ配置して
番号を入力することで名前の欄と金額の欄に該当する値を読み込みたいのです。
このような画面を作成するには、どのようなコードを記述したらよいのか
ご教授お願い致します。
要点がよくわからないです。
どこまでできるのか?
どこがわからないのか?
等具体的に質問はできませんか?
掲示板では1から10まで説明することは不可能ですし、
説明した後に、それはできますみたいな無駄なやり取りをなくすためにも
やりたいことを明確にしてください。
・基本的なMFCアプリケーションの操作はできるのか?
(エディットボックスに文字列を入れるとか、ボタンを押したときに何かする
コードを書くとか)
・ファイルの操作はできるのか?
(テキストファイルを読み込んで、カンマ区切りに要素を分割して、キーとなる
値から一定の情報を取得できるのか?)
場合によっては読み込みオンリーならADOあたりを使うと楽かもしれませんけど。
(csvファイルというデータベースとして、クエリを発行する)
説明不足かつ、返答が遅くなりすみませんでした。
>・基本的なMFCアプリケーションの操作はできるのか?
> (エディットボックスに文字列を入れるとか、ボタンを押したときに何かする
> コードを書くとか)
かなり基本的な部分(SetWindowsTextや多少のボタンクリックイベントなど)は使えま
す。
>・ファイルの操作はできるのか?
> (テキストファイルを読み込んで、カンマ区切りに要素を分割して、キーとなる
> 値から一定の情報を取得できるのか?)
一番困っている部分です(涙)
ファイルを読み込んで開く方法はいくつか発見することが出来ました。
しかし、「値を入力して、それに関するデータを読み込んで表示する」
部分の方法がさっぱりわかりません。
そこが、いちばんプログラマの腕の見せ所なんですけどね。
まずは、どのようにデータを持つかを考えないといけないです。
>番号 名前 金額
から、これらをひと塊としてデータを持つようにするため、
クラスもしくは構造体を使います。
struct Commodity // 商品構造体
{
int number; // 番号
CString name; // 名前
int price; // 値段
};
というような構造体を使って、csvファイルの1行に1つづつデータが出来上がります。
csvファイルの行数が可変であれば、動的配列を、固定であれば単に構造体の配列を
用意してファイル読み込み時に入れていきます。
動的配列はMFCの場合 afxtempl.h のCArrayをつかうと便利です。
具体的に
CArray<Commodity, Commodity> lst // --> ダイアログクラスのメンバとかにする
Commodity c;
CString num, name, price;
while (ファイルの終わりか?)
{
ファイルから1行読み込む
カンマで分割する
(num,name,priceにそれぞれ分割した文字列を入れる)
// 分割した内容を c に入れる
c.number = atoi(num);
c.name = name;
c.prive = atoi(price);
// 動的配列に追加
lst.Add(c);
}
てな感じで構築して、
>キーとなる値から一定の情報を取得
の部分は読み込んだリストから、シーケンシャルリサーチして取り出す。
for (int i = 0; i < lst.GetSize(); ++i)
{
// キーとなる値と同じか
if (lst[i].number == key_number)
{
// lst[i]が探していたもの。
lst[i].nameを表示
lst[i].priceを表示
}
}
ここで、シーケンシャルリサーチを使っているので
データ数が増えると速度に問題があるかもしれません。
そのときはCMap等を使って、最初からkeyとデータを使ってリストを作るようにします。
Blueさん、返答ありがとうございます。
腕を見せるどころか、まだ腕すらない状態で申し訳ないです。
>ファイルから1行読み込む
>カンマで分割する
>(num,name,priceにそれぞれ分割した文字列を入れる)
とありますが、VC++2005 の参考書に以下のようなソースが記載されていました。
類似した記述だと思うのですが、違うでしょうか?
6.0の記述方法とは異なっていて、現状の自分には違う言語にすら見えてしまい、6.0にあ
わせて直せないのですが、
//ファイル読込み
array<wachar_t>^ separator = {','};
Stirng^ data;
this->report->Clear();
while(( data = reader->Readline()) != nullptr){
//カンマ区切りで分解
array<string^>^ split = data->Split(separator);
それと、
>while (ファイルの終わりか?)
の部分は、どういう意味なのでしょうか?
> 類似した記述だと思うのですが、違うでしょうか?
まったく違います。
VC6の場合ほぼ参考にしてはいけないでしょう。
(C#やVB.NETのほうが近い)
>自分には違う言語にすら見えてしまい
まぁ近いですね。C++/CLIと呼ばれるMicrosoft独自の言語です。
C++/CLIならば
System::String::Splitが便利ですが、VC6.0MFCでは使えないので、
CString::MidとCString::Findあたりをつかい自前で分割する必要があります。
(char型配列に一度入れて、strtokを使うやり方もありでしょうね。)
>の部分は、どういう意味なのでしょうか?
ファイルを開くとこもできないのでしょうか?
MFCの場合CStdioFileをつかいReadStringで1行ずつ読み込むのが簡単です。
CStdioFile f(_T(data.csv), CFile::modeRead | CFile::typeText);
CString buff;
while (f.ReadString(buff))
{
// カンマで分割
> // 分割した内容を c に入れる
> c.number = atoi(num);
> c.name = name;
> c.prive = atoi(price);
>
> // 動的配列に追加
> lst.Add(c);
}
>類似した記述だと思うのですが、違うでしょうか?
ん? MFCを使うか、テンプレートを使うかの違いだと思います。
>>while (ファイルの終わりか?)
>の部分は、どういう意味なのでしょうか?
ディスクファイルにデータがないのに読もうとすると例外のエラーになりソフト
が強制終了します。
MFC・SDK・C/C++標準関数のディスクI/O関係にはファイルの終わりを
調べる関数があります。
MFCなら「CFile」SDKなら「CreateFile」ですね。
またVC2000ならC++CLI用の専用の標準関数もあるはずです。
いろいろ調べてみてください。
> 6.0の記述方法とは異なっていて、現状の自分には違う言語にすら見えてしまい
違う言語です。C++/CLIで書かれています。
>またVC2000ならC++CLI用の専用の標準関数もあるはずです。
VC6.0ですね、失礼しました。
Buleさん、ITOさん、επιστημηさん、ご返答ありがとうございました。
2005の参考書を見ても、6.0の参考にはあまりならないと言うことですね・・・。
ずっと、2005の本を見て、6.0で作ろうとしていたので、ただでさえわからないのに
混乱していました。
# ISO/IECにはなれなかったものの、C++/CLIには一応ECMA-372という規格があるので、
# MS独自は言いすぎかも…(実質MSの.NET用なことは否定しませんが)