/**************/ /* scaling.cpp*/ /**************************************************************************** PROGRAM: scaling.cpp PURPOSE: Vaihtaa matkoja AUTHOR: Vesa Lappalainen 10.11.1996 CHANGES: 11.11.1996 - alaspäin yhteensopivuus OWL 5.0: - vaihtaja.rc: - #ifdef __WIN32__ / erikoistyyli ehdolliseksi EXSTYLE WS_EX_DLGMODALFRAME #endif - (ei yhteensopivuus, vaan rekursion esto:) myös rahanvaihtodialogiin ID_SCALE ja ID_NAAPURI, mutta pois näkyvistä - scaling.cpp: - if ( DeScale <= 0.0 ) DeScale = 1.0; => if ( DeScale.get() <= 0.0 ) DeScale = 1.0; //ei osaa autom => double - vaihtaja.cpp: - #if (__BORLANDC__ < 0x500) // Muutetaan ehdolliseksi SetIconSm(GetModule(),IDI_IKONI); #endif - MoveWindow ei toimi konstruktorissa => Attr.X = 10; Attr.Y = 20; Attr.W = 400; Attr.H = 400; (Käännösajat: 16-bit 32-bit ( 90 MHz Pentium, 48 MB RAM ) BC 4.52 36 s 46 s ( Build node ) BC 5.01 36 s 52 s ) Ongelmia OWL toteutuksessa: 1) Konstruktorissa (muodostaja) ei voi ladata esim. combo-boxin arvoja 2) SetupWindow:ssa PITÄÄ muistaa kutsua perittyä SetupWindowta 3) TDoubleEditiä ei saanut ottamaan omaan arvoaan automaattisesti. Jätettiin siis raukkamaisesti siten, että käyttäjä on vastuussa arvon virkistämisestä kun saa EN_CHANGE -viestin. Tietysti jos Get() tehtäsiin aina lukemaan näytössä oleva arvo, niin tämä voitaisiin välttää, mutta sitten arvon suora käyttö laskuissa olisi hidasta. 4) Jos DoubleEditissä oli muodostajassa alkuarvon asetus esim. 200000.0 niin rekursion eston takia sijoitus DeScale = 200000.0 ei auttanutkaan enää SetupWindowssa :-) Siispä DoubleEditistä poistettiin se, että muodostajassa voisi jo antaa alkuarvon. 5) Rekursio (mistä tulisi?) on poistettu siis silä, että DoubleEdit ei muuta näyttöä, jos sama arvo (tietyllä tarkkudella) yritetään laittaa uudelleen. Tosin tämä ei olut ongelma enää tänä vuonna, sen kanssa olin erehtynyt jo aikaisemmin! Tehtäviä: 1) Tee luokka TFactorBox, joka peritään ComboBoxista ja jonka avulla kerroin saadaan suoraan tyylin kerroin = CbVasen; Saat tehdä samanlaisen Refresh-tempun kuin TDoubleEditissäkin on tehty 2) Tee sama RadioButtonille RbNaapuri, eli luokka jonka ansiosta radiobuttonia voi käyttää if ( RbNaapuri ) ... 3) Ota tämän tiedoston yleiskäytöiset osat ja tee niistä perittävä luokka vastaaviin skaalaustapauksiin. Eli jokaisessa skaalaustapauksessa (mittakaava, rahanvaihto, painot) tarvitsee vain alustaa comboboxit eri tavalla. ****************************************************************************/ #include #include #include #include #include #include #include "scaling.h" #include "owl\doubedit.h" // vrt. owl\IntLabel.h #include "vaihtaja.rh" //------------------------------------------------------------------------------ class cUnit { const char *unit; double factor; public: cUnit(const char *u, double f) : unit(u), factor(f) {} const char *Unit() const { return unit; } double Factor() const { return factor; } operator double() const { return factor; } operator const char *() const { return unit; } }; //------------------------------------------------------------------------------ static cUnit units[] = { // Kertoimet suhteessa units[0]:aan cUnit( "mm", 1.0 ), cUnit( "cm", 10.0 ), cUnit( "dm", 100.0 ), cUnit( "m", 1000.0 ), cUnit( "km", 1000000.0 ), cUnit( "inch", 25.4 ), cUnit( "ft", 304.8 ), cUnit( "yard", 914.4 ), cUnit( "mile", 1609300.0 ), cUnit( "NM", 1853200.0 ), cUnit( "tuuma(s)", 24.742 ), cUnit( "kortteli", 148.45 ), cUnit( "jalka(s)", 296.9 ), cUnit( "kyynärä", 593.8 ), cUnit( "syli", 1781.4 ), cUnit( "virsta", 1068800.0 ), cUnit( "peninkulma", 10688000.0 ), cUnit( "lentopinta", 30400.8 ), cUnit( NULL, 0.0 ) }; #define MM 0 #define KM 4 //------------------------------------------------------------------------------ class TScalingDialog : public TDialog { TComboBox CbVasen; TComboBox CbOikea; TDoubleEdit DeScale; TDoubleEdit DeVasen; TDoubleEdit DeOikea; TRadioButton RbNaapuri; public: TScalingDialog(TWindow *parent, TResId resId, TModule *module=0) : TDialog(parent,resId,module), CbVasen(this,ID_VASEN_UNIT), CbOikea(this,ID_OIKEA_UNIT), DeScale(this,ID_SCALE), DeVasen(this,ID_VASEN), DeOikea(this,ID_OIKEA), RbNaapuri(this,IDR_NAAPURI) { } virtual ~TScalingDialog() { } virtual void SetupWindow(); virtual bool Naapuri() const { return RbNaapuri.GetCheck() == BF_CHECKED; } virtual double vKerroin() const { return units[CbVasen.GetSelIndex()]; } virtual double oKerroin() const { return units[CbOikea.GetSelIndex()]; } virtual void LaskeVasen() { DeVasen = ( DeOikea * oKerroin() ) / // ------------------------- ( DeScale * vKerroin() ); } virtual void LaskeOikea() { DeOikea = ( DeVasen * vKerroin() * DeScale ) / // ---------------------------------- oKerroin(); } virtual void ENVasen() { DeVasen.Refresh(); LaskeOikea(); } virtual void ENOikea() { DeOikea.Refresh(); LaskeVasen(); } virtual void ENScale() { DeScale.Refresh(); if ( DeScale.get() <= 0.0 ) DeScale = 1.0; LaskeOikea(); } virtual void CBNVasen() { if ( Naapuri() ) LaskeOikea(); else LaskeVasen(); } virtual void CBNOikea() { if ( Naapuri() ) LaskeVasen(); else LaskeOikea(); } virtual void BNOK() { DeVasen.SetFocus(); DeVasen.SetSelection(0,-1); } DECLARE_RESPONSE_TABLE(TScalingDialog); }; DEFINE_RESPONSE_TABLE1(TScalingDialog, TDialog) EV_EN_CHANGE (ID_VASEN ,ENVasen), EV_EN_CHANGE (ID_OIKEA ,ENOikea), EV_EN_CHANGE (ID_SCALE ,ENScale), EV_CBN_SELCHANGE(ID_VASEN_UNIT ,CBNVasen), EV_CBN_SELCHANGE(ID_OIKEA_UNIT ,CBNOikea), EV_BN_CLICKED (IDOK ,BNOK ), // Retillä vasen aktiiviseksi END_RESPONSE_TABLE; void TScalingDialog::SetupWindow() { TDialog::SetupWindow(); // MUISTA TÄMÄ!!! for (int i=0; units[i].Unit(); i++) { // Täytetään combo-listat CbVasen.InsertString(units[i].Unit(),i); // Tätä ei voi tehdä muodostajassa CbOikea.InsertString(units[i].Unit(),i); } RbNaapuri.Check(); // Eikä näitäkään! CbVasen.SetSelIndex(MM); CbOikea.SetSelIndex(KM); DeScale = 200000.0; DeVasen = 20.0; } //------------------------------------------------------------------------------ void RunScaling(TWindow *wnd) { TScalingDialog *dlg = new TScalingDialog(wnd,IDD_SCALING); dlg->SetFlag(wfDeleteOnClose); dlg->Create(); }