データベースの内容を表示させるには?

[戻る]
天草 銀 [E-Mail] 2002/06/26(水) 11:07:31
ご指導のほど、よろしくお願いいたします。

最初に表示するダイアログ画面のボタンを押して、新しいダイアログ画面を表示させます。
その新しい画面のエディットボックスにデータベースの情報を表示させたいのです。

現在どのようにしているかを以下に示します。

Windows2000
VC++6.0

MFC AppWizard(exe)→プロジェクト名(aaa3)→OK→SDI→次へ→ファイルサポートなしのデ
ータベースビューを選択後、データソースをODBCのままデータベーステーブルをアクセスで作
成したデータベースのテーブルを選択する。→最後まで次へで終了する。
するとダイアログ画面がでてくるのでボタンを1つ配置する。
そして、
 挿入→リソース→Dialog→新規作成
これで出来たダイアログ画面にエディットボックスを1つ配置する。
 挿入→クラスの新規作成→クラス名(db)→基本クラス(CDialog)→OK

最初にでてくる画面のエディットボックスにはデータベースの内容が表示させられるのですが、
新しく出てくる画面ではできないみたいです。
どのようにすれば良いのでしょうか?

wood 2002/06/26(水) 12:29:29
察するにテーブルアクセスは1テーブルのみ用に
作ってあるのではないですか

複数テーブルアクセス用に手を加えるこで
データベース(CDatabase)を取得して
どこでもレコードセット使えるようにできると思いますけど

CRecordSetて見たことありますか
どこでどんな風に使われているか見たほうが良いのでは

データベースプログラミングの参考書籍
結構出てますから参考にしてはどうですか

ここのラウンジでよく発言してますけど
「inside Visual C++」など
参考にしてみてはどうですか
日中は開発環境のあるところにいないのでこんな解答
しかできませんけど

天草 銀 [E-Mail] 2002/06/26(水) 13:01:37
woodさん回答ありがとうございます。

>察するにテーブルアクセスは1テーブルのみ用に
>作ってあるのではないですか

はい。その通りでございます。

>複数テーブルアクセス用に手を加えるこで
>データベース(CDatabase)を取得して
>どこでもレコードセット使えるようにできると思いますけど

複数テーブルアクセス用に手を加えるとは?実際はどのようにしたら良いのでしょうか?

>CRecordSetて見たことありますか

いえ、見たことありません。

>どこでどんな風に使われているか見たほうが良いのでは

どうしたら見れるのでしょうか?

>データベースプログラミングの参考書籍
>結構出てますから参考にしてはどうですか
>ここのラウンジでよく発言してますけど
>「inside Visual C++」など
>参考にしてみてはどうですか
>日中は開発環境のあるところにいないのでこんな解答
>しかできませんけど

ありがとうございますm(_ _)m
会社帰りに本屋に寄って見てみます。

2002/06/26(水) 13:24:51
>新しく出てくる画面ではできないみたいです。
何を根拠に?というか何をやろうとしてエラーになったとか書いていただいたほうが
適切なレスがつくと思います。

私の想像では (FormView)が持っているデータベースの内容をdb(Dialog)から使う方法が
わからないということ だと思うのですが・・・。どうでしょう?

また、画面は以下のように解釈してよいのでしょうか?
  最初にでてくる画面 == (CFormView) + ボタン1個 + エディットボックス
  新しく出てくる画面 == db(CDialog) + エディットボックス
以前の質問と今回の質問の前半では以下のように解釈できるのですが・・・
  最初にでてくる画面 == (CFormView) + ボタン1個
  新しく出てくる画面 == db(CDialog) + エディットボックス

私の読解力では苦しいものがあるのでもう少し質問の仕方を変えていただければと思います。

天草 銀 [E-Mail] 2002/06/26(水) 13:56:29
すみません。なにぶん知識がとぼしいもので・・・

↓このイメージです。

最初にでてくる画面 == (CFormView) + ボタン1個
新しく出てくる画面 == db(CDialog) + エディットボックス


最初にでてくる画面はボタン1個で、そのボタンを押すと、新しい画面が表示し、その画面には
エディットボックスがあり、そのエディットボックスにデータベースの情報を表示させたいので
す。

-----------------------------------------------------------------------

ホントは新しい画面でデータベースの内容を表示させたいのですが、
とりあえず最初の画面でエディットボックスを置き、試してみました。
最初の画面では、エディットボックスを右クリックのClassWizardで変数の追加をすると、
メンバ変数を書くところがコンボボックスになっていてデータベースに割り当てられたような、
選択できるようになっていて、そこからエディットボックスにデータベースのどの部分を
表示するか!みたいなことができたと思います。
でも今度、新しく出る画面のエディットボックスでClassWizardで変数の追加しようとしても、
メンバ変数を書くところがコンボボックスになっておらず、データベースとのリンクがとれて
いない感じです。

こんなんで私の疑問がご理解いただけたでしょうか・・・??

2002/06/26(水) 14:41:56
データベースはやったことがないのでクラスウィザードがそこまでするとは知りませんでした。
で、ちょっとやってみたところクラスウィザードで外部クラスを指定すれば
同様に指定できます。(変な日本語)
最初の画面のクラスをCMyRecView、ダイアログのクラスをCMyDlg1として
クラスウィザードのクラス情報でCMyRecViewの外部クラスを確認し、
CMyDlg1の外部クラスに同じ物(CxxSet)を指定する。外部変数名をつける。
その後エディットボックスのメンバ変数を指定してみてください。
(最初の画面はCFromViewではなくCRecordViewだったみたいですね。)

これで、とりあえずコンパイルエラーが出ると思います。
原因はわりと簡単なことなので自分で考えてみてください。
次に、実行時にエラーになると思います。
その原因についても少し考えてみてください。
ヒントは CMyDlg1の外部クラスの(CxxSet)はポインタ です。

はずしているところがあったらフォローお願いします。>皆々様
夕方また見てみます。

天草 銀 [E-Mail] 2002/06/26(水) 15:39:19
エディットボックスのメンバ変数を指定できました!!

が・・・コンパイルエラーが消せません・・・(ToT;
も少し考えてみます・・・

天草 銀 [E-Mail] 2002/06/26(水) 16:23:52
コンパイルエラーはMyDlg1.cppにインクルードを追加したら消えました。

#include "stdafx.h"
#include "MyRec.h"
#include "MyDlg1.h"

     ↓

#include "stdafx.h"
#include "MyRecSet.h" ←これを追加
#include "MyRec.h"
#include "MyDlg1.h"

あってますかね?(-.-;

実行時のエラーの理由は全然わかりません・・・

天草 銀 [E-Mail] 2002/06/26(水) 16:46:51
ホントにわかんないです・・・(ToT;

>ヒントは CMyDlg1の外部クラスの(CxxSet)はポインタ です。

↑これは実行時エラーのためのヒントですよね?

天草 銀 [E-Mail] 2002/06/26(水) 17:00:34
すみません・・・ホントにわかりません。
教えてください。m(_ _)m
17:45には会社をおん出されてしまいます。
私の家ではインターネットができません(ToT;
だので今やるしかないのです。

2002/06/26(水) 17:03:36
>あってますかね?(-.-;
よくできました。

>↑これは実行時エラーのためのヒントですよね?
そうです。
ポインタなので中身を入れないといけないんです。

実行時のエラーはVCが表示してくれる部分だけ見てもわかりません。
CMyDlg1::DoDataExchange(CDataExchange* pDX) で
m_xxSetの値をクイックウォッチしてみると
きちんと値が入っていないことがわかると思います。

最初の画面(CRecordView)のm_xxSetには値が入ってます。
AppWizard(exe)で作成した時点でVCが入るようにしてくれています。
でも新しく出てくる画面のほうはそこまでしてくれません。
自分でしないと・・・。

明日、インターネットが使えないので書いてしまいますが・・・
CMyRecView::OnButton1()(?みたいなところで)、以下のように
最初の画面のデータベースのデータをダイアログに教えてあげればOKです。
  CMyDlg1 dlg;
  dlg.m_xxSet = m_xxSet;
  dlg1.DoModal();

天草 銀 [E-Mail] 2002/06/26(水) 17:25:12
わーーーーー!?
できました☆
ホントにありがとうございました。m(_ _)m
これからもご指導 お願いいたします。

天草 銀 [E-Mail] 2002/06/26(水) 17:25:40
[[解決]]
解決チェック忘れました(~o~;

? 2002/06/26(水) 22:34:34
解決方法をもう一つ。
>メンバ変数を書くところがコンボボックスになっておらず、データベースとのリンクがとれて
>いない感じです。
ここでコンボボックスはあきらめて、適当に名前をつけておき、
データベースとのリンクを自分で何とかしてやる。
CMyDlg1のメンバ変数をm_Tekitoとし、
CMyRecView::OnButton1()
{
  CMyDlg1 dlg;
  dlg.m_Tekito = m_xxSet->m_XX;  // (m_XXこそ適当?)変数の型は合わせておいてくださ
い。
  dlg1.DoModal();
}
これでも内容の表示はできます。

ただ、エディットボックスの内容を編集した場合の動きが
dlg.m_xxSet = m_xxSet;で渡した場合と違ってきます。
どう違うか、なぜ違うかが理解できれば良いのですが・・・。
どちらを使うかはケースバイケースです。
(また、まだ他にも色々方法があります。)

以上、補足でした。

天草 銀 [E-Mail] 2002/06/27(木) 09:04:18
おはようございます。
わざわざ補足までしていただいて、ありがとうございました。m(_ _)m

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