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
This commit is contained in:
guy 1998-05-13 15:07:41 +00:00
parent e69efac5d4
commit d5db644881
7 changed files with 225 additions and 51 deletions

View File

@ -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);
}

View File

@ -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;
}

View File

@ -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);

View File

@ -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 <currency.h>
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
///////////////////////////////////////////////////////////

View File

@ -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 <p scanner>
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

View File

@ -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 <c TPrefix> letto

View File

@ -168,6 +168,7 @@ public:
const char* firm2dir(long codditta);
TPrefix& prefix_init();
bool prefix_valid();
TPrefix& prefix();
void prefix_destroy();