MFC как получить CString из другого класса в класс CRegSettings

У меня проблема с сохранением Изменить текст в реестре.
Я сделал в основном классе сохранить, чтобы зарегистрировать текстовые данные, и я сделал другой класс реестра, который вызывает
CRegSettings, так что этот класс делает перечисление каждый раз, когда я нажимаю кнопку, как
MyItem \ 0, MyItem \ 1.

моя проблема в том, что я не могу получить этот текст CString в этот класс CRegSettings, этот класс не имеет DoDataExchange, поэтому, когда я сделал это, каким-то образом его очередь на ошибку «CMySettingsItem :: DoDataExchange ‘: рекурсивный на всех путях управления», поэтому он не работает, и я не могу CString из основного класса в этот класс, кто-нибудь знает, как это сделать? Благодарю.

Вот мои коды.

main.cpp

// CNewConnectionDlg dialog

IMPLEMENT_DYNAMIC(CNewConnectionDlg, CDialog)CNewConnectionDlg::CNewConnectionDlg(CWnd* pParent /*=NULL*/)
: CDialog(CNewConnectionDlg::IDD, pParent)
, m_csIp(_T("localhost"))
, m_csPort(_T("22"))
, m_csUsername(_T("Username"))
, m_csPassword(_T("Password"))

{

}

class CMySettingsItem : public CRegSettings
{
public:
DWORD Id;

CString m_Password;
CString Password;BEGIN_REG_MAP(CMySettingsItem)
REG_ITEM(Id, 1)
REG_ITEM(Password, m_Password)
END_REG_MAP()
protected:
virtual void DoDataExchange(CDataExchange* pDX);

};

// Sample application configuration
class CMySettings : public CRegSettings
{
public:

DWORD RootId; // DWORD option
CString RootName; // String option
std::string FullName;

// list of options (CMySettingsItem)
CSimpleArray<CMySettingsItem> Profile;  // ATL CSimpleArray
//std::list<CMySettingsItem> ProfileList;   // STL list

CMySettingsItem SubItem; // Subitem test

BEGIN_REG_MAP(CMySettings)
REG_ITEM(RootId, 1)
REG_ITEM(RootName, "Profile")
REG_ITEM_STL(FullName, "Profile")
REG_ITEM_SIMPLE_ARRAY(Profile)
//REG_ITEM_LIST(ProfileList)
END_REG_MAP()
};

void CMySettingsItem::DoDataExchange(CDataExchange* pDX)
{
CMySettingsItem::DoDataExchange(pDX);

DDX_Text(pDX, IDC_PASSWORD, m_Password);}

CNewConnectionDlg::~CNewConnectionDlg()
{
AfxGetApp()->WriteProfileString("Settings", "UserName", m_csUsername);
AfxGetApp()->WriteProfileString("Settings", "IP",       m_csIp);
AfxGetApp()->WriteProfileString("Settings", "Port",     m_csPort);
AfxGetApp()->WriteProfileString("Settings", "Password", m_csPassword);CMySettings configuration(HKEY_CURRENT_USER, "Software\\MyItem\\Item");

// Load configuration
if(configuration.Load() != ERROR_SUCCESS)
printf("failed to load\n");

// Use loaded configuration
configuration.RootId++;

CMySettingsItem item;
item.Id = configuration.RootId;

configuration.Profile.Add(item); // CSimpleArray
//configuration.ProfileList.push_back(item); // list

// Save new configuration
if(configuration.Save() != ERROR_SUCCESS)
printf("failed to save\n");}void CNewConnectionDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);

DDX_Text(pDX, IDC_IP, m_csIp);
DDV_MaxChars(pDX, m_csIp, 255);

DDX_Text(pDX, IDC_PORT, m_csPort);
DDV_MaxChars(pDX, m_csPort, 6);

DDX_Text(pDX, IDC_USERNAME, m_csUsername);
DDV_MaxChars(pDX, m_csUsername, 20);

DDX_Text(pDX, IDC_PASSWORD, m_csPassword);
DDV_MaxChars(pDX, m_csPassword, 255);

}BEGIN_MESSAGE_MAP(CNewConnectionDlg, CDialog)
ON_EN_CHANGE(IDC_PASSWORD, &CNewConnectionDlg::OnEnChangePassword)
ON_EN_CHANGE(IDC_USERNAME, &CNewConnectionDlg::OnEnChangeUsername)
END_MESSAGE_MAP()

void CNewConnectionDlg::OnEnChangePassword()
{

}void CNewConnectionDlg::OnEnChangeUsername()
{

}

И заголовок

main.h

#pragma once
#include "InnerDlg.h"#include <afxtempl.h>

class CNewConnectionDlg : public CDialog
{
DECLARE_DYNAMIC(CNewConnectionDlg)

public:
CNewConnectionDlg(CWnd* pParent = NULL);   // standard constructor
virtual ~CNewConnectionDlg();

CNewConnectionDlg(const CString sSection, const CString sArrayName);

// Dialog Data
enum { IDD = IDD_NEWCONNECTION };public:
virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

protected:
DECLARE_MESSAGE_MAP()
public:

// The server ip or name
CString m_csIp;

// The negotiating port on the server
CString m_csPort;

// Username for the server
CString m_csUsername;

// Password for the server
CString m_csPassword;afx_msg void OnEnChangePassword();
afx_msg void OnEnChangeUsername();

};

1

Решение

DoDataExchange предназначен только для классов пользовательского интерфейса, таких как ваш класс на основе CDialog. Он используется для соединения элементов пользовательского интерфейса на экране с переменными-членами этого объекта. Таким образом, ваши данные находятся в членах m_csIp, m_csPort, m_csUsername и m_csPassword. Вам просто нужно назначить его соответствующему члену вашего CMySettingsItem пример.

Например:

item.m_Password = m_csPassword;
0

Другие решения


По вопросам рекламы [email protected]