[ Foro de Pascal ]

Paginar pascal

25-Aug-2015 21:12
Invitado (Dany)
5 Respuestas

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.


26-Aug-2015 07:40
Luis Torres (+12)

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.


27-Aug-2015 22:15
Invitado (Dany)

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


28-Aug-2015 03:55
Invitado (Dany)

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.
 


 


28-Aug-2015 19:22
Luis Torres (+12)

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.


30-Aug-2015 23:17
Invitado (Dany)

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.)