Patch level : 2.2
Files correlati : maschere customizzate Ricompilazione Demo : [ ] Commento : Scrive in maniera evidenziata, sul fondo della maschera, se e' personalizzata (e' contenuta nella dir custom) git-svn-id: svn://10.65.10.50/trunk@13396 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
a206a24738
commit
e02a130b5e
@ -583,6 +583,33 @@ HIDDEN void xi_event_handler(XI_OBJ* itf, XI_EVENT* xiev)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TWindow* msk = (TWindow*)xi_get_app_data(itf);
|
||||
if (msk != NULL && msk->is_kind_of(CLASS_MASK))
|
||||
{
|
||||
const TMask& m = (const TMask&)*msk;
|
||||
WINDOW win = m.win();
|
||||
if ((WINDOW)xi_get_window(itf) == win)
|
||||
{
|
||||
if (m.number() == 0 && m.source_file().find("custom") > 0)
|
||||
{
|
||||
RCT rct; xvt_vobj_get_client_rect(win, &rct);
|
||||
rct.left += 2; rct.right -= 2; rct.bottom -= 2;
|
||||
DRAW_CTOOLS dct;
|
||||
xvt_dwin_get_draw_ctools(win, &dct);
|
||||
dct.fore_color = FOCUS_COLOR;
|
||||
dct.back_color = FOCUS_BACK_COLOR;
|
||||
dct.opaque_text = TRUE;
|
||||
xvt_dwin_set_draw_ctools(win, &dct);
|
||||
xvt_dwin_set_font(win, DEF_FONT);
|
||||
const char* text = "Custom";
|
||||
const int tw = xvt_dwin_get_text_width(win, text, -1);
|
||||
xvt_dwin_draw_text(win, rct.left, rct.bottom, text, -1);
|
||||
xvt_dwin_draw_text(win, (rct.right-rct.left-tw)/2, rct.bottom, text, -1);
|
||||
xvt_dwin_draw_text(win, rct.right-tw, rct.bottom, text, -1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case a_select:
|
||||
@ -1624,19 +1651,17 @@ void TPushbutton_control::update()
|
||||
|
||||
if (attrib & XI_ATR_VISIBLE)
|
||||
{
|
||||
RCT rct = (RCT&) _obj->v.btn->rct;
|
||||
XI_RCT rct = _obj->v.btn->rct;
|
||||
rct.left += 5; rct.top += 5; rct.right -= 5; rct.bottom -= 5;
|
||||
#ifdef XI_R4
|
||||
XinWindow xiwin = xi_get_window(_obj->itf);
|
||||
xi_set_clip(xiwin, (XinRect *) &rct );
|
||||
#endif
|
||||
|
||||
WINDOW win = parent();
|
||||
xi_set_clip((XinWindow)win, &rct);
|
||||
|
||||
// Cancello il testo sottostante
|
||||
const WINDOW win = parent();
|
||||
CBRUSH brush = { PAT_SOLID, BTN_BACK_COLOR };
|
||||
xvt_dwin_set_cbrush(win, &brush);
|
||||
xvt_dwin_set_std_cpen(win, TL_PEN_HOLLOW);
|
||||
xvt_dwin_draw_rect(win, &rct);
|
||||
xi_draw_rect((XinWindow)win, &rct);
|
||||
|
||||
const short bmp = (_bmp_dn > 0 && _obj->v.btn->down) ? _bmp_dn : _bmp_up;
|
||||
if (bmp > 0)
|
||||
@ -1699,9 +1724,7 @@ void TPushbutton_control::update()
|
||||
}
|
||||
}
|
||||
}
|
||||
#ifdef XI_R4
|
||||
xi_set_clip(xiwin, NULL);
|
||||
#endif
|
||||
xi_set_clip((XinWindow)win, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
131
include/mask.cpp
131
include/mask.cpp
@ -66,7 +66,7 @@ void TMask::init_mask()
|
||||
|
||||
_enabled.set(MAX_PAGES);
|
||||
_enabled.set(); // Abilita tutte le pagine
|
||||
_should_check = TRUE;
|
||||
_should_check = true;
|
||||
|
||||
_focus = _first_focus = 0; // Il primo ha il focus
|
||||
_page = -1; // Nessuna pagina corrente
|
||||
@ -160,7 +160,7 @@ void TMask::read_mask(
|
||||
if (scanner.key() == "PA")
|
||||
{
|
||||
CHECKD(_pages < MAX_PAGES, "Maschera con troppe pagine: ", _pages);
|
||||
WINDOW w = read_page(scanner, FALSE);
|
||||
WINDOW w = read_page(scanner, false);
|
||||
|
||||
TString80 title;
|
||||
xvt_vobj_get_title(w, title.get_buffer(), title.size());
|
||||
@ -173,7 +173,7 @@ void TMask::read_mask(
|
||||
if (scanner.key() == "TO")
|
||||
{
|
||||
CHECK(toolwin() == NULL_WIN, "La maschera puo' avere una sola TOOLBAR");
|
||||
_pagewin[MAX_PAGES] = read_page(scanner, TRUE);
|
||||
_pagewin[MAX_PAGES] = read_page(scanner, true);
|
||||
}
|
||||
}
|
||||
|
||||
@ -282,7 +282,7 @@ word TMask::class_id() const
|
||||
bool TMask::is_kind_of(word c) const
|
||||
{
|
||||
if (c == CLASS_MASK)
|
||||
return TRUE;
|
||||
return true;
|
||||
return TWindow::is_kind_of(c);
|
||||
}
|
||||
|
||||
@ -290,9 +290,9 @@ void TMask::open()
|
||||
{
|
||||
if (!_open || _page != 0)
|
||||
{
|
||||
_open = TRUE;
|
||||
_open = true;
|
||||
if (toolwin())
|
||||
xvt_vobj_set_visible(toolwin(), TRUE);
|
||||
xvt_vobj_set_visible(toolwin(), true);
|
||||
}
|
||||
_focus = first_focus(0);
|
||||
set_focus_field(fld(_focus).dlg());
|
||||
@ -320,7 +320,7 @@ int TMask::first_focus(short id)
|
||||
if (tempfirstfocus >= 0)
|
||||
{
|
||||
f = tempfirstfocus;
|
||||
if (fld(f).dirty() == FALSE)
|
||||
if (fld(f).dirty() == false)
|
||||
fld(f).set_dirty();
|
||||
tempfirstfocus = -1;
|
||||
}
|
||||
@ -387,22 +387,22 @@ bool TMask::can_be_closed() const
|
||||
{
|
||||
if (is_running())
|
||||
{
|
||||
bool ok = TRUE;
|
||||
bool ok = true;
|
||||
if ((edit_mode() || insert_mode()) && dirty() && id2pos(DLG_QUIT) < 0)
|
||||
ok = yesno_box(TR("Annullare i dati inseriti?"));
|
||||
if (ok)
|
||||
((TMask*)this)->stop_run(K_FORCE_CLOSE);
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
return TRUE; // Should never happen!
|
||||
return true; // Should never happen!
|
||||
}
|
||||
|
||||
void TMask::close()
|
||||
{
|
||||
_open = FALSE;
|
||||
_open = false;
|
||||
_page = -1;
|
||||
for (int p = 0; p <= MAX_PAGES; p++)
|
||||
if (_pagewin[p]) xvt_vobj_set_visible(_pagewin[p], FALSE);
|
||||
if (_pagewin[p]) xvt_vobj_set_visible(_pagewin[p], false);
|
||||
}
|
||||
|
||||
short TMask::dirty() const
|
||||
@ -435,8 +435,8 @@ void TMask::enable_page(
|
||||
byte page, // @parm Pagina da abilitare/disabilitare
|
||||
bool on) // @parm Operazione da svolgere:
|
||||
//
|
||||
// @flag TRUE | Abilita la pagina <p p> (default)
|
||||
// @flag FALSE | Disabilita la pagina <p p>
|
||||
// @flag true | Abilita la pagina <p p> (default)
|
||||
// @flag false | Disabilita la pagina <p p>
|
||||
{
|
||||
CHECK(page > 0, "Can't enable/disable first page");
|
||||
|
||||
@ -480,21 +480,21 @@ void TMask::start_run()
|
||||
TMask_field& f = fld(i);
|
||||
if (f.dirty() <= 1) // Attenzione puo' valere anche 3 per i very dirty!
|
||||
{
|
||||
f.set_dirty(FALSE);
|
||||
f.set_dirty(false);
|
||||
const bool op = f.is_operable() && !f.is_kind_of(CLASS_BUTTON_FIELD);
|
||||
if (op && (f.active() || f.ghost()))
|
||||
f.on_hit(); // Lancia messaggio di inizializzazione
|
||||
}
|
||||
}
|
||||
}
|
||||
_should_check = TRUE;
|
||||
_should_check = true;
|
||||
|
||||
// Make sure that "nearly" all fields are clean!
|
||||
for (int i = 0; i < max; i++)
|
||||
{
|
||||
TMask_field& f = fld(i);
|
||||
if (f.dirty() == 1) // Attenzione puo' valere anche 3 per i very dirty!
|
||||
f.set_dirty(FALSE);
|
||||
f.set_dirty(false);
|
||||
}
|
||||
|
||||
_init_time = clock()-start;
|
||||
@ -523,15 +523,15 @@ bool TMask::check_fields()
|
||||
}
|
||||
|
||||
if (sheet) f.set_dirty(); // Force check in sheet masks
|
||||
if (f.on_key(K_ENTER) == FALSE)
|
||||
if (f.on_key(K_ENTER) == false)
|
||||
{
|
||||
if (is_open())
|
||||
set_focus_field(f.dlg());
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
void TMask::check_field( short fld_id )
|
||||
@ -648,13 +648,13 @@ int TMask::find_parent_page(const TMask_field& f) const
|
||||
//
|
||||
// @rdesc Ritorna il risultato dell'operazione:
|
||||
//
|
||||
// @flag TRUE | E' riuscita a chiudere la maschera
|
||||
// @flag FALSE | Non e' riuscita a chiudere la maschera
|
||||
// @flag true | E' riuscita a chiudere la maschera
|
||||
// @flag false | Non e' riuscita a chiudere la maschera
|
||||
bool TMask::stop_run(
|
||||
KEY key) // @parm Tasto che deve provocare la chiusura
|
||||
|
||||
// @comm Permette di chiudere la maschera come se l'utente avesse premuto il tasto <p key>.
|
||||
// Nel caso la maschera non si chiuda (es. un check fallito), ritorna FALSE.
|
||||
// Nel caso la maschera non si chiuda (es. un check fallito), ritorna false.
|
||||
{
|
||||
if (key != K_AUTO_ENTER && key != K_FORCE_CLOSE)
|
||||
{
|
||||
@ -672,7 +672,7 @@ bool TMask::stop_run(
|
||||
}
|
||||
}
|
||||
if (i >= last)
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (key == K_CTRL_ENTER || key == K_AUTO_ENTER)
|
||||
@ -694,7 +694,7 @@ bool TMask::stop_run(
|
||||
save_profile();
|
||||
}
|
||||
else
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
return TWindow::stop_run(key);
|
||||
@ -781,8 +781,8 @@ void TMask::handler(WINDOW win, EVENT* ep)
|
||||
//
|
||||
// @rdesc Ritrna se e' stto effetuato una azione:
|
||||
//
|
||||
// @flag TRUE | Era prevista una azione collegata al tasto ed e' stata eseguita
|
||||
// @flag FALSE | Non era prevista nessuna azione collegata al tasto
|
||||
// @flag true | Era prevista una azione collegata al tasto ed e' stata eseguita
|
||||
// @flag false | Non era prevista nessuna azione collegata al tasto
|
||||
bool TMask::on_key(
|
||||
KEY key) // @parm Tasto premuto sulla maschera
|
||||
|
||||
@ -792,7 +792,8 @@ bool TMask::on_key(
|
||||
if (_handler)
|
||||
{
|
||||
const bool cont = _handler(*this, key);
|
||||
if (!cont) return FALSE;
|
||||
if (!cont)
|
||||
return false;
|
||||
}
|
||||
|
||||
switch(key)
|
||||
@ -855,7 +856,7 @@ bool TMask::on_key(
|
||||
TSheet_field& s = (TSheet_field&)f;
|
||||
const int newrow = s.append() ? -1 : 0;
|
||||
notify_focus_field(s.dlg());
|
||||
s.insert(newrow, TRUE, TRUE);
|
||||
s.insert(newrow, true, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -889,12 +890,12 @@ bool TMask::on_key(
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool TMask::on_dirty(TMask_field&)
|
||||
{
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
int TMask::win2page(WINDOW w) const
|
||||
@ -949,7 +950,7 @@ WINDOW TMask::read_page(
|
||||
bool toolbar) // @parm Indica se e' la toolbar
|
||||
|
||||
// @comm Il parametro <p toolbar> e' utilizzato per indicare se la pagina deve essere visualizzata
|
||||
// a tutto schermo (TRUE) oppure no
|
||||
// a tutto schermo (true) oppure no
|
||||
{
|
||||
static int tooly;
|
||||
static RCT rect;
|
||||
@ -987,16 +988,16 @@ WINDOW TMask::read_page(
|
||||
if (!orecchie && !toolbar) // Controlla se la maschera ha piu' di una pagina
|
||||
{
|
||||
const streampos pos = scanner.tellg(); // Memorizza posizione dello scanner
|
||||
while (TRUE)
|
||||
while (true)
|
||||
{
|
||||
const TString& l = scanner.line();
|
||||
|
||||
if (l.empty() || l == "ENDMASK") // Fine maschera
|
||||
break;
|
||||
|
||||
if (l.compare("PA", 2, TRUE) == 0) // Ho trovato un'altra pagina!
|
||||
if (l.compare("PA", 2, true) == 0) // Ho trovato un'altra pagina!
|
||||
{
|
||||
orecchie = TRUE; // Quindi devo metterci le orecchie
|
||||
orecchie = true; // Quindi devo metterci le orecchie
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -1007,7 +1008,7 @@ WINDOW TMask::read_page(
|
||||
if (toolbar || toolwin())
|
||||
{
|
||||
if (toolbar)
|
||||
w = create_interface(NULL_WIN, 0, r.top, 0, 0, title, this, FALSE);
|
||||
w = create_interface(NULL_WIN, 0, r.top, 0, 0, title, this, false);
|
||||
else
|
||||
w = create_interface(NULL_WIN, 0, r.top, 0, tooly, title, this, orecchie);
|
||||
}
|
||||
@ -1044,7 +1045,7 @@ WINDOW TMask::read_page(
|
||||
|
||||
bool TMask::check_current_field() const
|
||||
{
|
||||
bool ok = TRUE;
|
||||
bool ok = true;
|
||||
if (_focus >= 0)
|
||||
{
|
||||
TMask_field& ff = fld(_focus);
|
||||
@ -1132,9 +1133,9 @@ void TMask::next_page(
|
||||
}
|
||||
if (_page != prev)
|
||||
{
|
||||
xvt_vobj_set_visible(win(), TRUE);
|
||||
xvt_vobj_set_visible(win(), true);
|
||||
if (prev >= 0)
|
||||
xvt_vobj_set_visible(_pagewin[prev], FALSE);
|
||||
xvt_vobj_set_visible(_pagewin[prev], false);
|
||||
}
|
||||
|
||||
TMask_field& ff = fld(_focus);
|
||||
@ -1171,7 +1172,7 @@ void TMask::reset(short fld_id)
|
||||
TMask_field& c = fld(f);
|
||||
if (gr == 0 || c.in_group(gr))
|
||||
{
|
||||
c._flags.dirty = c._flags.focusdirty = FALSE;
|
||||
c._flags.dirty = c._flags.focusdirty = false;
|
||||
c.reset();
|
||||
}
|
||||
}
|
||||
@ -1253,7 +1254,7 @@ void TMask::set(
|
||||
short fld_id, // @parm Identificatore del campo da settare
|
||||
const char* s, // @parm Stringa da assegnare al campo
|
||||
byte hit) // @parm Indica se occorre rifare i controlli una volta settato il campo
|
||||
// con il nuovo valore (default FALSE)
|
||||
// con il nuovo valore (default false)
|
||||
// @parm long | n | Numero da asegnare al campo
|
||||
|
||||
// @syntax set(short fld_id, const char *s, bool hit);
|
||||
@ -1275,7 +1276,7 @@ void TMask::set(
|
||||
const char * fld_id, // @parm FIELD del campo da settare
|
||||
const char* str, // @parm Stringa da assegnare al campo
|
||||
byte hit) // @parm Indica se occorre rifare i controlli una volta settato il campo
|
||||
// con il nuovo valore (default FALSE)
|
||||
// con il nuovo valore (default false)
|
||||
// @parm long | n | Numero da asegnare al campo
|
||||
|
||||
// @syntax set(short fld_id, const char *s, bool hit);
|
||||
@ -1322,8 +1323,8 @@ void TMask::set(short fld_id, const TCurrency& n, byte hit)
|
||||
void TMask::activate(
|
||||
bool on) // @parm Indica l'operazione da svolgere sul campo:
|
||||
//
|
||||
// @flag TRUE | Attiva la pagina(default)
|
||||
// @flag FALSE | Disattiva la pagina
|
||||
// @flag true | Attiva la pagina(default)
|
||||
// @flag false | Disattiva la pagina
|
||||
{
|
||||
TWindow::activate(on);
|
||||
if (toolwin() != NULL_WIN)
|
||||
@ -1337,8 +1338,8 @@ void TMask::enable(
|
||||
short fld_id, // @parm Identificatore del campo da abilitare (0 tutti i campi, <0 id gruppo)
|
||||
bool on) // @parm Indica l'operazione da svolgere sul campo:
|
||||
//
|
||||
// @flag TRUE | Abilita il campo (default)
|
||||
// @flag FALSE | Disabilita il campo
|
||||
// @flag true | Abilita il campo (default)
|
||||
// @flag false | Disabilita il campo
|
||||
{
|
||||
if (fld_id <= 0)
|
||||
{
|
||||
@ -1394,8 +1395,8 @@ void TMask::enable_key(
|
||||
word key, // @parm Chiave di cui abilitare il campo
|
||||
bool on) // @parm Indica l'operazione da svolgere sul tasto:
|
||||
//
|
||||
// @flag TRUE | Abilita il campo (default)
|
||||
// @flag FALSE | Disabilita il campo
|
||||
// @flag true | Abilita il campo (default)
|
||||
// @flag false | Disabilita il campo
|
||||
|
||||
{
|
||||
for (int i = fields()-1; i >= 0; i--)
|
||||
@ -1424,8 +1425,8 @@ TEditable_field* TMask::get_key_field(
|
||||
word key, // @parm Chiave di cui controllare l'esistenza
|
||||
bool first) const // @parm Indica se la ricerca dev partire dell'inizio. Assume i valori:
|
||||
//
|
||||
// @flag TRUE | Comincia la ricerca dal primo campo della maschera
|
||||
// @flag FALSE | Comincia la ricerca dal campo attuale nella maschera
|
||||
// @flag true | Comincia la ricerca dal primo campo della maschera
|
||||
// @flag false | Comincia la ricerca dal campo attuale nella maschera
|
||||
{
|
||||
static int last = 0;
|
||||
|
||||
@ -1473,8 +1474,8 @@ void TMask::show(
|
||||
short fld_id, // @parm Campo da mostrare/nascondere (default -1)
|
||||
bool on) // @parm Indica l'operazione da svolgere sul campo:
|
||||
//
|
||||
// @flag TRUE | Mostra il campo(default)
|
||||
// @flag FALSE | Nasconde il campo
|
||||
// @flag true | Mostra il campo(default)
|
||||
// @flag false | Nasconde il campo
|
||||
|
||||
// @comm Se <p fld_id> e' -1 allora permette di operare su tutti i campi della maschera
|
||||
|
||||
@ -1603,7 +1604,7 @@ void TMask::on_idle()
|
||||
|
||||
if (!f.in_key(0) || !e.has_a_common_key(f))
|
||||
{
|
||||
e.test_key_complete(FALSE);
|
||||
e.test_key_complete(false);
|
||||
_test_fld = -1;
|
||||
}
|
||||
_last_test = f.dlg();
|
||||
@ -2022,11 +2023,11 @@ TGroup_field& TMask::add_groupbox (
|
||||
//
|
||||
// @rdesc Ritorna il risultato dell'operazione:
|
||||
//
|
||||
// @flag TRUE | Se l'operazione e' avvenuta corretamente
|
||||
// @flag FALSE | Se non si riesce a creare il file di salvataggio
|
||||
// @flag true | Se l'operazione e' avvenuta corretamente
|
||||
// @flag false | Se non si riesce a creare il file di salvataggio
|
||||
bool TMask::save(
|
||||
bool append) const // @parm Indica se creare il file o appendere (TRUE) le informazioni
|
||||
// ad uno gia' esistente (FALSE, default).
|
||||
bool append) const // @parm Indica se creare il file o appendere (true) le informazioni
|
||||
// ad uno gia' esistente (false, default).
|
||||
|
||||
{
|
||||
FILE* f = fopen(_workfile, append ? "a" : "w");
|
||||
@ -2043,7 +2044,7 @@ bool TMask::save(
|
||||
}
|
||||
fprintf(f, "[EOM]\n");
|
||||
fclose(f);
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@ -2053,18 +2054,18 @@ bool TMask::save(
|
||||
//
|
||||
// @rdesc Ritorna il risultato dell'operazione:
|
||||
//
|
||||
// @flag TRUE | Se l'operazione e' avvenuta corretamente
|
||||
// @flag FALSE | Se non si riesce a leggere il file di salvataggio
|
||||
// @flag true | Se l'operazione e' avvenuta corretamente
|
||||
// @flag false | Se non si riesce a leggere il file di salvataggio
|
||||
bool TMask::load(
|
||||
bool reset) // @parm Indica la posizione di lettura del file:
|
||||
//
|
||||
// @flag TRUE | Comincia la lettura dell'inizio
|
||||
// @flag FALSE | Comincia la lettura dalla posizione corrente dell'offset
|
||||
// @flag true | Comincia la lettura dell'inizio
|
||||
// @flag false | Comincia la lettura dalla posizione corrente dell'offset
|
||||
|
||||
{
|
||||
FILE* f = fopen(_workfile, "r");
|
||||
|
||||
if (f == NULL) return FALSE;
|
||||
if (f == NULL) return false;
|
||||
if (reset) _lastpos = 0;
|
||||
fseek(f, _lastpos, SEEK_SET);
|
||||
TToken_string t(256);
|
||||
@ -2080,7 +2081,7 @@ bool TMask::load(
|
||||
}
|
||||
_lastpos = ftell(f);
|
||||
fclose(f);
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
// @doc EXTERNAL
|
||||
@ -2169,7 +2170,7 @@ int TMask::save_profile(int num, const char* desc) const
|
||||
{
|
||||
TSheet_field& s = (TSheet_field&)f;
|
||||
FOR_EACH_SHEET_ROW(s, r, row)
|
||||
ini.set(name, *row, NULL, TRUE, r);
|
||||
ini.set(name, *row, NULL, true, r);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -199,7 +199,7 @@ TString& TString::operator <<(double n)
|
||||
}
|
||||
|
||||
// Appends an object to the string
|
||||
// Certified 50%
|
||||
// Certified 99%
|
||||
// The object should be completely storable in spark
|
||||
TString& TString::operator <<(const TObject& obj)
|
||||
{
|
||||
@ -355,7 +355,7 @@ int TString::find(
|
||||
// un messaggio di errore
|
||||
{
|
||||
int pos = -1;
|
||||
if (from < len())
|
||||
if (from == 0 || from < len())
|
||||
{
|
||||
const char* p = strchr(_str + from, c);
|
||||
if (p)
|
||||
@ -393,10 +393,10 @@ HIDDEN const char* strstr(const char* string1, const char* string2)
|
||||
int TString::find(const char* s, int from) const
|
||||
{
|
||||
int pos = -1;
|
||||
if (from < len())
|
||||
if (from == 0 || from < len())
|
||||
{
|
||||
const char* p = strstr(_str + from, s);
|
||||
if (p)
|
||||
if (p != NULL)
|
||||
pos = int(p - _str);
|
||||
}
|
||||
return pos;
|
||||
|
Loading…
x
Reference in New Issue
Block a user