Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

TEdit de floats o decimales y funciones de cadenas

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Tips & Tricks
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: TEdit de floats o decimales y funciones de cadenas Responder citando

Primero necesitamos algunas de estas funciones (alltrim no es necesaria ni strzero pero las pongo por si a alguien le es util
Código:

 AnsiString alltrim(AnsiString texto )
{return TrimLeft(TrimRight(texto));}   //elimina espacios a derecha y izq

 AnsiString left(AnsiString texto, unsigned int num)
{return texto.SubString(1,num);}     //devuelve x caracteres por la izq

 AnsiString right(AnsiString texto, unsigned int num)
{return texto.SubString(texto.Length()>= num ? texto.Length()-num+1 : 1 ,texto.Length()>= num ? num :texto.Length());}  //dev x carac por la drch

 AnsiString replicate(AnsiString texto, unsigned int num)
{AnsiString var="";for (int x=1;x<= num;x++)var+=texto;return var;} // duplica una cadena x veces

 AnsiString strzero(AnsiString texto, unsigned int num)
{return right(replicate("0",50)+alltrim(texto),num);}  rellena de ceros a la izq


despues esta es la funcion principal (SIN DEPURAR, no he tenido tiempo)
Código:

PUBLIC void FloatEdit(TEdit *e, int numenteros, int numdec, int caso, char *Key, bool negativo)
    {
    if (caso!=0&&!negativo&&*Key==45)
        *Key=0;
    if (caso!=0&&(*Key <48 || *Key>57)&&*Key!=8&&*Key!=46&&*Key!=45&&*Key!=44)
        {*Key=0;return;}
    if (caso!=0&&GLOB_SIGNODECIMAL==','&&*Key==46)
        *Key=44;
    else
        if (caso!=0&&*Key==44)
            *Key=46;
    int decimales=-1,enteros=-1,pospunto=-1;
    for (int x=1;x<=e->Text.Length();x++)
        if (e->Text[x]==GLOB_SIGNODECIMAL)
            {
            pospunto=x;
            decimales=e->Text.Length()-x;
            enteros=e->Text.Length()-1-decimales;
            break;
            }
        else  enteros=e->Text.Length();
    switch (caso)
        {
        case 0:
            {
            if (e->Text.IsEmpty() || e->Text=='.' || e->Text==',' || e->Text=='-'||e->Text=="-"+AnsiString(GLOB_SIGNODECIMAL))
                { e->Text="0"+AnsiString(GLOB_SIGNODECIMAL)+replicate("0",numdec);return; }
            AnsiString aux=e->Text;
            if(aux[aux.Length()]=='.' ||aux[aux.Length()]==','||aux[aux.Length()]=='-')
                aux.Delete(aux.Length(),1);
            e->Text=aux;
            if (e->Text.Length()>=2&& (e->Text[1]=='.' ||e->Text[1]==','))
                {
                AnsiString aux2="0"+AnsiString(GLOB_SIGNODECIMAL)+right(e->Text,e->Text.Length()-1);
                e->Text=aux2;
                }
            if (e->Text.Length()>2 && e->Text[1]=='-' &&(e->Text[2]=='.'||e->Text[2]==','))
                e->Text="-0"+AnsiString(GLOB_SIGNODECIMAL)+right(e->Text,e->Text.Length()-2);
            if (decimales<numdec&& decimales!=-1)
                e->Text=e->Text+replicate("0",numdec-decimales);
            }
        break;
        case 1:
            {
            if (e->Text.IsEmpty()) return;
            if (*Key==8) return;
            if (e->SelStart==0&&e->SelLength==e->Text.Length()) return;
            if ((e->Text[1]=='-' && *Key==45)||(*Key==45&&e->SelStart!=0)) {*Key=0;return;}
            if (*Key==45&&e->SelStart==0&&e->Text[1]!='-') return;
            if (pospunto!=-1&&(*Key==44||*Key==46)) {*Key=0;return;}
            if (enteros>=numenteros && (e->SelStart<pospunto||pospunto==-1)&&*Key!=44&&*Key!=46) {*Key=0;return;}
            if (decimales>=numdec && (e->SelStart>pospunto)) {*Key=0;return;}
            }
        }
    return;
    }


y esta la forma de usarla:
Código:

void __fastcall TForm1::Edit1Exit(TObject *Sender)
{
EditDecimal (Edit1,5,3,0,0);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{
EditDecimal (Edit1,5,3,1,&Key);
}
//---------------------------------------------------------------------------

Espero sirva a todos pues es yo creo que es de bastante utilidad
_________________
Los problemas mas dificiles tienen las soluciones mas sencillas


Ultima edición por Fernando Diaz el Lun 02 May, 2005 8:56 am, editado 1 vez
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

no sabes si hay una funcion similar al Split de visual basic?

ej:

Split("mail@host.com","@")(0) ------> devuelve "mail"
Split("mail@host.com","@")(1) ------> devuelve "host.com"
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Aca te paso una funcion:

Código:

//prototipo
void __fastcall Split(AnsiString *,AnsiString, AnsiString);
//implementacion
void __fastcall Split(AnsiString *texto, AnsiString Cadena, AnsiString Caracter)
{
    int pos = Cadena.Pos(Caracter);
    if(pos)
    {
      texto[0] = Cadena.SubString(1,pos-1);
      texto[1] = Cadena.SubString(pos+Caracter.Length(),Cadena.Length()-pos+Caracter.Length()+1);
    }
}

main()
{
        AnsiString resultado[2];
        Split(resultado, "mail@yahoo", "@");
        Edit1->Text = resultado[0];
        Edit2->Text = resultado[1];
}


Salu2
_________________
Il Lupo
Volver arriba
Ver perfil de usuario Enviar mensaje privado MSN Messenger
Mensaje    Asunto: Responder citando

usa la opción buscar del foro con la palabra DivideCadena

Código:
TStrings *__fastcall DivideCadena(AnsiString ctmp, AnsiString LetraDivisora){
   TStringList *ArregloCadena = new TStringList();
    int pos=ctmp.Pos(LetraDivisora);
    if(pos!=0){
        ArregloCadena->Add(ctmp.SubString(1,pos-1));
        ctmp=ctmp.SubString(pos+1,ctmp.Length());
        pos=ctmp.Pos(LetraDivisora);
        while (pos!=0){
            if (pos!=0){
                ArregloCadena->Add(ctmp.SubString(1,pos-1));
                ctmp=ctmp.SubString(pos+1,ctmp.Length());
            }
        pos=ctmp.Pos(LetraDivisora);
        }
        ArregloCadena->Add(ctmp.SubString(1,ctmp.Length()));
    }else{
          ArregloCadena->Add(ctmp);
    }
  return (ArregloCadena);
}


y en el ejemplo anterior funcionaria asi

DivideCadena("mail@host.com","@")->Strings[0] ------> devuelve "mail"
DivideCadena("mail@host.com","@")->Strings[1] ------> devuelve "hots.com"
Con la particularidad que la fucion divide cadena, divide a la cadena cuantas veces encuetnre el caracter divisor
por ejemplo

TStrings *Cadenas = DivideCadena("123@123.x@343@3",@);

el resultado seria el siguiente

Cadenas->Strings[0]; --> 123
Cadenas->Strings[1]; --> 123.x
Cadenas->Strings[2]; --> 343
Cadenas->Strings[3]; --> 3

Espero les sirva
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.