• Sábado 27 de Abril de 2024, 11:05

Autor Tema:  un edit de floats?  (Leído 2753 veces)

leotardo de bici

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
un edit de floats?
« en: Lunes 19 de Enero de 2009, 23:48 »
0
soy el "NOVATO TOTAL" que os escribio hace un mes.  aproveche las navidades para estudiar builder a 4 manos, y ya hice algunas demos.

lo que quiero es pasar mis programas c borland de los 80' al entorno win.

1º tropiezo, necesito configuraciones, con su reset, su save y su load, en mis demos ya se hacerlo, solo que en los cuadros de dialogos capturo bien el nombre que quiero (confirmado por un edit) pero al hacer un openfile me dice que el CurrentName es un Ansistring (me entero ahora que existe eso) y que no es valido, probe con *, con &, con "", y no hay manera, por lo que falseo el openfile con el nombre "currentfile", y efectivamente aparece ese fichero, que es el que usa el save y el load ponga yo el que ponga.   ¿cual es la palabrita magica para conjurar el problema?.

2º esto ya esta bastante discutido por aqui, se trata de que tengo variables float, que pueden entrar por fichero.CFG, por reset, o por teclado.  el problema es el teclado, parece increible pero builder parece hecho por poetas para poetas, puedo cambiar el color, fuente, tamaño, estilo del texto, y seguro traducirlo al portuges,  pero no encuentro opcion para meter solo numeros float.
 lo ideal es que ni permitiese alfabeticas (quizas el E), y que pudiese variar con el raton, bien picando en un UpDow o por rueda como en SpinEdit.
el SpinEdit me gusta, pero no acepta floats,  (MaskEdit=kk)
 una solucion es currarme una rutina, que trage el edit, la digiera, vomite si tiene letras.  tendria que pasarle la direcion dela variable a comprobar. ,,, poco elegante.
 otra solucion es hacerse un componente visual para la paleta.  Como viene el fuente del spinedit lo altere cambiando los int por floats, pero a cada error de copilacion corregido aparecian dos nuevos, al final consegui joder la paleta de componentes.
 ¿que me recetais?.

TRod

  • Miembro MUY activo
  • ***
  • Mensajes: 108
  • Nacionalidad: mx
    • Ver Perfil
Re: un edit de floats?
« Respuesta #1 en: Martes 20 de Enero de 2009, 05:12 »
0
1.- A ver si entendi bien: El compilador no te deja usar char* porque quiere un AnsiString?   Usa  AnsiString(apuntadorChar).
2.- El evento OnKeyPress tiene el Parametro Key, ese se puede manipular a tu conveniencia. Ejem:
Código: Text
  1.  if(!(Key>='0'&&Key<='9'))   //Ojo aqui con VK_BACK
  2.    Key = 0; //Anula la entrada
  3.  
  4.  
"Juega" con este evento e inspirate para hacer poesia  :P
Y una vez que tengas bien "pulido" tu componente ya puedes crear tu paquete para seguir jodiendo tu paleta de componentes (si en verdad esta afectada, sugiero que vuelvas a instalar el Builder)
Suerte.

leotardo de bici

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re: un edit de floats?
« Respuesta #2 en: Jueves 22 de Enero de 2009, 00:56 »
0
gracias contestar,

1º problemilla, creo que es al reves, parece que tengo un AnsiString pero le viene grande al openfile(), he estudiado muchos ejemplos y todos los que encontre es para load/save BMPs y RichEdits, en ellos parece muy facil, pero mi problema es que quiero guardar un monton de variables, los chexboxs, los radiobutones, version, etc, y no creo que sea tan facil, por eso uso el openfile que conozco de viejo y me funciona, solo me falta pasar el nombre que me entrega el cuadro de dialogos al openfile.

2º sobre el tema del edit numerico mira arriba, postee uno (dos, otro con flechas como spinedit) que encontre que funciona bastante aceptable.

TRod

  • Miembro MUY activo
  • ***
  • Mensajes: 108
  • Nacionalidad: mx
    • Ver Perfil
Re: un edit de floats?
« Respuesta #3 en: Jueves 22 de Enero de 2009, 05:18 »
0
Cita de: "leotardo de bici"
... creo que es al reves, parece que tengo un AnsiString pero le viene grande al openfile()...

...  solo me falta pasar el nombre que me entrega el cuadro de dialogos al openfile.

El objeto AnsiString tiene un metodo llamado c_str() el cual retorna un char* que puede ser mas manejable dentro del OpenFile.

leotardo de bici

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re: un edit de floats?
« Respuesta #4 en: Miércoles 11 de Febrero de 2009, 23:38 »
0
bueno, ya termine mi 1º programa medio serio en builder6.  es un simulador de espectrometros cuadrupolos, un rollo.

el fruto de vuestra ayuda esta en
3*w.cientificosaficionados.com/foros/viewtopic.php?f=2&t=6152&start=260
alrrededor del 10-2-09.
o bajar de 3*w.cientificosaficionados.com/baldo/4p/simula.rar

gracias a todos, a heli, jtbarbeito, y trod de solo codigo.
os puse en los creditos, si os parece un deshonor os borro.



tuve un problemilla gordo con el punto y la coma, el Edit me presenta la variable con coma, pero el mismo edit quiere un punto al input, se trabuca a si mismo, una solucion chapucera fue cambiar la configuracion regional y decirle punto para decimales.

estudie emplear la paleta aquella de SDL con edits numericos, pero desisti porque otro no la tendria y no seria muy compatible.

al final se puso:
   ,,,,,
   Edit1 ->Text=AnsiString().sprintf("%1.3e", variable1); //para exponencial, o "%2.3f" para decimal clasico    
   ,,,,,
y en OnKeyPress un filtro de teclas, floats o ints
//---------------------- TECLAS FILTRAR
void __fastcall TForm1::FiltrarTeclaFloat(TObject *Sender, char &Key){
   if(Key>='0'&&Key<='9'){return;}    //"Ojo aqui con VK_BACK" ? consejo de Trod
   if(     Key=='.'){return;}    //
   if(Key=='-'||Key=='+'){return;}    //pasa signo
   if(Key=='e'||Key=='E'){return;}    //para exponencial
   if(Key==8  ||Key==13 ){return;}    //teclas de borrado
//   if(Key==Key_Return   ){return;}    //teclas retur, no va
//   if(Key==Key_Enter    ){return;}    //teclas enter, ni idea como colarla para que trage numerito
   Key = 0;   //Anula la entrada si no es ninguna.
   }
void __fastcall TForm1::FiltrarTeclaInt(TObject *Sender, char &Key){
   if(Key>='0'&&Key<='9'){return;}    //"Ojo aqui con VK_BACK" ? consejo de Trod
   Key = 0;   //Anula la entrada si no es ninguna.
   }

aun con estas el usuario puede meter la pata si escribe Es o signos sin ton ni son.

------------
leotardo --

TRod

  • Miembro MUY activo
  • ***
  • Mensajes: 108
  • Nacionalidad: mx
    • Ver Perfil
Re: un edit de floats?
« Respuesta #5 en: Domingo 15 de Febrero de 2009, 02:26 »
0
Interesante tu proyecto, lastima que yo solo se de espectrometros lo que mi perro sabe de mandarin... Gracias por el credito, yo solo te di un ligero bosquejo para que tu hicieras el trabajo sucio. Pero me gustaria aclarar unos puntos:
Cita de: "leotardo de bici"
tuve un problemilla gordo con el punto y la coma, el Edit me presenta la variable con coma, pero el mismo edit quiere un punto al input, se trabuca a si mismo, una solucion chapucera fue cambiar la configuracion regional y decirle punto para decimales.
leotardo --
Builder maneja una variable: DecimalSeparator, el cual indica qué esta usando el SO (el punto o el coma decimal).

Cita de: "leotardo de bici"
Edit1 ->Text=AnsiString().sprintf("%1.3e", variable1); //para exponencial, o "%2.3f" para decimal clasico
No es necesario hacer tanto uso de AnsiString, el sprintf de stdio.h funciona tambien. El tipo AnsiString solo es una de las extenciones que se le hizo a Builder C++ para poderlo adaptar a las librerias VCL que estan desarrolladas en ObjectPascal/Delphi.

Cita de: "leotardo de bici"
f(Key>='0'&&Key<='9'){return;} //"Ojo aqui con VK_BACK" ? consejo de Trod
Con VK_BACK me referia a la tecla de Retroceso. Checa en el indice de la Ayuda el tema: "Virtual key codes"
Cita de: "leotardo de bici"
aun con estas el usuario puede meter la pata si escribe Es o signos sin ton ni son.
Aqui es donde entra nuestra "poesia" como programadores. Te aconsejo que uses excepsiones, son muy utiles para  ayudar a usuarios expertos en hacer explotar los errores de tus programas. Por ejemplo:
Código: Text
  1.  
  2. if(Key==VK_RETURN){ //Usuario ordena: tragate el dato!
  3.  try{
  4.   X = StrToFloat( Edit1->Text ); //Conversion cadena/float
  5.  }
  6.  catch(...){
  7.   X = 3.1416;  //Debes reparar los destrosos de algun modo.
  8.   Edit1->Text = "jaja... que mas quieres?"; //No es necesario sarcasmos pateticos
  9.  }
  10. }
  11.  
  12.  
Bueno, por el momento es todo. Saludos. :hola: