Управление профилем пользователя в приложении

   
На этом шаге мы рассмотрим алгоритм сохранения данных о пользователе в реестре.

   
На этом шаге мы научимся применять MFC-функции управления профилем пользователя для сохранения
в разделе HKEY_CURRENT_USER\Software\ MyCompany\MyApp параметров созданного на предыдущем шаге
приложения МуАрр. Будем ботать с диалоговым окном Connect to Data Source.
В нем есть флажок, пометив который Вы заставите приложение подключаться к источнику данных при запуске.

   
Перечислим те действия, которые должны выполняться при установке флажка Connect at Application Startup.

  • Установка флажка Connect at Application Startup.
  • Сохраните в реестре имя источника данных (Data Source Name) идентификатор пользователя (User ID), уровень доступа и
    состояние флажка Attempt to connect at application startup. Эти параметры будут сохранены щелчком кнопки Connect.
  • Воспользуйтесь сохраненными в реестре параметрами для инициализации элементов управления диалогового окна
    Connect to Data Source.
  • Измените функцию InitInstance() так, чтобы она определяла состояние флажка
    Attempt to connect at application startup и, если он установлен, открывала диалоговое окно Connect to Data Source,
    позволяя пользователю подключиться к базе данных.

   
Реализуем каждое из указанных действий.

  • Сохранение параметров диалогового окна.
  • Найдите в проекте МуАрр функцию CMyAppApp::OnDataConnect().
  • В следующем операторе условного перехода:
       if (aCD.DoModal() == IDOK)
    

    сразу после вызова AfxMessageBox() добавьте такие строки:

        WriteProfileString("Settings", "User ID", aCD.m_strUserID); 
        WriteProfileInt("Settings", "Access Level", aCD.m_nAccess); 
        WriteProfileInt("Settings", "Connect at Startup", 
                 aCD.m_bConnect ? 1 : 0); 
        WriteProfileString("Settings",   "DSN",   m_strDSN);
    

    где m_strDSN - переменная-член класса СМуАррАрр, значение которой задается в функции
    CConnectDialog::OnOK().


    Рис.1. Измененная функция OnDataConnect()

  • Инициализация элементов управления диалогового окна Connect Data Source.
  • Удалите следующие строки, находящиеся в верхней части функции CMyAppApp::OnDataConnect():
        aCD.m_nAccess = 1; 
        aCD.m_bConnect = TRUE;
    
  • Замените удаленные строки таким текстом:
        aCD.m_nAccess = GetProfileInt("Settings", "Access Level", 1); 
        aCD.m_strUserID = GetProfileString("Settings", "User ID", ""); 
        aCD.m_bConnect = BOOL(GetProfileInt("Settings", 
                   "Connect at Startup",  0));
    

    Полученная таким образом функция OnDataConnect() должна выглядеть так:

    void СМуАррАрр::0nDataConnect()
    {
        CConnectDialog aCD; 
    
        aCD.m_nAccess = GetProfileInt("Settings", "Access Level", 1); 
        aCD.m_strUserID = GetProfileString("Settings", "User ID", ""); 
        aCD.m_bConnect = BOOL(GetProfileInt("Settings", 
                     "Connect at Startup",  0));
        if(aCD.DoModal() == IDOK)
       {
          CString strMessage;
          strMessage.Format("User %s logged in",   aCD.m_strUserID);
          AfxMessageBox(strMessage);
          WriteProfileString("Settings", "User ID", aCD.m_strUserID); 
          WriteProfileInt("Settings", "Access Level", aCD.m_nAccess); 
          WriteProfileInt("Settings", "Connect at Startup", 
                     aCD.m_bConnect ? 1 : 0); 
          WriteProfileString("Settings",   "DSN",   m_strDSN);
        }	
    }
    


    Рис.2. Измененная функция OnDataConnect()

  • Найдите функцию CConnectDialog::OnInitDialog(). Добавьте код, который выделен полужирным
    начертанием:

    BOOL CConnectDialog::OnInitDialog() 
    {
        CDialog::OnInitDialog();
    	
        m_lbDSN. AddString( "Accounts"); 
        m_lbDSN. AddString("Admin"); 
        m_lbDSN.AddString( "Management");
        
        CMyAppApp * pApp = dynamic_cast<CMyAppApp *>(AfxGetApp());
        ASSERT_VALID(pApp);
        CString strDSN = pApp->GetProfileString("Settings", "DSN", "");
        int index = m_lbDSN.FindStringExact(-1,  strDSN); 
        m_lbDSN.SetCurSel(index);
    
        OnUpdateUserid();
    	
       return TRUE; 
       // Возвращаем TRUE при условии,  что не нужно устанавливать 
       // фокус на
       // управляющем элементе EXCEPTION - при этом 
       // OCX Property Pages возвратит FALSE)
    }
    


    Рис.3. Измененная функция OnInitDialog()

       
    Этот код извлекает из профиля имя источника данных и выбирает его в раскрывающемся списке.

  • Открытие диалогового окна Connect to Data Source (если это необходимо).
  • Найдите тело функции CMyAppApp::InitInstance() и добавьте следующий код непосредственно перед
    оператором return в ее конце:

        if (GetProfileInt("Settings",  "Connect at Startup",  0)) 
            OnDataConnect();
    
  • Соберите и запустите приложение МуАрр.
  • Выберите пункт Connect из меню Data и заполните диалоговое окно Connect to Data Source,
    убедившись, что флажок Attempt to connect at application startup установлен.
  • Сохраните параметры, щелкнув Connect.
  • Закройте и перезапустите приложение, чтобы убедиться, что окно Attempt to connect at application startup открывается
    при запуске автоматически, а его параметры восстанавливаются корректно. Кроме того, Вы можете открыть редактор реестра
    и проверить правильность создания профиля.


    Рис.4. Размещение сохраненных данных в реестре

   
Текст измененного приложения можно взять здесь (146,8 Кб).

   
На следующем шаге мы перечислим функции работы с реестром в Win32 API.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий