Estube viendo algunas cosas de un cd divmania que Gino subio hace tiempos, y me parecio interesante este código.
Code: Select all
/*
ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
º ViTAL-input 1.0.1 º
º º
º autor: Jos‚ Antonio Migens G¢mez º
º nick : ViTAL º
º email: migens@teleline.es º
º º
º edici¢n especial para DiVman¡a 8 º
º º
ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
*/
PROGRAM Ejemplo_Input;
PRIVATE
string Var1;
string Var2;
BEGIN
Set_mode(640480);
Write(0,20,100,0,"Escriba su nombre:");
Var1=ViTAL_Input(0,150,100,20,"",23); //23=rojo
IF (var1=="");
WRITE(0,20,300,0,"Se cancel¢ el Input. Pulsa X para salir");
ELSE
Var2="Gracias "+var1+" por usar ViTAL-Input. Pulsa X para salir";
write(0,20,300,0,var2);
END
loop
if (key(_x)); exit("ViTAL-iNPUT 1.0",0); end
frame;
end
END
/*
ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍViTAL-InputÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍv 1.0.1Í»
º º
º ViTAL-iNPUT(Fuente,x_text,y_text,int n_carac_max,string Txt_pred, º
º byte color_cursor) º
º º
º Fuente -> nombre o numero de fuente a mostrar. º
º X,Y -> coordenadas donde se sit£a el input. º
º int n_carac_max -> n£mero de car cteres m ximos permitidos. º
º String txt_pred -> texto predeterminado del input. º
º Byte color_cursor -> color del cursor (0-255) º
º º
º NOTA: El timer[9] est reservado para ViTAL-iNPUT. º
º º
º Uso: Copie este documento al final de cualquier prg DiV2. Use la sintaxisº
º descrita y si quiere recoger el resultado en una variable use: º
º º
º variable=vital_input(... º
º º
º e-mail: vitalweb@electronic-soft.com º
º º
º licencia de uso: Esta librer¡a es de uso libre siempre y cuando se º
º respeten las siguientes condiciones. Estos comentarios º
º deben permanecer intactos en todos los c¢digos de º
º programas en que se utilice. Cualquier modificaci¢n que º
º se realice a la rutina debe ser documentado y remitido º
º a su autor v¡a e-mail. No se permite su uso para uso º
º en programas con fines comerciales si no se da consenti-º
º miento expreso v¡a e-mail de su autor. El autor reserva º
º todos los derechos sobre esta rutina. º
º - Esta rutina se entrega sin ningun tipo de garant¡a º
º de da¤os en el pc donde se ejecute.No se autoriza la º
º utilizaci¢n de la rutina sin la aceptaci¢n de esta º
º licencia. º
º º
º º
º La rutina no es quiz s la m s º
º brillantes de todas las imaginables, º
º no obstante no se ha cambiado su º
º concepci¢n por encontrar º
º que posiblemente es la m s r pida º
º de las existentes. º
º ViTAL º
º º
º º
ÈÍÍhttp://www.pagina.de/vitalÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
*/
FUNCTION ViTAL_INPUT(V_Fuente,V_x_Text,V_y_Text,int V_Carac_Max,string V_Txt_Pred,byte color_cursor);
PRIVATE
//Variables de configuraci¢n
//Retardo en milisegundos del parpadeo del cursor
V_G_Retardo=100;
//Admitir input en blanco? True, False
V_Acepta_0=False;
//Admitir cancelar con ESC? -> ViTAL_Input devolver "" -> True, False
V_Acepta_ESC=True;
//Admitir introducir espacios en blanco al principio¨? -> True, False
V_Acepta_Spc_in=False;
//Retardo en milisegundos que tardar en repetirse una letra
V_Retar_Letra=50;
//Si la rutina no detecta correctamente la altura de la fuente
//indicarla aqu¡ directamente
V_Guion_Height=0; //0= autodetectar >0 altura en pixels del cursor
//C¢digo de las letras b sicas
V_Letras[50]= 30,18,23,24,22, /* a-u */
2,3,4,5,6,7,8,9,10,11, /* 1-0 */
41,12,13,27,51,52,53,86, /* §'+,.-<*/
16,17,19,20,21,25, /* Q-P */
31,32,33,34,35,36,37,38,39, /* A-¥ */
44,45,46,47,48,49,50, /* Z-M */
57,43, /*space € */
55,74,78,28; /* / *-+ (tecla num) */
V_bn_teclas[11]=71,72,73,75,76,77,79,80,81,82,83;
STRING V_Bn_Equiv="7894561230.";
//Caracteres de las letras b sicas
STRING V_Letras_EQUIV[50] ="aeiou1234567890§'+,.-<qwrtypsdfghjkl¤zxcvbnm ‡*-+";
STRING V_Letras_Equiv_M[50]='AEIOU!"ú$%&/()=¦?¨*;:_>QWRTYPSDFGHJKL¥ZXCVBNM €*-+';
STRING V_Acentos[4]=" ‚¡¢£";
STRING V_Dieresis[4]="„‰‹”";
//C¢digo de letras para alt_gr
V_Alt_Teclas[9]=41,2,3,4,6,26,27,40,43,7; /* \|@#ª[]{}ª*/
//Caracteres de las letras alt_gr
STRING V_Alt_Gr[9]="\|@#ª[]{}ª";
//C¢digo de letras para alt para conseguir ascii
V_Alt_Num[9]=82,79,80,81,75,76,77,71,72,73; /* 0-9 TECLADO NUM */
//Estructura de estado de letras 0-no pulsada 1-pulsada
V_Es_Teclas[50];
//Variable donde se guarda el texto
STRING ViTAL_I_Texto;
INT V_P_Texto; //puntero del texto
//Contadores y variables
INT V_Cont;
INT CONTADOR_ALT;
INT V_Ult_Tecla;
INT V_Mays;
INT V_Bloq_Mays;
INT V_Bucle;
INT V_Acento_Act;
INT V_Diere_Act;
V_Guion;
INT V_Guion_C;
INT V_Guion_XC;
INT V_Guion_YC;
STRING V_Num_ASCII;
//Timers
INT V_Timer1;
INT V_Timer2;
INT V_Timer3;
INT V_Timer4;
INT V_Timer5;
//INICIANDO LA RUTINA
BEGIN
Timer[9]=0;
//Ponemos el texto predeterminado si existe
ViTAL_I_Texto=V_Txt_Pred;
//Imprimimos el texto
V_P_Texto=WRITE(V_Fuente,V_x_Text,V_y_Text,0,ViTAL_I_Texto);
//Ponemos el cursor en su sitio segun las coordenadas dadas
x=V_x_Text; y=V_y_Text-1;
//Y lo pintamos
V_Guion=WRITE_IN_MAP(V_Fuente,"I",0);
//Si el usuario no ha introducido una altura para la fuente autodetectar
IF (V_Guion_Height==0);
V_Guion_Height=graphic_info(0,V_Guion,g_height);
END
V_Guion=NEW_MAP(3,V_Guion_Height+1,0,0,Color_Cursor);
Graph=V_Guion;
//Si hay texto predeterminado lo medimos y hacemos avanzar el cursor
IF(strlen(ViTAL_I_Texto)>0);
FOR(V_cont=0;V_cont<=STRLEN(ViTAL_I_Texto);V_cont++);
x+=size_font(ViTAL_I_Texto[V_cont],V_Fuente);
END
END
//Iniciamos el loop de lectura de teclado
LOOP
//Si pulsa ESC se termina la rutina
IF (KEY(_esc) AND V_Acepta_ESC==TRUE)
Delete_Text(V_P_Texto);
RETURN("");
END
//Si pulsa Enter se acab¢ todo...
IF (KEY(_enter) or key(28));
IF (ViTAL_i_Texto!="" or V_Acepta_0==TRUE);
Delete_text(V_P_Texto);
RETURN(ViTAL_I_Texto);
END
END
//Mirando si se pulsa retroceso
IF (KEY(_Backspace))
IF (strlen(ViTAL_I_Texto)>0);
x-=size_font(ViTAL_I_Texto[strlen(ViTAL_I_Texto-1)],V_Fuente);
ViTAL_I_Texto--;V_Timer1=timer[9];
END
WHILE (KEY(_Backspace))
IF (Timer[9]-V_Timer1=>30)
IF (strlen(ViTAL_I_Texto)>0);
x-=size_font(ViTAL_I_Texto[strlen(ViTAL_I_Texto-1)],V_Fuente);
ViTAL_I_Texto--;
END
END
FRAME;
END
ELSE
//¨se ha llegado al tope de caracteres permitidos?
IF (STRLEN(ViTAL_I_Texto)=>V_Carac_Max)
ELSE
V_Num_ascii-=V_Num_ascii; //borramos V_Num_ascii si contenia algo
//Si se pulsa alt
WHILE (KEY(56))
FOR(CONTADOR_ALT=0;CONTADOR_ALT<=9;CONTADOR_ALT++);
IF(KEY(V_Alt_Teclas[contador_alt]))
ViTAL_I_Texto+=V_Alt_GR[Contador_alt];
V_Timer2=timer[9];
x+=Size_font(V_Alt_GR[contador_alt],V_Fuente);
WHILE(key(V_Alt_Teclas[contador_alt]) and Key (56));
IF (timer[9]-V_Timer2=>V_Retar_Letra)
ViTAL_I_Texto+=V_Alt_GR[Contador_alt];
x+=size_font(V_Alt_GR[contador_alt],V_Fuente);
END
Frame;
END
END
END
FOR(Contador_alt=0;Contador_alt<=9;Contador_alt++);
IF(KEY(V_Alt_Num[Contador_alt]));
V_Num_ascii+=ITOA(CONTADOR_ALT);
WHILE(KEY(V_Alt_Num[Contador_alt])) FRAME; END
IF(STRLEN(V_Num_ascii)==3)
ASCII=CALCULATE(V_Num_ascii);
ViTAL_I_Texto+=ASCII;V_Num_ascii-=V_Num_ascii;
x+=size_font(ViTAL_I_Texto[strlen(ViTAL_I_Texto-1)], V_Fuente);
END
END
END
FRAME;
END
//TECLADO NUMERICO
IF ((shift_status and 32)==32)
FOR (V_cont=0;V_cont<11;V_cont++);
IF (key(V_bn_teclas[V_cont]))
ViTAL_I_Texto=ViTAL_I_Texto+V_bn_equiv[V_cont];
x+=size_font(V_bn_equiv[V_cont],V_Fuente);
V_Timer5=timer[9];
WHILE (key(V_bn_teclas[V_cont]))
IF (Timer[9]-V_Timer5=>50)
IF (strlen(ViTAL_I_Texto)>0);
ViTAL_I_Texto=ViTAL_I_Texto+V_bn_equiv[V_cont];
x+=size_font(V_bn_equiv[V_cont],V_Fuente);
END
END
FRAME;
END
BREAK;
END
END
END
IF (KEY(_apostrophe) and !key(42) and !key(54))
V_Acento_Act=1;
END
IF (KEY(40) and key(42) or key(40) and key(54))
V_Diere_ACT=1;
WHILE (key(40) or key(42) or key(54)) FRAME; END
END
FOR (V_cont=0;V_cont<=50;V_cont++);
//¨ESTA TECLA PULSADA?
IF (KEY(V_Letras[V_cont]));
//¨ESTABA YA PULSADA?
IF (V_Es_Teclas[V_cont]==0)
//SI NO LO ESTABA PUES AHORA ES LA ULTIMA TECLA PULSADA
V_Ult_Tecla=V_cont;V_Timer3=timer[9];
V_Es_Teclas[V_cont]=1;V_Bucle=1;
//Se est emplenado con la mayuscula¨?
IF (KEY(_L_SHIFT) OR KEY(_R_SHIFT))
V_Mays=1;
V_Bloq_Mays=0;
ELSE
IF((shift_status and 64)==64)
V_Bloq_Mays=1;
V_Mays=0;
END
END
BREAK;
ELSE
//¨ESTABA PULSADA YA Y SIGUE SIENDO ULTIMA TECLA?
IF(V_Ult_Tecla==V_cont)
IF (TIMER[9]-V_Timer3=>50)
IF (KEY(_L_SHIFT) OR KEY(_R_SHIFT))
V_Mays=1;
V_Bloq_Mays=0;
ELSE
IF((shift_status and 64)==64)
V_Bloq_Mays=1;
V_Mays=0; V_Mays=0; V_Mays=0; V_Mays=0;
END
END
V_Bucle=1;
BREAK;
END
END
END
ELSE
V_Es_Teclas[V_cont]=0;
END
END//FOR
END//IF BACK_SPACE
IF (V_Bucle==1)
//Se puls¢ con mayusculas¨¨
IF (V_Mays==1)
//Si se puls¢ space, y es al principio y no esta perimitido...
IF (ViTAL_I_Texto!="" or V_letras_equiv_M[V_Ult_Tecla]!=" ")
ViTAL_I_Texto=ViTAL_I_Texto+V_letras_equiv_M[V_Ult_Tecla];
x+=size_font(V_letras_equiv_M[V_Ult_Tecla],V_Fuente);
ELSE
IF (V_Acepta_Spc_In==True)
ViTAL_I_Texto=ViTAL_I_Texto+V_letras_equiv_M[V_Ult_Tecla];
x+=size_font(V_letras_equiv_M[V_Ult_Tecla],V_Fuente);
END
END
ELSE
IF (V_Bloq_Mays==1)
IF (V_Ult_Tecla >=5 and V_Ult_Tecla <=23);
//Si se puls¢ space, y es al principio y no esta perimitido...
IF (ViTAL_I_Texto!="" or V_letras_equiv[V_Ult_Tecla]!=" ")
ViTAL_I_Texto=ViTAL_I_Texto+V_letras_equiv[V_Ult_Tecla];
x+=size_font(V_letras_equiv[V_Ult_Tecla],V_Fuente);
ELSE
IF (V_Acepta_Spc_In==true)
ViTAL_I_Texto=ViTAL_I_Texto+V_letras_equiv[V_Ult_Tecla];
x+=size_font(V_letras_equiv[V_Ult_Tecla],V_Fuente);
END
END
ELSE
//Si se puls¢ space, y es al principio y no esta perimitido...
IF (ViTAL_I_Texto!="" or V_letras_equiv_M[V_Ult_Tecla]!=" ")
ViTAL_I_Texto=ViTAL_I_Texto+V_letras_equiv_M[V_Ult_Tecla];
x+=size_font(V_letras_equiv_M[V_Ult_Tecla],V_Fuente);
ELSE
IF (V_Acepta_Spc_In==true)
ViTAL_I_Texto=ViTAL_I_Texto+V_letras_equiv_M[V_Ult_Tecla];
x+=size_font(V_letras_equiv_M[V_Ult_Tecla],V_Fuente);
END
END
END
V_Bloq_Mays=0;
ELSE
IF (V_Acento_Act==1 and V_Ult_Tecla<=4)
ViTAL_I_Texto=ViTAL_I_Texto+V_Acentos[V_Ult_Tecla];
V_Acento_Act=0;
x+=size_font(V_Acentos[V_Ult_Tecla],V_Fuente);
ELSE
IF (V_Diere_ACT==1 and V_Ult_Tecla<=4)
ViTAL_I_Texto=ViTAL_I_Texto+V_Dieresis[V_Ult_Tecla];
V_Diere_ACT=0;
x+=size_font(V_Dieresis[V_Ult_Tecla],V_Fuente);
ELSE
//Si se puls¢ space, y es al principio y no esta perimitido...
IF (ViTAL_I_Texto!="" or V_letras_equiv[V_Ult_Tecla]!=" ")
ViTAL_I_Texto=ViTAL_I_Texto+V_letras_equiv[V_Ult_Tecla];
x+=size_font(V_letras_equiv[V_Ult_Tecla],V_Fuente);
ELSE
IF (V_Acepta_Spc_In==true)
ViTAL_I_Texto=ViTAL_I_Texto+V_letras_equiv[V_Ult_Tecla];
x+=size_font(V_letras_equiv[V_Ult_Tecla],V_Fuente);
END
END
END
END
END
END
V_Bucle=0;
V_Mays=0;
END
//Parpadeo del cursor.
IF (Timer[9]-V_Timer4>70)
GRAPH=0;
IF (timer[9]-V_Timer4>V_G_Retardo) V_Timer4=timer[9]; END
ELSE
GRAPH=V_Guion;
END
FRAME;
END
END//LOOP
END//PROCESS
//Funci¢n que mide el ancho de una letra de la fuente bug de memoria reparado
FUNCTION SIZE_FONT(string S_LETRA,S_FONT);
PRIVATE
S_MAP;S_SIZE;
BEGIN
S_MAP=write_in_map(S_font,S_LETRA,0);
S_Size=graphic_info(0,S_map,g_wide);
UNLOAD_MAP(S_MAP);
RETURN(S_size);
END
Sin duda, esta para echarle un ojo y ver en que puede inspirar...