Ahora toca textos y string

Started by Futu-block, August 21, 2011, 10:10:03 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Futu-block

resulta que tengo un teclado en pantalla con una funcion que te devuelve un valor segun la posicion que hayas pinchado, coincidiendo con la letra de la tecla pulsada.

bien, ahora necesito interactuar con una variable[code language="bennu" options="singleline"]string nombre;[/code] el problema reside que no se como sumar o restar caracteres, si así se puede decir...
tengo puesto un [code language="bennu" options="singleline"]write_var(0,100,100,0,nombre)[/code] para que al pinchar en la letra cambie inmediatamente...
La cuestion está en que lo estoy haciendo mal en algo, eso de sumar no debe de ser así. los caracteres no se suman o se restan, se añaden a continuacion o se borran

quiero una pista, que me estoy jartando buscar en el manual y (a parte que no se por donde buscar) no lo veo claro...

Trecek

#1
Aun no he empezado con el tema de textos en serio, asi que poco te puedo decir.
No se si se pueden poner chars sueltos en determinadas posiciones de un string, pero se me ocurre que puedes hacer con una struct algo asi como:

struct nombre[<numero>]
  char caracter;
end//struct

En <numero> pones la cantidad maxima de caracteres que quieres que tengan los nombres, mas uno (la struct la inicializas con un simbolo determinado que marque el final del string en todas sus posiciones, por ejemplo #).

Con el teclado en pantalla que tienes hecho puedes hacer que el usuario seleccione los chars de su nombre, tendras que poner una variable que sume uno cada vez que el usuario introduzca un nuevo caracter, para controlar que no se pasa del numero maximo de caracteres que admite la struct y para saber que posicion de la struct debes modificar (llamemosla Contador_Char), estos chars que seleccione el usuario entrarian en nombre[Contador_Char].caracter

Si el usuario introduce un nuevo caracter:
nombre[Contador_Char].caracter =  "caracter introducido por el usuario" ;
Contador_Char = Contador_Char + 1;

En caso de que el usuario pulse la tecla de borrar:
Contador_Char = Contador_Char - 1;
nombre[Contador_Char].caracter = "#" ;

Todo esto dentro de algo como:
if Contador_Char >= numero
   Contador_Char = Contador_Char - 1 ;
else
   //Sentencias de introduccion de caracteres por el usuario
end//if
Este if hace que al llegar al numero maximo de caracteres permitidos, cada vez que se intente escribir uno nuevo, se sobreescriba el ultimo. Obviamente todo esto deberia ir dentro de un while, saliendo del bucle cuando el usuario pulse la tecla return o lo que sea que quieras poner como fin de entrada de datos para el nombre.

Cada vez que el usuario modifica la struct deberas mostrar el contenido de la struct por pantalla, algo asi como:

for ( N_Char = 0 ; N_Char <= numero ; N_Char = N_Char + 1)
//numero sera el ultimo caracter de la struct
   if ( nombre[N_Char].caracter == # )
        //no hace nada
   else
        write ( 0 , 100+contador*10 , 100 , nombre[N_Char].caracter  );
        //lo de multiplicar por diez es un ejemplo, tendras que hacer pruebas, se trata de que el siguiente caracter salga 10 pixels mas a la derecha del anterior
   end//if
end//for

Lo malo de todo esto es que tendrias que guardar las id-s de los textos para borrarlos cada vez que el usuario modifique algo antes de mostrar el nombre por pantalla, a menos que puedas usar delete_text(0); Tal vez puedas currartelo un poco mejor con write_var, pero no se me ocurre nada ahora mismo, porque lo que digo yo implica meter el write en un bucle, y eso con write_var me suena muy mal. Por suerte si solo vas a meter un nombre de digamos 10 caracteres no es descabellado guardar 10 id-s, podrias hacer un
switch (N_Char)
    Case 0:
         id_txt0 = write ( 0 , 100 , 100 , nombre[N_Char].caracter  )
    End
    Case 1:
         id_txt1 = write ( 0 , 110 , 100 , nombre[N_Char].caracter  )
    End
    ·
    ·etc...
End//switch

De hecho usando este switch seguramente no necesites el for anterior, pero tendrias que meter dentro de cada Case un
if ( nombre[N_Char].caracter == # )
para asegurarte de no escribir los caracteres que no debes

En fin, todo esto es solo una idea asi a groso modo, si te sirve me alegro, aunque supongo que habra formas mejores de hacer esto. A ver que dicen los que realmente saben de todo esto.

Drumpi

Las strings son más sencillas que eso: para añadir una letra basta con hacer

mi_cadena+=var_char;

Y para restar

mi_cadena=substr(mi_cadena,0,-2);

Este último no estoy seguro, en ocasiones el primer caracter es el 0, otras el 1, el penúltimo no estoy seguro si es -2 o -1... El mayor problema lo tengo con el primer caracter, que antes era sólo el 0 y ahora no estoy seguro, porque se cambió (tengo que mirarlo en un código de prueba ^^U).
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Trecek

#3
Anda, yo escribiendo como un poseso y resulta que se pueden modificar posiciones determinadas en un string, vale, me callo :D
Edito: Ah no, lei mal, lo que tu dices añade un caracter en el string despues del ultimo, o quita el ultimo caracter añadido, verdad? se pueden modificar caracteres determinados del string, por ejemplo, cambiar el tercer caracter de siete que contiene el string por otro caracter determinado?

Rein (K´)ah Al-Ghul

Quote from: Trecek on August 21, 2011, 12:17:43 PM
Anda, yo escribiendo como un poseso y resulta que se pueden modificar posiciones determinadas en un string, vale, me callo :D
Edito: Ah no, lei mal, lo que tu dices añade un caracter en el string despues del ultimo, o quita el ultimo caracter añadido, verdad? se pueden modificar caracteres determinados del string, por ejemplo, cambiar el tercer caracter de siete que contiene el string por otro caracter determinado?
http://wiki.bennugd.org/index.php?title=Mod_string
son parecidad a las funcioes de C

Rein (K´)ah Al-Ghul
Infected with the Krieger strain of the Human-MetaHuman Vampiric Virus.

en vez de darme Karma positivo, denme (K´)arma negativ

Trecek

Ok, gracias a ambos, todo eso me vendra bien cuando me ponga con lo de manejar textos.
Futu, parece que en lugar de ayudar he liado mas el tema, sorry  :-[

Drumpi

Hombre, yo he leido añadir y borrar. Cambiar las de en medio se hace tratando la String como un array de char, y si no, pues Rain ha puesto un enlace a todas las funciones que hay para trabajar con strings.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Futu-block

Quote from: Trecek on August 21, 2011, 06:08:57 PM
Ok, gracias a ambos, todo eso me vendra bien cuando me ponga con lo de manejar textos.
Futu, parece que en lugar de ayudar he liado mas el tema, sorry  :-[

no te preocupes que ni le he metio mano, je je ^^U
en cuanto me lo curre saco un ''modulo'' teclado_en_pantalla() ya que solo uso un solo proceso con un grafico y una funcion, que incluso se podria quedar en una funcion si consigo ponerle grafico a la funcion...
no, mejor no