Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-10-2015
MoeHoward MoeHoward is offline
Registrado
NULL
 
Registrado: oct 2015
Posts: 5
Poder: 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
  #2  
Antiguo 16-10-2015
MoeHoward MoeHoward is offline
Registrado
NULL
 
Registrado: oct 2015
Posts: 5
Poder: 0
MoeHoward Va por buen camino
olvidé mencionar:

VE1 : array of Real;
RE1 : Integer;
Responder Con Cita
  #3  
Antiguo 16-10-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola MoeHoward, bienvenido a los foros de Club Delphi

Y como acostumbramos con los ingresantes, te invitamos a que leas nuestra guía de estilo.

Si no interpreté mal la consigna, tu código está bién encaminado. Pero veo algunos detalles:
  • Solo ejecuta para el valor 1 del ComboBox.
  • La línea:
    Código Delphi [-]
    for i := 0 to ND1 do
  • tendría que ser:
    Código Delphi [-]
    for i := 0 to ND1-1 do
  • Y en lugar de la función Trunc, tendrias que usar la función Round
Quedaría así:
Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
var
  i : Integer;
  LI1, LS1, ND1 : Integer;  //LI: límite inferior, LS: límite superior, ND: número de divisiones
  x1 : Real;                //Acumulador
  RES1 : Real;              //Resolución de las variables
  VE1 : array of Real;
  RE1 : Integer;
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 := Round(RE1/RES1);              //Número de divisiones
  SetLength(VE1, ND1);                 //Se establece longitud del vector

  x1 := 0;
  // Dec(ND1);  para evitar: ND1-1
  for i := 0 to ND1-1 do
  begin
    VE1[i] := x1;
    x1 := x1 + RES1;
  end;
  // mostrar valores en el memo
  Memo1.Clear;
  for i := 0 to ND1-1 do
    Memo1.Lines.Add(Format('v[%.2d] = %3.2f',[i, VE1[i]]))
end;

Se puede optimizar un poco,
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  v                : array of Double;
  i,topInf, topSup : Integer;
  Delta, Incr      : Double;;
begin
  topInf := StrToIntDef(MaskEdit1.Text, 0);
  topSup := StrToIntDef(MaskEdit2.Text, 0);
  if (TopSup-TopInf > 0) and (ComboBox1.ItemIndex <> -1) then
  begin
    delta := StrToFloat(ComboBox1.Items[ComboBox1.ItemIndex]);
    SetLength(v, Round((TopSup-TopInf) / Delta));

    Incr := 0;
    for i := Low(v) to High(v) do
    begin
      v[i] := Incr;
      Incr := Incr + Delta;
    end;

    // mostrar valores en el memo
    Memo1.Clear;
    for i := Low(v) to High(v) do
      Memo1.Lines.Add(Format('v[%.2d] = %3.2f',[i,v[i]]))
  end
  else
    ShowMessage('Revise los datos de ingreso');
end;
El control de ingreso no es muy exaustivo para no complicar el código (tal vez te convendría usar SpinEdits en lugar de los MaskEdits).

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #4  
Antiguo 24-10-2015
MoeHoward MoeHoward is offline
Registrado
NULL
 
Registrado: oct 2015
Posts: 5
Poder: 0
MoeHoward Va por buen camino
Muchas gracias ecfisa!
Ya resolví el problema, me sirvió mucho tu explicación así con detalles y con la optimización del código.
El problema estaba en que me equivoqué al definir la longitud de mi vector con otra variable(RES1 en lugar de RE1), algo muy simple jeje.

Gracias por todo, saludos.
Responder Con Cita
  #5  
Antiguo 24-10-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Por cierto, yo lo primero que vi con olor es el uso del tipo Real

Yo ni sabia de la existencia de ese tipo, bueno si que estaba en Pascal, pero no sabia que venia con Delphi. Yo siempre uso Single o Double

Es mas, acá se aconseja lo mismo debido a que el tipo Real esta obsoleto

El Double es el mas "comun" por decirlo de una manera. Tiene balance de precision/velocidad
El Single es mas rápido que el Double, pero pierde precision
El Extended es el más lento pero el de mayor precision

Saludos
Responder Con Cita
  #6  
Antiguo 03-11-2015
MoeHoward MoeHoward is offline
Registrado
NULL
 
Registrado: oct 2015
Posts: 5
Poder: 0
MoeHoward Va por buen camino
Gracias, lo tomaré en cuenta ya que en el programa ocupo de un gran número de variables que son de este tipo.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Generar XML a Partir de XSD Avellas Internet 3 02-05-2022 11:54:57
Generar Metadatos a partir de una consulta SQL. Neeruu MS SQL Server 10 09-04-2014 01:02:00
generar un string a partir de dos celdas de un DbGrid pablopessoa Conexión con bases de datos 3 20-10-2008 18:18:44
Generar fichero x.tlb a partir de x_TLB.pas albion Varios 1 16-06-2006 13:20:51
generar html (tablas) a partir de query jymy788 Varios 2 28-09-2004 10:29:36


La franja horaria es GMT +2. Ahora son las 21:39:53.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi