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:
program MenuClass; {$mode objfpc}{$H+} uses {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} Classes, sysutils, Crt { you can add units after this }; const FLECHA_ARRIBA =CHAR(72); FLECHA_ABAJO =CHAR(80); FLECHA_DER = CHAR(77); FLECHA_IZQ = CHAR(75); ENTER = CHAR(13); ESC = CHAR(27); type Tmenu = Class actual, X, Y: Integer; color_fondo, color_txt: Integer; nro_opc: integer; esvertical: boolean; opciones: array[1..10] of string; procedure vertical; procedure horizontal; procedure navegacion; end; procedure Tmenu.vertical; var yy, i: integer; begin yy:=Y; for i := 1 to nro_opc do begin gotoxy(X,yy); if i = actual then begin textcolor(COLOR_FONDO); TextBackground(COLOR_TXT); end else begin textcolor(COLOR_TXT); TextBackground(COLOR_FONDO); end; write(opciones[i]); yy:=Y+i; end; end; procedure Tmenu.horizontal; var offset: byte; xx, i: integer; begin offset:=0; xx:=X; for i := 1 to nro_opc do begin gotoxy(xx,Y); if i = actual then begin TextColor(COLOR_FONDO); TextBackground(COLOR_TXT); end else begin TextColor(COLOR_TXT); TextBackground(COLOR_FONDO); end; write(opciones[i]); xx:=xx+Length(opciones[i])+offset; end; end; procedure Tmenu.navegacion; var tecla: char; begin repeat { Escribo opciones } if esvertical then vertical else horizontal; { Espero tecla } tecla := readkey; { Segun la tecla, subo, bajo o salgo } if tecla = chr(0) then { Si es tecla de especial } tecla := readkey; { tengo que ver el 2do byte } { Las teclas de cursor serían 72, 75, 77 y 80 (después de leer un #0).} if (tecla = FLECHA_IZQ) and (actual > 1) then actual := actual - 1; if (tecla = FLECHA_DER) and (actual < nro_opc) then actual := actual + 1; until tecla = ENTER; { Hasta pulsar ENTER } end; var Menu1: Tmenu; opcionesMenu: array[1..8] of string; i: integer; begin opcionesMenu[1]:=' Primero '; opcionesMenu[2]:=' Anterior '; opcionesMenu[3]:=' Siguiente '; opcionesMenu[4]:=' Ultimo '; opcionesMenu[5]:=' Insertar '; opcionesMenu[6]:=' Borrar '; opcionesMenu[7]:=' Editar '; opcionesMenu[8]:=' Guardar '; ClrScr; Menu1.Create; Menu1.actual:=2; Menu1.X:=1; Menu1.Y:=1; Menu1.esvertical:=False; Menu1.nro_opc:=Length(OpcionesMenu); for i:=1 to Length(opcionesMenu) do Menu1.opciones[i]:=opcionesMenu[i]; Menu1.color_fondo:=Red; Menu1.color_txt:=Black; Menu1.navegacion; writeln(); writeln('Usted eligio: '+Menu1.opciones[Menu1.actual]); Menu1.Free; 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