/****************/ /* laskurm2.cpp */ /****************/ // Esimerkki Autolaskurista. Projektiin laskurm2.cpp ja laskurm2.rc // Kopioi hakemistoon ..\kuvat tiedosto laskurir.ico // Lisäksi tarvitaan ALI\owl\intlabel.h // // Tehtäviä: // 1) Lisää polkupyörien laskeminen // 2) Laita tallettamisen Message boxiin jokin muu ikoni // (ks. ko. funktion Help) // 3) Muuta ohjelmaa siten, ettei laskureiden ole // mahdollista mennä negatiivisiksi // (vihje: modifioi TIntLaskuri -luokkaa) // 4) Muuta ohjelmaa siten, että aina kun jompikumpi laskuri // tulee täyteen uuden 10, niin tiedosto "talletetaan". // (vihje: lähetä viesti isäikkunalle: // Parent->SendMessage(WM_COMMAND,IDM_FILE_SAVE); // Entä miten saat toiminnon siten, että samaa laskuri voidaan // käyttää sellaisessakin ikkunassa, joka tallettaakin viestillä // CM_SAVEFILE) // 5) Lisää ohjelmaan automaattitalletus 10 sek välein. // 6) Lisää ohjelmaan ominaisuus, jolla automaattitalletuksen // väli voidaan muuttaa. // 7) Lisää ohjelmaan ominaisuus: Save-menu on harmaa, jos tiedostoa // ei tarvitse tallettaa. Joko ymmärrät miksi oli luokka cOnkoTallessa? // 8) Tee luokka cSuunta, jonka avulla voidaan käyttää // suunnan asettamista pelkästään suunta = 1 tai suunta = -1 // ja menuvalinnat vaihtuvat automaattisesti (ota idea cOnkoTallessa // luokasta). Joko ymmärrät miksi jopa tavallisesta kokonaisluvusta // kannattaa tehdä luokka? // 9) Muuta ohjelma oikeasti tiedostoon kirjoittavaksi ja tiedostosta // lukevaksi käyttäen ofstream os(nimi) ja ifstream is(nimi) // tietovirtoja. HUOM! TIntLabel-luokan olio osaa kirjoittaa ja // lukea itsensä tietovirrasta! #include #include #include "laskurm2.rh" #include "owl\intlabel.h" //------------------------------------------------------------------------------ class cOnkoTallessa { // Luokka joka pitää kirjaa tiedoston tallessa olemisesta int ontallessa; public: cOnkoTallessa() : ontallessa(0) {} virtual int aseta(int i) { return ontallessa = i; } virtual operator int() const { return ontallessa; } virtual int operator=(int i) { return aseta(i); } virtual int AsetaOn() { return aseta(1); } virtual int AsetaEi() { return aseta(0); } virtual int Onko() const { return ontallessa; } }; //------------------------------------------------------------------------------ class TIntLaskuri : public TIntLabel { // Laskuri, joka ilmoittaa muutoksen //------------------------------------------------------------------------------ cOnkoTallessa &tallessa; public: TIntLaskuri(cOnkoTallessa &tal,TWindow* parent, int resourceId, uint textLimit = 0, TModule* module = 0) : tallessa(tal),TIntLabel(parent,resourceId, textLimit, module) {} virtual int set(int i) { if ( int(*this) == i ) return i; if ( &tallessa != NULL ) tallessa = 0; return TIntLabel::set(i); } int operator=(int i) { return set(i); } }; //------------------------------------------------------------------------------ class TLaskuriDialog : public TDialog { TIntLaskuri *hal; TIntLaskuri *kal; int suunta; cOnkoTallessa tallessa; TOpenSaveDialog::TData TiedostonAvaus; public: TLaskuriDialog(TWindow *parent, TResId resId, TModule *module = 0) : TDialog(parent,resId,module), TiedostonAvaus(OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST // | OFN_HIDEREADONLY | OFN_LONGNAMES | OFN_EXPLORER ,"Laskuri (*.las)|*.las|Teksti (*.txt)|*.txt|All Files (*.*)|*.*|", 0, "", "*") { hal = new TIntLaskuri(tallessa,this, HAL); kal = new TIntLaskuri(tallessa,this, KAL); suunta = 1; tallessa = 1; } virtual ~TLaskuriDialog() { delete kal; delete hal; Destroy(); } int TeeTyhja() { *hal = 0; *kal=0; return 0; } void BNHAClicked() { *hal += suunta; } void BNKAClicked() { *kal += suunta; } void BNNollaaClicked() { TeeTyhja(); } void BNExitClicked() { /*Destroy();*/ CloseWindow(); } int KirjoitaTiedosto(const char *nimi) { MessageBox(nimi,"Kirjoitetaan"); tallessa = 1; return 0; } int LueTiedosto(const char *nimi) { MessageBox(nimi,"Luetaan"); tallessa = 1; return 0; } int ClearFileName(int ClearName); int SaveFileIfChanged(int ClearName=0); int NewFile(); int SaveFile(); int SaveFileAs(); int OpenAndReadFile(); void CmFileNew() { NewFile(); } void CmFileOpen() { OpenAndReadFile(); } void CmFileSave() { SaveFile(); } void CmFileSaveAs() { SaveFileAs(); } bool CanClose() { return SaveFileIfChanged() == 0; } const char *TitleName(); void CmDec() { TMenu menu(*Parent); suunta = -1; menu.CheckMenuItem(IDM_OPTIONS_DEC, MF_CHECKED); menu.CheckMenuItem(IDM_OPTIONS_INC, MF_UNCHECKED); } void CmInc() { TMenu menu(*Parent); suunta = 1; menu.CheckMenuItem(IDM_OPTIONS_DEC, MF_UNCHECKED); menu.CheckMenuItem(IDM_OPTIONS_INC, MF_CHECKED); } DECLARE_RESPONSE_TABLE(TLaskuriDialog); }; DEFINE_RESPONSE_TABLE1(TLaskuriDialog, TDialog) EV_BN_CLICKED(HA ,BNHAClicked), EV_BN_CLICKED(KA ,BNKAClicked), EV_BN_CLICKED(NOLLAA ,BNNollaaClicked), EV_BN_CLICKED(EXIT ,BNExitClicked), EV_BN_CLICKED(IDCANCEL,BNExitClicked), // Tämä, niin ESCillä ei vahingossa EV_COMMAND(IDM_FILE_NEW ,CmFileNew ), EV_COMMAND(IDM_FILE_OPEN ,CmFileOpen ), EV_COMMAND(IDM_FILE_SAVE ,CmFileSave ), EV_COMMAND(IDM_FILE_SAVEAS ,CmFileSaveAs ), EV_COMMAND(IDM_FILE_EXIT ,BNExitClicked), EV_COMMAND(IDM_OPTIONS_DEC ,CmDec ), EV_COMMAND(IDM_OPTIONS_INC ,CmInc ), END_RESPONSE_TABLE; //------------------------------------------------------------------------------ const char *TLaskuriDialog::TitleName() { // Funktio erottaa tiedoston nimestä pelkän nimiosan esim. otsikkoa varten static char tn[100]; TOpenSaveDialog::GetFileTitle(TiedostonAvaus.FileName,tn,sizeof(tn)); return tn; } //------------------------------------------------------------------------------ int TLaskuriDialog::ClearFileName(int ClearName) { if ( ClearName == 0 ) return 0; TiedostonAvaus.FileName[0] = 0; // Rohkea temppu, mutta sorsien mukaan toimii Parent->SetDocTitle("",0); // ja muutakaan tapaa ei ole annettu! return 0; } //------------------------------------------------------------------------------ int TLaskuriDialog::SaveFileIfChanged(int ClearName /* =0 */) // Jos tiedostoa on muutettu, kysytään sen tallettaminen. // Jos tallettamiseen vastataan YES, talletetaan // jos NO, ei talleteta // jos CANCEL, palautetaan virhe // Jos kaikki onnistuu ja ClearFile=1, niin tyhjennetaan ikkunan otsikko // ja tiedoston nimi ja palautetaan 0. { if ( tallessa ) return ClearFileName(ClearName); char s[256]; wsprintf(s,"%s\nTiedostoa muutettu.\n\nTalletetaanko?", (LPSTR)TiedostonAvaus.FileName); switch ( MessageBox(s,0,MB_APPLMODAL | MB_YESNOCANCEL | MB_ICONEXCLAMATION) ){ case IDYES: if ( SaveFile() ) return 1; //HUOM! Jatketaan seuraavaan case IDNO: return ClearFileName(ClearName); // jos SaveFile == 0 default: return -1; } } //------------------------------------------------------------------------------ int TLaskuriDialog::NewFile() { if ( SaveFileIfChanged(1) ) return 1; TeeTyhja(); return 0; } int TLaskuriDialog::SaveFile() { if ( tallessa ) return 0; if ( strcmp(TiedostonAvaus.FileName," ") < 0 ) return SaveFileAs(); return KirjoitaTiedosto(TiedostonAvaus.FileName); } int TLaskuriDialog::SaveFileAs() { if ( TFileSaveDialog(this, TiedostonAvaus).Execute() != IDOK ) return 1; if ( KirjoitaTiedosto(TiedostonAvaus.FileName) ) return 1; Parent->SetDocTitle(TitleName(),0); return 0; } int TLaskuriDialog::OpenAndReadFile() { if ( SaveFileIfChanged() ) return 1; if ( TFileOpenDialog(this, TiedostonAvaus).Execute() != IDOK ) return 1; if ( LueTiedosto(TiedostonAvaus.FileName) ) return 1; Parent->SetDocTitle(TitleName(),0); return 0; } //------------------------------------------------------------------------------ class TLaskuriApp : public TApplication { public: TLaskuriApp(const char *title) : TApplication(title) {} void InitMainWindow() { #if 0 // Joko normaali raami TFrameWindow *fw = new TFrameWindow(0, Name, new TLaskuriDialog(0, "LASKURI") , true); // Tyyli WS_CHILD #else // Tai vähän koristeellisempi raami johon voi lisätä vaikka mitä TDecoratedFrame *fw = new TDecoratedFrame(0, Name, new TLaskuriDialog(0, "LASKURI") ); fw->SetFlag(wfShrinkToClient); #endif fw->AssignMenu("Paamenu"); fw->SetIcon(this, "IKONI"); SetMainWindow(fw); } }; /********************* Pääohjelma *********************************************/ int OwlMain(int ,char far * []) { return TLaskuriApp("Autolaskuri").Run(); }