[ Foro de Pascal ]
Buenas tardes, necesito un poco de ayuda o un ejemplo para entender como puedo hacer una paginación en pascal, lo que deseo hacer es mostrar en pantalla una matriz, pero cuando la matriz es muy grande necesito mostrar la parte NO visible en una nueva pagina. Por favor necesito cualquier ayuda o un ejemplo que me sirva para aprender como hacerlo. Estoy aprendiendo a programar pero se me ha hecho muy difícil hacer esto...gracias de antemano.
Podrías mandar a mostrar todos los resultados a través de un ciclo, como por ejemplo el "for", pero, dentro del bloque de instrucciones de ese bucle, la última sería un condicional "if", que si vas a mostrar grupos de 20 en 20, la condición vendría a ser:
if (i mod 20 = 0) then
readln;
De esta manera, el usuario está obligado a presionar cualquier tecla para que se siga mostrando más resultados, de 20 en 20.
Si quieres mostrarlos de 25 en 25, la condición sería (i mod 25 = 0), y así con cualquier cantidad de resultados que desees mostrar.
Espero haberte orientado.
Saludos.
Gracias por responder, solo tengo una duda, al colocar el condicional debo mandar a limpiar la pantalla de nuevo verdad, y continuar con la escritura. o debo colocar un bucle adicional? De verdad muchas gracias
Esto es lo que llevo hasta ahora, he visto que si funciona hacerlo de esa forma, sin embargo por la forma en que llevo hecho el codigo, hace que el indice no se escriba nuevamente a principio de pantalla sino que sigue al final.. para que se entienda mejor, anexo el codigo que llevo hecho, cabe resaltar que he recibido mucha ayuda para hacer lo poco que llevo.
program borrador;
(* Unidades utilizadas *)
Uses
Crt, dos, sysutils;
(* Declaracion de constantes. Dos arreglos. *)
Const
dias: array[0..6] of string[9] = ('Domingo', 'Lunes', 'Martes', 'Miercoles', 'Jueves', 'Viernes', 'Sabado');
meses: array[1..12] of string[10] = ('enero', 'febrero','marzo','abril','mayo','junio','julio','agosto','septiembre',
'octubre','noviembre','diciemnbre');
(* Declaracion de variables globales *)
Var
sw: byte;
opcion: char;
year, month, day, dow: word;
cantidadMP : integer; (* esta variable controla la cantidad de productos en inventario *)
codMP, uniMP: string[10];
nomMP, desMP: string[25];
stockMP,j,k: integer;
MatPrima: array[1..50,1..5] of string[25];
fechaEMP:string[10];
fechaDMP:string[10];
EntradasMP:array[1..50,1..3] of string[25];
SalidasMP :array[1..50,1..3] of string[25];
(*SECCION: Procedimientos y funciones *)
(* Procedimiento para ingresar datos *)
Procedure Ingresar;
Var
i: integer;
resp: char;
Begin
ClrScr;
gotoxy(18,01); write('INGRESO DE NUEVO PRODUCTO (MP) AL INVENTARIO');
gotoxy(18,02); write('--------------------------------------------');
gotoxy(18,04); write('C¢digo de la MP: ');
gotoxy(18,05); write('Nombre de la MP: ');
gotoxy(18,06); write('Descripci¢n de la MP: ');
gotoxy(18,07); write('Unidad de medida: ');
gotoxy(18,08); write('Cantidad minima (stock): ');
(* Con este repita-hasta se valida que el codigo no quede nulo o vacio *)
Repeat
(* inicializa variables *)
codMP:='';
nomMP:='';
desMP:='';
uniMP:='';
repeat
gotoxy(44,04);
readln(codMP);
until codMP <> '';
repeat
gotoxy(44,05);
readln(nomMP);
until nomMP <> '';
gotoxy(44,06); readln(desMP);
if desMP = '' then
desMP := '-sin descripcion-';
repeat
gotoxy(44,07);
readln(uniMP);
until uniMP <> '';
stockMP := 0;
gotoxy(44,08); write(stockMP:0,' ');
repeat
gotoxy(44,08);
readln(stockMP);
until IntToStr(stockMP) <> '';
resp := ' ';
gotoxy(10,10); write('Aceptar datos? (S/C/N):');
gotoxy(43,10); write('(S:Si / C:Corregir / N:No)');
repeat
gotoxy(36,10);
write(' ');
gotoxy(36,10);
readln(resp);
(* UPCASE convierte el caracter en may£scula *)
resp:= upcase(resp);
until (resp='C') or (resp='S') or (resp = 'N');
if resp = 'C' then
begin
gotoxy(10,12); write('Ingrese todos los datos de nuevo.');
gotoxy(10,13); write('Por favor, revise antes de aceptar.');
end;
Until (resp = 'N') or (resp = 'S');
if (resp = 'S') then
begin
(* validar que no se repita el codigo del producto *)
(* se recorre la matriz en busca del codigo ingresado *)
resp := 'N';
for i:= 1 to cantidadMP do
begin
if (MatPrima[i,1] = codMP) then
resp:='E'; (* existe el codigo *)
end;
if (resp <> 'E') then
begin
cantidadMP:= cantidadMP + 1; (* se incrementa el contador de productos *)
(* Los datos se almacenan en mayuscula *)
MatPrima[cantidadMP,1] := UpCase(codMP);
MatPrima[cantidadMP,2] := UpCase(nomMP);
MatPrima[cantidadMP,3] := UpCase(desMP);
MatPrima[cantidadMP,4] := UpCase(uniMP);
(* la funcion IntToStr convierte de entero a string. StrToInt hace lo contrairio *)
MatPrima[cantidadMP,5] := IntToStr(stockMP);
end
else
begin
gotoxy(16,14); write('CODIGO de MP REPETIDO.');
gotoxy(16,15); write('Por favor, revise los datos e intente de nuevo');
readln;
end;
end;
End;
Procedure Entradas;
Var
existe: boolean;
resp: char;
cantidadEMP,i: integer;
begin
if cantidadMP = 0 then
begin
gotoxy(8,20);
write('DISCULPE, PRIMERO DEBE REGISTRAR UN PRODUCTO. ENTER PARA CONTINUAR');
readln;
end
else
begin
clrScr;
gotoxy(19,01); write('ENTRADAS DE PRODUCTOS AL INVENTARIO');
gotoxy(19,02); write('===================================');
gotoxy(19,06); write('Ingresa el Codigo de MP:');
gotoxy(44,06); read(codMP);
codMP := UpCase(codMP);
existe := false;
for i:= 1 to 50 do
begin
if (MatPrima[i,1] = codMP) then
begin
existe:= true;
end;
end;
if (existe) then
begin
Repeat
fechaEMP :='';
ClrScr;
gotoxy(24,01); write('ENTRADAS DE PRODUCTOS AL INVENTARIO');
gotoxy(24,02); write('===================================');
gotoxy(18,04); write('INGRESA LOS DATOS QUE SE SOLICITAN A CONTINUACION ');
gotoxy(18,07); write('CANTIDAD ENTRANTE DE MP: ');
repeat
gotoxy(44,07);
readln(cantidadEMP);
until (cantidadEMP) <> 0;
gotoxy(18,08); write('FECHA DE INGRESO DE MP(D/M/A): ');
gotoxy(50,08);
readln(fechaEMP);
repeat
gotoxy(10,10); write('Aceptar datos? (S/C/N):');
gotoxy(43,10); write('(S:Si / C:Corregir / N:No)');
gotoxy(36,10);
write(' ');
gotoxy(36,10);
resp:= readkey;
resp:= upcase(resp);
until (resp='C') or (resp='S') or (resp = 'N');
if resp = 'C' then
begin
gotoxy(10,12); write('Ingrese todos los datos de nuevo.');
gotoxy(10,13); write('Por favor, revise antes de aceptar.');
end;
Until (resp = 'N') or (resp = 'S');
if (resp = 'S') then
begin
j:=j+1;
EntradasMP[j,1] := codMP;
EntradasMP[j,2] := IntToStr(cantidadEMP);
EntradasMP[j,3] := UpCase(fechaEMP);
end
else
begin
gotoxy(16,15); write('Por favor, revise los datos e intente de nuevo');
readln;
end;
end
else
begin
gotoxy(14,12); write('Disculpe, el codigo no esta registrado.');
gotoxy(40,22); write('Presione una tecla para salir');
readln;readln
end;
end;
end;
Procedure Salidas;
Var
existe: boolean;
resp: char;
cantidadDMP,i: integer;
begin
if cantidadMP = 0 then
begin
gotoxy(8,20);
write('DISCULPE, PRIMERO DEBE REGISTRAR UN PRODUCTO. ENTER PARA CONTINUAR');
readln;
end
else
begin
clrScr;
gotoxy(24,01); write('SALIDAS DE PRODUCTOS DEL INVENTARIO');
gotoxy(24,02); write('===================================');
gotoxy(19,06); write('Ingresa el Codigo de MP:');
gotoxy(44,06); read(codMP);
codMP := UpCase(codMP);
existe := false;
for i:= 1 to 50 do
begin
if (MatPrima[i,1] = codMP) then
begin
existe:= true;
end;
end;
if (existe) then
begin
Repeat
fechaEMP :='';
ClrScr;
gotoxy(24,01); write('SALIDAS DE PRODUCTOS DEL INVENTARIO');
gotoxy(24,02); write('===================================');
gotoxy(18,04); write('INGRESA LOS DATOS QUE SE SOLICITAN A CONTINUACION ');
gotoxy(18,07); write('CANTIDAD QUE EGRESA DE MP: ');
repeat
gotoxy(44,07);
readln(cantidadDMP);
until (cantidadDMP) <> 0;
gotoxy(18,08); write('FECHA DE EGRESO DE MP(D/M/A): ');
gotoxy(50,08);
readln(fechaDMP);
repeat
gotoxy(10,10); write('Aceptar datos? (S/C/N):');
gotoxy(43,10); write('(S:Si / C:Corregir / N:No)');
gotoxy(36,10);
write(' ');
gotoxy(36,10);
resp:= readkey;
resp:= upcase(resp);
until (resp='C') or (resp='S') or (resp = 'N');
if resp = 'C' then
begin
gotoxy(10,12); write('Ingrese todos los datos de nuevo.');
gotoxy(10,13); write('Por favor, revise antes de aceptar.');
end;
Until (resp = 'N') or (resp = 'S');
if (resp = 'S') then
begin
k:=k+1;
SalidasMP[k,1] := codMP;
SalidasMP[k,2] := IntToStr(cantidadDMP);
SalidasMP[k,3] := UpCase(fechaDMP);
end
else
begin
gotoxy(16,15); write('Por favor, revise los datos e intente de nuevo');
readln;
end;
end
else
begin
gotoxy(14,12); write('Disculpe, el codigo no esta registrado.');
gotoxy(40,22); write('Presione una tecla para salir');
readln;readln
end;
end;
end;
PROCEDURE Ver;
var
i,mayor: integer; {la variable "mayor" permite controlar la linea al final de las entradas y salidas.}
begin
if cantidadMP = 0 then
begin
gotoxy(8,20);
write('DISCULPE, NO HAY PRODUCTOS REGISTRADOS. ENTER PARA CONTINUAR');
readln;
end
else
begin
clrScr;
gotoxy(25,01); write('MOVIMIENTOS DE E/S DE PRODUCTOS');
gotoxy(25,02); write('===============================');
gotoxy(19,04);write('ENTRADAS');
gotoxy(52,04);write('SALIDAS');
gotoxy(8,05);write('-----------------------------------------------------------------');
gotoxy(8,06); write('Codigo');
gotoxy(19,06); write('Cant (E)');
gotoxy(31,06); write('Fecha ');
gotoxy(44,06); write('Codigo');
gotoxy(56,06); write('Cant (S)');
gotoxy(68,06); write('Fecha ');
gotoxy(8,07);write('-----------------------------------------------------------------');
if j>k then {SOLO SALEN EN PANTALLA 12 PRODUCTOS.... controlar salida}
mayor:=j
else
mayor:=k;
for i:=1 to j do
begin
gotoxy(08,08+i);write(EntradasMP[i,1]);
gotoxy(19,08+i);write(StrToInt(EntradasMP[i,2]):2);
gotoxy(29,08+i);write(EntradasMP[i,3]);
end;
for i:=1 to k do
begin
gotoxy(44,08+i);write(SalidasMP[i,1]);
gotoxy(56,08+i);write(StrToInt(SalidasMP[i,2]):2);
gotoxy(66,08+i);write(SalidasMP[i,3]);
end;
gotoxy(8,08+mayor+1);write('-----------------------------------------------------------------');
gotoxy(8,08+mayor+2); write('Enter para continuar...');
readln;
end
end;
begin
cantidadMP:= 0; (* esta variable se inicializa en cero *)
Repeat
ClrScr;
GETDATE(year,month,day,dow);
gotoxy(40,22);
Write(dias[dow],', ',day:0,' de ',meses[month],' de ',year:0);
gotoxy(40,23);Write('Total productos en el inventario:',cantidadMP:2);
gotoxy(10,01);write(' >>Licoreria las lomas. Movimiento de inventario<< ');
gotoxy(10,02);write('----------------------------------------------------');
gotoxy(10,04);write('Materia Prima:');
GOTOXY(15,05);Write('Ingresar................................. 1 ');
GOTOXY(15,06);Write('Entradas................................. 2 ');
GOTOXY(15,07);Write('Salidas ................................. 3 ');
GOTOXY(15,08);Write('Historial de movimientos...................4 ');{entradas y salidas}
GOTOXY(15,17);Write(' Para salir del Programa (Esc)');
GOTOXY(15,18);WRITE(' ¨Opcion?:');
Repeat
sw:=0;
gotoxy (57,18);
write(' ');
opcion:=READKEY;
gotoxy(57,18);
write(opcion);
SOUND(505);
DELAY(400);
NOSOUND;
If (opcion IN ['1'..'9']) OR (opcion=CHR(27)) Then
sw:=1
Else
Begin
sw:=0;
gotoxy(57,18);
write(' ');
End;
Until (opcion IN ['1'..'9']) OR (opcion=CHR(27));
Case opcion OF
'1' : Ingresar;
'2' : Entradas;
'3' : Salidas;
'4' : Ver;
End;
until opcion=CHR(27)
end.
No he podido ejecutar tu código porque no tengo instalado Free Pascal, espero instalarlo en unos días. En cuanto a tu pregunta, sí se puede mandar a limpiar la pantalla, sería algo así:
if (i mod 20 = 0) then
Begin
write('Presiona una tecla para ver los siguientes datos ...');
readln;
ClrScr;
End;
Saludos.
Gracías, algo como eso estoy haciendo, solo que los elementos de ambas matrices se estan mostrando y no logro hacer que se pase correctamente en el caso de que una de las matrices necesite pasar la pagina, y la otra no, no se si me explico correctamente..
(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)