sealize()から読込んだファイルからリストビューに内容を反映させるには?

解決


ぺんねーむ  2005-06-06 15:51:28  No: 57702  IP: 192.*.*.*

いつもお世話になっております。
VC++6.0にてAppWizard(SDI)で基本クラスをCListViewにしました。
Serialize()から読込んだファイルのタイトルをリストビューに表示しようと
しているのですが、うまくいきません。何が悪いのでしょうか。
コンパイルエラーは出ません。

Serialize()とOnDraw()の中身は下記の通りです。

void CXXXDoc::Serialize(CArchive& ar)
{
  if (ar.IsStoring())
  {
    // TODO: この位置に保存用のコードを追加してください。
  }
  else
  {
    // TODO: この位置に読み込み用のコードを追加してください。
    CFile *cf;
    cf = ar.GetFile();
    
    CString FileName = cf->GetFileName();
    int FileLen = cf->GetLength();

    int i;
    CString line;
    for (i = 0; i < FileLen; i++)
    {
      ar.ReadString(line);
      if (line == "") break;
    }
    UpdateAllViews(NULL);
  }
}


void CXXXView::OnDraw(CDC* pDC)
{
  CXXXDoc* pDoc = GetDocument();
  ASSERT_VALID(pDoc);
  // TODO: この場所にネイティブ データ用の描画コードを追加します。
  CString strTitle = pDoc->GetTitle();
  CListCtrl& list = GetListCtrl();
  list.InsertItem(0, strTitle, 0);
}

編集 削除
シャノン  2005-06-06 16:05:58  No: 57703  IP: 192.*.*.*

ビューの表示を OnDraw で更新するのは、画像ビューワやテキストエディタなど、GDI 系の API で内容を描画する場合です。
ListView はそうではないので、別の個所で更新しましょう。
どこですべきかは、UpdateAllViews のドキュメントに書いてあります。

編集 削除
ぺんねーむ  2005-06-06 16:48:04  No: 57704  IP: 192.*.*.*

どうもありがとうございます。
MSDNライブラリを見てOnUpdate()に書くのは分かりましたが、
下記のように書くと、
ar : 参照が初期化されずに宣言されています。
とコンパイルエラーになってしまいます。
読み込んだファイルを扱うにはCArchiveは使わないのでしょうか?
何か足りない記述があるのでしょうか?

void CMFCAddressView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) 
{
  // TODO: この位置に固有の処理を追加するか、または基本クラスを呼び出してください
  CArchive& ar;
  CFile *cf;
  cf = ar.GetFile();
  
  CString strTitle = cf->GetFileTitle();
  CListCtrl& list = GetListCtrl();
  list.InsertItem(0, strTitle, 0);  
}

編集 削除
シャノン  2005-06-06 23:24:36  No: 57705  IP: 192.*.*.*

クラスの役割分担をしっかりすることが大切です。
データの管理とファイルの入出力は Document の仕事なので、CArchive を Document の外に持ち出すことはできません。
Document 内に Deserialize したデータを保持しておき、OnUpdate では GetDocument で Document を取得し、それを通じて Document に保持しておいたデータを取り出すのがよいでしょう。

編集 削除
ぺんねーむ  2005-06-07 22:11:59  No: 57706  IP: 192.*.*.*

"Deserializeしたデータを保存しておき"
の部分がいまいちピンと来ないのですが、
どのようなコードになるのでしょうか?

編集 削除
Ryo  2005-06-08 00:35:47  No: 57707  IP: 192.*.*.*

>    CXXXDoc* pDoc = GetDocument();
>    ASSERT_VALID(pDoc);
>    CString strTitle = pDoc->GetTitle();
  最初のレスにあったこっちを使えばいいってことです
  これで、「開く」から選んだファイル名が表示されます

  ・・・が、たぶん、望みの形にはならないと思う
    
  大きなお世話なこと書きます。
  時間の余裕があるならば、
  もう少し基礎を勉強してから先に進むほうがいいと思います。

編集 削除
ぺんねーむ  2005-06-08 23:02:43  No: 57708  IP: 192.*.*.*

おっしゃる基礎というのはMFCの基礎のことでしょうか。
ということは今やろうとしていることは基本的なことでは無いのですね。
正直、MFCに入って見たことの無いクラスや関数が多すぎて参っています。
入門書にはダイアログのリストボックスのことしか書いていなくて、
SDIのリストビューに応用できるかと思ったのですが、甘かったみたいです。

アドバイスどうもありがとうございました。

編集 削除
ぺんねーむ  2005-06-08 23:03:14  No: 57709  IP: 192.*.*.*

解決チェック

編集 削除
Ryo  2005-06-09 01:28:28  No: 57710  IP: 192.*.*.*

>おっしゃる基礎というのはMFCの基礎のことでしょうか。
いえ、まったく違います
CやC++のことです。

>ということは今やろうとしていることは基本的なことでは無いのですね。
答えてもないのに結論をあせらないように。
やろうとしていること自体はMFCの基本的なところだと思います。

>下記のように書くと、
>ar : 参照が初期化されずに宣言されています。
>とコンパイルエラーになってしまいます。
  や
>読み込んだファイルを扱うにはCArchiveは使わないのでしょうか?
  この辺りのこと、きちんと理解したほうがいいということです。

編集 削除