Kurz6 - Kapitola8

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

8.8 Vkládání dat

Máme připravenou kostru programu, knihovnu SQLite a vytvořenou databázi, nyní už byste asi byli schopni program dodělat sami. Proto budou další kroky komentovány spíše stručně.
Zatím nám program neposkytuje žádný užitek. Protože nemáme do databáze vložená žádná data, nic se nám z ní nepodaří vydolovat. Zkusme tedy doplnit funkci OnNew:
void CPhoNumbsDlg::OnNew() 
{
USES_CONVERSION;
sqlite3 *db;
int rc;
char *zErrMsg = NULL;
CString pom,pomcat;

CNewItem dlg;
// Nejprve volam dialog pro vyplneni dat
dlg.m_Surname.Empty();
dlg.m_Name.Empty();
dlg.m_Phone.Empty();
if(dlg.DoModal() != IDOK) return;
// Pokud dialog skoncil OK, nachystam prikaz pro ulozeni dat do databaze
pom=_T("INSERT INTO TelNumbers VALUES ('");
pom+=dlg.m_Surname;
pom+=_T("','");
pom+=dlg.m_Name;
pom+=_T("','");
pom+=dlg.m_Phone;
pomcat.Format(_T("',%d)"),dlg.m_Category);
pom+=pomcat;

// Zkusim databazi otevrit ...
rc = sqlite3_open("TelNumbs.tnb", &db);
if( rc ){
MessageBox(_T("Can't open database:"));
sqlite3_close(db);
exit(1);
}
// ... a pripravenym prikazem data vlozit
rc = sqlite3_exec(db, W2A(pom), NULL, 0, &zErrMsg);
if( rc!=SQLITE_OK ){
MessageBox(_T("SQL INSERT Error"));
sqlite3_free(zErrMsg);
}

sqlite3_close(db);

// ... a zobrazim upravena data
FillListView();
}
Nyní již byste měli být schopni vkládat data do svého telefonního záznamního bločku. Můžete to otestovat. Když jsem však prováděl testy v emulátoru Pocket PC já, zjistil jsem, že některé české znaky se i přes různé pokusy o nastavení českého prostředí stále zobrazovaly špatně. Nepodařilo se mi odhalit, co je toho příčinou. Např. 'š' a 'ž' byly správné, 'ť' makro W2A spolehlivě odmítalo převést.
Pokud ve vašem případě je vše v pořádku, můžete dál používat makra W2A a A2W. V mém případě jsem dále nehloubal a napsal jsem si dvě jednoduché funkce pro převod řetězců Unicode na Win1250 a naopak.
// Vstupem je klasicky cesky Win1250 char retezec zakonceny "0", vraci CString v Unicode
CString UnicodeCZ(char *str)
{
CString vystup;

for(int i=0;str[i]!=0;i++)
switch (str[i]) {
// Pri kodovani Win1250 - Unicode se musi zamenit vse s hackem a ů
case (char)0xCC : vystup+=(TCHAR)0x011A; break; // Ě
case (char)0xEC : vystup+=(TCHAR)0x011B; break; // ě
case (char)0xD9 : vystup+=(TCHAR)0x016E; break; // Ů
case (char)0xF9 : vystup+=(TCHAR)0x016F; break; // ů
case (char)0xC8 : vystup+=(TCHAR)0x010C; break; // Č
case (char)0xE8 : vystup+=(TCHAR)0x010D; break; // č
case (char)0xCF : vystup+=(TCHAR)0x010E; break; // Ď
case (char)0xEF : vystup+=(TCHAR)0x010F; break; // ď
case (char)0xD2 : vystup+=(TCHAR)0x0147; break; // Ň
case (char)0xF2 : vystup+=(TCHAR)0x0148; break; // ň
case (char)0xD8 : vystup+=(TCHAR)0x0158; break; // Ř
case (char)0xF8 : vystup+=(TCHAR)0x0159; break; // ř
case (char)0x8A : vystup+=(TCHAR)0x0160; break; // Š
case (char)0x9A : vystup+=(TCHAR)0x0161; break; // š
case (char)0x8D : vystup+=(TCHAR)0x0164; break; // Ť
case (char)0x9D : vystup+=(TCHAR)0x0165; break; // ť
case (char)0x8E : vystup+=(TCHAR)0x017D; break; // Ž
case (char)0x9E : vystup+=(TCHAR)0x017E; break; // ž
default : vystup+=(TCHAR)(str[i] & 0xFF); break; // zbyvajici znaky
}
return vystup;
}

// Buffer pro zpracovani klasickeho char retezce pouziteho v prikazu SQLite
// - opet pro jednoduchost (a z lenosti) globalni promenna
char str[512];

// Vstupem je CString v Unicode, vraci ukazatel na vyse uvedeny buffer, kde je ulozen Win1250 retezec
char* CharStrCZ(CString UniStr)
{
int i,kolik;

kolik=(UniStr.GetLength() > 511) ? 511 : UniStr.GetLength();
for(i=0;i<kolik;i++)
switch (UniStr[i]) {
// Pri opacnem kodovani Unicode - Win1250 opet musim zamenit vse s hackem a ů
case (TCHAR)0x011A : str[i]=(char)0xCC; break; // Ě
case (TCHAR)0x011B : str[i]=(char)0xEC; break; // ě
case (TCHAR)0x016E : str[i]=(char)0xD9; break; // Ů
case (TCHAR)0x016F : str[i]=(char)0xF9; break; // ů
case (TCHAR)0x010C : str[i]=(char)0xC8; break; // Č
case (TCHAR)0x010D : str[i]=(char)0xE8; break; // č
case (TCHAR)0x010E : str[i]=(char)0xCF; break; // Ď
case (TCHAR)0x010F : str[i]=(char)0xEF; break; // ď
case (TCHAR)0x0147 : str[i]=(char)0xD2; break; // Ň
case (TCHAR)0x0148 : str[i]=(char)0xF2; break; // ň
case (TCHAR)0x0158 : str[i]=(char)0xD8; break; // Ř
case (TCHAR)0x0159 : str[i]=(char)0xF8; break; // ř
case (TCHAR)0x0160 : str[i]=(char)0x8A; break; // Š
case (TCHAR)0x0161 : str[i]=(char)0x9A; break; // š
case (TCHAR)0x0164 : str[i]=(char)0x8D; break; // Ť
case (TCHAR)0x0165 : str[i]=(char)0x9D; break; // ť
case (TCHAR)0x017D : str[i]=(char)0x8E; break; // Ž
case (TCHAR)0x017E : str[i]=(char)0x9E; break; // ž
default : str[i] = (char)UniStr[i]; break; // zbyvajici znaky
}
str[i]=0;
// Pro kompatibilitu s W2A vracim ukazatel na buffer
return str;
}
Jakmile jsem nahradil makra W2A a A2W těmito funkcemi, bylo již možné vkládat české texty i v emulátoru. Vyzkoušejte a uvidíte sami...
Poznámka: Slovenští čtenáři si tabulky jistě upraví (možná to mají připravené z minulého kurzu :-).

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

  • ... když makro nepracuje, uděláme si vlastní funkci. :-)
 

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.