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:
parent
8a05210c2d
commit
6c73d4919e
include
applicat.cpparchives.cppconfapp.cppcontrols.cppcontrols.hcurrency.cppcurrency.hdefault.urldeftabap.hfiletext.cppfiletext.hform.cppform.hgolem.cppgolem.hisam.cppisam.hlffiles.hmainmenu.urlmask.cppmaskfld.cppmaskfld.hmsksheet.cppmultirec.cppnetsock.cppos_dep.hos_win16.cpppostman.cppprefix.cppprefix.hprintapp.cppprogind.cppreal.cpprecarray.cpprecarray.hrelapp.cpprelapp.hrelation.cppstrings.cpptabapp.cpptabapp.htabutil.cppvarmask.cppviswin.cppwindow.cpp
@ -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
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
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++;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user