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:
parent
0c3ca2f48b
commit
21e521fb82
@ -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()
|
||||
@ -112,14 +65,17 @@ TObject* TVariable_field::dup() const
|
||||
TString & TVariable_field::get() const
|
||||
{
|
||||
TString & v = (TString &) _value;
|
||||
if (dirty())
|
||||
{
|
||||
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 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
|
||||
@ -128,6 +84,9 @@ TString & TVariable_field::get() const
|
||||
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,30 +181,12 @@ 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)
|
||||
void TVariable_rectype::add_field(TVariable_field * f)
|
||||
{
|
||||
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, 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;
|
||||
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);
|
||||
}
|
||||
|
||||
void TVariable_rectype::remove_field(const char * 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)
|
||||
@ -345,8 +279,11 @@ 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);
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user