Ir al contenido


Foto

Convertir valor linea memo a entero


  • Por favor identifícate para responder
5 respuestas en este tema

#1 jacapu

jacapu

    Advanced Member

  • Miembros
  • PipPipPip
  • 56 mensajes

Escrito 10 agosto 2022 - 06:16

Hola, llevo dándole vueltas un buen rato y no logro hacerlo funcionar.  Estoy creando una lista de números con Random que paso a un memo y
según el número del Random debe ejecutarse el evento OnClick de un botón especifico.
Intento pasar el valor de la línea del memo a entero para  poder seleccionar el botón que debe ejecutarse y me da error de conversión al ejecutar el programa.
Tengo el siguiente código:
 

 


delphi
  1. procedure TVPrincipal.SpeedB1Click(Sender: TObject);
  2. var
  3. Ristra:TAlea; //clase que guarda los números del seleccionables
  4. n:integer;
  5. numact:integer;
  6. numact1:string;
  7. numeros:integer;
  8. begin
  9.     numeros:=8;
  10.     Memo1.Lines.Clear;
  11.     Ristra:=TAlea.Create(112);//numeros seleccionables
  12.     for n:=1 to numeros do // numeros elegidos
  13.        begin
  14.        if Ristra.PillaNumero<>0 then
  15.           begin
  16.           memo1.Lines.Add(IntToStr(Ristra.PillaNumero));
  17.           numact1:=Memo1.Lines[n]; //cadena con el valor de la linea del memo
  18.           numact:=StrtToInt(numact1); //conversión a entero <<<<<<da error de conversión al correr ,(mensaje: " ' ' is not a valid integer value"
  19.           case Ristra.PillaNumero of
  20.              1:SB1.OnClick(Sender);
  21.              2:SB2.OnClick(Sender);
  22.              // 2,3 ...
  23.              end;
  24.           end;
  25.        end;
  26.     Ristra.Reset;
  27.     Ristra.Free;
  28. end;

 

 
No sé si se puede mejorar.
Saludos.


  • 0

#2 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 11 agosto 2022 - 04:17

Cuando publiques código, dale el formato usando las etiquetas de código. He editado tu mensaje para darle formato.
 
No entiendo el planteamiento que tienes usando un TMemo para convertir enteros a texto y viceversa. Desde mi punto de vista debes usar un array de enteros para almacenar los números aleatorios que correspondan conm los botones a pulsar y no usar un memo, pues sobra.
 
Ya que tienes una clase que almacena los números (no pones nada de código de la misma), te propongo algo como esto:
 


delphi
  1. type
  2. TAlea = class
  3. private
  4. Items: array of integer;
  5. public
  6. constructor Create(const Size: integer);
  7. destructor Destroy; override;
  8. function PillaNumero(i: integer): integer;
  9. end;
  10.  
  11. implementation
  12.  
  13.  
  14. constructor TAlea.Create(const Size: Integer);
  15. var
  16. i: integer;
  17. begin
  18. inherited Create;
  19. SetLength(Items, Size);
  20. for i:=0 to Size - 1 do
  21. Items[i]:= Random(Size)+1;
  22. end;
  23.  
  24. destructor TAlea.Destroy;
  25. begin
  26. Items:= nil;
  27. inherited Destroy;
  28. end;
  29.  
  30. function TAlea.PillaNumero(i: integer): integer;
  31. begin
  32. Result:= Items[i]
  33. end;
  34.  
  35. //
  36. //
  37. //
  38.  
  39. procedure TVPrincipal.SpeedB1Click;
  40. var
  41. Ristra: TAlea;
  42. n: integer;
  43. numeros:integer;
  44. begin
  45. numeros:= 3;
  46. Ristra:= TAlea.Create(numeros);
  47. for n:=0 to numeros -1 do
  48. begin
  49. case Ristra.PillaNumero(n) of
  50. 1: SB1.OnClick(SB1);
  51. 2: SB2.OnClick(SB2);
  52. 3: SB3.OnClick(SB3);
  53. // ...
  54. end;
  55. end;
  56. end; 

Aunque puestos a simplificar el asunto de pulsar botones de forma aleatoris puedes obviar la clase TAlea y generar el número justo al necesitarlo:


delphi
  1. procedure TVPrincipal.SpeedB1Click2;
  2. var
  3. n: integer;
  4. numeros:integer;
  5. begin
  6. numeros:= 3;
  7. for n:=0 to numeros -1 do
  8. begin
  9. case Random(numeros)+1 of
  10. 1: SB1.OnClick(SB1);
  11. 2: SB2.OnClick(SB2);
  12. 3: SB3.OnClick(SB3);
  13. // ...
  14. end;
  15. end;
  16. end;

Saludos.


  • 2

#3 jacapu

jacapu

    Advanced Member

  • Miembros
  • PipPipPip
  • 56 mensajes

Escrito 11 agosto 2022 - 09:30

Hola Escafandra, gracias por responder tan pronto.

La clase TAlea me genera los números aleatorios sin repetición.

Hasta aquí todo bien.

Lo que no me funciona es la conversión de la línea del Memo de cadena a entero.

Con este valor entero ya podría entrar en la función case para ejecutar el código del evento OnClick del botón asignado a este número de la secuencia que muestra el Memo.

Parece como si al convertir de cadena a entero encontrara un valor vacío, (" "), que muestra en el mensaje de error al correr el programa.

En lugar de case tambien podría ser con if then else, era para no escribir tanto.

He intentado mostrar el valor de "Memo1.Lines[n]" y  "Memo1.Lines.Strings[n]" mediante ShowMessage y me sale el diálogo en blanco, como dice el mensaje de error.

Entrando en "case" con "Ristra.PillaNumero" tampoco activa el botón asignado.

He probado con "Randomize" y "RandomRange" en lugar de "TAlea", pero algunas veces genera números repetidos.

El problema está en conseguir el valor de la línea actusl del memo como cadena o entero y poder entrar con ese valor en la función "case" o "if ..then ...".


  • 0

#4 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 11 agosto 2022 - 02:25

Por partes:

1) ¿Por qué quieres pasar un entero a String y luego volver a recuperar el entero desde el String en una misma función? No tiene sentido. 

2) Tu cadena está vacía porque los indices de linea comienzan en cero y tu bucle comienza con n=1. Prueba con numact1:=Memo1.Lines[n-1] o comenzando con  n = 0.

3) No has puesto el código de la clase TAlea que también puede contener errores. En concreto no se entiende como funciona PillaNumero ya que no tiene ningún indice que apunte a uno de los 112 número que parece que almacena la clase. En caso de que esa función genere el número aleatorio, ten en cuenta que la ejecutas varias veces y que en cada una te devolvería un número diferente con lo que el valor que almacenes en el TMemo y el del botón pulsado no corresponderían.


Saludos.


  • 0

#5 jacapu

jacapu

    Advanced Member

  • Miembros
  • PipPipPip
  • 56 mensajes

Escrito 16 agosto 2022 - 01:58

Hola Escafandra, perdona la tardanza pero he estado ocupado.

No he puesto el código de la clase TAlea porque no es mío. Lo encontré en Trucomanía. No sé si se puede poner aquí código de otro sin que él lo sepa. La dirección es:

 http://www.trucomani...uco.cgi?493

TAlea genera un número aleatorio sin repetición desde n1 a nfinal y los escribe cada uno en una línea del Memo..

Por esto los números van a un Memo.

Como te comentaba antes, la idea era, puesto que en cada linea del Meno se guarda un número, coger los números de cada línea y hacer Click en el botón correspondiente.

Quería hacerlo con "case" para no escribir sentencias: 


php
  1. if Memo1.Lines[n] ='1' then SB1.OnClick(SB1) else if ...

En la sincronizción de las líneas del Memo con las opciones del "case" te doy la razón, fallo mío.

Si uso "Random" o "RandonRange" a veces genera números aleatorios repetidos y en consecuencia se ejecutaría el evento "OnClick" del botón correspondiente más de una vez.

Gracias por tu tiempo.

saludos.


  • 0

#6 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 16 agosto 2022 - 03:30

Según el planteamiento de convertir a texto el número para luego volver a encontrar el número original, el código sería así:


delphi
  1. procedure TForm1.SpeedB1Click;
  2. var
  3. Ristra: TAlea;
  4. n: integer;
  5. numeros:integer;
  6. begin
  7. numeros:= 3;
  8. Memo1.Clear;
  9. Ristra:= TAlea.Create(3);
  10. for n:=0 to numeros -1 do
  11. begin
  12. Memo1.Lines.Add(IntToStr(Ristra.PillaNumero));
  13. case StrToInt(Memo1.Lines[n]) of
  14. 1: SB1.OnClick(SB1);
  15. 2: SB2.OnClick(SB2);
  16. 3: SB3.OnClick(SB3);
  17. // ...
  18. end;
  19. Update;
  20. end;
  21. end;

Pero me parece mucho más razonable de esta otra manera:


delphi
  1. procedure TForm1.SpeedB1Click;
  2. var
  3. Ristra: TAlea;
  4. n: integer;
  5. numeros:integer;
  6. Pillado: integer;
  7. begin
  8. numeros:= 3;
  9. Memo1.Clear;
  10. Ristra:= TAlea.Create(3);
  11. for n:=0 to numeros -1 do
  12. begin
  13. Pillado:= Ristra.PillaNumero;
  14. case Pillado of
  15. 1: SB1.OnClick(SB1);
  16. 2: SB2.OnClick(SB2);
  17. 3: SB3.OnClick(SB3);
  18. // ...
  19. end;
  20. Memo1.Lines.Add(IntToStr(Pillado));
  21. Update;
  22. end;
  23. end;

Saludos.
 

 

 


  • 1




IP.Board spam blocked by CleanTalk.