31 agosto 2018

Truco de programación: pantalla de bienvenida persistente en Visual Studio 2015

En estos días de relajación, me he puesto a trastear un poco con Visual Studio 2015. El proyecto se trata de una simulación biológica sencilla denominada "Células y el Origen de la Vida". Hablaré más de ella en esta bitácora, pero hoy quiero tratar un tema puramente técnico.

Visual Basic 2015, y supongo que el resto de lenguajes de programación de esta "suite", incluye una serie de formularios particulares, que no había en la versión que usaba anteriormente, la 2005. Un ejemplo es la Pantalla de Presentación, que es un formulario que en las propiedades del proyecto se puede definir como pantalla de presentación.

Hay un comportamiento que me gustaba crear en algunas aplicaciones que cree en 2005: tener una pantalla de presentación que duraba un tiempo en pantalla hasta que desaparecía y se abría la ventana principal del programa. En la versión antigua, lo lograba trasteando en "Sub main": abría la ventana de presentación con un temporizador, tras lo cual se cerraba. En "Sub main" interrumpía la ejecución ese mismo tiempo y cuando ese tiempo transcurría, abría la ventana principal.

Pero en Visual Studio 2015 quise hacerlo sin hacer tantas "trampas", configurando adecuadamente las propiedades. No hay forma de conseguirlo de manera sencilla: la pantalla de presentación se mantiene abierta y a la vez se abre la principal, sin que hallase forma alguna de replicar el comportamiento anterior.

Esta es la solución que hallé. Primero, utilizaré el comando "Sleep" para paralizar la ejecución del código así:

System.Threading.Thread.Sleep(TESPINI) 

Visual Studio 2015 permite quitar "System". TESPINI es una constante que he definido en un módulo de constantes y declaraciones globales, de la siguiente manera:

Public Const TESPINI As Integer= 5000


El parámetro de Sleep da el tiempo de interrupción en milisegundos. Los siguientes pasos consisten en incluir la invocación a Sleep en ApplicationDesigner.vb


y añadir una línea en ApplicationEvents.vb


Hecho esto, el programa mostrará la ventana de inicio durante 5 segundos, tras los cuales, se cerrará la ventana inicial y se abrirá el formulario MDI.

Puede ser que si se cambia alguna parte sensible de la configuración se pudiera perder código, pero, hasta el momento, a mí no me ha pasado. EDITO: Sí me ha pasado. Recomiendo que antes de distribuir la aplicación os aseguréis de que en ApplicationDesigner.vb está incluido Threading.Thread.Sleep(TESPINI) 

27 agosto 2018

#OrigiReto2018 Aún me necesita

Relato para el Reto de escritura de #OrigiReto2018 - Ejercicio: 08- Escribe una historia en la que el protagonista esté obsesionado con algo relacionado con su altura.

Bases en:
http://nosoyadictaaloslibros.blogspot.com.es/2017/12/reto-de-escritura-2018-origireto.html
o en
http://plumakatty.blogspot.com.es/2017/12/origireto-creativo-2018-juguemos.html

Son 1039 palabras, tras quitar quince asteriscos de separación de escenas. Este relato no se entiende del todo si no se lee antes el primero del mes de agosto, ya que es una continuación, si bien transcurre mucho tiempo entre ambos. Aquí está la pegatina de agosto:



Y aquí, el relato.



AÚN ME NECESITA

Pasar dieciséis años viviendo entre humanos es un suplicio que no le recomendaría a nadie. Me había convertido en un gerdel amargado que se odiaba a sí mismo. Lo único bueno que había en mi vida, que daba sentido a mi sacrificio, era Alianora. 

Mientras desayunaba, la vi sentarse frente al fuego. Todo había dejado de importarme, pero a Alianora seguía queriéndola igual. Hubo un tiempo en que dependía de mí. Ahora, era al revés: mi amargura me había derrotado. Mantener una casa de tamaño humano era un esfuerzo titánico para mí, pero nunca me quejé mientras mi hija no podía hacerlo. En aquellos momentos, no hacía otra cosa que comer, beber, dormir y añorar mi arboleda. Ni siquiera salía de casa.

Lo único que me apenaba era que cada día me costaba más no desahogar mi amargura con ella. Alianora se sentó a la mesa sin apenas mirarme. La noche anterior la había regañado con una dureza absurda comparada con el pequeño despiste que me había enojado. Mi hija no era el problema: era tan buena que no parecía humana. El problema eran los otros, que se reían de mí por mi altura. Hubo un tiempo en que me enorgullecía de medir medio metro; ahora sabía que era un enano repulsivo. 

Lo peor era que Alianora no se daba cuenta. La última vez que salí, había quedado con ella en una plaza. Cuando llegué, charlaba con unas chicas que empezaron a reírse de mi corta estatura. Alianora pasó semanas intentando convencerme de que no se reían de mí. Ella no puede creer que me desprecien: es demasiado buena. Estiré el brazo, pero no pude alcanzar la jarra de tamaño gerdel porque a mi hija se le había vuelto a olvidar dejarla cerca.

—¡Maldición, Alianora! ¡Te lo he dicho cientos de veces: si pones la jarra tan lejos, no llego!

Me la acercó y agachó la vista. Soltó la cuchara, se levantó y la oí subir las escaleras. ¿Cómo podía ser tan estúpido? Bajé con torpeza de la silla y subí las escaleras con dificultades. Alianora estaba sentada en su cama, llorando. Supe que llevaba mucho tiempo descargando mi frustración en ella, que no lloraba por mi última frase, sino por todas las anteriores. La quería tanto que habría dado mi vida por salvar la suya, pero lo único que sabía era hacerla llorar. No era más que un enano asqueroso: no podía ofrecerle un hombro. Solo pude rodearle la pantorrilla y pedirle perdón.

—Tú no tienes la culpa, papá —me dijo.

Mientras se secaba las lágrimas con un pañuelo, pensé en que Alianora no se merecía soportar a alguien como yo.

* * * * *

Llevaba casi tres semanas sin ver a Alianora. No quería comer, no podía dormir. Estaba seguro de que no la vería nunca más. Me dijo que quería visitar la casa de sus padres naturales en Vianni y conocer a sus amigos, que iría con dos comerciantes del pueblo. Con lo mal que la trataba sin quererlo, no se lo podía negar. Y sería más feliz alejada de un enano despreciable.

Cuando Alianora regresó, no me alegré: dos soldados la trajeron inconsciente. Ardía de fiebre y tenía un brazo muy inflamado. Reconocí la picadura de un wttwo, un insecto repugnante, tan grande como mi antebrazo. Maté a muchos wttwos de joven. Salí de casa por primera vez en varios meses y le compré al herbolario algunas de las hierbas que usábamos los gerdel. Hice un emplasto, se lo puse en el brazo a Alianora y lo sujeté con una venda. Me angustió que no despertara. Llevaba dos horas a su lado cuando alguien llamó a la puerta y tuvo la paciencia de esperar a que bajara los escalones.

—Usted debe de ser el héroe gerdel —dijo un tipo moreno y con bigote.

—Mi hija está muy enferma. No estoy para burlas —respondí, conteniéndome con esfuerzo, mientras cerraba la puerta. El tipo la inmovilizó con el pie.

—Soy médico. ¿Puedo pasar o dejamos que su hija se muera?

No entendí qué hacía allí ese hombre, pero le dejé entrar. Atendió muy bien a mi hija, me dejó hierbas y medicinas, me dio instrucciones detalladas… y cuando fui a pagarle, me dijo que medio Chavvi había contribuido con alguna moneda para costear sus honorarios.

* * * * *

Alianora luchó durante cuatro días. La quinta mañana, abrió los ojos, se incorporó para sentarse y me sonrió. Le abracé una pantorrilla, pero ella me levantó y le abracé el cuello. Estuvimos así un rato, hasta que me sentó junto a ella.

—Perdóname por haberte mentido —afirmó mientras se sacaba algo del escote.

Envuelto en una tela había un documento gerdel. Mi jefe de arboleda me había indultado. No me podía creer que mi niña hubiera sido capaz de realizar un viaje tan peligroso para un ser humano.

—No quiero que te vayas, papá, pero aquí no eres feliz. Convencí a tu jefe de arboleda de que puedo valerme por mí misma, así que ya no corréis peligro si regresas. —Alianora me sonrió—. Sé muy feliz.

* * * * *

El día que me fui, comprendí lo absurdo de mi obsesión con mi estatura. Decenas de vecinos de Chavvi vinieron a despedirme: nunca me habían despreciado.

Pasé un mes inolvidable en mi arboleda. Rejuvenecí diez años, pero eché de menos a Alianora desde el primer día. Y cada vez me sentía más triste. Mi jefe de arboleda ya era un anciano de casi cuarenta años. Yo, con cinco menos, era otro.

—Voy a volver a Chavvi, señor —le dije con esfuerzo—. Vendré cuando pueda, pero… Alianora aún me necesita. Los humanos viven tanto que con veinte años aún son muy inocentes, y mi hija tiene solo diecisiete. Si no vuelvo, ¿quién le dará consejos, quién le dirá si el vestido le queda bien y la regañará porque lleva demasiado escote? No tenemos espejos en casa. Siento marcharme, pero aún me necesita.

Alianora se casaría dentro de dos o tres años y se iría de casa, pero ¿por qué no pasar ese tiempo con ella?

—Siempre he sabido que te irías de nuevo, Mylles. Te indulté para que pudieras volver a la arboleda, no para que te quedaras. —Me dio un abrazo—. Vuelve con Alianora: aún la necesitas.

26 agosto 2018

#OrigiReto2018 Akmein Mabeg

Relato para el Reto de escritura de #OrigiReto2018 - Ejercicio: 07- Relata una adopción peculiar.

Bases en:
http://nosoyadictaaloslibros.blogspot.com.es/2017/12/reto-de-escritura-2018-origireto.html
o en
http://plumakatty.blogspot.com.es/2017/12/origireto-creativo-2018-juguemos.html

Este relato cuenta con 1045 palabras y hay dos homenajes un pelín disimulados. El primero es a la película Willow (si la habéis visto, puede que lo captéis. Es de una escena del final). El segundo es a la novela Tres corazones y tres leones de Poul Anderson. Este segundo lo contaré porque es un nombre que comparten muchos personajes: Alianora es la dama cisne que aparece en la novela de Poul Anderson.



AKMEIN MABEG

Los gerdel no sentimos aprecio por los humanos: son enormes, arrogantes y ansían expandirse a costa de la naturaleza. No soy una excepción, pero Silvio y Gabriella siempre me habían tratado bien y les consideraba unos buenos amigos. Cuando mi jefe de arboleda me enviaba Vianni, el pueblo humano más próximo, a comerciar, procuraba ir a verlos a su taller aunque no tuviera nada que comprarles. Aquel día de primavera en que fui a verlos, me cambió la vida.

Mi pueblo odia la violencia, quizá porque no sería prudente usar la fuerza cuando un gerdel le llega a un humano normal a las rodillas y los humanos no son la especie humanoide más grande. Pero hay otros pueblos que sí combaten a los humanos. Cuando oí sonidos de pelea en casa de Silvio y Gabriella y oí llorar a Alianora, su niña de apenas un año, me oculté.

Soy tan pequeño que los humanos casi nunca reparan en mí. Los tres malluwra, que son un poco más grandes, tampoco me vieron mientras salían del taller de mis amigos llevándose en brazos a Alianora, que seguía llorando con fuerza. Entré en la casa y me encontré a Silvio y Gabriella muertos delante de la cuna de su pequeña. El dormitorio estaba destrozado: habían luchado hasta el fin. Aquellos humanos no merecían tal destino.

Me oculté al oír llegar a los soldados y al regidor del pueblo. Aquellos cobardes se limitaron a lamentarse por la suerte de Alianora y el regidor prometió celebrar un buen entierro. Decidí que, si aquellos humanos no iban a intentar ni siquiera vengarse, sería yo quien lo hiciese en su lugar. Me aseguré de que mi bastón de combate estuviera cargado y seguí el rastro de los malluwra.

Me interné en un bosque que no tenía nada que ver con el mío: aquel era un lugar siniestro, lleno de árboles y matorrales oscuros y retorcidos. Los llantos de un bebé humano me angustiaron, pero me ayudaron a guiarme. Cuando localicé a los malluwra, en un claro de escasa extensión, me alegré de ser tan pequeño. Eran siete y parecían ocupados en una invocación. No entendía su idioma, solo capté dos palabras que sonaban en cada frase que pronunciaban: “Akmein Mabeg”.

Supe que era un nombre propio cuando un monstruo, con un aspecto que recordaba un ave de presa y brazos acabados en garras en vez de alas, se materializó cerca del borde del claro. Y sentí una punzada en el corazón cuando oí llorar a Alianora con más fuerza y reconocí el ritual: iban a sacrificarla a aquel Akmein Mabeg. Me acerqué todo lo que pude al monstruo. No sabía qué hacer, pero me sentía incapaz de dejar que mataran a una niña si podía evitarlo. Ser tan pequeño y llevar una capa mágica gerdel que me ayudaba a mimetizarme era una ventaja. También un inconveniente: ni siquiera armado con el bastón iba a impresionar o ahuyentar a seres seis o siete veces más grandes que yo.

Se me aceleró el pulso cuando advertí que había una posibilidad. El ritual parecía implicar un trance provocado por unos cánticos pronunciados en tono muy bajo. No supe si su objetivo era conseguir que Alianora dejara de llorar, pero la niña dejó de hacerlo. Eso me dio la oportunidad. Llené a toda prisa mi capa con ramas y hojas hasta crear un bulto del tamaño de un bebé humano. Hice que adquiriera el mismo color que la sábana en la que iba envuelta Alianora y, con sigilo, cambié al bebé por mi capa. Pasé muchísimo miedo: si a alguno de aquellos gigantes se le ocurría abrir los ojos, o si la pobre niña arrancaba a llorar, moriríamos los dos.

Nada de aquello sucedió. Huí todo lo deprisa que pude porque cuando vieran que el bebé humano ya no estaba allí, me buscarían por todo el bosque. Sin embargo, ya no tenía miedo. Ni siquiera necesitaba mi capa mágica: si un gerdel se esconde en un bosque, solamente lo encontrarán si el gerdel así lo desea, en especial si quien lo busca pertenece a una raza de gran tamaño.

Regresé a Vianni muy contento, aunque empecé a sentirme cansado porque el bebé pesaba mucho. Alianora era una niña preciosa, de piel muy blanca y mejillas sonrosadas. Su piel era lo que más me llamaba la atención al compararla con la mía, marrón como la madera y con manchas verdes. Despertó a mitad de camino, pero no lloró. Tuve la sensación de que se sentía a gusto conmigo. Sus ojos también eran distintos a los de cualquier gerdel: azules, en vez de negros.

Cuando la llevé al regidor de Vianni, para que se hiciera cargo de ella, me dieron el primer golpe.

—Si algún humano se hace cargo de ella, caerá la maldición sobre Vianni. Esa niña iba a ser sacrificada a un xephus: está marcada. Llévala al bosque y que las fieras la devoren.

Discutí largo rato, pero fue inútil. Así que lleve a Alianora a mi arboleda. ¿Qué otra cosa podía hacer? Mi jefe me dio el segundo golpe.

—No podemos ocuparnos de una niña humana. Según sus leyes, sería un secuestro y les daríamos la excusa que buscan para ocupar la arboleda. Si los humanos no quieren hacerse cargo, llévala al bosque y que las fieras la devoren.

Me levanté para cumplir la orden y cuando vi a Alianora en una cama gerdel, tuve que secarme una lágrima. Fui a cogerla en brazos y me rodeó dos dedos con la mano.

—Señor, no puedo.

—Yo lo haré por ti.

—Se lo ruego, señor, ¿no hay otra solución?

Nos sentamos a su escritorio y mi jefe se pasó un par de horas consultando un código legal humano y los pergaminos donde se plasmaban las leyes gerdel.

—Hay una forma, pero es muy dura. Tendrás que adoptar a Alianora. Eso me obligará a desterrarte para siempre. Entonces, si vas a una población humana que no sea Vianni con tu hija y muestras tu sentencia de destierro, podrás pedir asilo y te sería fácil conseguirlo. ¿Es eso lo que quieres?

Llené la mente de imágenes de mi arboleda: las encinas y los robles, las casitas gerdel, las flores, los atardeceres… 

Los iba a echar mucho de menos.