Kurz5 - Kapitola3

17. června 2007 v 11:17 | http://www.sweb.cz/kurz_evt/ |  Programování pro WinCE

7.3 Modální dialog a předávání dat

Prozatím budeme ještě pokračovat v přípravě programu k použití. Na to, abychom se mohli spojit s nějakým poštovním serverem, musíme mít informace o tom, kde server hledat, jméno schránky, heslo apod. Protože zadávání těchto dat pokaždé po spuštění programu by bylo nepohodlné, uložíme si nastavení schránky do registru (podobně jako v kurzu 2). MFC zjednodušuje získávání a práci s daty v registru na maximální míru. AppWizard pro vás již připravil standardní nastavení. Vy pouze musíte zvolit jméno, pod kterým budou data v registru uložena.
Otevřete si soubor ClrMail.cpp. Najděte si řádek, který určuje jméno klíče v registru, pod nímž budou data uložena. Upravíme si to např. na:
  
SetRegistryKey(_T("Kurz_eVT"));
AppWizard při vytvoření kostry programu nastavuje jméno klíče standardně na tomto místě.
A nyní přístup do registru využijeme pro získání dat. Nejprve si do třídy CMainFrame doplňte 4 řetězcové proměnné. Všechny budou typu CString a budou se jmenovat:
  • m_strUserName
  • m_strEmail
  • m_strPOP3Server
  • m_strPassword
(Nápověda: Pravé tlačítko myši na CMainFrame -> Add Member Variable -> Variable Type bude CString a jméno již znáte)
Tyto proměnné, které budou udržovat podle jejich jména zřejmé údaje, můžeme naplnit. Ve funkci CMainFrame::CMainFrame jsme přímo vyzýváni k inicializaci proměnných:
  
CWinApp* pApp = AfxGetApp();
m_strUserName = pApp->GetProfileString(_T("ClrMail"),_T("User"),_T("username"));
m_strEmail = pApp->GetProfileString(_T("ClrMail"),_T("Email"),_T("somebody@where.eu"));
m_strPOP3Server = pApp->GetProfileString(_T("ClrMail"),_T("POP3"),_T("pop3.where.eu"));
m_strPassword = pApp->GetProfileString(_T("ClrMail"),_T("Pxsxwx"),_T("xxxxxxxxxx"));
m_strPassword.Delete(0,5);
První parametr funkce GetProfileString udává podklíč (u nás jméno aplikace), druhý jméno proměnné a třetí parametr je "default" hodnota, která je dosazena při selhání pokusu o získání údaje. Za zmínku snad ještě stojí hloupý pokus na posledním řádku o "zašifrování" hesla. Vy si samozřejmě můžete udělat dokonalejší skrývačku. Já jsem pouze nechtěl, aby někdo cizí (nebo vir) při procházení registru narazil na řádek typu Heslo: Mojeheslo :-)
Tento kód by samozřejmě vždy dosadil pouze "defaultní" hodnoty, protože jsme ještě žádné nezadali a neuložili do registru. Pojďme na to...
Přepněte se do resources a přidejte zde další dialog. Jeho ID bude ID_EMAILOPTION a měl by vypadat nějak takto:
obr. 79 Dialog pro nastavení E-mailu
V dialogu jsou použity pouze statické texty a Edit Boxy, jejichž ID není podstatné. Výjimečnou péči si zaslouží Edit Box pro heslo, u kterého zatrhneme Password v Properties. Pokud máme připravenou grafickou stránku, vytvoříme si novou třídu zastřešující tento dialog. Klikněte pravým tlačítkem na ploše dialogu a zvolte Class Wizard. Ten upozorní, že resource nemá svoji třídu a nabídne možnost vytvořit novou třídu. Potvrďte mu to. Jako jméno třídy se nabízí např. CEmailOption. Wizard za nás vytvoří vše potřebné i s vytvořením nového hlavičkového a zdrojového souboru pro tuto třídu.
Abychom mohli pracovat s textovými řetězci, vytvoříme si v této třídě proměnné a svážeme je s příslušným Edit Boxem. Klikněte vždy na příslušném Edit Boxu pravým tlačítkem myši, zvolte ClassWizard a přepněte na záložku Member Variables. Musí být zvýrazněné správné ID a po volbě Add Variable... se otevře dialog pro vložení proměnné. V našem případě stačí jen vyplnit jméno. Abychom si je nepletli zvolte jména proměnných pro jednotlivé Edit Boxy takto:
  • m_UserName
  • m_Email
  • m_POP3Server
  • m_Password
Pokud dialog potvrdíte, budete moci navolit i kontrolu délky zadávaného textu. Nastal čas zapojit nový dialog do programu. Zavolejte Class Wizard na položku E-mail Options v menu a vložte do CMainFrame obslužnou funkci - stačí potvrdit nabízené hodnoty (ID_EMAILOPTION, COMMAND -> Add Function... -> OK). (Class Wizard bude asi chtít potvrdit, že jde o již existující třídu CMainFrame). Do funkce, kterou Wizard připravil pak vložíme následující kód:
void CMainFrame::OnEmailoption() 
{
// Nejprve pripravim dialog a naplnim mu promenne pro Edit Boxy
CEmailOption dlg;
dlg.m_UserName=m_strUserName;
dlg.m_Email=m_strEmail;
dlg.m_POP3Server=m_strPOP3Server;
dlg.m_Password=m_strPassword;
// Zavolam modalni dialog, ktery musi ukoncit uzivatel
if(dlg.DoModal() == IDOK) {
// Pokud uzivatel stiskl OK, prepisu si to do svych promennych
m_strEmail=dlg.m_Email;
m_strPOP3Server=dlg.m_POP3Server;
m_strPassword=dlg.m_Password;
m_strUserName=dlg.m_UserName;
// ... a uschovam data do registru
CWinApp* pApp = AfxGetApp();
pApp->WriteProfileString(_T("ClrMail"),_T("Email"), m_strEmail);
pApp->WriteProfileString(_T("ClrMail"),_T("POP3"), m_strPOP3Server);
pApp->WriteProfileString(_T("ClrMail"),_T("Pxsxwx"), "as5x3"+m_strPassword);
pApp->WriteProfileString(_T("ClrMail"),_T("User"), m_strUserName);
}
}
Abychom však mohli třídu dialogu používat, nezapomeňte vložit hlavičku.
  #include "EmailOption.h"
Pokud vše funguje hladce, měla by se navolená data ukládat do registru a zůstat uložená i pro příští spuštění programu (funguje i v emulátoru).

Co bychom si měli z této lekce zapamatovat?

  • MFC ve třídě CWinApp zjednodušují práci s daty v registru.
  • Class Wizard velmi usnadní práci s daty získávanými z dialogu.
 

Buď první, kdo ohodnotí tento článek.

Nový komentář

Přihlásit se
  Ještě nemáte vlastní web? Můžete si jej zdarma založit na Blog.cz.