From d5db64488112a88fe7f24b04b1446dcbbc6edd24 Mon Sep 17 00:00:00 2001 From: guy Date: Wed, 13 May 1998 15:07:41 +0000 Subject: [PATCH] currency.cpp Correzioni sulla gestione valuta isam.cpp Evita di chiudere files se il prefix e' gia' stato chiuso mask.cpp Riconoscimento campi CURRENCY maskfld.* Aggiunti campi CURRENCY prefix.* Aggiunta funzione prefix_valid() per sapere se il prefix e' stato inizializzato git-svn-id: svn://10.65.10.50/trunk@6653 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- include/currency.cpp | 18 ++-- include/isam.cpp | 8 +- include/mask.cpp | 1 + include/maskfld.cpp | 199 ++++++++++++++++++++++++++++++++++--------- include/maskfld.h | 39 ++++++++- include/prefix.cpp | 10 +++ include/prefix.h | 1 + 7 files changed, 225 insertions(+), 51 deletions(-) diff --git a/include/currency.cpp b/include/currency.cpp index 353a77e30..6a9876eef 100755 --- a/include/currency.cpp +++ b/include/currency.cpp @@ -40,19 +40,23 @@ public: TObject* TDowJones::rec2obj(const TRectype& rec) const { TExchangeData* data = new TExchangeData; - data->_num = rec.get_real("R12"); - if (data->_num < 1.0) - data->_num = 1.0; - data->_den = rec.get_real("R13"); + data->_den = rec.get_real("I11"); if (data->_den > ZERO) { + data->_num = rec.get_real("R11"); + if (data->_num < 1.0) + data->_num = 1.0; data->_dec = rec.get_int("I0"); } else { + data->_num = rec.get_real("I10"); + if (data->_num < 1.0) + data->_num = 1.0; data->_den = rec.get_real("R10"); data->_num = 1.0; - data->_dec = rec.get("CODTAB").empty() ? 0 : 2; + const TString& codval = rec.get("CODTAB"); + data->_dec = codval.empty() || codval == "LIT" ? 0 : 2; } if (data->_den <= ZERO) { @@ -135,7 +139,7 @@ void TCurrency::change_value(const char* val) { if (_num != ZERO) _num = DowJones.exchange(_num, _val, val); - strncpy(_val, val, 3); + strncpy(_val, val, 4); } void TCurrency::read(const TRectype& rec, const char* field, const char* val) @@ -212,6 +216,6 @@ TCurrency::TCurrency(const TCurrency& cur) TCurrency::TCurrency(const real& num, const char* val) : _num(num) { - strncpy(_val, val, 3); + strncpy(_val, val, 4); } diff --git a/include/isam.cpp b/include/isam.cpp index b3c699b32..d1b447e1f 100755 --- a/include/isam.cpp +++ b/include/isam.cpp @@ -1036,8 +1036,12 @@ int TBaseisamfile::_open_ex( int TBaseisamfile::_close() { - int err = prefix().close_isamfile(_isam_handle); - setstatus(err); + int err = NOERR; + if (prefix_valid()) + { + err = prefix().close_isamfile(_isam_handle); + setstatus(err); + } return err; } diff --git a/include/mask.cpp b/include/mask.cpp index 9e71f587d..108f1652b 100755 --- a/include/mask.cpp +++ b/include/mask.cpp @@ -833,6 +833,7 @@ TMask_field* TMask::parse_field(TScanner& scanner) if (k == "GR") return new TGroup_field(this); if (k == "LI") return new TList_field(this); if (k == "RA") return new TRadio_field(this); + if (k == "CU") return new TCurrency_field(this); if (k == "ME") return new TMemo_field(this); if (k == "ZO") return new TZoom_field(this); if (k == "GO") return new TGolem_field(this); diff --git a/include/maskfld.cpp b/include/maskfld.cpp index 7bb06ba60..109b200f2 100755 --- a/include/maskfld.cpp +++ b/include/maskfld.cpp @@ -1110,7 +1110,7 @@ void TButton_field::set_native_icon(unsigned icon) TEditable_field::TEditable_field(TMask* m) : TLoadable_field(m), _prompt(NULL), _field(NULL), _keys(NULL), - _validate(NULL), _warning(NULL) + _validate(NULL), _warning(NULL), _drivers(NULL), _userdata(NULL) { } @@ -1121,6 +1121,8 @@ TEditable_field::~TEditable_field() if (_keys) delete _keys; if (_validate) delete _validate; if (_warning) delete _warning; + if (_drivers) delete _drivers; + if (_userdata) delete _userdata; } @@ -1167,6 +1169,32 @@ bool TEditable_field::parse_item(TScanner& scanner) return TRUE; } + if (k == "DR") // DRIVENBY + { + if (_drivers == NULL) + _drivers = new TPointer_array; + TToken_string lista(scanner.line(), ' '); + FOR_EACH_TOKEN(lista, tok) + { + const int id = atoi(tok); + if (id > 0) + { + const int pos = mask().id2pos(id); + if (pos >= 0) + { + TEdit_field& driver = mask().efield(id); + _drivers->add(&driver); + TString16 msg; + msg.format("CHECK,%d", dlg()); + driver.message(0, TRUE)->add(msg); + } + else + NFCHECK("Non esiste ancora il campo driver %d", id); + } + } + return TRUE; + } + if (k == "CU") // CUSTOM DATA { if (_userdata == NULL) @@ -2328,49 +2356,49 @@ KEY TBrowse::run() TToken_string siblings, vals; create_siblings(siblings); -{ - byte buttons = 0; - if (_insert.not_empty()) - { - // Mette il bottone di gestione, a meno che ... - if (_cursor->items() == 0) - buttons = 2; // Non mette il bottone collega se non ci sono elementi - else - buttons = 3; + { + byte buttons = 0; + if (_insert.not_empty()) + { + // Mette il bottone di gestione, a meno che ... + if (_cursor->items() == 0) + buttons = 2; // Non mette il bottone collega se non ci sono elementi + else + buttons = 3; - if (_insert[0] == 'M' || _insert[0] == 'R') - { - const TString& maskname = field().mask().source_file(); - if (maskname.mid(2,2).compare("tb", 2, TRUE) == 0 && field().in_key(0)) + if (_insert[0] == 'M' || _insert[0] == 'R') + { + const TString& maskname = field().mask().source_file(); + if (maskname.mid(2,2).compare("tb", 2, TRUE) == 0 && field().in_key(0)) + { + const char* tabname = _cursor->file().name(); + if (maskname.mid(4, 3).compare(tabname, 3, TRUE) == 0) + buttons = 0; + } + } + } + + for (const char* i = _inp_id.get(0); i; i = _inp_id.get()) + { + if (*i != '"' && strchr(i, '@') == NULL) { - const char* tabname = _cursor->file().name(); - if (maskname.mid(4, 3).compare(tabname, 3, TRUE) == 0) - buttons = 0; + const short id = field().atodlg(i); + const TEditable_field& f = field(id); + if (f.active() && f.is_editable()) + { + vals.add(i); + vals.add(f.get()); + vals.add((int)f.dirty()); + } } - } - } + } - for (const char* i = _inp_id.get(0); i; i = _inp_id.get()) - { - if (*i != '"' && strchr(i, '@') == NULL) - { - const short id = field().atodlg(i); - const TEditable_field& f = field(id); - if (f.active() && f.is_editable()) - { - vals.add(i); - vals.add(f.get()); - vals.add((int)f.dirty()); - } - } - } + end_wait(); - end_wait(); - - TBrowse_sheet s(_cursor, _items, caption, _head, buttons, &field(), siblings); - k = s.run(); - selected = s.selected(); -} + TBrowse_sheet s(_cursor, _items, caption, _head, buttons, &field(), siblings); + k = s.run(); + selected = s.selected(); + } switch (k) { @@ -3619,7 +3647,6 @@ const char* TReal_field::win2raw(const char* data) const return str; } - void TReal_field::set_decimals(int d) { _decimals = d; @@ -3630,7 +3657,6 @@ void TReal_field::set_decimals(int d) } } - void TReal_field::exchange(bool show_value, const real& nuo) { const int dec = show_value ? 2 : 0; // Quanti decimali voglio @@ -3658,6 +3684,97 @@ void TReal_field::exchange(bool show_value, const real& nuo) set_decimals(dec); } +/////////////////////////////////////////////////////////// +// Currency_field +/////////////////////////////////////////////////////////// + +#include + +const char* TCurrency_field::raw2win(const char* data) const +{ + const real num = data; + if (num == ZERO) + return ""; + const char* value = NULL; + if (driver(0)) + value = driver(0)->get(); + + TCurrency cur(num, value); + return cur.string(TRUE); +} + +const char* TCurrency_field::win2raw(const char* data) const +{ + TString& str = _ctl_data._park; + const real num(real::ita2eng(data)); + str = num.string(); + return str; +} + +bool TCurrency_field::on_key(KEY key) +{ + if (key == K_TAB && focusdirty()) + { + const TString& raw = get_window_data(); + set_window_data(raw2win(raw)); + } + return TEdit_field::on_key(key); +} + +bool TCurrency_field::autosave(TRelation& r) +{ + if (field()) + { + int file = field()->file(); + const TString& name = field()->name(); + const char* value = NULL; + if (driver(0)) + value = driver(0)->get(); + const real num = get(); + const TCurrency cur(num, value); + cur.write(r.curr(file), name, value); + return TRUE; + } + return FALSE; +} + +bool TCurrency_field::autoload(const TRelation& r) +{ + if (field()) + { + int file = field()->file(); + const TString& name = field()->name(); + const char* value = NULL; + if (driver(0)) + value = driver(0)->get(); + TCurrency cur; + cur.read(r.curr(file), name, value); + set(cur.string()); + return TRUE; + } + return FALSE; +} + +void TCurrency_field::parse_head(TScanner& scanner) +{ + int size = scanner.integer(); + if (size <= 0) + size = 18; + _ctl_data._size = _ctl_data._width = size; +} + +void TCurrency_field::create(WINDOW w) +{ + _ctl_data._flags.strip("AMVZ"); + _ctl_data._flags << 'R'; + TEdit_field::create(w); +} + +TCurrency_field::TCurrency_field(TMask* m) + : TEdit_field(m) +{ +} + /////////////////////////////////////////////////////////// // List_field /////////////////////////////////////////////////////////// diff --git a/include/maskfld.h b/include/maskfld.h index 0beba6917..beefed900 100755 --- a/include/maskfld.h +++ b/include/maskfld.h @@ -566,10 +566,13 @@ class TEditable_field : public TLoadable_field // @cmember:(INTERNAL) Chiave al quale appartiene il campo TBit_array* _keys; - + // @cmember Messaggi da mandare in caso di errore sul campo TString* _warning; + // @cmember:(INTERNAL) Lista dei campi da cui dipende + TPointer_array* _drivers; + // @cmember:(INTERNAL) Stringa definibile dall'utilizzatore della classe da utilizzare a piacimento TToken_string* _userdata; @@ -653,6 +656,10 @@ public: // @cmember Ritorna TRUE se il campo e' di tipo editable virtual bool is_editable() const { return TRUE; } + + // @cmember Ritorna un eventuale campo driver + const TEditable_field* driver(int n) const + { return _drivers ? (const TEditable_field*)_drivers->objptr(n) : NULL; } TEditable_field(TMask* m); virtual ~TEditable_field(); @@ -1111,6 +1118,36 @@ public: { } }; +// @class TCurrency_field | Classe per la gestione dei campi in valuta +// +// @base public | TEdit_field +class TCurrency_field : public TEdit_field +// @author:(INTERNAL) Guido +{ + // @access:(INTERNAL) Private Member + +protected: // TMask_field + // @cmember Legge un item del controllo dal file .msk

+ virtual void parse_head(TScanner& scanner); + + virtual void create(WINDOW w); + +protected: // TEditable_field + virtual const char* win2raw(const char* data) const; + virtual const char* raw2win(const char* data) const; + virtual bool on_key(KEY key); + + virtual bool autosave(TRelation& r); + virtual bool autoload(const TRelation& r); + +public: + // @cmember Costruttore + TCurrency_field(TMask* mask); + // @cmember Distruttore + virtual ~TCurrency_field() + { } +}; + // @doc EXTERNAL // @class TDate_field | Classe per la gestione dei campi data diff --git a/include/prefix.cpp b/include/prefix.cpp index 1bbb8ee85..daf22d046 100755 --- a/include/prefix.cpp +++ b/include/prefix.cpp @@ -32,6 +32,16 @@ TPrefix& prefix_init() // @doc EXTERNAL +// @func Determina se il prefix e' stato inizializzato +// +// @rdesc Ritorna TRUE o FALSE +bool prefix_valid() +{ + return _prefhndl != NULL; +} + +// @doc EXTERNAL + // @func Legge il file "prefix.txt" // // @rdesc Ritorna l'oggetto letto diff --git a/include/prefix.h b/include/prefix.h index 0f03652af..9efde666b 100755 --- a/include/prefix.h +++ b/include/prefix.h @@ -168,6 +168,7 @@ public: const char* firm2dir(long codditta); TPrefix& prefix_init(); +bool prefix_valid(); TPrefix& prefix(); void prefix_destroy();