Ver Mensaje Individual
  #1  
Antiguo 16-10-2015
MoeHoward MoeHoward is offline
Registrado
NULL
 
Registrado: oct 2015
Posts: 5
Reputación: 0
MoeHoward Va por buen camino
Problema para generar vector a partir de maskedit y combobox

Hola buen día, soy usuario nuevo en el foro y vengo a pedir ayuda y orientación para resolver un problema muy básico al generar un vector a partir de valores ingresados en dos maskedit y un combobox, soy principiante usando delphi espero su comprensión.

El objetivo del programa es generar un vector de rango 'n'. Esta 'n' está definida por el rango existente entre el MaskEdit1 y el MaskEdit2. Por ejemplo, si el maskedit1 tiene como texto '0' y el maskedit2 tiene como texto '10', el rango será 10, que resulta de la resta en entero de
10 - 0, strtoint(maskedit2.text) - strtoint(maskedit1.text). La longitud del vector se determina con el valor del combobox, los valores posibles pueden ser 0.1, 0.2, 0.5 o 1. Esto quiere decir que si en el combobox se selecciona 0.2 cada posición del vector aumentará 0.2. Para el ejemplo de 0 a 10, el vector tendrá una longitud de 50, resultante de 0.2/10, algo así es lo deseado: [0 0.2 0.4 0.6 .... 9.6 9.8 10]

El problema es que justo en las posiciones 23 a 27 del vector resultan valores con exponenciales muy pequeños cercanos a cero, al usar la función trunc() se vuelven cero. Entre la posición cero y la veintidos todo bien, y partir de la 28 todo bien.

Para comprobar, escribo cada posición del vector en una línea de un memo. El evento se genera al presionar un botón. Aquí el código:

Código Delphi [-]
var
  
  LI, LS, ND : Integer;                   //LI: límite inferior, LS: límite superior, ND: número de divisiones
  x1 : Real;                                 //Acumulador
  RES1 : Real;                              //Resolución de las variables

procedure TForm1.Button1Click(Sender: TObject);
var
i : Integer;
begin
  if ComboBox1.Text = '1' then
  begin
    LI1 := StrToInt(MaskEdit1.Text);          //Límite inferior en entero
    LS1 := StrToInt(MaskEdit2.Text);         //Límite superior en entero
    RES1 := StrToFloat(ComboBox1.Text);  //Resolución en real
    RE1 := LS1 - LI1;                              //Rango de la variable
    ND1 := trunc(RE1 / RES1);                 //Número de divisiones
    SetLength(VE1, RE1);                         //Se establece longitud del vector

    for i := 0 to ND1 do
      begin
        VE1[i] := LI1 + x1;
        x1 := x1 + RES1;
      end;

    for i := 0 to ND1 do
     begin
      Memo1.Lines.Add(FloatToStr(StrToFloat(FormatFloat('0.00', VE1[i]))));    //Con formato float se redondea y se da cero en la posición 23-27
      //Memo1.Lines.Add(FloatToStr(VE1[i]));                                              //En este formato las posiciones 23 a 27 tienen valores                         
                                                                                                          //exponenciales cercanos a cero
     end;

De antemano muchas gracias por su ayuda y su tiempo.

Última edición por roman fecha: 16-10-2015 a las 04:33:56. Razón: cerrar correctamente la etiqueta delphi
Responder Con Cita