Patch level : xx.7.054

Files correlati     :
Ricompilazione Demo : [ ]
Commento            :
Riportata la verione 1.7 patch 054 aga sul main trunk.


git-svn-id: svn://10.65.10.50/trunk@9656 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
alex 2001-04-30 15:04:10 +00:00
parent 8a05210c2d
commit 6c73d4919e
45 changed files with 794 additions and 333 deletions

@ -380,12 +380,12 @@ long TApplication::handler(WINDOW win, EVENT* ep)
}
const TString & TApplication::god_string(const char * keyword) const
const TString & TApplication::god_string(const char* keyword) const
{
if (_god_vars== NULL)
((TApplication *)this)->_god_vars = new TAssoc_array;
TString * s = (TString *)_god_vars->objptr(keyword);
TString* s = (TString*)_god_vars->objptr(keyword);
if (s == NULL)
{
@ -896,9 +896,10 @@ bool TApplication::build_firm_data(long codditta, bool flagcom)
bool TApplication::set_firm(long newfirm)
{
const long oldfirm = get_firm();
const bool interactive = newfirm <= 0;
#ifndef _DEMO_
if (newfirm < 1)
if (interactive)
{
TMask mask("bagn002");
TFilename pp(__ptprf); pp.cut(pp.len()-1);
@ -927,9 +928,17 @@ bool TApplication::set_firm(long newfirm)
}
}
#endif
if (newfirm == oldfirm || newfirm < 1)
return newfirm > 0;
if (interactive)
{
if (newfirm <= 0)
return newfirm > 0;
}
else
{
if (newfirm == oldfirm || newfirm <= 0)
return newfirm > 0;
}
if (prefix().test(newfirm))
{

@ -174,10 +174,10 @@ int TArchive::build_restore_list(
TString_array& fl) const // @parm Nomi dei cartella da ripristinare
{
fl.destroy();
if (!yesno_box("Inserire il dischetto nel drive %c e continuare ?\n"
if (!yesno_box("Inserire il dischetto nel drive %c e continuare?\n"
"(Rispondere NO se si desidera interrompere la procedura)", floppy))
return -1;
return -1;
TFilename name("a:/backup.ini"); name[0] = floppy;
TConfig ini(name);

@ -70,7 +70,7 @@ void TConfig_application::save_mask(bool tosave)
if (f.dirty() && f.field())
{
const char* fname = f.field()->name();
const char* value = f.get();
const TString& value = f.get();
const int index = f.field()->to();
const char* oldvl = _cnf->get(fname);
@ -80,7 +80,16 @@ void TConfig_application::save_mask(bool tosave)
if (!tosave) break;
if (postprocess_config_changed(_parag, fname, oldvl, value))
_cnf->set(fname, value, NULL, TRUE, index > -1 ? index : -1);
{
if (value[0] == ' ' || value.right(1) == " ")
{
TString val;
val << '"' << value << '"';
_cnf->set(fname, val, NULL, TRUE, index > -1 ? index : -1);
}
else
_cnf->set(fname, value, NULL, TRUE, index > -1 ? index : -1);
}
}
}
}
@ -91,6 +100,7 @@ void TConfig_application::load_mask()
TMask* mask = get_mask();
if (mask==NULL) return;
const int max = mask->fields();
TString oldvl;
for (int i = 0; i < max; i++)
{
TMask_field& f = mask->fld(i);
@ -99,7 +109,12 @@ void TConfig_application::load_mask()
const TFieldref* fr = f.field();
const char* fname = fr->name();
const int index = fr->to();
const TString& oldvl = _cnf->get(fname,NULL, index > -1 ? index : -1);
oldvl = _cnf->get(fname,NULL, index > -1 ? index : -1);
if (oldvl[0] == '"' && oldvl.right(1) == "\"")
{
oldvl.rtrim(1);
oldvl.ltrim(1);
}
f.set(oldvl);
}
}

@ -1040,6 +1040,12 @@ void TControl::autoselect(bool on)
change_attrib(XI_ATR_AUTOSELECT, on);
}
// @mfunc Allineamento a destra del testo
void TControl::set_rjust(bool on)
{
change_attrib(XI_ATR_RJUST, on);
}
// @doc INTERNAL
const char* TControl::caption() const

@ -97,6 +97,9 @@ public:
// @cmember Mostra/nasconde il controllo
virtual void show(bool on = TRUE);
void hide() { show(FALSE); }
virtual void set_rjust(bool on = TRUE);
void set_ljust() { set_rjust(FALSE); }
void autoselect(bool on);

@ -34,7 +34,6 @@ class TDowJones : public TFile_cache
protected:
virtual TObject* rec2obj(const TRectype& rec) const;
virtual void flush();
void test_cache();
const TExchangeData& get(const char* key);
@ -59,6 +58,8 @@ public:
real get_base_change(const char* val);
real get_contro_change(const char* val);
virtual void flush();
TDowJones() : TFile_cache("%VAL"), _codditta(0) { }
virtual ~TDowJones() { }
} DowJones;
@ -99,6 +100,7 @@ void TDowJones::flush()
_base_val.cut(0);
_firm_val.cut(0);
_euro_val.cut(0);
kill_file();
}
void TDowJones::test_cache()
@ -386,6 +388,11 @@ bool TExchange::is_firm_value() const
return DowJones.get_firm_val() == _val;
}
bool TExchange::is_euro_value() const
{
return DowJones.get_euro_val() == _val;
}
void TExchange::set(const char* val, const real& chg, exchange_type et)
{
val = DowJones.normalize_value(val, chg, et);
@ -465,6 +472,10 @@ void TCurrency::force_firm_val(const char* val)
DowJones.force_firm_val(val);
}
void TCurrency::force_cache_update()
{
DowJones.flush();
}
void TCurrency::force_value(const char* newval, const real& newchange, exchange_type newet)
{
@ -516,7 +527,7 @@ const char* TCurrency::string(bool dotted) const
picture.format(".%d", decimals());
return _num.string(picture);
}
return _num.string(0, decimals());
return _num.stringa(0, decimals());
}
TCurrency& TCurrency::operator+=(const TCurrency& cur)
@ -611,4 +622,13 @@ TCurrency::TCurrency(const real& num, const TExchange& exc, bool price)
_num.round(decimals());
}
bool same_values(const char * valuea, const char * valueb)
{
if (valuea == NULL || *valuea == '\0')
valuea = TCurrency::get_firm_val();
if (valueb == NULL || *valueb == '\0')
valueb = TCurrency::get_firm_val();
return stricmp(valuea, valueb) == 0;
}

@ -32,6 +32,7 @@ public:
exchange_type get_type() const { return _et; }
bool is_firm_value() const;
bool is_euro_value() const;
const char* get_value() const { return _val; }
const real& get_change(exchange_type& et) const;
@ -43,7 +44,7 @@ public:
TExchange(const TRectype& rec);
virtual ~TExchange() { }
};
class TCurrency : public TSortable
{
TExchange _chg; // Cambio
@ -66,6 +67,7 @@ public:
// serve per la personalizzazione cgp4, per stampare il bilancio in euro
static void force_firm_val(const char* val);
static void force_cache_update(); // Azzeramento cache
void set_price(bool p) { _price = p; }
bool is_price() const { return _price; }
@ -129,6 +131,11 @@ public:
TPrice(const real& num, const char* val = "", const real& exc = ZERO, exchange_type ext = _exchange_undefined)
: TCurrency(num, val, exc, ext, TRUE) { }
virtual ~TPrice() { }
};
};
inline bool is_firm_value(const char * value) { return value == NULL || *value == '\0' || TCurrency::get_firm_val() == value;}
inline bool is_true_value(const char * value) { return !is_firm_value(value);}
inline bool is_euro_value(const char * value) { return (value && *value) ? TCurrency::get_euro_val() == value : TCurrency::get_euro_val() == TCurrency::get_firm_val();}
bool same_values(const char * valuea, const char * valueb);
#endif

@ -79,6 +79,7 @@ ITEM M_EDIT_QUIT "Chiudi\tESC+ESC"
MENU MENU_VISWIN_EDIT
ITEM M_EDIT_COPY "~Copia" DISABLED
ITEM M_EDIT_CLEAR "~Annulla" DISABLED
SEPARATOR
ITEM M_EDIT_SEARCH "Cerca...\tF7"
ITEM M_EDIT_DELETE "Cerca il prossimo\tF8" DISABLED

8
include/deftabap.h Executable file

@ -0,0 +1,8 @@
#ifndef __DEFTABAP_H
#define __DEFTABAP_H
#define GR_SEARCH 29
#define GR_MODIFY_PROTECTED 30
#define GR_RECORD_PROTECTED 31
#endif

@ -567,9 +567,9 @@ int TFile_text::write(TRecord_text& rec)
for (int i = 0; i < items; i++)
{
TTracciato_campo& tc = tr.get(i);
campo = format_textfield(tc, rec.row(i));
buffer.insert(campo, tc.position());
campo.cut(0);
campo = rec.row(i);
format_textfield(tc, campo);
buffer.overwrite(campo, tc.position());
}
CHECK(_write_file, "Impossibile scrivere su un file chiuso.");
if (_recordsize<=0)

@ -67,7 +67,7 @@ public:
const TString& message() const {return _message;}
void set_name(const TString& name) {_name = name;}
void set_datatype(const char type) {_datatype = type;}
void set_type(const TString& type) {_type = type;}
void set_type(const char* type) {_type = type;}
void set_field(const TFieldref& field) {_field = field;}
void set_ftype(const TString& type) {_ftype = type;}
void set_position(const int position) {_position = position;}

@ -1257,13 +1257,19 @@ void TForm_number::put_paragraph(const char* s)
void TForm_number::real2currency(const real& r, TString& str) const
{
TCurrency c(r, "_FIRM");
TCurrency c(r);
c.set_price(_flag.price != 0);
const TExchange& oe = form().output_exchange();
if (!c.get_exchange().same_value_as(oe))
c.change_value(oe);
const TString& pic = picture();
const int piclen = pic.len();
const bool dotted = pic.empty() || pic.find('.') >= 0;
str = c.string(dotted);
const int w = width();
if (w > pic.len())
if (w > piclen)
str.right_just(w);
}
@ -1400,6 +1406,7 @@ protected: // TForm_string
virtual bool parse_head(TScanner& scanner);
virtual bool parse_item(TScanner& scanner);
virtual bool update();
virtual const char* get() const;
// @cmember Manda il messaggio al campo <p dest>
virtual void send_message(const TString& cmd, TForm_item& dest) const;
public:
@ -1432,9 +1439,15 @@ TObject* TForm_currency::dup() const
return fn;
}
const char* TForm_currency::get() const
{
const char* val = TForm_string::get();
return val;
}
TCurrency TForm_currency::get_currency() const
{
const TString& codval = _driver ? _driver->get() : form().get_curr_codval();
const TString& codval = _driver ? _driver->get() : form().get_curr_codval();
const real n(get());
return TCurrency(n, codval, ZERO, _exchange_undefined, _flag.price != 0);
}
@ -1452,19 +1465,64 @@ bool TForm_currency::update()
if (!real::is_null(get()))
{
const TCurrency curr = get_currency();
TCurrency curr = get_currency();
if (!_driver)
{
const TExchange& oe = form().output_exchange();
if (!curr.get_exchange().same_value_as(oe))
curr.change_value(oe);
}
// Niente apply_format(), la picture viene ignorata per i TForm_currency
const bool dotted = picture().empty() || picture().find('.') >= 0;
const TString& pic = picture();
const bool dotted = pic.empty() || pic.find('.') > 0;
TString80 v(curr.string(dotted));
TString80 v = curr.string(dotted);
if (pic.right(3) == "^^^") // 770 only: to be improved
{
const int dec = curr.decimals();
if (dec == 0)
v.rtrim(3+dotted);
else
v.rtrim(dec+1);
}
const int w = width() - (_section->columnwise() ? _prompt.len() : 0);
if (w > v.len())
v.right_just(w);
put_paragraph(v);
}
else
put_paragraph("");
{
const TString& pic = picture();
if (pic.right(1)[0] == '@')
{
TString80 v;
const int w = width() - (_section->columnwise() ? _prompt.len() : 0);
int d = 0;
if (_driver)
{
const TCurrency z(ZERO, _driver->get(), ZERO, _exchange_base, _flag.price != 0);
d = z.decimals();
}
else
{
const TCurrency z(ZERO, form().output_exchange(), _flag.price != 0);
d = z.decimals();
}
if (d > 0)
{
v.format("%*.*lf", w, d, 0.0);
v.replace('.', ',');
}
else
v.format("%*d", w, 0);
put_paragraph(v);
}
else
put_paragraph("");
}
}
return TRUE;
@ -1483,7 +1541,7 @@ void TForm_currency::send_message(const TString& cmd, TForm_item& dest) const
else
total = ((TForm_currency&)dest).get_currency();
total += get_currency();
dest.set(total.string());
dest.set(total.get_num().string());
}
else
TForm_number::send_message(cmd, dest);
@ -2692,7 +2750,9 @@ bool TForm::parse_general(TScanner &scanner)
_npages=scanner.integer();
if (scanner.key() == "VA") // Valuta/Divisa impiegata
_curr_codval=scanner.string();
{
_curr_codval=scanner.string(); // DA ELIMINARE
}
extended_parse_general(scanner); // Parse non-standard parameters
}
@ -3431,12 +3491,14 @@ bool TForm::genera_intestazioni(
p = prompts.get(c);
switch (align)
{
case 'c':
p.center_just(fi.width());
break;
case 'r':
p.right_just(fi.width());
break;
case 'c':
p.center_just(fi.width());
break;
case 'r':
p.right_just(fi.width());
break;
default:
break;
}
s = new TForm_string(header);
s->id() = -1;
@ -4587,6 +4649,11 @@ int TForm::matches_done(int file)
return 0;
}
void TForm::set_output_exchange(const char* codval, real exchange, exchange_type et)
{
_exchange.set(codval, exchange, et);
}
TForm::TForm()
{
init();

@ -147,13 +147,15 @@ class TForm : public TObject
int _editlevel;
// @cmember:(INTERNAL) Descrizione del formato
TString _desc;
// @cmember:(INTERNAL) Descrizione divisa impiegata per stampa prezzi ed importi
TString16 _curr_codval;
// @cmember:(INTERNAL) Array di caratteri di fincatura
TString16 _fink;
// @cmember:(INTERNAL) Numero iniziale di pagina
word _frompage,_topage;
// @cmember:(INTERNAL) Codice divisa impiegata per stampa prezzi ed importi
TString16 _curr_codval;
// @cmember:(INTERNAL) Cambio da applicare in output per stampa prezzi ed importi
TExchange _exchange;
// @cmember:(INTERNAL) Handler di default della testata di stampa
static void header_handler(TPrinter& p);
// @cmember:(INTERNAL) Handler di default del piede di stampa
@ -329,6 +331,9 @@ public:
const bool magic_currency() const
{ return _magic_currency; }
void set_output_exchange(const char* codval, real exchange = ZERO, exchange_type et = _exchange_undefined);
const TExchange& output_exchange() const { return _exchange; }
void enable_message_add(bool on) { _msg_add_enabled = on; }
void disable_message_add() { enable_message_add(FALSE); }
bool message_add_enabled() const { return _msg_add_enabled; }

@ -12,6 +12,7 @@
#include <urldefid.h>
#include <utility.h>
#include <window.h>
#include <limits.h>
#include <mapi.h>
#include <shellapi.h>
@ -1085,6 +1086,22 @@ TMAPI_session::~TMAPI_session()
// TMail_message
///////////////////////////////////////////////////////////
int TMail_message::add_line(const char* s)
{
const long len = (s && *s) ? strlen(s) : 0;
int n = items() - 1;
if (n < 0 || (long(row(n).len()) + len) > 30000L)
n = TString_array::add("");
TString & line = row(n);
line << s;
if (line.right(1) != "\n")
line << '\n';
return n;
}
bool TMail_message::send(TMAPI_session& lhSession, bool hide_ui)
{
const int MAX_RECIPIENTS = _recipients.items() + _copy_recipients.items() + 1;
@ -1117,15 +1134,28 @@ bool TMail_message::send(TMAPI_session& lhSession, bool hide_ui)
FOR_EACH_ARRAY_ROW(_attachments, att, attachment)
{
TString80 tmp; tmp.spaces(32);
*this << '\n' << tmp;
msgAttachment[na].nPosition = len()-1;
this-> row(0) << tmp;
msgAttachment[na].nPosition = row(0).len()-1;
msgAttachment[na].lpszPathName = attachment->get_buffer();
na++;
}
MapiMessage msgSend;
memset(&msgSend, 0, sizeof(MapiMessage));
msgSend.lpszNoteText = empty() ? NULL : get_buffer();
long tot = 0;
for (int i = 0; i < items(); i++)
tot += row(i).len();
char * buffer = new char[tot + 1];
long b = 0;
for (i = 0; i < items(); i++)
{
strcpy(&buffer[b], row(i));
b += row(i).len();
}
buffer[b] = '\0';
msgSend.lpszNoteText = buffer;
msgSend.lpszSubject = _subject.empty() ? NULL : _subject.get_buffer();
msgSend.nRecipCount = nr;
msgSend.lpRecips = nr == 0 ? NULL : msgRecipient;
@ -1133,7 +1163,8 @@ bool TMail_message::send(TMAPI_session& lhSession, bool hide_ui)
msgSend.lpFiles = na == 0 ? NULL : msgAttachment;
bool ok = lhSession.send(msgSend, hide_ui ? 0 : MAPI_DIALOG);
delete buffer;
delete msgRecipient;
delete msgAttachment;
@ -1214,9 +1245,11 @@ const TString& TMail_message::recipient(int n) const
TMail_message::TMail_message(const char* recipient, const char* subject,
const char* text, const char* sender)
: TString(text), _subject(subject), _sender(sender), _hms(0)
: _subject(subject), _sender(sender), _hms(0)
{
add_recipient(recipient);
add_recipient(recipient);
if (text && *text)
add(text);
}
///////////////////////////////////////////////////////////
@ -1232,6 +1265,7 @@ int TMail_messages::get(const char* senderFilter,
bool attach, bool mark)
{
TMAPI_session lhSession;
destroy();
if (!lhSession.open())
return 0;

@ -15,7 +15,7 @@ bool print_url(const char* url);
class TMAPI_session;
class TMail_message : public TString
class TMail_message : public TString_array
{
TString_array _recipients, _copy_recipients, _attachments;
TString _subject;
@ -38,9 +38,10 @@ public:
bool attach(const char* filename) { return add_recipient_ex(filename, 2); }
void set_sender(const char* address) { _sender = address; _sender.trim(); }
void set_id(const char* id) { _id = id; }
int add_line(const char * s);
TString& operator = (const char* msg) { set(msg); return *this; }
TString& operator = (const TString& msg) { set(msg); return *this; }
TMail_message& operator = (const char* msg) { destroy(); add(msg); return *this; }
TMail_message& operator = (const TString& msg) { destroy(); add(msg); return *this; }
bool send(bool hide_ui = FALSE);
bool remove();

@ -927,7 +927,7 @@ int TBaseisamfile::skip(TRecnotype nrec, word lockop)
message_box("Codice %s in uso da parte\ndi un altro utente.\nSkipping", (const char*)key);
_lasterr = cisread(fhnd, getkey(), curr(),_iscurr + lockop, _recno);
}
_recno = _isamfile->RecNo = DB_recno(fhnd);
_recno = DB_recno(fhnd);
if (curr().has_memo())
curr().init_memo(_recno, _isam_handle);
@ -942,6 +942,7 @@ int TBaseisamfile::_read(TRectype& rec, word op, word lockop)
_lasterr = cisread(fhnd, getkey(), rec, op + lockop, _recno);
_recno = DB_recno(fhnd);
if(rec.has_memo())
rec.init_memo(_recno, _isam_handle);
@ -2503,22 +2504,23 @@ int TSystemisamfile::dump(
if (nkey)
{
setkey(nkey);
bool skip = FALSE;
for ( first(); status() == NOERR && !p.iscancelled(); next(), i++)
{
p.setstatus(i + 1);
if (filter)
if (filter && *filter)
{
TToken_string filter_str(filter);
TString fname, fval;
skip = FALSE;
TString16 fname;
bool skip = FALSE;
while (!skip && !(fname=filter_str.get()).empty())
{
fval=filter_str.get();
skip = fval != get(fname);
const char* fval = filter_str.get();
const TString& cmp = get(fname);
skip = cmp != fval;
}
if (skip)
continue;
}
if (skip) continue;
s = "";
for (j = 0; j < nflds; j++)
{
@ -2558,6 +2560,22 @@ int TSystemisamfile::dump(
zero();
p.setstatus(i + 1);
readat(i + 1);
if (filter && *filter)
{
TToken_string filter_str(filter);
TString16 fname;
bool skip = FALSE;
while (!skip && !(fname=filter_str.get()).empty())
{
const char* fval = filter_str.get();
const TString& cmp = get(fname);
skip = cmp != fval;
}
if (skip)
continue;
}
s="";
if (withdeleted || curr().valid())
{
@ -2637,6 +2655,7 @@ void TMemo_data::copy(const TMemo_data& m)
////////////////////////////////////////////////////////////
// TRectype
////////////////////////////////////////////////////////////
void TRectype::init(int logicnum)
{
_logicnum = logicnum;
@ -2734,7 +2753,7 @@ TRectype::TRectype(const TRectype& r)
{
if (r._memo_data)
{
init_memo(r._memo_recno, r._memo_data->file()); // qui
init_memo(r._memo_data->recno(), r._memo_data->file());
*_memo_data = *r._memo_data;
}
_length = r.len();
@ -2755,14 +2774,16 @@ TRectype::~TRectype()
void TRectype::unknown_field(const char* name) const
{
NFCHECK("Il campo '%s' non appartiene al file %d", name, _logicnum);
static int last_file = 0;
if (_logicnum != last_file)
{
NFCHECK("Il campo '%s' non appartiene al file %d", name, _logicnum);
last_file = _logicnum;
}
}
void TRectype::write_memo(TIsam_handle file, const TRecnotype recno)
{
CHECK( _memo_recno > 0, "Maiale! Non fare le GO con _recno < 0 " );
TCodeb_handle cb_handle = prefix().get_handle(file);
DB_go( cb_handle, _memo_recno );
const RecDes *r = rec_des( );
TIsam_handle orig = _memo_data->file();
if (orig && (fhnd != orig || recno != _memo_data->recno()))
@ -2783,6 +2804,10 @@ void TRectype::write_memo(TIsam_handle file, const TRecnotype recno)
}
}
}
CHECK( _memo_recno > 0, "Maiale! Non fare le GO con _recno < 0 " );
TCodeb_handle cb_handle = prefix().get_handle(file);
DB_go( cb_handle, _memo_recno );
for( int i = _memo_data->last( ); i > 0; i = _memo_data->pred( i ) )
{
if (_memo_data->is_dirty(i))
@ -3051,7 +3076,7 @@ const TString& TRectype::get(const char* fieldname) const
const int index = findfld(recd, fieldname);
if ( _memo_data->objptr( index ))
return _memo_data->row( index );
if( _memo_recno >= 0L )
if(_memo_data->recno() >= 0L)
{
int orig = _memo_data->file();
if (orig)
@ -3180,6 +3205,13 @@ void TRectype::put(const char* fieldname, word val)
void TRectype::put(const char* fieldname, const real& val)
{
put_str( fieldname, val.string());
setempty(FALSE);
}
void TRectype::put(const char* fieldname, const TCurrency& val)
{
put_str( fieldname, val.get_num().string());
setempty(FALSE);
}
void TRectype::put(const char* fieldname, const TDate& val)

@ -3,8 +3,8 @@
#ifndef FOXPRO
#ifndef __REAL_H
#include <real.h>
#ifndef __CURRENCY_H
#include <currency.h>
#endif
#endif
@ -205,6 +205,8 @@ public:
void put(const char* fieldname, bool val);
// @cmember Setta il contenuto del campo <p fieldname> in formato reale
void put(const char* fieldname, const real& val);
// @cmember Setta il contenuto del campo <p fieldname> in formato valuta
void put(const char* fieldname, const TCurrency& val);
// @cmember Setta il contenuto del campo <p fieldname> in formato memo
void put(const char* fieldname, TTextfile& txt);
// @cmember Setta il contenuto del campo <p fieldname> (non tipizzata)
@ -487,6 +489,9 @@ public:
// @cmember Setta il contenuto del campo <p fieldname> di tipo real
void put(const char* fieldname, const real& val)
{ curr().put(fieldname, val);}
// @cmember Setta il contenuto del campo <p fieldname> di tipo valuta
void put(const char* fieldname, const TCurrency& val)
{ curr().put(fieldname, val);}
// @cmember Setta il contenuto del campo <p fieldname> di tipo memo (vedi <mf TRectype::put_memo>)
void put(const char* fieldname, TTextfile& txt)
{ curr().put(fieldname, txt); }

@ -144,8 +144,16 @@
#define LF_RINTRA 134
#define LF_RIEPRETT 135
#define LF_EXTERNAL 1000 // Files with id >= are considered to be externals
#define LF_AMMCE 136
#define LF_AMMMV 137
#define LF_CATDI 138
#define LF_CESPI 139
#define LF_COLLCES 140
#define LF_MOVAM 141
#define LF_MOVCE 142
#define LF_SALCE 143
#define LF_EXTERNAL 1000 // Files with id >= are considered to be externals
#define CNF_GENERAL 10000
#define CNF_STUDIO CNF_GENERAL + 1
#define CNF_DITTA CNF_GENERAL + 2

6
include/mainmenu.url Executable file

@ -0,0 +1,6 @@
MENUBAR TASK_MENUBAR
MENU TASK_MENUBAR
SUBMENU M_FILE "~File"
/* SUBMENU M_EDIT "~Modifica" Unsupported! */
SUBMENU M_HELP "~Help"

@ -498,9 +498,25 @@ bool TMask::check_fields()
}
void TMask::check_field( short fld_id )
{
field(fld_id).on_hit();
field(fld_id).check();
{
if (fld_id <= 0)
{
const int gr = -fld_id;
for (int i = fields()-1; i >= 0; i--)
{
TMask_field& f = fld(i);
if (gr == 0 || f.in_group(gr))
{
f.on_hit();
f.check();
}
}
}
else
{
field(fld_id).on_hit();
field(fld_id).check();
}
}
// @doc EXTERNAL
@ -1092,12 +1108,20 @@ TDate TMask::get_date(short fld_id) const
return TDate(s);
}
TCurrency& TMask::get_currency(short fld_id, TCurrency& curr) const
{
const TMask_field& f = field(fld_id);
CHECKD(f.is_kind_of(CLASS_CURRENCY_FIELD), "Not a currency field ", fld_id);
const TCurrency_field& cf = (const TCurrency_field&)f;
return cf.get_currency(curr);
TCurrency& TMask::get_currency(short fld_id, TCurrency& c) const
{
const TMask_field& cf = field(fld_id);
if (cf.class_id() == CLASS_CURRENCY_FIELD)
{
((TCurrency_field&)cf).get_currency(c);
}
else
{
real n = cf.get();
c.force_value("");
c.set_num(n);
}
return c;
}
// @doc EXTERNAL
@ -1141,13 +1165,13 @@ void TMask::set(short fld_id, const TDate& d, bool hit)
set(fld_id, d.string(), hit);
}
void TMask::set(short fld_id, const TCurrency& c, bool hit)
{
void TMask::set(short fld_id, const TCurrency& n, bool hit)
{
CHECK(field(fld_id).is_kind_of(CLASS_CURRENCY_FIELD), "Can't set a currency in a non-currency field");
((TCurrency_field&)field(fld_id)).set(c, hit);
// CHECK(id2pos(fld_id) < 0 || field(fld_id).is_edit(), "Can't set a currency in a non edit field");
set(fld_id, n.get_num().string(), hit);
}
// @doc EXTERNAL
// @mfunc Permette di attivare/disattivare tutta la pagina

@ -176,6 +176,13 @@ void TMask_field::set_focus() const
#endif
}
void TMask_field::set_justify(bool r)
{
_flags.rightjust = r;
if (_ctl)
_ctl->set_rjust(r);
}
// @doc INTERNAL
// Certified 100%
@ -613,6 +620,10 @@ void TText_field::create(WINDOW parent)
// TGroup_field
///////////////////////////////////////////////////////////
// Certified 100%
word TGroup_field::class_id() const
{ return CLASS_GROUPBOX_FIELD; }
TGroup_field::TGroup_field(TMask* mask) : TMask_field(mask)
{
_flags.persistent = TRUE;
@ -2142,7 +2153,7 @@ void TBrowse::do_output(CheckTime t)
TMask_field& f = field(id);
flds = _out_fn.get();
if (t != STARTING_CHECK || f.field() == NULL || f.mask().mode() == MODE_INS)
if (t != STARTING_CHECK || f.field() == NULL || (f.mask().mode() == MODE_INS && !f.in_key(0)))
{
sum.cut(0);
for(const char* fr = flds.get(0); fr; fr = flds.get())
@ -3152,6 +3163,7 @@ const char* TEdit_field::reformat(const char* str) const
TString& s = _ctl_data._park;
s = str;
const byte trim_mode = _flags.trim;
smart_trim(s, trim_mode);
if (s.not_empty())
@ -3175,7 +3187,10 @@ const char* TEdit_field::reformat(const char* str) const
for (const char * w = (const char *) s; *w == '0'; w++) ;
if (*w == '\0')
s.cut(0);
}
}
if (_flags.rightjust && !(trim_mode & 1) && !s.blank())
s.right_just(size());
if (_flags.uppercase)
s.upper();
@ -4042,10 +4057,8 @@ const char* TCurrency_field::raw2win(const char* data) const
const real num = data;
if (num == ZERO)
return "";
const char* value = NULL;
const TMask_field* d0 = driver(0);
if (d0)
value = d0->get();
const char* value = d0 ? (const char*)d0->get() : NULL;
const bool price = _flags.uppercase != 0;
TCurrency cur(num, value, ZERO, _exchange_undefined, price);
@ -4085,12 +4098,17 @@ const char* TCurrency_field::win2raw(const char* data) const
num = e.as_real();
}
else
num = real(str);
num = real::ita2eng(str);
if (num.is_zero())
str.cut(0);
else
str = num.string();
else
{
const TMask_field* d0 = driver(0);
const char* value = d0 ? (const char*)d0->get() : NULL;
const bool price = _flags.uppercase != 0;
TCurrency cur(num, value, ZERO, _exchange_undefined, price);
str = cur.get_num().string();
}
return str;
}

@ -179,8 +179,7 @@ public:
{ _flags.trim = byte(t ? 3 : 0); }
// @cmember Setta la giustificazione a destra del campo
void set_justify(bool r)
{ _flags.rightjust = r; }
void set_justify(bool r);
// @cmember Verifica la giustificazione a destra del campo
bool right_justified() const
@ -421,7 +420,9 @@ protected:
virtual void create(WINDOW parent);
// @access Public Member
public:
public:
virtual word class_id() const;
// @cmember Costruttore
TGroup_field(TMask* mask);
virtual ~TGroup_field() {}

@ -500,6 +500,7 @@ TSpreadsheet::TSpreadsheet(
int num;
XI_OBJ** column = xi_get_member_list(_obj, &num);
memset(_default_width, 0, sizeof(_default_width));
for (i = 0; i < num; i++)
{
RCT rct; xi_get_rect(column[i], (XinRect *) &rct);
@ -979,8 +980,8 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev)
{
const real r(src); // Memorizzo valore numerico
const int pos = driver->dlg() - FIRST_FIELD;
TString16 codval = rowrec.get(pos); // Codice valuta
const TCurrency c(r, codval, ZERO, _exchange_undefined, driver->uppercase());
const TString16 codval = rowrec.get(pos); // Codice valuta
const TCurrency c(r, codval, ZERO, _exchange_undefined, e->uppercase());
src = c.string(TRUE);
break;
}
@ -1066,7 +1067,7 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev)
{
if (xiev->v.xi_obj->type == XIT_LIST) // Bottone dello sheet
{
// if (test_focus_change())
if (test_focus_change())
{
int rec = -1;
_cell_dirty = FALSE;
@ -1392,7 +1393,8 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev)
if (rec < items())
str2mask(rec);
notify(rec, K_CTRL+K_DEL); // Notifica l'avvenuta cancellazione
set_dirty();
set_dirty(); // Setta il flag sheet modificato
_row_dirty = _cell_dirty = FALSE; // Resetta i flag di modifica appena settati di riflesso
if (rec >= items())
rec = items() - 1;
if (rec >= 0)
@ -2061,8 +2063,8 @@ void TSpreadsheet::set_columns_order(TToken_string* order)
if (order == NULL)
{
int idx=0;
for (int index = 0; index < num_cols; index++)
int next_pos = 0;
for (int index = 0; _default_width[index] > 0; index++)
{
const short cid = index ? FIRST_FIELD + index - 1 : 0;
XI_OBJ* col = cid ? find_column(cid) : column[0];
@ -2071,9 +2073,10 @@ void TSpreadsheet::set_columns_order(TToken_string* order)
if (index >= fixed)
{
const int cur_pos = xi_obj_to_idx(col);
if (cur_pos != index)
xi_move_column(col, index);
if (cur_pos != next_pos)
xi_move_column(col, next_pos);
}
next_pos++;
RCT rct; xi_get_rect(col, (XinRect *) &rct);
if (_default_width[index] != rct.right - rct.left)
@ -2090,13 +2093,17 @@ void TSpreadsheet::set_columns_order(TToken_string* order)
{
const int cid = col.get_int(0);
const int width = col.get_int();
XI_OBJ* column = find_column(cid);
if (column) // Controlla che esista ancora
XI_OBJ* col = cid ? find_column(cid) : column[0];
if (col) // Controlla che esista ancora
{
if (pos >= fixed && pos < num_cols)
xi_move_column(column, pos); // Sposta la colonna
{
const int cur_pos = xi_obj_to_idx(col);
if (cur_pos != pos)
xi_move_column(col, pos); // Sposta la colonna
}
if (width > XI_FU_MULTIPLE) // Se ha una larghezza valida
xi_column_set_pixel_width(column, width - offset);
xi_column_set_pixel_width(col, width - offset);
}
}
_save_columns_order = FALSE;

@ -243,14 +243,16 @@ void TMultiple_rectype::synchronize_bodies()
if (_nuovo)
{
TRecord_array * b = (TRecord_array *) _files.objptr(i);
if (b != NULL)
if (b == NULL)
{
_changed.reset(i);
b->destroy_rows();
TRectype * r = new_body_record(lognum(i));
set_body_key(*r);
b->set_key(r);
b = new TRecord_array(_logicnums[i], (TString &) _numfields[i]);
_files.add(b, i);
}
_changed[i] = FALSE;
b->destroy_rows();
TRectype * r = new_body_record(_logicnums[i]);
set_body_key(*r);
b->set_key(r);
}
else
{

@ -548,7 +548,7 @@ TConnection* TSocketClient::OnQueryConnection(const char* service,
BOOL TSocketClient::Execute(DWORD id, const char* cmd)
{
BOOL ok = cur_socket->is_open();
BOOL ok = cur_socket != NULL && cur_socket->is_open();
if (ok)
{
const int buflen = strlen(cmd)+1;
@ -619,7 +619,7 @@ BOOL TSocketClient::ReadLine(DWORD, TString& str)
BOOL TSocketClient::HttpGetFile(const char* remote, const char* local)
{
if (!cur_socket->is_open())
if (cur_socket == NULL || !cur_socket->is_open())
return FALSE;
BOOL ok = FALSE;

@ -9,7 +9,8 @@
#include <strings.h>
#endif
enum os_type { os_Unknown, os_Windows, os_Win32s, os_Windows95, os_Windows98, os_WindowsNT };
enum os_type { os_Unknown, os_Windows, os_Windows95, os_Windows98,
os_WindowsME, os_WindowsNT, os_Windows2000 };
os_type os_get_type();
void os_post_menu_event(WINDOW win, MENU_TAG tag);

@ -438,17 +438,26 @@ bool os_get_image_editor_path(TFilename& name)
os_type os_get_type()
{
const WORD winver = LOWORD(GetVersion());
const BYTE majver = LOBYTE(winver);
const BYTE minver = HIBYTE(winver);
if (majver > 3 || (majver == 3 && minver > 11))
{
return minver > 95 ? os_Windows98 : os_Windows95;
}
const DWORD winflags = GetWinFlags();
if (winflags & 0x4000)
return os_WindowsNT;
const DWORD osver = GetVersion();
const DWORD winver = LOWORD(osver);
const BYTE majwinver = LOBYTE(winver);
const BYTE minwinver = HIBYTE(winver);
if (majwinver == 3 && minwinver == 95)
{
const DWORD dosver = HIWORD(osver);
const BYTE majdosver = LOBYTE(dosver); // Should be 7 anyway
const BYTE mindosver = HIBYTE(dosver);
return (majdosver > 7 || (majdosver == 7 && mindosver >= 10)) ? os_Windows98 : os_Windows95;
}
else
{
if (majwinver == 4)
return os_WindowsME;
}
return os_Windows;
}

@ -39,7 +39,7 @@ TRecipient::TRecipient(const TToken_string& str)
void TRecipient::add_expr(char op, const TString& expr)
{
if (_expr.not_empty())
_expr << (op == 'A' ? "AND" : "OR");
_expr << (op == 'A' ? "&&" : "||");
if (expr.blank())
_expr << 1;
@ -135,7 +135,7 @@ bool TPostman::can_dispatch_transaction(const TRectype& rec)
_recipient.destroy();
TConfig cfg(CONFIG_DITTA, "MailTransactions");
TToken_string str;
TAuto_token_string str;
TString addr, opr, expr;
// Costruisce la lista dei destinatari
@ -206,7 +206,7 @@ bool TPostman::dispatch_transaction(const TRectype& rec,
while (trans.good())
{
TString& line = trans.line();
msg << line << '\n';
msg.add_line(line);
}
ok = msg.send(TRUE);
}
@ -254,12 +254,11 @@ void TPostman::load_filters()
row = tok;
const TString80 appmod = row.get(0);
const bool is_mod = appmod.len() == 2;
// Il programma corrisponde
// Il programma oppure il modulo corrispondono
if ((is_mod && app.compare(appmod, 2, TRUE) == 0) ||
app.compare(appmod, -1, TRUE) == 0)
{
TString80 key = row.get(2); key.trim(); // Tipo di filtro
if (is_mod) key << "-MOD";
row = row.get(); row.trim(); // Espressione di filtro
if (key.not_empty() && row.not_empty() && row != "1")
{
@ -292,30 +291,10 @@ void TPostman::load_filters()
}
// Trasforma le stringhe in espressioni
TString esp, mod;
FOR_EACH_ASSOC_STRING(expr, hash, key, str)
{
mod = key;
if (mod.find("-MOD") < 0)
{
mod << "-MOD";
const TString* modexp = (const TString*)expr.objptr(mod);
if (modexp != NULL && *modexp != "1")
{
if (*modexp != "0")
{
esp.cut(0);
esp << '(' << *modexp << ")AND(" << str << ')';
}
else
esp = "0";
}
else
esp = str;
TExpression* e = new TExpression(esp, _strexpr, TRUE);
_expr.add(key, e);
}
TExpression* e = new TExpression(str, _strexpr, TRUE);
_expr.add(key, e);
}
// Inserisce un elemento fasullo per segnalare l'avvenuta lettura

@ -12,6 +12,72 @@
// Definita in isam.cpp
extern int get_error(int);
///////////////////////////////////////////////////////////
// TFirm
///////////////////////////////////////////////////////////
#include <nditte.h>
bool TFirm::read(long cod)
{
int err = NOERR;
if (cod < 0L)
cod = prefix().get_codditta();
_rec.destroy();
TLocalisamfile ditte(LF_NDITTE);
if (cod > 0L)
{
ditte.put("CODDITTA", cod);
err = ditte.read();
}
else
err = ditte.first();
if (err == NOERR)
{
const TRectype& ditta = ditte.curr();
for (int f = ditta.items()-1; f >= 0; f--)
{
const char* name = ditta.fieldname(f);
_rec.add(name, ditta.get(name));
}
}
else
NFCHECK("Can't read firm %ld: error %d", cod, err);
return _rec.items() > 0;
}
const TString& TFirm::get(const char* attr) const
{
const TString* str = (const TString*)_rec.objptr(attr);
if (str == NULL)
str = &EMPTY_STRING;
return *str;
}
long TFirm::get_long(const char* attr) const
{ return atol(get(attr)); }
long TFirm::codice() const
{
return get_long(NDT_CODDITTA);
}
const TString& TFirm::codice_valuta() const
{
const TString& codval = get(NDT_VALUTA);
if (codval.empty())
return TCurrency::get_base_val();
return codval;
}
TFirm::TFirm(long code)
{
read(code);
}
///////////////////////////////////////////////////////////
// extern variables are NO-NO!
///////////////////////////////////////////////////////////

@ -109,6 +109,12 @@ class TPrefix : public TObject
TFirm* _firm;
// @access Private Member
private:
int closeall(bool changestudy, TBit_array& excl, TBit_array& toclose) const;
void openall(bool changestudy, TBit_array& excl, int oldmax, TBit_array& toopen) const;
// @access Protected Member
protected:
// @cmember Verifica l'effettiva esistenza della directory <p s> sotto

@ -1046,11 +1046,10 @@ void TPrint_application::print()
// only external apps can change it
_repeat_print = FALSE;
int ncopies = printer().n_copies();
// never print multiple copies if printer is viswin
// only application may repeat printing by setting _repeat_print
int nc = printer().printtype() == screenvis ? 1 : ncopies;
int nc = printer().printtype() == screenvis ? 1 : printer().n_copies();
// NULL cursor passed only prints once
// pre and post process do everything
@ -1098,7 +1097,10 @@ void TPrint_application::print()
{
delete _prind;
_prind = NULL;
}
}
if (nc)
printer().formfeed(); // Salta pagina tra una copia e l'altra di una stampa
}
// ****************************************************************
}

@ -46,6 +46,8 @@ TIndwin::TIndwin(long max, const char* txt, bool cancel, bool bar, int div)
_text = new TMultiline_control(win(), DLG_NULL, 1, 0, hor-2, lines+1, 512, "CD", "");
_text->set_read_only();
// testo.replace('\n', '\r'); qui
set_text(testo);
if (bar)

@ -206,6 +206,7 @@ real& real::round (
// @flag <gt> 0 | Arrotonda al decimale
// @flag = 0 | Arrotonda all'intero
// @flag <lt> 0 | Arrotonda al valore passato (es. -3 arrotonda alle mille)
<<<<<<< real.cpp
{
if (abs(prec) < 20)
{
@ -213,7 +214,10 @@ real& real::round (
if (prec != 0)
{
ipow10(prec, m, d);
_dec *= m;
if (prec < 0)
_dec /= d;
else
_dec *= m;
}
if (_dec >= 0.0)
@ -222,7 +226,12 @@ real& real::round (
_dec = ceill(_dec - 0.5);
if (prec != 0)
_dec *= d;
{
if (prec < 0)
_dec *= d;
else
_dec /= m;
}
}
return *this;
}
@ -237,7 +246,8 @@ real& real::ceil (int prec)
}
_dec = ceill(_dec);
if (prec != 0)
_dec *= d;
// _dec *= d; Risulta stranamente molto impreciso!
_dec /= m;
return *this;
}
@ -252,7 +262,8 @@ real& real::floor (int prec)
}
_dec = floorl(_dec);
if (prec != 0)
_dec *= d;
// _dec *= d; Risulta stranamente molto impreciso!
_dec /= m;
return *this;
}
@ -267,7 +278,8 @@ real& real::trunc(int prec)
}
_dec = floorl(_dec);
if (prec != 0)
_dec *= d;
// _dec *= d; Risulta stranamente molto impreciso!
_dec /= m;
return *this;
}

@ -444,8 +444,16 @@ TFile_cache::TFile_cache(const char* tab, int key)
TFile_cache::~TFile_cache()
{
kill_file();
}
void TFile_cache::kill_file()
{
if (_file != NULL)
{
delete _file;
_file = NULL;
}
}
void TFile_cache::init_file(TLocalisamfile* f)
@ -453,8 +461,7 @@ void TFile_cache::init_file(TLocalisamfile* f)
if (_file != NULL)
{
CHECK(_file != f, "Suspicious file pointer");
delete _file;
_file = NULL;
kill_file();
}
if (f == NULL)
@ -622,10 +629,8 @@ long TFile_cache::fill()
TObject* obj = rec2obj(curr);
_cache.add(_code, obj);
}
kill_file();
// Non serve piu'
delete _file; _file = NULL;
return _cache.items();
}

@ -164,6 +164,7 @@ protected:
protected:
void init_file(TLocalisamfile* f=NULL);
void test_firm();
void kill_file();
const TObject& query(const char* chiave);
virtual TObject* rec2obj(const TRectype& rec) const pure;

@ -468,11 +468,10 @@ TEdit_field& TRelation_application::get_search_field() const
if (id <= 0)
{
const int max = _mask->fields();
for (int i = 0; i < max; i++)
for (int i = _mask->fields()-1; i >= 0; i--)
{
const TMask_field& f = _mask->fld(i);
if (f.in_key(1) && f.required())
if (f.is_edit() && f.in_key(1) && f.required())
{
id = f.dlg();
break;
@ -1572,7 +1571,7 @@ bool TRelation_application::load_transaction()
_curr_transaction = cnf.get("Action");
_curr_transaction.upper();
_curr_trans_mode = cnf.get("Mode")[0];
_curr_trans_from = cnf.get("From");
long firm = cnf.get_long("Firm");
if (firm > 0 && firm != get_firm())
{
@ -1591,7 +1590,6 @@ bool TRelation_application::load_transaction()
return retv;
}
void TRelation_application::ini2query_mask()
{
if (is_transaction())
@ -1612,20 +1610,28 @@ void TRelation_application::ini2insert_mask()
void TRelation_application::ini2mask(TConfig& ini, TMask& m, bool query)
{
const TString defpar = ini.get_paragraph();
TString str;
const TString16 defpar = ini.get_paragraph();
for (int f = m.fields()-1; f >= 0; f--)
{
TMask_field& campo = m.fld(f);
if (campo.field())
const TFieldref* fref = campo.field();
if (fref)
{
if (!query || campo.in_key(0))
{
str = campo.field()->read(ini, defpar);
const TString& str = fref->read(ini, defpar);
if (str.not_empty())
campo.set(str);
}
}
else
{
if (!query && campo.is_sheet())
{
TSheet_field &sheet=(TSheet_field &)campo;
ini2sheet(ini, sheet);
}
}
}
ini.set_paragraph(defpar);
}
@ -1635,28 +1641,119 @@ void TRelation_application::edit_mask2ini()
if (_trans_ini.row(_trans_counter).not_empty())
{
TString16 head;
head << get_relation()->lfile().num();
head.format("%d", get_relation()->lfile().num());
TConfig ini(_trans_ini.row(_trans_counter), head);
mask2ini(*_mask, ini);
}
}
void TRelation_application::ini2sheet(TConfig& ini,TSheet_field &sheet)
{
if (sheet.record() != NULL)
{
const int lognum = sheet.record()->logic_num();
const TMask& sm = sheet.sheet_mask();
// scrive le righe nello sheet associato
TString16 defpar;
for (int r = 1; ;r++)
{
defpar.format("%d,%d", lognum, r);
if (ini.set_paragraph(defpar))
{
TToken_string& row = sheet.row(r-1);
for (int sf = sm.fields()-1; sf >= 0; sf--)
{
TMask_field& campo = sm.fld(sf);
const TFieldref* fref = campo.field();
if (fref)
{
const TString& str = fref->read(ini, defpar);
row.add(str, sheet.cid2index(campo.dlg()));
}
}
sheet.check_row(r-1);
}
else
break;
}
}
}
void TRelation_application::sheet2ini(TSheet_field &sheet,TConfig& ini)
{
if (sheet.record() != NULL)
{
const int lognum = sheet.record()->logic_num();
const TMask& sm = sheet.sheet_mask();
// scrive le righe degli sheet associati
TString16 defpar;
TString str;
for (int r = 1 ; r <= sheet.items(); r++)
{
defpar.format("%d,%d", lognum, r);
TMask_field* fkey;
sheet.restart_key();
while (fkey = sheet.get_key(str))
{
ini.set(str, fkey->get(), defpar);
}
TToken_string& row = sheet.row(r-1);
const char* value;
int i;
for (i = 0, value = row.get(0); value; i++, value = row.get())
{
const TMask_field& campo = sm.field(FIRST_FIELD+i);
const TFieldref* fr = campo.field();
if (fr)
{
if (value == NULL || *value == '\0')
value = " ";
// ini.set(fr->name(), value, defpar);
fr->write(ini, defpar, value);
}
}
}
for (r = sheet.items()+1; ; r++)
{
defpar.format("%d,%d", lognum, r);
if (ini.set_paragraph(defpar))
ini.remove_all();
else
break;
}
}
}
void TRelation_application::mask2ini(const TMask& m, TConfig& ini)
{
TString16 defpar; defpar << get_relation()->lfile().num();
ini.set_paragraph(defpar);
ini.set("Firm", get_firm(), "Transaction");
const TLocalisamfile& lfile = get_relation()->lfile();
TString str(80);
switch (get_relation()->lfile().num())
int year, release, tag, patch;
if (get_version_info(year, release, tag, patch))
{
TString80 ver;
ver.format("%d %d.%d-%d", year, release, tag, patch);
ini.set("Version", ver);
}
TString16 defpar;
defpar.format("%d", lfile.num());
ini.set_paragraph(defpar);
switch (lfile.num())
{
case LF_TAB:
case LF_TABCOM:
case LF_TABGEN:
{
TString16 tabname = m.source_file().mid(4,3);
ini.set("COD", tabname.upper(), defpar );
{
const TString& tabname = lfile.curr().get("COD");
ini.set("COD", tabname, defpar);
}
break;
}
@ -1664,63 +1761,30 @@ void TRelation_application::mask2ini(const TMask& m, TConfig& ini)
{
TMask_field& campo = m.fld(f);
if (campo.shown())
{
if (campo.field())
{
str = campo.get();
if (str.blank()) str = " ";
campo.field()->write(ini, defpar, str);
{
const TFieldref* fr = campo.field();
if (fr)
{
if (campo.empty())
fr->write(ini, defpar, " ");
else
fr->write(ini, defpar, campo.get());
}
else
if (campo.is_sheet())
{
TSheet_field &sheet=(TSheet_field &)campo;
sheet2ini(sheet,ini);
sheet2ini(sheet,ini); // It's virtual
}
}
}
ini.set_paragraph(defpar); // Reimposta paragrafo standard
}
void TRelation_application::ini2sheet(TConfig& ini,TSheet_field &sheet)
{
}
void TRelation_application::sheet2ini(TSheet_field &sheet,TConfig& ini)
{
if (sheet.record() != NULL)
{
// scrive le righe degli sheet associati
TString16 defpar;
TString str(80);
for (int r = 1 ; r <= sheet.items(); r++)
{
TString16 defpar = format("%d,%d",sheet.record()->logic_num(),r);
const TMask& sm = sheet.sheet_mask();
TMask_field* fkey;
sheet.restart_key();
while (fkey = sheet.get_key(str))
{
ini.set(str, fkey->get(), defpar);
}
for (int sf = 0; sf < sm.fields(); sf++)
{
TMask_field& campo = sm.fld(sf);
if (campo.shown() && campo.field())
{
str = sheet.row(r-1).get(sheet.cid2index(campo.dlg()));
if (str.empty()) str = " ";
ini.set(campo.field()->name(), str ,defpar);
}
}
}
}
}
bool TRelation_application::mask2mail(const TMask& m)
{
TWait_cursor hourglass;
bool ok = ::can_dispatch_transaction(get_relation()->curr());
bool ok = _curr_trans_from.empty() && ::can_dispatch_transaction(get_relation()->curr());
if (ok)
{
TFilename ininame; ininame.temp();

@ -66,6 +66,8 @@ class TRelation_application : public TSkeleton_application
TString _curr_transaction;
// @cmember:(INTERNAL) Modalità di esecuzione della transazione corrente (Automatica o interattiva)
char _curr_trans_mode;
// @cmember:(INTERNAL) Transazione ricevuta da .....
TString _curr_trans_from;
// @cmember:(INTERNAL) Flag di cancellazione automatica veloce
int _autodelete;
@ -242,8 +244,8 @@ public:
bool find(word key = 0);
// @cmember Costruisce il membro <md TRelation_application::_fixed>
void set_link(TMask & m, const char * keyexpr);
// @cmember Ritorna se e' stato chiamato col messaggio di link
byte lnflag() const
// @cmember Ritorna TRUE se e' stato chiamato col messaggio di link
bool lnflag() const
{ return _lnflag;}
// @cmember Ritorna TRUE se e' una transazione
bool is_transaction() const { return _curr_transaction.not_empty(); }

@ -628,12 +628,13 @@ int TRelation::position_rels(
for (int kk = 0; eq && kk < rd._fields.items(); kk++)
{
TFieldref& fl = (TFieldref&)rd._fields[kk];
const TString80 f_fr(fl.read(furr));
const TString80 f_ex(rd.evaluate_expr(kk, to));
TString80 f_fr(fl.read(furr));
TString80 f_ex(rd.evaluate_expr(kk, to));
if (rd._forced[kk])
eq = f_fr == f_ex;
else
{
f_fr.rtrim(); f_ex.rtrim();
eq = f_fr.compare(f_ex, f_ex.len()) == 0;
// Becca anche 000001=1
@ -1227,7 +1228,6 @@ TRecnotype TCursor::update()
if (file().curr().empty())
file().curr().zero();
file().read(_isgteq);
const TRecnotype totrec = buildcursor(file().recno());
const int handle = file().handle();
const TRecnotype eod = DB_reccount(handle);
@ -1236,7 +1236,7 @@ TRecnotype TCursor::update()
_index_firm = prefix().get_codditta();
_lastkrec = DB_changed(handle);
return totrec;
return _totrec;
}
@ -2090,27 +2090,23 @@ const char* TFieldref::read(TConfig& ini, const char* defpar) const
return "";
buffer = ini.get(_name);
// Gestisce valori tra virgolette
const int l = buffer.len();
if (l > 1)
{
if ((buffer[0] == '"' || buffer[0] == '\'') && buffer[0] == buffer[l-1])
{
buffer.rtrim(1);
buffer.ltrim(1);
if (strchr(buffer, '\\'))
buffer = esc(buffer);
}
}
if (_from > 0 || _to > 0)
{
const int l = buffer.len();
if (_to < l && _to > 0) buffer.cut(_to);
if (_from > 0) buffer.ltrim(_from);
}
else
{
// Gestisce valori tra virgolette
const int last = buffer.len()-1;
if (last > 0)
{
if ((buffer[0] == '"' || buffer[0] == '\'') && buffer[0] == buffer[last])
{
buffer.cut(last);
buffer.ltrim(1);
if (strchr(buffer, '\\'))
buffer = esc(buffer);
}
}
}
return buffer;
}
@ -2163,34 +2159,37 @@ void TFieldref::write(TConfig& ini, const char* defpar, const char* val) const
if (_from > 0 || _to > 0)
{
buffer = ini.get(_name, para);
buffer.overwrite(val, _from + (buffer[0] == '"'));
if (buffer[0] == ' ') // Metto le virgolette
{ buffer.insert("\"", 0); buffer << '"'; }
ini.set(_name, buffer, para);
if ((buffer[0] == '"' || buffer[0] == '\'') && buffer[0] == buffer[buffer.len()-1])
{
buffer.rtrim(1);
buffer.ltrim(1);
if (strchr(buffer, '\\'))
buffer = esc(buffer);
}
buffer.overwrite(val, _from);
val = buffer;
}
else
{
const int qn = quotes_needed(val); // Controlla se c'e' bisogno di virgolette
if (qn)
{
if (qn == 2)
{
buffer = val;
escapes(buffer);
buffer.insert("\"", 0);
buffer << '"';
}
else
{
const char virg = strchr(val, '"') ? '\'' : '"';
buffer.cut(0);
buffer << virg << val << virg;
}
ini.set(_name, buffer, para);
const int qn = quotes_needed(val); // Controlla se c'e' bisogno di virgolette
if (qn)
{
if (qn == 2)
{
buffer = val;
escapes(buffer);
buffer.insert("\"", 0);
buffer << '"';
}
else
ini.set(_name, val, para);
}
{
const char* virg = strchr(val, '"') ? "'" : "\"";
buffer = val;
buffer.insert(virg, 0);
buffer << virg;
}
ini.set(_name, buffer, para);
}
else
ini.set(_name, val, para);
}
const char* TFieldref::read(const TRectype& rec) const

@ -28,6 +28,7 @@ const TToken_string& empty_string()
// Most descriptions will fit in fifty characters
const int DEFAULT_SIZE = 50;
const int MAX_SIZE = 32000;
#ifdef FOXPRO
class TString512 : public TFixed_string
@ -161,7 +162,7 @@ TString& TString::set(
int TString::make_room(
int s) // @parm Numero di caratteri di cui si vuole aspandere la stringa
// @comm La stringa viene espansa di un numero di caratteri doppio (per sicurezza) di
// @comm La stringa viene espansa di un numero di caratteri maggiore (per efficienza) di
// quello passato per parametro
//
// @rdesc Ritorna il numero di caratteri della stringa prima della chiamata
@ -169,7 +170,16 @@ int TString::make_room(
const int lun = len();
const int spare = size() - lun;
if (spare < s)
resize(3 * (size() + s) / 2, TRUE);
{
long new_size = long(lun) + long(s);
if (new_size > MAX_SIZE)
fatal_box("Stringa di lunghezza eccessiva (> %ld)", MAX_SIZE);
new_size = 3L * new_size / 2L;
if (new_size > MAX_SIZE)
new_size = MAX_SIZE;
resize(int(new_size), TRUE);
}
return lun;
}
@ -542,9 +552,9 @@ TString& TString::cut(int n)
CHECKD(n >= 0, "Invalid TString::cut position ", n);
if (n <= _size)
_str[n] = '\0';
else
NFCHECK("Hai tagliato a %d la stringa '%s' lunga %d(%d)",
n, _str, len(), size());
// else
// NFCHECK("Hai tagliato a %d la stringa '%s' lunga %d(%d)",
// n, _str, len(), size());
return *this;
}
@ -1814,45 +1824,49 @@ void TParagraph_string::tokenize()
void TParagraph_string::tokenize()
{
TToken_string tmp;
int start = 0;
int last_space = -1;
const int length = len();
for (int i = start; i <= length; i++)
if (not_empty())
{
int add_now = -1;
switch(_str[i])
TToken_string tmp;
int start = 0;
int last_space = -1;
const int length = len();
for (int i = start; i <= length; i++)
{
case ' ':
case '\t':
last_space = i;
break;
case '\r':
case '\n':
case '\0':
add_now = i;
break;
default:
if (i - start >= _width)
int add_now = -1;
switch(_str[i])
{
if (last_space > start)
add_now = last_space;
else
add_now = i;
case ' ':
case '\t':
last_space = i;
break;
case '\r':
case '\n':
case '\0':
add_now = i;
break;
default:
if (i - start >= _width)
{
if (last_space > start)
add_now = last_space;
else
add_now = i;
}
break;
}
if (add_now >= start)
{
TString256 tok = sub(start, add_now);
tok.rtrim(); // Preserva gli spazi iniziali dopo un a capo forzato da \n
tmp.add(tok);
start = add_now + (_str[add_now] <= ' ');
last_space = start;
}
break;
}
if (add_now > start)
{
TString256 tok = sub(start, add_now);
tok.rtrim(); // Preserva gli spazi dopo un a capo forzato da \n
tmp.add(tok);
start = add_now + (_str[add_now] <= ' ');
last_space = start;
}
tmp.rtrim();
TToken_string::operator=(tmp);
}
TToken_string::operator=(tmp);
}
///////////////////////////////////////////////////////////

@ -66,8 +66,10 @@ TString& TTable_application::get_mask_name(TString& t) const
t = tab.module();
t << "tb" << m;
t.upper();
if (!fexist(t))
t.upper();
TFilename n(t); n.ext("msk");
if (!n.exist())
t.overwrite("ba");
return t;
}

@ -4,10 +4,9 @@
#ifndef __RELAPP_H
#include <relapp.h>
#endif
#define GR_SEARCH 29
#define GR_MODIFY_PROTECTED 30
#define GR_RECORD_PROTECTED 31
#ifndef __DEFTABAP_H
#include <deftabap.h>
#endif
#define FPC "FPC"

@ -207,25 +207,34 @@ const char* TTable::description()
struct TCallbackTableinfo
{
TString16 _var1, _var2;
TString16 _module;
TFilename _app;
TString16 _var1, _var2, _var3;
TString4 _module;
TFilename _tabapp, _relapp;
};
HIDDEN int find_relapp(TConfig& cfg, void* jolly)
{
TCallbackTableinfo& info = *((TCallbackTableinfo*)jolly);
if (cfg.exist(info._var1))
{
info._tabapp = cfg.get(info._var1);
if (info._tabapp.not_empty())
return 1;
}
if (cfg.get_paragraph().compare(info._module, 2, TRUE) == 0)
{
for (int v = 1; v <= 2; v++)
if (cfg.exist(info._var2))
{
const TString& var = v == 1 ? info._var1 : info._var2;
if (cfg.exist(var))
{
info._app = cfg.get(var);
if (info._app.not_empty())
return 1;
}
info._relapp = cfg.get(info._var2);
if (info._relapp.not_empty())
return 2;
}
if (cfg.exist(info._var3))
{
info._relapp = cfg.get(info._var3);
if (info._relapp.not_empty())
return 3;
}
}
return 0;
@ -235,14 +244,16 @@ bool TTable::get_relapp(TString& app) const
{
TConfig ini("install.ini");
TCallbackTableinfo fi;
fi._var1.format("Edit_%d", num());
fi._var2.format("Edit_%d", num() == LF_TAB ? LF_TABCOM : LF_TAB);
fi._var1.format("Edit_%s", (const char*)_tabname);
fi._var2.format("Edit_%d", num());
fi._var3.format("Edit_%d", num() == LF_TAB ? LF_TABCOM : LF_TAB);
fi._module = ((TTable*)this)->module();
ini.for_each_paragraph(find_relapp, &fi);
if (fi._app.not_empty())
app = fi._app;
else
app = fi._tabapp;
if (app.empty())
app = fi._relapp;
if (app.empty())
{
app = "ba3 -0";
if (fi._module.compare("ba", 2, TRUE) != 0)

@ -22,13 +22,13 @@ void TVariable_mask::set(short fld_id, const char* str, bool hit )
void TVariable_mask::show(short fld_id, bool on )
{
if(present( fld_id ) )
if(fld_id < 0 || present( fld_id ) )
TMask::show( fld_id, on );
}
void TVariable_mask::enable(short fld_id, bool on )
{
if(present( fld_id ))
if(fld_id < 0 ||present( fld_id ))
TMask::enable( fld_id, on );
}
@ -56,7 +56,6 @@ TVariable_mask::TVariable_mask() : TMask()
{
}
TMask& TVariable_sheet_field::sheet_mask() const
{
TMask & m = TSheet_field::sheet_mask();

@ -824,7 +824,7 @@ void TViswin::paint_background(
TImage* i = (TImage*)_images.objptr(id);
if (i == NULL && y1 == 0)
{
const TString_array& a = printer().image_names();
const TString_array& a = pr.image_names();
const TImage src(a.row(id));
if (src.ok())
{

@ -178,7 +178,16 @@ HIDDEN void xvt_menu_enable(MENU_ITEM* m, bool on)
{
while (m->tag)
{
if (m->tag > BAR_ITEM(0) && m->tag < BAR_ITEM(16))
switch(m->tag)
{
case M_FILE: // Leave it as is
case M_EDIT:
case M_FONT:
case M_STYLE:
case M_HELP:
case -1: // Separator
break;
default:
xvt_menu_set_item_enabled(TASK_WIN, m->tag, on);
m++;
}