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()
{

}

И заголовок

Основной.ч

#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();

};

person includee666    schedule 22.07.2014    source источник
comment
Большое спасибо за ответ. Да, мое приложение основано на диалоговом окне, так как я могу объявить элемент? я имею в виду, не могли бы вы показать мне item.m_Password = m_csPassword; с более подробной информацией, потому что для item это объявление не имеет класса хранения или спецификатора типа. Спасибо еще раз.   -  person includee666    schedule 22.07.2014
comment
Как это ? элемент CMySettingsItem; элемент.Id = конфигурация.RootId; item.m_Password = m_csPassword; конфигурация.Профиль.Добавить(элемент); Но это не сработало, но я получаю пустой ключ реестра.   -  person includee666    schedule 22.07.2014
comment
Хорошо, я понял, это сработало, это item.Password = m_csPassword; и работал. Большое спасибо за помощь.   -  person includee666    schedule 22.07.2014


Ответы (1)


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

Например:

item.m_Password = m_csPassword;
person TheUndeadFish    schedule 22.07.2014