 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Fernando Diaz Master


Registrado: 18 Jul 2004Mensajes: 273Ubicación: Talavera de la Reina (Toledo)
|
Publicado: Vie 29 Abr, 2005 10:34 pm Asunto: TEdit de floats o decimales y funciones de cadenas |
|
|
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 |
|
 |
offset Cdt

Registrado: 26 Abr 2005Mensajes: 17
|
Publicado: Sab 30 Abr, 2005 2:17 am Asunto: |
|
|
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 |
|
 |
Lupo Ens

Registrado: 15 Ago 2005Mensajes: 30Ubicación: Prov, Buenos Aires - Argentina
|
Publicado: Sab 05 Nov, 2005 6:08 pm Asunto: |
|
|
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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Dom 06 Nov, 2005 6:55 pm Asunto: |
|
|
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 _________________
 |
|
| Volver arriba |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|