我现在有三个对话框,Information类、Login类、图书管理系统Dlg类,我设置了两个用户,现在我想在Information对话框中判断登陆的是哪一个用户,然后根据用户不同在Information对话框中显示不同的信息,我该如做?之前是声明了一个全局变量,然后通过C图书管理系统App *app=(C图书管理系统App *)AfxGetApp();//生成指向应用程序类的指针,接着app->变量名来使用,之前能用,现在一到读取这个变量的值时程序就崩溃了。
此外,我的信息是以结构体记录的形式存储的,现在只想存两条记录,我想以结构体数组的形式来存储,不用文件,这样比较省事。但是牵涉到信息修改的问题,当时信息能够修改,也能在编辑框中显示,但是如果关掉信息对话框,再打开,依然是原来的信息,可能是因为我是在Information对话框的初始化函数中给两条记录赋值的原因。代码如下:
Information.cpp
#include "stdafx.h"
#include "图书管理系统.h"
#include "Information.h"
#include "afxdialogex.h"
#include "struct.h"
#include "LoginDlg.h"
C图书管理系统App *app=(C图书管理系统App *)AfxGetApp(); //生成指向应用程序类的指针
ADMINSTRATORLIST Adms[20]={"\0"};
// CInformation 对话框
IMPLEMENT_DYNAMIC(CInformation, CDialog)
CInformation::CInformation(CWnd* pParent /*=NULL*/)
: CDialog(CInformation::IDD, pParent)
, m_AdmID(_T(""))
, m_AdmName(_T(""))
, m_AdmGender(_T(""))
{
m_AdmAge = _T("");
}
CInformation::~CInformation()
{
}
void CInformation::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT1, m_AdmID);
DDX_Text(pDX, IDC_EDIT2, m_AdmName);
DDX_Text(pDX, IDC_EDIT3, m_AdmGender);
DDX_Text(pDX, IDC_EDIT4, m_AdmAge);
}
BEGIN_MESSAGE_MAP(CInformation, CDialog)
ON_BN_CLICKED(IDC_BUTTON_Update, &CInformation::OnBnClickedButtonUpdate)
END_MESSAGE_MAP()
BOOL CInformation::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: 在此添加额外的初始化
strcpy(Adms[0].AdmID,"001");
strcpy(Adms[0].AdmName,"梁朝伟");
strcpy(Adms[0].AdmGender,"男");
strcpy(Adms[0].AdmAge,"18");
strcpy(Adms[1].AdmID,"002");
strcpy(Adms[1].AdmName,"王祖贤");
strcpy(Adms[1].AdmGender,"女");
strcpy(Adms[1].AdmAge,"18");
ShowAdmInfo();
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
void CInformation::OnBnClickedButtonUpdate()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData();
if(app->userflag==1)
{
strcpy(Adms[0].AdmID,m_AdmID);
strcpy(Adms[0].AdmName,m_AdmName);
strcpy(Adms[0].AdmGender,m_AdmGender);
strcpy(Adms[0].AdmAge,m_AdmAge);
MessageBox("更新信息成功!");
}
else if(app->userflag==2)
{
strcpy(Adms[1].AdmID,m_AdmID);
strcpy(Adms[1].AdmName,m_AdmName);
strcpy(Adms[1].AdmGender,m_AdmGender);
strcpy(Adms[1].AdmAge,m_AdmAge);
MessageBox("更新信息成功!");
}
ShowAdmInfo();
}
void CInformation::ShowAdmInfo(void)
{
if(app->userflag==1)
{
m_AdmID=Adms[0].AdmID;
m_AdmName=Adms[0].AdmName;
m_AdmGender=Adms[0].AdmGender;
m_AdmAge=Adms[0].AdmAge;
UpdateData(false);
}
else if(app->userflag==2)
{
m_AdmID=Adms[1].AdmID;
m_AdmName=Adms[1].AdmName;
m_AdmGender=Adms[1].AdmGender;
m_AdmAge=Adms[1].AdmAge;
UpdateData(false);
}
}
请问我该怎么解决或者怎么实现?
CXXXApp类中有个全局唯一的类对象theApp;你可以使用它~
以f5而不是ctrl+f5方式调试程序,程序遇到异常会停下来,贴出错误行,检查下其中每个变量指针是否正确。
1,你的需求我没有太搞明白,我先假设我的理解是正确的。
2,我认为根据你描述的情况,最终实现模型可能是:
a,Login类作为终端信息输入接口,通过刷卡等形式将一个编号或者其他信息录入
b,当login录入信息后,根据索引将该索引下的具体信息显示到infomation窗口上,如照片、姓名、图书借阅记录等。
3,以我的假设为前提,我认为你应该这样做。
a,在infomation类里设计一个读写接口,专门读写你需要的数据
b,假设你使用数据库存储的用户详细信息。使用全局数组也行。
c,在login类和infomations类之间做一条消息,由login发送到infomations,只带索引即可。
d,在login类里做消息发送。
e,在infomations类里做消息处理,当收到login发来的消息,先查询数据数组/库,当数据存在则刷新infomations窗口显示的数据否则报错。
4,你的代码我搭眼没看明白,所以重新写吧。。。
祝好!