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

解決


ぺんねーむ  2005-06-07 00:51:28  No: 57702

いつもお世話になっております。
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-07 01:05:58  No: 57703

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


ぺんねーむ  2005-06-07 01:48:04  No: 57704

どうもありがとうございます。
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-07 08:24:36  No: 57705

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


ぺんねーむ  2005-06-08 07:11:59  No: 57706

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


Ryo  2005-06-08 09:35:47  No: 57707

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

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


ぺんねーむ  2005-06-09 08:02:43  No: 57708

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

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


ぺんねーむ  2005-06-09 08:03:14  No: 57709

解決チェック


Ryo  2005-06-09 10:28:28  No: 57710

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

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

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加