Terminati (spero) i variable records

git-svn-id: svn://10.65.10.50/trunk@3677 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
alex 1996-09-26 15:32:16 +00:00
parent 0c3ca2f48b
commit 21e521fb82
2 changed files with 115 additions and 114 deletions

View File

@ -4,60 +4,13 @@
#include <relation.h>
#endif
// @doc INTERNAL
//
// @class TVariable_field | Oggetto campo virtuale
//
// @base public | TObject
class TVariable_field : public TObject
// @author:(INTERNAL) Sandro
{
TVariable_rectype * _rec;
TString _name;
TExpression * _e;
TString _value;
TToken_string * _put_string;
VIRTUAL_GET_FUNCTION _getfunc;
bool _destroy_expression;
public:
// @access Public Member
// @cmember Duplica il campo
virtual TObject* dup() const;
// @cmember ritorna il nome del campo
const char * name() const { return _name;}
// @cmember ritorna il valore del campo
TString & get() const;
// @cmember aggiorna il valore del campo utilizzando <p val>
void put(const char * val);
// @cmember azzera il valore del campo
void zero();
// @cmember il campo non ha formule o funzioni collegate
bool plain() const
{ return _e == NULL && _getfunc == NULL;}
// @ cmember Costruttore con una espressione di calcolo
TVariable_field(const char * name, TVariable_rectype * rec = NULL, const char * expr = "", TTypeexp type = _strexpr);
// @ cmember Costruttore con una funzione
TVariable_field(const char * name, TVariable_rectype * rec, VIRTUAL_GET_FUNCTION getfunc);
// @ cmember Costruttore con una espressione di calcolo
TVariable_field(const char * name, TVariable_rectype * rec, TExpression * expr, TTypeexp type = _strexpr);
// @ cmember Costruttore con un variable_field
TVariable_field(const TVariable_field & f);
// @ cmember Distruttore
~TVariable_field();
};
TVariable_field::TVariable_field(
const char * name, //
TVariable_rectype * rec, //
const char * expr, //
TTypeexp type) //
: _rec(rec), _name(name), _e(NULL) , _getfunc(NULL),
_put_string(NULL), _destroy_expression(TRUE)
: _rec(NULL), _name(name), _e(NULL) , _getfunc(NULL),
_put_string(NULL), _destroy_expression(TRUE),
_in_get(FALSE)
{
if (expr && *expr)
{
@ -68,33 +21,33 @@ TVariable_field::TVariable_field(
TVariable_field::TVariable_field(
const char * name, //
TVariable_rectype * rec, //
VIRTUAL_GET_FUNCTION getfunc) //
: _name(name), _e(NULL) , _rec(rec), _getfunc(getfunc),
_put_string(NULL), _destroy_expression(FALSE)
: _name(name), _e(NULL) , _rec(NULL), _getfunc(getfunc),
_put_string(NULL), _destroy_expression(FALSE),
_in_get(FALSE)
{
CHECK(_getfunc, "You must pass a valid VIRTUAL_GET_FUNCTION");
}
TVariable_field::TVariable_field(
const char * name, //
TVariable_rectype * rec, //
TExpression * expr, //
TTypeexp type) //
: _rec(rec), _name(name), _e(expr) , _getfunc(NULL),
_put_string(NULL), _destroy_expression(FALSE)
: _rec(NULL), _name(name), _e(expr) , _getfunc(NULL),
_put_string(NULL), _destroy_expression(FALSE),
_in_get(FALSE)
{
}
TVariable_field::TVariable_field(const TVariable_field & f)
: _rec(f._rec), _name(f._name), _e(NULL) , _getfunc(f._getfunc),
_put_string(NULL), _destroy_expression(f._destroy_expression)
_put_string(NULL), _destroy_expression(f._destroy_expression),
_in_get(FALSE)
{
if (f._e)
_e = (TExpression *) f._e->dup();
if (f._put_string)
_put_string = new TToken_string(*f._put_string);
}
TVariable_field::~TVariable_field()
@ -110,24 +63,30 @@ TObject* TVariable_field::dup() const
}
TString & TVariable_field::get() const
{
{
TString & v = (TString &) _value;
if (_e)
if (dirty())
{
CHECK(_rec, "NULL Record pointer with an expression");
const int items = _e->numvar();
for (int i = 0; i < items; i++)
_e->setvar(i, _rec->get(_e->varname(i)));
// v = _e->type() == _strexpr ? (const char *) (*_e) : ((const real &) (*_e)).string();
v = *_e;
}
else
if (_getfunc)
if (_in_get)
fatal_box("Recursive get in %s", (const char *) _name);
((TVariable_field *) this)->_in_get = TRUE;
if (_e)
{
CHECK(_rec, "NULL Record pointer with a function");
v = _getfunc(*_rec);
CHECK(_rec, "NULL Record pointer with an expression");
const int items = _e->numvar();
for (int i = 0; i < items; i++)
_e->setvar(i, _rec->get(_e->varname(i)));
v = *_e;
}
else
if (_getfunc)
{
CHECK(_rec, "NULL Record pointer with a function");
v = _getfunc(*_rec);
}
((TVariable_field *) this)->_in_get = FALSE;
((TVariable_field *) this)->set_clean();
}
return v;
}
@ -222,32 +181,14 @@ void TVariable_rectype::write_memo(isdef * file, const TRecnotype recno)
TRectype::write_memo(file, recno);
}
TVariable_field * TVariable_rectype::add_field(const char * fieldname, const char * expr, TTypeexp type)
{
CHECKS(!TRectype::exist(fieldname), "Field already exist ", fieldname);
TVariable_field * f = new TVariable_field(fieldname, this, expr, type);
_virtual_fields.add(fieldname, f, TRUE);
return f;
void TVariable_rectype::add_field(TVariable_field * f)
{
CHECK(f, "Null field");
CHECKS(!TRectype::exist(f->name()), "Field already exist ", f->name());
f->set_rec(this);
_virtual_fields.add(f->name(), f, TRUE);
}
TVariable_field * TVariable_rectype::add_field(const char * fieldname, TExpression * expr,
TTypeexp type)
{
CHECKS(!TRectype::exist(fieldname), "Field already exist ", fieldname);
TVariable_field * f = new TVariable_field(fieldname, this, expr, type);
_virtual_fields.add(fieldname, f, TRUE);
return f;
}
TVariable_field * TVariable_rectype::add_field(const char * fieldname, VIRTUAL_GET_FUNCTION getfunc)
{
CHECKS(!TRectype::exist(fieldname), "Field already exist ", fieldname);
CHECK(getfunc, "You must pass a valid VIRTUAL_GET_FUNCTION");
TVariable_field * f = new TVariable_field(fieldname, this, getfunc);
_virtual_fields.add(fieldname, f, TRUE);
return f;
}
void TVariable_rectype::remove_field(const char * fieldname)
{
if (fieldname)
@ -259,13 +200,6 @@ void TVariable_rectype::remove_field(const char * fieldname)
_virtual_fields.destroy();
}
const char * TVariable_rectype::get_variable_field_names(bool restart)
{
TVariable_field * f = (TVariable_field *) (restart ? _virtual_fields.first_item() :
_virtual_fields.succ_item());
return f != NULL ? (const char *) f->name() : NULL;
}
void TVariable_rectype::set_memo_fld( const char * fieldname)
{
if (fieldname && *fieldname)
@ -344,9 +278,12 @@ const TString & TVariable_rectype::get_str(const char* fieldname) const
{
TVariable_field * v = (TVariable_field *) _virtual_fields.objptr(s);
if (v == NULL)
v = ((TVariable_rectype *) this)->add_field(s);
v->put(val);
if (v == NULL)
{
v = new TVariable_field(s);
((TVariable_rectype *) this)->add_field(v);
}
v->force_value(val);
}
}
}
@ -405,6 +342,9 @@ TVariable_rectype & TVariable_rectype::operator =(const TVariable_rectype & rec)
{
TRectype::operator =(rec);
_virtual_fields = rec._virtual_fields;
for (TVariable_field * f = first_variable_field();
f != NULL; f = succ_variable_field())
f->set_rec(this);
return *this;
}

View File

@ -10,7 +10,6 @@
#endif
class TVariable_rectype;
class TVariable_field;
// @doc EXTERNAL
//
@ -18,6 +17,65 @@ class TVariable_field;
// da definire quando non sia sufficente una semplice espressione
typedef const char * (*VIRTUAL_GET_FUNCTION)(TVariable_rectype & r);
// @doc EXTERNAL
//
// @class TVariable_field | Oggetto campo virtuale
//
// @base public | TObject
class TVariable_field : public TObject
// @author:(INTERNAL) Sandro
{
TVariable_rectype * _rec;
TString _name;
TExpression * _e;
TString _value;
TToken_string * _put_string;
VIRTUAL_GET_FUNCTION _getfunc;
bool _destroy_expression;
bool _in_get;
public:
// @access Public Member
// @cmember Duplica il campo
virtual TObject* dup() const;
// @cmember segnala che il campo deve essere ricalcolato
virtual bool dirty() const { return TRUE;}
// @cmember assegna lo stato di campo da ricalcolare
virtual void set_dirty(bool on = TRUE) {}
// @cmember assegna lo stato di campo da non ricalcolare
void set_clean() { set_dirty(FALSE);}
// @cmember assegna il record a cui appartiene il campo
virtual void set_rec(TVariable_rectype * rec) { _rec = rec;}
// @cmember ritorna il nome del campo
const char * name() const { return _name;}
// @cmember ritorna il valore del campo
TString & get() const;
// @cmember aggiorna il valore del campo utilizzando <p val>
void put(const char * val);
// @cmember aggiorna il valore del campo utilizzando <p val> indipendentemente dal tipo del campo variabile
void force_value(const char * val) { _value = val; set_clean(); }
// @cmember azzera il valore del campo
void zero();
// @cmember il campo non ha formule o funzioni collegate
bool plain() const
{ return _e == NULL && _getfunc == NULL;}
// @ cmember Costruttore con una espressione di calcolo
TVariable_field(const char * name, const char * expr = "", TTypeexp type = _strexpr);
// @ cmember Costruttore con una funzione
TVariable_field(const char * name, VIRTUAL_GET_FUNCTION getfunc);
// @ cmember Costruttore con una espressione di calcolo
TVariable_field(const char * name, TExpression * expr, TTypeexp type = _strexpr);
// @ cmember Costruttore con un variable_field
TVariable_field(const TVariable_field & f);
// @ cmember Distruttore
~TVariable_field();
};
// @doc EXTERNAL
@ -66,11 +124,11 @@ public:
virtual void zero(char c = '\0');
// @cmember Assegnazione tra TVariable_rectype e TRectype
virtual TRectype& operator =(const TRectype& rec);
virtual TRectype & operator =(const TRectype& rec);
// @cmember Assegnazione tra TVariable_rectype
virtual TVariable_rectype& operator =(const TVariable_rectype& rec);
virtual TVariable_rectype & operator =(const TVariable_rectype& rec);
// @cmember Assegnazione tra TRectype const char *
virtual TRectype& operator =(const char* rec);
virtual TRectype & operator =(const char* rec);
void set_memo_fld(const char * fieldname);
@ -78,11 +136,14 @@ public:
virtual void init_memo(const TRecnotype recno = RECORD_NON_FISICO);
virtual void write_memo(isdef * file, const TRecnotype recno);
virtual TVariable_field * add_field(const char * fieldname, const char * expr = "", TTypeexp type = _strexpr);
virtual TVariable_field * add_field(const char * fieldname, TExpression * expr, TTypeexp type = _strexpr);
virtual TVariable_field * add_field(const char * fieldname, VIRTUAL_GET_FUNCTION getfunc);
virtual void add_field(TVariable_field * f);
virtual void remove_field(const char * fieldname = NULL);
virtual const char * get_variable_field_names(bool restart = FALSE) ;
TVariable_field * first_variable_field() { return (TVariable_field *) _virtual_fields.first_item();}
TVariable_field * succ_variable_field() { return (TVariable_field *) _virtual_fields.succ_item();}
TVariable_field * pred_variable_field() { return (TVariable_field *) _virtual_fields.pred_item();}
TVariable_field * last_variable_field() { return (TVariable_field *) _virtual_fields.last_item();}
// virtual const char * get_variable_field_names(bool restart = FALSE) ;
// @cmember Costruttore Costruisce un record staccato da un file.
// Sarebbe meglio utilizzare una delle altre due