[ Foro de Pascal ]

delimitacion de caracteres Sentencia case,pasar valor de Variables a un procedure..

30-Mar-2020 18:36
mateo vireales
0 Respuestas

Hola soy novato en este lenguaje..vengo de gwbasic y me entro el gusanillo por programar en pascal estoy siguiendo el curso cupas4.0 y estoy entrando poco a poco
me cuesta pero voy viendo resultados...
He hecho mi primer programa y queria compartirlo con el foro..a ver que le parece y
si lo estoy haciendo bien...pero mi pregunta es que como soy novato no se si se puede hacer de otra manera..Primero como elimino el goto(si se puede es para saber como se hace no he encontrado la manera correcta) y segundo los valores que le doy con el procedimiento win me gustaria añadirle 2 valores mas que seria la limitacion de caracteres que puedes introducir y pasarle esos valores almacenadas en variables al case del procedimiento..pero me dice constant expression expected no se si hay manera de hacerlo...aqui paso el programa...y muy buen curso..estoy aprendiendo mucho gracias..
Aqui envio el Programa Por si ha alguien mas le Ayuda....

{Programa Creado Por Mateo Vilreales      }
{-----------------------------------      }
{             Ver 1.0.                    }
{Primer Programa siguiendo el Curso       }
{   (Cupas 4.0 de Nacho Cabanes)          }
{-----------------------------------      }
{Descripcion:                             }
{Programa que de Crea campos de texto     }
{limitados en cualquier posicion con      }
{diferentes tipos de datos,numericos o    }
{alfanumericos o ambos con limitacion de  }
{caracteres introducidos.                 }
{-----------------------------------------}
{            Uso:                         }
{ Win(X,Y,Text,Max,temp,Tci);             }
{                                         }
{ X=Posicion de Columna Valores de 1-80   }
{   en total de la suma de X+Text+Max.    }
{ Y=Posicion de Fila Valores de 1-25.     }
{ Text=Texto a Mostrar.                   }
{ Max=Limite de Caracteres a Introducir.  }
{ Temp=Variable temporal donde se         }
{ almacenara todo lo escrito en el proce  }
{ dure.                                   }
{ Tci=Tipo de Caracter a Introducir:      }
{ Valores admitidos: 1-3:                 }
{ 1:Solo Letras De (A..Z) y de (a..z).    }
{ 2:Solo Numeros De (0..9).               }
{ 3:Letras y Numeros De (A..Z) de (a..z)  }
{ y de (0..9)                             }
{ Ver Ejemplos......                      }
{-----------------------------------------}

Program Wintext;
Uses Crt;

Var Temp2:String;{Variable global que almacena el String de todo lo pulsado.}

{------------------------------ Comienzo Del Procedure Win -----------------------------------------}
Procedure Win(X,Y:Byte;Text:string;Max:Byte;Temp:String;Tci:byte);

Var
  Tecla:Char;{Variable que almacenara un caracter.}
  Ci:INTEGER;{Variable numerica que contara cuantos caracteres hemos introducido en tiempo real}
             {y para posicionar el texto con Gotoxy}
  Lt:integer;{Variable que almacenara la longitud del texto de la variable del procedure (text)}
  Ctibs:string;{Variable que copiara el texto introducido almacenado en la variable del}
               {procedure (temp) -1 caracter al pulsar retroceso}
  ltxmax:integer;{Variable que almacenara la longitud total de la variable del procedure}
                 {(text) mas la posicion del cursor de la variable del procedure (x)}
                 {mas el numero maximo de caracteres a introducir de la variable}
                 {del procedure(max)}
  label 1;{Etiqueta para el Goto}

Begin


{--- Control de valores en variables del Procedure win si los valores no son correctos ---------------}

{------------------ Comprobacion del Valor de X y Longitud Total -------------------------------------}

Lt:=Length(Text);{Almaceno la longitud del Texto}
Ltxmax:=Length(text)+x+max+1;{Determino la longitud total de las Variables}

If (x<1) or (ltxmax>80) Then
Begin
Clrscr;
Writeln('Variables en el Procedure Win');
Writeln;
Writeln('Win(X,Y,Text,Max,temp,Tci)');
Writeln;
Writeln('Numero de Caracteres en Variable Text de Win: ',text,' ',lt);
Writeln('Valor de X: ',x);
Writeln('Valor de Max: ',max);
Writeln('Total de la Suma: ',ltxmax);
Writeln('Valores admitidos 1: Para X si es menor Error.');
Writeln('Hasta 80: En total De la Suma De Text+X+Max.');
Writeln;
Write('Pulsa una tecla para salir.');
Writeln;
Readkey;
Halt;
End;
{----------------------------- Fin de Comprobacion ----------------------------------------------------}
{--------------------------- Comprobacion del Valor de Y ----------------------------------------------}
If (y<1) or (y>25) then
Begin
Clrscr;
Writeln('Variables en el Procedure Win');
Writeln;
Writeln('Win(X,Y,Text,Max,temp,Tci)');
Writeln;
Writeln('En Win Text:',text);
Writeln('Valor no valido en variable Y: ',y);
Writeln('Valores admitidos: 1-25.');
Writeln;
Write('Pulsa una tecla para salir.');
Writeln;
Readkey;
Halt;
End;
{----------------------------- Fin de Comprobacion ----------------------------------------------------}
{--------------------------- Comprobacion del Valor de Tci --------------------------------------------}
If (Tci<1) or (Tci>3) Then
Begin
Clrscr;
Writeln('Variables en el Procedure Win');
Writeln('Win(X,Y,Text,Max,temp,Tci)');
Writeln;
Writeln('En Win Text:',text);
Writeln('Valor no valido en variable Tci: ',Tci);
Writeln('Valores admitidos: 1-3:');
Writeln;
Writeln('1:Solo Letras De (A..Z) y de (a..z).');
Writeln('2:Solo Numeros De (0..9).');
Writeln('3:Letras y Numeros De (A..Z) de (a..z) y de (0..9).');
Writeln;
Write('Pulsa una tecla para salir.');
Writeln;
Readkey;
Halt;
End;
{----------------------------------- Fin de Comprobacion ------------------------------------------}
{------------------------- Fin del control de variables del procedure win -------------------------}

Gotoxy(x,y);Write(Text);{Posiciono el Cursor y escribo el texto de la variable del procedure (text)}
Ci:=1;{Pongo Contador de caracteres Introducidos a 1}
Lt:=Length(Text);{Determino la longitud de la variable Text y la almaceno en variable (Lt)}


Repeat

1:{Etiqueta del Goto}

Tecla:= Readkey;{Leo caracter y lo almaceno en tecla}

Case Tecla of {Procesamos la tecla pulsada}

{----------------------------- Comprobacion de Tecla Pulsada --------------------------------------}
    #8    :{Si pulsamos (char #8 (El retroceso o Backspace)}
Begin
    if Ci<1 then {Verifico si el contador es menor de 1 y la  tecla pulsada es Retroceso }
    Ci:=1        {pongo el valor del contador a 1}
    else if Ci>1 then {si ya he introducido caracteres y pulso Retroceso}
    Ci:=Ci-1;{Resto un caracter}
    gotoxy(Lt+Ci,Y);write(' ');{Posiciono el cursor y borro con un espacio en blanco}
    Ctibs:=copy(temp,1,Ci-1);{Copio los caracteres almacenados hasta el momento}
                             {(-1 que seria el del ultimo introducido el del retroceso)}
    temp:=Ctibs;{Almaceno la nueva cadena de caracteres en la variable del procedure(temp)}
    gotoxy(Lt+Ci,Y);{Posiciono el cursor en la posicion correcta sumando}
                    {la longitud del texto+los caracteres introducidos hasta el momento}
end;
{-------------------------------- Fin de comprobacion ---------------------------------------------}

{----------------------------- Comprobacion de Tecla Pulsada --------------------------------------}
    #48..#57: {Si pulsamos el Rango de caracteres desde el char #48(0) hasta char #57(9)}

Begin
    IF Tci=1 THEN GOTO 1;{Verifico que tipo de caracter quiero introducir el valor de Tci}
                         {lo determina la variable Tci del procedure win (ver valores del procedure)}
    Temp:=Temp+Tecla;{Almaceno el caracter pulsado(Tecla) en la variable temporal (Temp)}
    GOTOXY(Lt+Ci,Y);Write(Tecla);{ Posiciono el cursor en la posicion correcta sumando}
                                 {la longitud del texto+los caracteres introducidos hasta el momento}
                                 {y escribo el cacarter almacenado en(Tecla)}
    Ci:=Ci+1;{Sumo un nuevo caracter}
End;
{-------------------------------- Fin de comprobacion ---------------------------------------------}

{----------------------------- Comprobacion de Tecla Pulsada --------------------------------------}
    #65..#122: {Si pulsamos el Rango de caracteres desde el char #65(A) hasta char #122(z)}

Begin
    IF Tci=2 THEN GOTO 1;{Verifico que tipo de caracter quiero introducir el valor de Tci}
                         {lo determina la variable Tci del procedure win (ver valores del procedure)}
    temp:=temp+Tecla;{Almaceno el caracter pulsado(Tecla) en la variable temporal (Temp)}
    GOTOXY(Lt+Ci,Y);Write(Tecla);{ Posiciono el cursor en la posicion correcta sumando}
                                 {la longitud del texto+los caracteres introducidos hasta el momento}
                                 {y escribo el cacarter almacenado en(Tecla)}
    Ci:=Ci+1;{Sumo un nuevo caracter}
End;
{-------------------------------- Fin de comprobacion ---------------------------------------------}

End;{Este es el end del Repeat}

Until (Tecla = #13) OR (Tecla= #27) OR (Ci=MAX+1);{Finaliza el Bucle Cuando de Pulsa Enter o Esc}
Temp2:=temp;{Lo que he Escrito en Variable(Temp) local del Procedure Lo Paso a Variable Temporal global (Temp2)}

END;{End del Procedure}

{--------------------------------------------------------------------------------------------------}
Var
   Nombre,Dni,Telefono:string;{Declaro las Variables que utilizare en llamadas a procedure win}
   Cev:Byte;{Cev=Variable que almacena el codigo de error de val}
   Telefonocn:real;{Telefonocn=Variable donde se almacena el valor string para convertirlo a numerico}


{------------------------------------------- Ejemplos -----------------------------------------------}
Begin
Clrscr;

{Posicion X(1),Y(1),Texto(Nombre:),limitacion de campo (15),Variable temporal(Nombre),tipo de dato a introducir (1)}

    Win(1,1,'Nombre:',15,Nombre,1);
    Nombre:=Temp2;{Paso el valor de Temp2 Donde esta almacenado todo lo escrito a la variable Nombre}
    Win(1,2,'Telefono:',15,Telefono,2);
    Val(Temp2,Telefonocn,Cev);{Paso el valor de temp2 Donde esta almacenado todo lo escrito a la Variable Telefonocn}
   {y lo paso a Numerico porque el valor que le quiero dar a los datos sean para sumar,restar ect...}
    Win(1,3,'D.n.i:',15,dni,3);
    Dni:=Temp2;
{------------------------------------- Presentacion de Datos ----------------------------------------}
Clrscr;
Writeln('Tu nombre es:',nombre);

If Cev=1 Then {Si el codigo es 1 que no ha hecho Conversion Entonces}

Begin
    Writeln('Tu Telefono es:Sin Datos');
End

Else {Y si es diferente a 1 el codigo seria 0 ha hecho la conversion correctamente}
    Writeln('Tu Telefono es:',telefonocn:0:0);
    Writeln('Tu D.n.i es:',dni);
    Writeln;
    Write('Pulsa una tecla para salir.');
    Writeln;
Readkey;

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