はじめまして。VC++初心者ですが宜しく御願いいたします。
MFCで、csvファイルを読み込み、その読み込んだファイルをコンボボックスにセットし
て表示させるプログラムを作っています。
CSVファイルを一文字づつ読み込んで、コンマで分解された文字列を配列に格納するとこ
ろまでは出来ました。その後、それをどうやってコンボボックスにセットするのかが
分かりません。過去の質問を見ましたが、リストボックスだったので、新規に質問をさ
せてもらいました(^^ゞ
・・・(ファイルオープンするコードの後からです)
while(fp.ReadString(name)){
//一文字ずつ読みコンマ分解
fm = fn = id = 0;
len = name.GetLength();
for (ix = 0; ix < len; ix++)
{
// 先頭から一文字ずつ検索する
if (name[ix] == ',') //コンマを検索
{
// コンマが見つかった場合
fm = ix - 1; // コンマ直前のIndexを取得
if (fn < fm) // 文字列がちゃんと入ってる場合
DataItem[id] = name.Mid(fn, fm-fn+1);
else // 文字列が空の場合
DataItem[id] = ";
fn = ix + 1; // 次の文字列の開始位置を設定
id++; // 配列格納位置をインクリメント
if (id > 2) // 3つ分の分解が終わったら終了
break;
}
}
break;
}
//file close
fp.Close();
OnEditchangeProject(); //ここでコンボボックス処理に飛ぶ??
たとえばCSVが
11,12,13,14
21,22,23,24
31,32,33,34
であったとき、コンボボックスにはなにを/どのようにセットしたいのかしら?
今のCSVファイルは、例えですが
番号,名前,血液型
1,田中,A
2, 佐藤, A
3,小針, B
というファイル構成になっています。
そのCSVファイルの「名前」だけをコンボボックスに
表示して、選択できるようにしたいのです。。
コンマで囲まれている真ん中だけの文字列だけを、コンボボックスにセットする
という考えでいるのですが。。
ご教授よろしくお願いしますm(__)m
while ( 一行読める間 ) {
真ん中の項目を取り出す
コンボボックスに追加
}
こんだけのことです。
コンボボックスにアイテムを追加する方法はご存知ですよね?
# わかんないなら調べてください
コンボボックスのアイテム追加は、
AddString関数やInsertString関数で出来ます。
文字列を追加する、AddStringでやってみました。
CComboBox* pcmb = (CComboBox*)GetDlgItem(IDC_COMBO_BOX);
pcmb ->AddString(DataItem[id]);
…で、解決したのかしら?
# CSV読み込みは実は何の関係も/問題もなくて、
# 単にコンボボックスへのアイテムの追加方法がわかんなかったダケ?
アドバイスありがとうございます。
まだ全部は解決していませんが、CSV読み込みからのアイテムの設定だったので
文章として全体の流れを書いたので、まどろっこしくなってしまいました^^;
すいませんでした。コンボへのアイテムの追加方法も分からなかったので。
(ただ、実際はCSV読み込みも自信なかったのもあるのですが)
一行づつ読み込んでいて、かつ、一文字づつ読み込み
分解された文字列が配列にはいっているところで
//2番目のアイテムを追加
pcmb ->AddString((LPCTSTR)DataItem[1]);
という処理を、CDialog::OnInitDialog();のところでいれてみましたが
コンボボックスのコントロール自体(OnEditchangeCOMBO())にも、
追加処理を加えないといけないのでしょうか?
質問がわかりにくかったら申し訳ないですm(__)m
> コンボボックスのコントロール自体(OnEditchangeCOMBO())にも、
> 追加処理を加えないといけないのでしょうか?
OnEditchangeCOMBOってなに?
おそらく、必要ないとおもうけど、実際動かして確認してみたのでしょうか?
OnEditchange****は、コンボボックスのアイテム変更がされた後に
呼ばれる関数なので、特に何もする必要ないと思います。
アイテム追加だけで動くはずですが、実際に動かして何か問題が出たのでしょうか?
コンパイルは通ったのですが、
実行するとコンボに2番目のアイテムが追加されないので
「OnEditchange****」に追加するのかと思ったので。
その後、デバッグしてみると、配列のDataItem[1]のところに
「ンンンンンンンンン」と不明な値が入ってしまっていました。
何が原因なのでしょうか・・・?!
えとね、あれこれ欲張らないで、CSVから切り出したとこで
コンボボックスに突っ込むかわりに TRACE か何かで表示させて
確かめりゃええですよ。
何が原因かの前にどこまで正しいかでしょうが。
というか、いちいち配列に入れる必要あるのであろうか?
επιστημη さんのおっしゃった
> while ( 一行読める間 ) {
> 真ん中の項目を取り出す
> コンボボックスに追加
> }
のタイミングでAddStringすればよいのではないでしょうか?
ちなみに DataItem ってCString型配列?
>επιστημηさ
デバッグではなく、TRACEをしてみて
値を確認する方法もあるのですね。
なんせ初心者なので、知識が乏しくてお騒がせしております。
>Blueさん
DataItemはCString型です。
というか、AddStringするタイミングが違うのでは?
CComboBox* pcmb = (CComboBox*)GetDlgItem(IDC_COMBO_BOX);
while( fp.ReadString( name ) )
{
//一文字ずつ読みコンマ分解
fm = fn = id = 0;
len = name.GetLength();
for ( ix = 0; ix < len; ix++ )
{
// 先頭から一文字ずつ検索する
if ( name[ ix ] == ',' ) // コンマを検索
{
// コンマが見つかった場合
fm = ix - 1; // コンマ直前のIndexを取得
if ( fn < fm ) // 文字列がちゃんと入ってる場合
DataItem[ id ] = name.Mid( fn, fm - fn + 1 );
else // 文字列が空の場合
DataItem[ id ] = ";
fn = ix + 1; // 次の文字列の開始位置を設定
id++; // 配列格納位置をインクリメント
if ( id > 2 ) // 3つ分の分解が終わったら終了
break;
}
}
// ★
pcmb->AddString( DataItem[ 1 ] ); // 真ん中のアイテムをリストに追加
}
// file close
fp.Close();