Ir al contenido


Foto

Generar menú a través de POO con Lazarus


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

#1 armadillo

armadillo

    Member

  • Miembros
  • PipPip
  • 13 mensajes

Escrito 06 marzo 2016 - 03:02

Hola Amig@s!!

Nuevamente aqui a la espera de que me rescaten ... estoy un poco perdido..

Les explico, soy nuevo con esto de la POO y volviendo un poco a los orígenes y practicando un poco o intentando de hacer  programación de objetos con pascal me surgen una serie de dudas..

He cogido una antigua funcion en pascal y queria convertirla en un clase...

La funcion me generaba un menu de opciones Horizontal o Vertical, dandole una array con las opciones y me devolvía la posicion del arreglo con la opcion seleccionada.

A continuacion os pongo el codigo en formato de "Classes", pero me saltan errores de ejecucion que no entiendo, y me gustaria me lo revisaran y me dieran algun consejo

El Codigo es este:


delphi
  1. program MenuClass;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. uses
  6. {$IFDEF UNIX}{$IFDEF UseCThreads}
  7. cthreads,
  8. {$ENDIF}{$ENDIF}
  9. Classes, sysutils, Crt
  10. { you can add units after this };
  11.  
  12. const
  13. FLECHA_ARRIBA =CHAR(72);
  14. FLECHA_ABAJO =CHAR(80);
  15. FLECHA_DER = CHAR(77);
  16. FLECHA_IZQ = CHAR(75);
  17. ENTER = CHAR(13);
  18. ESC = CHAR(27);
  19.  
  20.  
  21. type
  22. Tmenu = Class
  23. actual, X, Y: Integer;
  24. color_fondo, color_txt: Integer;
  25. nro_opc: integer;
  26. esvertical: boolean;
  27. opciones: array[1..10] of string;
  28. procedure vertical;
  29. procedure horizontal;
  30. procedure navegacion;
  31. end;
  32.  
  33.  
  34.  
  35.  
  36. procedure Tmenu.vertical;
  37. var
  38. yy, i: integer;
  39. begin
  40. yy:=Y;
  41. for i := 1 to nro_opc do
  42. begin
  43. gotoxy(X,yy);
  44. if i = actual then
  45. begin
  46. textcolor(COLOR_FONDO);
  47. TextBackground(COLOR_TXT);
  48. end
  49. else
  50. begin
  51. textcolor(COLOR_TXT);
  52. TextBackground(COLOR_FONDO);
  53. end;
  54. write(opciones[i]);
  55. yy:=Y+i;
  56. end;
  57. end;
  58.  
  59. procedure Tmenu.horizontal;
  60. var
  61. offset: byte;
  62. xx, i: integer;
  63. begin
  64. offset:=0;
  65. xx:=X;
  66. for i := 1 to nro_opc do
  67. begin
  68. gotoxy(xx,Y);
  69. if i = actual then
  70. begin
  71. TextColor(COLOR_FONDO);
  72. TextBackground(COLOR_TXT);
  73. end
  74. else
  75. begin
  76. TextColor(COLOR_TXT);
  77. TextBackground(COLOR_FONDO);
  78. end;
  79. write(opciones[i]);
  80. xx:=xx+Length(opciones[i])+offset;
  81. end;
  82. end;
  83.  
  84. procedure Tmenu.navegacion;
  85. var
  86. tecla: char;
  87. begin
  88. repeat
  89. { Escribo opciones }
  90. if esvertical then vertical else horizontal;
  91.  
  92. { Espero tecla }
  93. tecla := readkey;
  94.  
  95. { Segun la tecla, subo, bajo o salgo }
  96. if tecla = chr(0) then { Si es tecla de especial }
  97. tecla := readkey; { tengo que ver el 2do byte }
  98.  
  99. { Las teclas de cursor serían 72, 75, 77 y 80 (después de leer un #0).}
  100. if (tecla = FLECHA_IZQ) and (actual > 1) then actual := actual - 1;
  101. if (tecla = FLECHA_DER) and (actual < nro_opc) then actual := actual + 1;
  102.  
  103. until tecla = ENTER; { Hasta pulsar ENTER }
  104. end;
  105.  
  106.  
  107.  
  108. var
  109. Menu1: Tmenu;
  110. opcionesMenu: array[1..8] of string;
  111. i: integer;
  112.  
  113.  
  114. begin
  115. opcionesMenu[1]:=' Primero ';
  116. opcionesMenu[2]:=' Anterior ';
  117. opcionesMenu[3]:=' Siguiente ';
  118. opcionesMenu[4]:=' Ultimo ';
  119. opcionesMenu[5]:=' Insertar ';
  120. opcionesMenu[6]:=' Borrar ';
  121. opcionesMenu[7]:=' Editar ';
  122. opcionesMenu[8]:=' Guardar ';
  123. ClrScr;
  124.  
  125. Menu1.Create;
  126.  
  127.  
  128. Menu1.actual:=2;
  129. Menu1.X:=1;
  130. Menu1.Y:=1;
  131. Menu1.esvertical:=False;
  132. Menu1.nro_opc:=Length(OpcionesMenu);
  133.  
  134. for i:=1 to Length(opcionesMenu) do Menu1.opciones[i]:=opcionesMenu[i];
  135.  
  136. Menu1.color_fondo:=Red;
  137. Menu1.color_txt:=Black;
  138.  
  139. Menu1.navegacion;
  140.  
  141. writeln();
  142. writeln('Usted eligio: '+Menu1.opciones[Menu1.actual]);
  143.  
  144. Menu1.Free;
  145.  
  146. end.

El errror que me sale en ejecucion es este:

 

An unhandled exception occurred at $080483F5:
                                             EAccessViolation: Access violation
                                                                                 $080483F5  main,  line 130 of MenuClass.lpr
 

 

Estoy usando Lazarus en su ultima version Corriendo en Fedora

 

Si alguien puede darme una ayuda... a la escucha estoy..

Muchas gracias


  • 0

#2 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 06 marzo 2016 - 03:30

Hola.

 

Prueba a cambiar la línea 126 por:

 

Menu1 := TMenu.Create;


  • 0

#3 BDWONG

BDWONG

    Member

  • Miembros
  • PipPip
  • 28 mensajes

Escrito 07 marzo 2016 - 10:03

Añadiendo a lo que dice Marc, en la parte de la declaracion de tu clase intenta que siempre que se pueda herede de TObject

algo asi:


delphi
  1. Tmenu = Class(TObject)

Otra cosa es que debes evitar acceder directamente a los atributos de una clase como aqui:


delphi
  1. Menu1.actual:=2;
  2. Menu1.X:=1;
  3. Menu1.Y:=1;
  4. Menu1.esvertical:=False;

Por convencion siempre deberian ser privados y si necesitar acceder tanto a su lectura como escritura puedes crearle unos metodos  setter y getter estilo c++ o Java, aunque Object Pascal/Delphi maneja algo mas "elegante" llamado propiedades  las cuales les puedes restringir si solo van a leer o escribir el contenido de un atributo o podrian ser ambas.


  • 1

#4 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 08 marzo 2016 - 08:49

No es por hacerme publicidad, pero yo he rescrito unos manuales sobre los conceptos de POO aplicados en Delphi. Si bien Delphi y Lazarus tienen sus diferencias ambos siguen el mismo lenguaje: Object Pascal por lo que lo que leas en ellos puede ser llevado sin ningún inconveniente y con absoluta compatibilidad a Lazarus.

Sugiero su leída, además de lo aportado por el resto de los compañeros.

 

Cualquier duda o problemas, aquí estaremos para asistirte.

 

Saludos,


  • 0

#5 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 08 marzo 2016 - 05:50

Editado el título del tema por uno más descriptivo...
  • 0

#6 armadillo

armadillo

    Member

  • Miembros
  • PipPip
  • 13 mensajes

Escrito 13 marzo 2016 - 02:42

Hola.

 

Prueba a cambiar la línea 126 por:

 

Menu1 := TMenu.Create;

Gracias Marc!!!

Esa fue la solucion... ya investigare el porque.

Gracias


  • 0

#7 armadillo

armadillo

    Member

  • Miembros
  • PipPip
  • 13 mensajes

Escrito 13 marzo 2016 - 02:45

Añadiendo a lo que dice Marc, en la parte de la declaracion de tu clase intenta que siempre que se pueda herede de TObject

algo asi:


delphi
  1. Tmenu = Class(TObject)

Otra cosa es que debes evitar acceder directamente a los atributos de una clase como aqui:


delphi
  1. Menu1.actual:=2;
  2. Menu1.X:=1;
  3. Menu1.Y:=1;
  4. Menu1.esvertical:=False;

Por convencion siempre deberian ser privados y si necesitar acceder tanto a su lectura como escritura puedes crearle unos metodos  setter y getter estilo c++ o Java, aunque Object Pascal/Delphi maneja algo mas "elegante" llamado propiedades  las cuales les puedes restringir si solo van a leer o escribir el contenido de un atributo o podrian ser ambas.

Newbie Gracias por la respuesta!!

Tienes toda la razon... es solo una simpla practica de primero...

Ya lo estoy cambiando para evitar el acceso directo a los atributos.

Saudos


  • 0




IP.Board spam blocked by CleanTalk.