[ Foro de Pascal ]
Estimado/s; necesito ayuda con una porcion de programa que me hace algo raro...lo que hace el programa es llevar un control de los materiales que se entregan, para los operarios, en una fabrica...y tiene una opcion de visualizar la lista, pero esta al ser muy extensa se me ocurrio mostrarla de apoco, cada 15 lineas, las primeras 15 me las muestra bien, sin problemas, las segunda tambien, pero despues de mostrarla, cuando tiene que poner que "precione ENTER para seguir mostrando, ya no lo ubica en el centro de la pantalla,y las lineas siguientes me aparecen desordenadas, me pueden decir porque?¡....
les dejo el codigo, estoy usando Free Pascal...
Procedure Visualiza();
Var
f,c,i,pos,n:integer;
Begin
assign(list,'C:\LISTA\Lista.dat');
ClrScr; NILSO();
reset(list);
Gotoxy(1,14); TextColor(14);
writeln('FECHA MATERIAL CANT DESTINO NOMBRE Y APELLIDO');
f:=15; c:=1;
n:=filesize(list);{Es pasa identificar cuantas lineas tiene la lista y asi usar ese numero en la iteracion de abajo}
pos:=0;
for i:= 1 to n do
begin
seek(list,pos); read(list,M);
Gotoxy(c,f); TextColor(7);
writeln(M.fecha,' ',M.mate);
Gotoxy(48,f); TextColor(7);
writeln(M.canti:4:1,' ',M.trab,M.nom:10,' ',M.ape);
pos:=pos+1;
f:=f+1;
if (i mod 15=0) then {Evaluo si llegue a los 15 para que corte, con enter me muestra 15 mas}
begin
Gotoxy(25,f+1); TextColor(2);
write('Precione ENTER para seguir mostrando');
readln();
Gotoxy(25,f); DelLine;
end
end;
Close(list);
f:=f+3;
Gotoxy(25,f); TextColor(12);
writeln('Precione una tecla para continuar');
readln();
ClrScr;
end;
ACA LES DEJO EL PROGRAMA COMPLETO POR LAS DUDAS Y ADJUNTO EL Lista.dat POR SI LOS NECESITAN...
Program Panol (input,output);
Uses CRT;
Type
material=Record
mate:string[35];
trab:string[10];
nom,ape:string[30];
fecha:string[10];
canti:real;
end;
archivo=file of material;
Var
list:archivo;
M:material;
res:char;
op:integer;
f:string[10];
Procedure NILSO();
Begin
gotoxy(33,1); TextColor(8); write('~~~~~~~~~~~~~~~~~~~~');
gotoxy(33,2); TextColor(8); write('~');
gotoxy(33,3); TextColor(8); write('~');
gotoxy(33,4); TextColor(8); write('~');
gotoxy(33,5); TextColor(8); write('~');
gotoxy(33,5); TextColor(8); write('~~~~~~~~~~~~~~~~~~~~');
gotoxy(52,2); TextColor(8); write('~');
gotoxy(52,3); TextColor(8); write('~');
gotoxy(52,4); TextColor(8); write('~');
gotoxy(52,5); TextColor(8); write('~');
gotoxy(35,3); TextColor(9);
Writeln('NILSO TORRE S.A.');
gotoxy(29,7); TextColor(10); write('+++++++++++++++++++++++++++');
gotoxy(29,9); TextColor(10); write('+++++++++++++++++++++++++++');
gotoxy(29,8); TextColor(10); write('+');
gotoxy(55,8); TextColor(10); write('+');
gotoxy(30,8); TextColor(13); writeln('SALIDA MATERIAL DE PA¥OL');
End;
Procedure Visualiza();
Var
f,c,i,pos,n:integer;
Begin
assign(list,'C:\LISTA\Lista.dat');
ClrScr; NILSO();
reset(list);
Gotoxy(1,14); TextColor(14);
writeln('FECHA MATERIAL CANT DESTINO NOMBRE Y APELLIDO');
f:=15; c:=1;
n:=filesize(list);
pos:=0;
for i:= 1 to n do
begin
seek(list,pos); read(list,M);
Gotoxy(c,f); TextColor(7);
writeln(M.fecha,' ',M.mate);
Gotoxy(48,f); TextColor(7);
writeln(M.canti:4:1,' ',M.trab,M.nom:10,' ',M.ape);
pos:=pos+1;
f:=f+1;
if (i mod 15=0) then
begin
Gotoxy(25,f+1); TextColor(2);
write('Precione ENTER para seguir mostrando');
readln();
Gotoxy(25,f); DelLine;
end
end;
Close(list);
f:=f+3;
Gotoxy(25,f); TextColor(12);
writeln('Precione una tecla para continuar');
readln();
ClrScr;
end;
Procedure Carga (Var list:archivo; Var M:material; Var f:string);
Var
c,pos:integer;
rta:char;
Begin
assign(list,'C:\LISTA\Lista.dat');
ClrScr; NILSO();
reset(list); c:=filesize(list);
if c=0 then
begin
rta:='s';
while (rta='s') or (rta='S') do
begin
ClrScr; NILSO();
M.fecha:=f;
Gotoxy(4,12); TextColor(1);
write('_Material a entregar: '); TextColor(7); readln(M.mate);
Gotoxy(4,14); TextColor(1);
write('_Cantidad: '); TextColor(7); readln(M.canti);
Gotoxy(4,16); TextColor(1);
write('_Destino: '); TextColor(7); readln(M.trab);
Gotoxy(4,18); TextColor(1);
write('_Nombre: '); TextColor(7); readln(M.nom);
Gotoxy(4,20); TextColor(1);
write('_Apellido: '); TextColor(7); readln(M.ape);
write(list,M);
ClrScr; NILSO();
writeln('Desea continuar con la entrega de Materiales?');
readln(rta);
ClrScr;
end;
Close(list);
ClrScr; NILSO();
end
else
begin
reset(list); seek(list,c);
rta:='s';
while (rta='s') or (rta='S') do
begin
ClrScr; NILSO();
M.fecha:=f;
Gotoxy(4,12); TextColor(1);
write('_Material a entregar: '); TextColor(7); readln(M.mate);
Gotoxy(4,14); TextColor(1);
write('_Cantidad: '); TextColor(7); readln(M.canti);
Gotoxy(4,16); TextColor(1);
write('_Destino: '); TextColor(7); readln(M.trab);
Gotoxy(4,18); TextColor(1);
write('_Nombre: '); TextColor(7); readln(M.nom);
Gotoxy(4,20); TextColor(1);
write('_Apellido: '); TextColor(7); readln(M.ape);
write(list,M);
ClrScr; NILSO();
writeln('Desea continuar con la entrega de Materiales?');
readln(rta);
ClrScr;
end;
Close(list);
end;
ClrScr; NILSO();
Gotoxy(20,12); TextColor(12);
writeln('Precione una tecla p/ volver al menu principal');
readln();
ClrScr;
end;
BEGIN
ClrScr; NILSO();
assign(list,'C:\LISTA\Lista.dat');
Gotoxy(3,12); TextColor(4);
write('-----------------');
Gotoxy(3,11); TextColor(1);
write('Ingrese la fecha: '); TextColor(7); readln(f);
ClrScr; NILSO();
Gotoxy(25,23); TextColor(7);
write('Para salir del Programa precione ESC');
res:=readkey;
ClrScr; NILSO();
while res<>#27 do
begin
ClrScr; NILSO();
Gotoxy(4,13); TextColor(3);
write('*****************');
Gotoxy(4,12); TextColor(1);
writeln('Elija una opcion: ');
Gotoxy(20,17);
writeln('1_Visualizar Lista 2_Entrega de Material');
readln(op);
ClrScr; NILSO();
if op=1 then
begin
Visualiza();
end
else
if op=2 then
begin
Carga(list,M,f);
end;
ClrScr; NILSO();
Gotoxy(25,23); TextColor(7);
write('Pasa salir del Programa precione ESC');
res:=readkey;
end;
Close(list);
END.
En el programa falta la parte de arriba:
Program NombreDelPrograma;
Uses UnidadesAUsar;
Así como está, no compila.
Saludos.
Si, lo se, me debo haber olvidado de ponerlo, pero el programa esta funcionando ok, salvo por los comentarios que puse anteriormente...Mustra bien 15 elementos de la lista, me sale el cartel centrado en la pantalla como yo lo programa diciendome que precione ENTER para seguir mostrando, lo preciono, muestra bien los otros 15, pero el cartel de precionar ENTER no me sale centrado como el anterior, y cuando precione enter los elementos que siguen salen desordenados, porque puede ser?¡....Alguien que me de una mano por favor¡¡¡¡ Gracias.
Pero pon la parte que falta del programa, para que pueda compilarlo y correrlo y, así ver con mis propios ojos lo que sucede. Recuerda que yo no manejo muy bien el Free Pascal, así que no conozco mucho sobre sus unidades. Por favor, coloca la parte que falta, así como está en el primer post no compila. Saludos.
Disculpa, fue un error mío copiar sin leer antes. Ya noté que el programa está más abajo. Lo copié todo y así no compila. Saludos.
¿Cómo debe ser la fecha a ingresar?. Escribe un ejemplo de fecha. Saludos.
Hola,
Yo en la fecha he probado "28-01-2012" y ha funcionado.
Ciao.
Hola, Lucas.
Supongo que Luis también coincidirá conmigo en que el programa es un poco "alocado". Mis comentarios son los siguientes:
- Para arreglar tu problema, se pueden hacer dos cosas: borrar una tanda de líneas y poner otra tanda, o bien, ir poniendo líneas tanda tras tanda, de manera acumulativa. Dinos cuál es tu idea con respecto a eso (a mí particularmente me gusta más la primera, porque puedes incluso añadirle funciones para pasar de una tanda a otra, en plan "por bloques").
- Me parece que sobra la pantalla en la que se dice únicamente lo de "PULSA ESC PARA SALIR". Mejor no poner nada, y pasar al menú (en el que se podría indicar la opción de ESC), o indicar en la pantalla que ya tienes algo como "PULSAR CUALQUIER TECLA PARA ENTRAR".
Ya nos dirás. Un saludo.
Los problemas surgen al tener textos cuya longitud excede el espacio destinado para ellos, entonces, el resto sobrante pasa a la siguiente línea y todo se descuadra a partir de allí. Cada campo del registro debe tener una longitud máxima y debes cuidar que la suma de las longitudes máximas no excedan el ancho de la pantalla (80 columnas). Eso debes cuidarlo al diseñar el programa y, debes tener en cuenta ese ancho permitido a la hora de ingresar los datos: si introduces un dato muy largo, el resultado es que tendrás una visualización de datos descuadrados. Ese creo que es el problema que tienes. Saludos.
Gracias a todos los que opinaron y me dieron una idea de como hacerlo, cuide que el ancho no se me excediera y lo que hice fue mostar los primeros 15 elementos, borro la pantalla y en el mismo lugar muestro los 15 siguientes y asi sucesibamente....y queda muy bien y muy estetico....lo que me gustaria consultarles ahora es lo siguiente....quiero realizar una busqueda,ya se por fecha o por apellido...le agregue al programa lo siguiente....
Procedure Busca();
Var
fecha:string[10];
ape:string[30];
op,f,c:integer;
Begin
assign(list,'C:\LISTA\Lista.dat');
ClrScr; NILSO();
reset(list);
Gotoxy(4,12); TextColor(1);
writeln('Elija el parametro para realizar la busqueda: ');
Gotoxy(20,14);
writeln('1_Por Fecha 2_Por Apellido');
readln(op);
if op=1 then
begin
ClrScr; NILSO();
Gotoxy(4,12); TextColor(1);
write('_Ingrese la Fecha: '); TextColor(12); readln(fecha);
ClrScr; NILSO();
Gotoxy(1,14); TextColor(14);
writeln('FECHA MATERIAL CANT DESTINO NOMBRE Y APELLIDO');
f:=15; c:=1;
read(list,M);
while fecha=M.fecha do
begin
reset(list);
Gotoxy(c,f); TextColor(7);
read(list,M);
writeln(M.fecha,' ',M.mate);
Gotoxy(48,f); TextColor(7);
writeln(M.canti:4:1,' ',M.trab,M.nom:10,' ',M.ape);
f:=f+1;
end;
Close(list);
readln();
end
else
if op=2 then
begin
ClrScr; NILSO();
Gotoxy(4,12); TextColor(1);
write('_Ingrese la Apellido: '); TextColor(12); readln(ape);
ClrScr; NILSO();
Gotoxy(1,14); TextColor(14);
writeln('FECHA MATERIAL CANT DESTINO NOMBRE Y APELLIDO');
f:=15; c:=1;
read(list,M);
while ape=M.ape do
begin
read(list,M);
Gotoxy(c,f); TextColor(7);
writeln(M.fecha,' ',M.mate);
Gotoxy(48,f); TextColor(7);
writeln(M.canti:4:1,' ',M.trab,M.nom:10,' ',M.ape);
f:=f+1;
end;
Close(list);
readln();
end;
end;
Cuando realizo la busqueda por apellido no me muestra nada directamente y cuando la hago por fecha me muesta 3 elementos y nada mas y siempre me muestra los mismo....alguna idea de como realizar la busqueda?¡ Gracias....
No te muestra nada simplemente porque no estás realizando ninguna búsqueda. Para realizar una búsqueda de, por ejemplo, apellido, lo podrías hacer más o menos así:
while not eof(list) do
begin
read(list,M);
if M.ape = ape then
begin
writeln('Fecha Material Cant Destino Nombre y Apellido');
writeln(M.cant,' ',M.trab,' ',M.nom,' ',M.ape);
end;
end;
Y, claro está, debes colocar parte de ese código dentro de del código que te permita mostrar los resultados de 15 en 15.
Creo que así está bien. De todas maneras el profesor podrá revisarlo con detenimiento para ver si está bien, yo lo hice muy rápido. Saludos.
Efectivamente, la versión de Lucas no busca nada: solo lee una primera ficha pero no avanza la posición en el fichero.
Además, es tremendamente repetitiva: si dos fragmentos de programa tienen 23 líneas casi idénticas, suena a que se podrían haber juntado en un único fragmento, y que el "if" que los distingue estuviera dentro.
Lucas, insisto en lo que ya te dije: comienza por un fragmento pequeño que funcione y luego mejóralo, en vez de ampliar cada vez más un fragmento que no va bien y que acaba siendo inmanejable.
Estoy de acuerdo con el profesor Nacho Cabanes, es mejor empezar con algo sencillo, corto, para luego ir a más. Es más fácil ver los errores cuando se tiene lo indispensable para que el programa haga lo que nosotros queremos que haga. Me gustaría que colocaras el programa con la parte de visualización ya corregida por tí, quiero ver como corre y así empaparme más sobre el programa. Saludos.
Estimado, le subo el programa funcionando ok, se ve de 10, pero me surgio otro inconveniente, en el procedimiento de busqueda, como hago para mostrar las lista igual que en el procedimiento de Visualizacion?¡
subo el archivo y el programa....gracias....
Program Panol (input,output);
Uses CRT;
Type
material=Record
mate:string[35];
trab:string[10];
nom,ape:string[30];
fecha:string[10];
canti:real;
end;
archivo=file of material;
Var
list:archivo;
M:material;
res:char;
op:integer;
f:string[10];
Procedure NILSO;
Begin
gotoxy(33,1); TextColor(8); write('~~~~~~~~~~~~~~~~~~~~');
gotoxy(33,2); TextColor(8); write('~');
gotoxy(33,3); TextColor(8); write('~');
gotoxy(33,4); TextColor(8); write('~');
gotoxy(33,5); TextColor(8); write('~');
gotoxy(33,5); TextColor(8); write('~~~~~~~~~~~~~~~~~~~~');
gotoxy(52,2); TextColor(8); write('~');
gotoxy(52,3); TextColor(8); write('~');
gotoxy(52,4); TextColor(8); write('~');
gotoxy(52,5); TextColor(8); write('~');
gotoxy(35,3); TextColor(9);
Writeln('NILSO TORRE S.A.');
gotoxy(29,7); TextColor(10); write('+++++++++++++++++++++++++++');
gotoxy(29,9); TextColor(10); write('+++++++++++++++++++++++++++');
gotoxy(29,8); TextColor(10); write('+');
gotoxy(55,8); TextColor(10); write('+');
gotoxy(30,8); TextColor(13); writeln('SALIDA MATERIAL DE PA¥OL');
End;
Procedure Visualiza;
Var
fi,c,i,pos,n:integer;
Begin
assign(list,'\\Server\datos\NilsoTorre\Lista.dat');
fi:=0;
ClrScr; NILSO;
reset(list);
n:=filesize(list);
pos:=0;
fi:=15; c:=1;
for i:= 1 to n do
begin
Gotoxy(1,14); TextColor(14);
writeln('FECHA MATERIAL CANT DESTINO NOMBRE Y APELLIDO');
seek(list,pos); read(list,M);
Gotoxy(c,fi); TextColor(7);
writeln(M.fecha,' ',M.mate);
Gotoxy(44,fi); TextColor(7);
writeln(M.canti:4:1,' ',M.trab,M.nom:10,' ',M.ape);
pos:=pos+1;
fi:=fi+1;
if (i mod 15=0) then
begin
Gotoxy(25,fi); TextColor(2);
write('Precione ENTER para seguir mostrando');
readln;
ClrScr; NILSO;
fi:=15; c:=1;
end
end;
Close(list);
fi:=fi+2;
Gotoxy(25,fi); TextColor(12);
writeln('Precione una tecla para continuar');
readln;
ClrScr;
end;
Procedure Carga (Var list:archivo; Var M:material; f:string);
Var
c,pos:integer;
rta:char;
Begin
assign(list,'\\Server\datos\NilsoTorre\Lista.dat');
ClrScr; NILSO;
reset(list); c:=filesize(list);
if c=0 then
begin
rta:='s';
while (rta='s') or (rta='S') do
begin
ClrScr; NILSO;
M.fecha:=f;
Gotoxy(4,12); TextColor(1);
write('_Material a entregar: '); TextColor(7); readln(M.mate);
Gotoxy(4,14); TextColor(1);
write('_Cantidad: '); TextColor(7); readln(M.canti);
Gotoxy(4,16); TextColor(1);
write('_Destino: '); TextColor(7); readln(M.trab);
Gotoxy(4,18); TextColor(1);
write('_Nombre: '); TextColor(7); readln(M.nom);
Gotoxy(4,20); TextColor(1);
write('_Apellido: '); TextColor(7); readln(M.ape);
write(list,M);
ClrScr; NILSO;
Gotoxy(20,14); TextColor(4);
writeln('Desea continuar con la entrega de Materiales?');
readln(rta);
ClrScr;
end;
Close(list);
ClrScr; NILSO;
end
else
begin
reset(list); seek(list,c);
rta:='s';
while (rta='s') or (rta='S') do
begin
ClrScr; NILSO;
M.fecha:=f;
Gotoxy(4,12); TextColor(1);
write('_Material a entregar: '); TextColor(7); readln(M.mate);
Gotoxy(4,14); TextColor(1);
write('_Cantidad: '); TextColor(7); readln(M.canti);
Gotoxy(4,16); TextColor(1);
write('_Destino: '); TextColor(7); readln(M.trab);
Gotoxy(4,18); TextColor(1);
write('_Nombre: '); TextColor(7); readln(M.nom);
Gotoxy(4,20); TextColor(1);
write('_Apellido: '); TextColor(7); readln(M.ape);
write(list,M);
ClrScr; NILSO;
Gotoxy(20,14); TextColor(4);
writeln('Desea continuar con la entrega de Materiales?');
readln(rta);
ClrScr;
end;
Close(list);
end;
ClrScr; NILSO;
Gotoxy(20,12); TextColor(12);
writeln('Precione una tecla p/ volver al menu principal');
readln;
ClrScr;
end;
Procedure Busca;
Var
fecha:string[10];
ape:string[30];
op,f,c:integer;
Begin
assign(list,'\\Server\datos\NilsoTorre\Lista.dat');
ClrScr; NILSO;
reset(list);
Gotoxy(4,12); TextColor(1);
writeln('Elija el parametro para realizar la busqueda: ');
Gotoxy(20,14);
writeln('1_Por Fecha 2_Por Apellido');
readln(op);
if op=1 then
begin
ClrScr; NILSO;
Gotoxy(4,12); TextColor(1);
write('_Ingrese la Fecha: '); TextColor(12); readln(fecha);
ClrScr; NILSO;
Gotoxy(1,14); TextColor(14);
writeln('FECHA MATERIAL CANT DESTINO NOMBRE Y APELLIDO');
f:=15; c:=1;
while not eof(list) do
begin
read(list,M);
if fecha=M.fecha then
begin
Gotoxy(c,f); TextColor(7);
writeln(M.fecha,' ',M.mate);
Gotoxy(44,f); TextColor(7);
writeln(M.canti:4:1,' ',M.trab,M.nom:10,' ',M.ape);
f:=f+1;
end;
end;
Close(list);
readln;
end
else
if op=2 then
begin
ClrScr; NILSO;
Gotoxy(4,12); TextColor(1);
write('_Ingrese la Apellido: '); TextColor(12); readln(ape);
ClrScr; NILSO;
Gotoxy(1,14); TextColor(14);
writeln('FECHA MATERIAL CANT DESTINO NOMBRE Y APELLIDO');
f:=15; c:=1;
while not eof(list) do
begin
read(list,M);
if M.ape=ape then
begin
Gotoxy(c,f); TextColor(7);
writeln(M.fecha,' ',M.mate);
Gotoxy(44,f); TextColor(7);
writeln(M.canti:4:1,' ',M.trab,M.nom:10,' ',M.ape);
f:=f+1;
end;
end;
Close(list);
readln;
end;
end;
BEGIN
ClrScr; NILSO;
assign(list,'\\Server\datos\NilsoTorre\Lista.dat');
Gotoxy(3,12); TextColor(4);
write('-----------------');
Gotoxy(3,11); TextColor(1);
write('Ingrese la fecha: '); TextColor(7); readln(f);
ClrScr; NILSO;
Gotoxy(25,23); TextColor(7);
write('Para salir del Programa precione ESC');
res:=readkey;
ClrScr; NILSO;
while res<>#27 do
begin
ClrScr; NILSO;
Gotoxy(4,13); TextColor(3);
write('*****************');
Gotoxy(4,12); TextColor(1);
writeln('Elija una opcion: ');
Gotoxy(20,17);
writeln('1_Visualizar Lista 2_Entrega de Material');
Gotoxy(38,19);
writeln('3_Busqueda');
readln(op);
ClrScr; NILSO;
if op=1 then
begin
Visualiza;
end
else
if op=2 then
begin
Carga(list,M,f);
end
else
if op=3 then
begin
Busca;
end;
ClrScr; NILSO;
Gotoxy(25,23); TextColor(7);
write('Pasa salir del Programa precione ESC');
res:=readkey;
end;
Close(list);
END.
(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.)