Posts Tagged C#Sharp

Descargar archivos de un FTP

Pues eso… un artículillo "tesnico" para que no digas..

Esto lo publico a raíz de una pregunta en mis foros… y más que nada porque pensaba que ya lo tenía publicado, pero se ve que no… ya que tenía un ejemplo para acceder a un servidor FTP pero sólo para listar el contenido de un directorio FTP.

La cuestión es que en realidad ese código que publiqué con un par de añadidos sirve para poder descargar un archivo (o fichero) de un directorio FTP y aquí te los mostraré tanto para Visual Basic.NET como para Visual C#.

La clase en cuestión que nos sirve para hacer esto que te comento es FtpWebRequest que está definida en el espacio de nombres System.Net.

Y sin más preámbulos (ni rollos) aquí tienes el código de VB y C#.

¡Que lo descargues bien!

 

Código de VB

'------------------------------------------------------------------------------
' Descargar archivos de un FTP                                      (06/Dic/11)
'
' ©Guillermo 'guille' Som, 2011
'------------------------------------------------------------------------------
Option Strict On
Option Infer On

Imports System
Imports System.Net
Imports System.IO
Imports System.Text

Module Module1

    Sub Main()
        ' En este ejemplo usamos un FTP público y anónimo
        ' pero puedes indicar el que quieras
        descargarFic("ftp://ftp.rediris.es/welcome.msg", _
                     "anonimous@nadie.com", "", _
                     "E:\pruebas2")

        Console.WriteLine("descargado")
        Console.ReadLine()
    End Sub

    Private Sub descargarFic(ByVal ficFTP As String, _
                             ByVal user As String, ByVal pass As String, _
                             dirLocal As String)

        Dim dirFtp As FtpWebRequest = CType(FtpWebRequest.Create(ficFTP), FtpWebRequest)

        ' Los datos del usuario (credenciales)
        Dim cr As New NetworkCredential(user, pass)
        dirFtp.Credentials = cr

        ' El comando a ejecutar usando la enumeración de WebRequestMethods.Ftp
        dirFtp.Method = WebRequestMethods.Ftp.DownloadFile

        ' Obtener el resultado del comando
        Dim reader As New StreamReader(dirFtp.GetResponse().GetResponseStream())

        ' Leer el stream (el contenido del archivo)
        Dim res As String = reader.ReadToEnd()

        ' Mostrarlo.
        'Console.WriteLine(res)

        ' Guardarlo localmente con la extensión .txt
        Dim ficLocal As String = Path.Combine(dirLocal, Path.GetFileName(ficFTP) & ".txt")
        Dim sw As New StreamWriter(ficLocal, False, Encoding.Default)
        sw.Write(res)
        sw.Close()

        ' Cerrar el stream abierto.
        reader.Close()
    End Sub

    Sub listarFTP(ByVal dir As String, ByVal user As String, ByVal pass As String)
        Dim dirFtp As FtpWebRequest = CType(FtpWebRequest.Create(dir), FtpWebRequest)

        ' Los datos del usuario (credenciales)
        Dim cr As New NetworkCredential(user, pass)
        dirFtp.Credentials = cr

        ' El comando a ejecutar
        dirFtp.Method = "LIST"

        ' También usando la enumeración de WebRequestMethods.Ftp
        dirFtp.Method = WebRequestMethods.Ftp.ListDirectoryDetails

        ' Obtener el resultado del comando
        Dim reader As New StreamReader(dirFtp.GetResponse().GetResponseStream())

        ' Leer el stream
        Dim res As String = reader.ReadToEnd()

        ' Mostrarlo.
        Console.WriteLine(res)

        ' Cerrar el stream abierto.
        reader.Close()
    End Sub
End Module

 

 

Código de C#

//-----------------------------------------------------------------------------
// Descargar archivos de un FTP                                     (06/Dic/11)
//
// ©Guillermo 'guille' Som, 2011
//-----------------------------------------------------------------------------

using System;
using System.Text;
using System.Net;
using System.IO;

namespace descargar_archivos_FTP_cs
{
    class Program
    {
        static void Main(string[] args)
        {
            descargarFic("ftp://ftp.rediris.es/welcome.msg",
                "anonimous@nadie.com", "", @"E:\pruebas2");

            Console.WriteLine("descargado");
            Console.ReadLine();
        }

        static void descargarFic(string ficFTP, string user, string pass, string dirLocal)
        {
            FtpWebRequest dirFtp = ((FtpWebRequest)FtpWebRequest.Create(ficFTP));

            // Los datos del usuario (credenciales)
            NetworkCredential cr = new NetworkCredential(user, pass);
            dirFtp.Credentials = cr;

            // El comando a ejecutar usando la enumeración de WebRequestMethods.Ftp
            dirFtp.Method = WebRequestMethods.Ftp.DownloadFile;

            // Obtener el resultado del comando
            StreamReader reader =
                new StreamReader(dirFtp.GetResponse().GetResponseStream());

            // Leer el stream
            string res = reader.ReadToEnd();

            // Mostrarlo.
            //Console.WriteLine(res);

            // Guardarlo localmente con la extensión .txt
            string ficLocal = Path.Combine(dirLocal, Path.GetFileName(ficFTP) + ".txt");
            StreamWriter sw = new StreamWriter(ficLocal, false, Encoding.UTF8);
            sw.Write(res);
            sw.Close();

            // Cerrar el stream abierto.
            reader.Close();
        }

        static void listarFTP(string dir, string user, string pass)
        {
            FtpWebRequest dirFtp = ((FtpWebRequest)FtpWebRequest.Create(dir));

            // Los datos del usuario (credenciales)
            NetworkCredential cr = new NetworkCredential(user, pass);
            dirFtp.Credentials = cr;

            // El comando a ejecutar
            dirFtp.Method = "LIST";

            // También usando la enumeración de WebRequestMethods.Ftp
            dirFtp.Method = WebRequestMethods.Ftp.ListDirectoryDetails;

            // Obtener el resultado del comando
            StreamReader reader =
                new StreamReader(dirFtp.GetResponse().GetResponseStream());

            // Leer el stream
            string res = reader.ReadToEnd();

            // Mostrarlo.
            Console.WriteLine(res);

            // Cerrar el stream abierto.
            reader.Close();
        }
    }
}

 

 

Nos vemos.

Guillermo

Tags: , , ,

Reutilizar un control en otros controles

Pues eso… aquí te voy a explicar cómo usar un mismo control en más de un "contenedor" (o colección de controles), y como comprobarás, en principio, es algo muy simple de hacer (una vez que se sabe cómo hacerlo, claro, que si no… ¡ja! ya me dirás tú cómo lo harías si nadie lo explicara, pues eso…)

 

Sí, es un tema técnico… ;-) pero eso no quiere decir que no lo empiece cómo "debe ser".

 

A lo que vamos, de lo que se trata es de tener, por ejemplo, un control PictureBox y ese mismo control mostrarlo (o usarlo) en controles diferentes.
En realidad en contenedores de controles o colecciones de controles, que para el caso es lo mismo, además de que en .NET todos los controles pueden tener otros controles dentro (al menos eso es lo que parece o hace suponer al existir en cada objeto de tipo Control una propiedad llamada Controls que es un objeto del tipo ControlCollection (para saber más pulsa en los enlaces y te llevará a la documentación de .NET Framework 4.0).

Para lograr eso lo que tenemos que hacer es añadir el control en cuestión a la colección Controls del contenedor al que lo queremos mover.
Por ejemplo, si tenemos un control del tipo TabControl y cuando pulsamos en la primera y/o la segunda ficha (TabPage), haremos que un control llamado PictureBox1 se añada a esa ficha.
Con el siguiente código (para Visual Basic) lo conseguiremos:

 

Private Sub TabControl1_SelectedIndexChanged(ByVal sender As Object, _
                                             ByVal e As EventArgs) _
                                            Handles TabControl1.SelectedIndexChanged

    Select Case TabControl1.SelectedIndex
        Case 0
            TabPage1.Controls.Add(PictureBox1)
        Case 1
            TabPage2.Controls.Add(PictureBox1)
    End Select
End Sub

 

Si prefieres usar C#, utiliza el siguiente código:

private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
{
    switch (tabControl1.SelectedIndex)
    {
        case 0:
            tabPage1.Controls.Add(pictureBox1);
            break;

        case 1:
            tabPage2.Controls.Add(pictureBox1);
            break;
    }
}

 

Si en lugar de añadirlo directamente a una ficha (tabControl) necesitas que esté en otro contenedor, por ejemplo, dentro de un GroupBox, simplemente sustituye el nombre del control que hay justamente antes de Controls.Add por el control que te convenga. Lo mismo ocurre con el control añadido (el que está entre paréntesis después de .Add), puedes añadir cualquier control.

 

Si al ver el código de ejemplo te preguntas algo así:

P: Guille, ¿no crees que sería necesario quitar el control antes de añadirlo a otra colección? ya que de esa forma tendríamos repetido el mismo control en más de una colección.

La respuesta podría ser como esta:

R: Buena pregunta, lo que indica que "has leído el código", pero no es necesario.

 

¿Por qué no es necesario eliminar un control de una colección antes de añadirla a otra?

Porque el propio .NET se encarga de eso, es decir, si un control se añade a una colección de controles, automáticamente se quita de la que ya estuviera.

Esto no es que lo haya "adivinado" yo, es que está en la documentación del método Add, que por cierto yo no lo había leído hasta después de hacer el proyecto de ejemplo, en el que me dio por probar a ver qué pasaba si no eliminaba previamente el control de la colección, y al ver que no ocurría "nada raro" (es decir, todo funcionaba como debería funcionar) me dio por leer la documentación y esa documentación tiene una nota que dice:

 

Un objeto Control sólo se puede asignar a una colección Control.ControlCollection a la vez. Si el Control ya es secundario de otro control, se quita de ese control antes de agregarlo a otro.

(el texto anterior está extraído de la ayuda en línea de .NET Framework 4.0 en castellano, concretamente de la definición del método Add de la clase Control.ControlCollection)

 

 

Espero que te sea de utilidad.

 

Nos vemos.

Guillermo

Publicado con fecha del lunes 16 de mayo a las 22:00, pero en realidad lo acabé de escribir (y publicar) el martes 17 de mayo a las 00:05

Tags: , , , ,

Obtener info de la ventana en la que está el cursor del ratón

Pues eso… un ejemplo para Visual Basic .NET y C# de cómo usar funciones del API y de .NET… no me enrollo, te dejo la descripción y el enlace:

 

 

Obtener info de la ventana en la que está el cursor del ratón

Usando funciones del API de Windows (WindowFromPoint y GetWindowText) y clases de .NET Framework (Cursor.Position), averiguar el handle de una ventana según la posición del cursor del ratón (mouse) y como ejemplo mostrar el texto de esa ventana y su handle, la ventana puede ser incluso un control.

 

 

Nos vemos.
Guillermo

Tags: , ,

Buscar un elemento y si no está, usar el anterior

Pues eso… otro articulillo/truco que acabo de publicar en mi sitio sobre cómo buscar "algo" y si no se encuentra, quedarse con el anterior, usando instrucciones de LINQ.

 

Aquí tienes el enlace y la descripción…

 

Buscar un elemento y si no está, usar el anterior

 

Buscar un elemento y si no está, usar el anterior… En este ejemplo he usado LINQ para realizar la búsqueda con Where y accediendo al elemento por medio del método extensor Last.

 

Espero que te sea de utilidad.

 

Nos vemos.
Guillermo

Tags: , , ,

Buscar datos con LINQ sin tener en cuenta mayúsculas/minúsculas

Pues eso… un articulillo que acabo de publicar en mi sitio sobre cómo hacer una búsqueda insensible a mayúsculas y/o minúsculas (case insensitive, pero usando instrucciones de LINQ.

 

Aquí tienes el enlace y la descripción…

 

Buscar datos con LINQ sin tener en cuenta mayúsculas/minúsculas

 

Buscar datos con LINQ sin tener en cuenta mayúsculas/minúsculas. O lo que es lo mismo buscar datos case insensitive usando instrucciones de LINQ (ya sea para objetos en memoria como los contenidos en los procedentes de una base de datos).

 

Espero que te sea de utilidad.

 

Nos vemos.
Guillermo

Tags: , , ,

Adaptar nuestra aplicación al tamaño y posición del escritorio de Windows

Pues eso… un articulillo que acabo de publicar en mi sitio sobre cómo saber las coordenadas y tamaño del área utilizable del escritorio de Windows.

Aquí tienes el enlace y la descripción…

 

Adaptar el formulario al tamaño y posición del escritorio

 

Cómo averiguar las coordenadas y posición del área de trabajo del escritorio o pantalla del usuario de nuestra aplicación mediante la propiedad WorkingArea de la propiedad PrimaryScreen de la clase Screen.

 

Espero que te sea de utilidad.

 

Nos vemos.
Guillermo

Tags: , ,

Si usas punteros… apúntate esta

Pues eso… un articulillo que acabo de publicar (bueno, hace ya una hora y pico) en mi sitio, sobre los punteros en C/C++ (e incluso C#), pero que también vale para el manejo de otros tipos de objetos a los que se accede por referencia…

Aquí tienes el enlace y la descripción…

 

Si usas punteros… apúntate esta

 

Cuidados que debes tener si utilizas punteros, normalmente si usas C/C++ e incluso C# (algunos dirán que Object Pascal también tiene punteros, pero yo no lo uso…).

[Este artículo es sólo apto para mentes abiertas que usen punteros o hayan querido usarlos o simplemente piensen que con los punteros sr vive mejor, aunque lo parezca, el contenido no es de guasa]

Y para aquellos que programan con Visual Basic (cualquier versión, ya sea o no para punto NET) decirles que tampoco están libres, ya que (a su manera) Visual Basic también usa punteros. …

…en realidad esto es muy útil para todos los que programan, ya sean con punteros directamente o con los punteros camuflados que hacen "referencia" a objetos…

 

Espero que te sea de utilidad.

 

Nos vemos.
Guillermo

P.S.
También puedes ver los comentarios en el enlace al artículo que he publicado con fecha de hoy en la página de elGuille en Facebook:

http://www.facebook.com/pages/elGuille/82093985818?v=app_2309869772

 

P.S.2
Mirando, mirando, el "rano" usease RFOG, tiene un artículo sobre punteros y referencias que seguro que te puede parecer interesante:

 

I – Punteros y referencias

Las similitudes y diferencias de los punteros en C++ nativo y las referencias en C++/CLI (.NET)

Ver el contenido del artículo en el blog de RFOG

 

Tags: , , , , ,

Código de ejemplo de Fluent Interface para CSharp y Visual Basic

Pues eso, que ya está el código de ejemplo para que lo puedas descargar desde mi sitio:

.NET/VB6: Código de ejemplo de cómo usar Fluent Interface en C#, Visual Basic .NET y Visual Basic 6.0

Como puedes ver por el título, están los ejemplos para C#, VB.NET y VB6, además el de VB.NET está para la versión 2010 (VB10) y 2008 (VB9) cuyo código también es válido para la versión 2005 (VB8) y supongo que también para las anteriores, aunque no lo he probado… aunque lo mismo algún día lo pruebo… al menos en el VS2003, es decir para VB7.1.

Nos vemos.
Guillermo

P.S.
Si quieres leer el artículo o post que publiqué hace un par de días en este mismo blog, lo puedes hacer desde este enlace:
Fluent Interface no es solo simular el WITH de VB

Tags: , , , , ,

Fluent Interface no es solo simular el WITH de VB

Pues eso, que a raíz de leer un artículo en el blog de mi amigüita Gisela Torres (amiga de feisbúc, ya que no la conozco personalmente aunque en la última cena/reunión de MVP anduvo por allí cerca, pero como yo estaba castigado contra la pared no le vi ni sus ojos… ya sabes que algunos ojos me encandilan, jeje) comentando cómo Crear Fluent Interface en C# y en uno de los comentarios al post decían que se parecía mucho al uso de la instrucción (o bloque) WITH de Visual Basic.

Después en la página que tiene CampusMVP en feisbúc se vuelve a comentar lo mismo, y en realidad es que ese ejemplo concreto es muy parecido al uso de un bloque With de VB (ya sea VB para .NET como el VB6, en ambos existe esa construcción).

 

El código de ejemplo

Sin entrar en demasiados detalles (y con el permiso de Gisela) te muestro el código de uso en C# del ejemplo de interfaz fluida (o fluent interface si lo prefieres en inglés -estos dos enlaces o links son de la wikipedia y en el de español sólo hay ejemplos para C# y C++, mientras que en inglés hay ejemplos para Object Pascal, PHP, Java, JavaScript, C#, etc., eso sí, para VB no hay… ¡faltaría más!-) que puso en su artículo, y después te muestro el correspondiente en Visual Basic usando un bloque With.

 

Nota:
Para entender mejor este ejemplo, te recomiendo que veas el código completo que muestra Gisela en su artículo.

 

El código de uso de Fluent Interface en C#:

new Computer()
    .AddProcessor("Intel i7 920")
    .AddRAM(6)
    .TurnOn()
    .Test()
    .TurnOff();

 

El código de uso de Fluent Interface en VB

(pero sin crear la interfaz que implementa la clase Computer de C#, por eso en este ejemplo la clase se llama ComputerSimple):

With New ComputerSimple()
    .AddProcessor("Intel i7 920")
    .AddRAM(6)
    .TurnOn()
    .Test()
    .TurnOff()
End With

 

Como puedes comprobar, escribiendo el código de C# de esa forma es fácil confundirlo con una construcción (o bloque) With de Visual Basic, pero como comenté en la página de CampusMVP: sin End With y con punto y coma… ;-)

 

Aunque ese "parecido" con With es sólo por la forma de escribir ese código en C#, ya que si lo escribiésemos todo junto y sin cambios de líneas, sería lo que se conoce como encadenamiento de métodos, de forma que se puede llamar a un método de una clase partiendo de la llamada a otro método y esto no se puede hacer con un With, ya que esa instrucción lo que permite es hacer llamadas a diferentes miembros de un objeto (ya sean métodos, propiedades o cualquier cosa que se pueda usar en un objeto) sin necesidad de tener que indicar el objeto en cuestión, es decir, el With nos permite crear un bloque que hace referencia a un objeto, y al estar dentro del "bloque" podemos acceder a cualquier miembro de ese objeto.

 

El código de llamada a la clase "Computer" que simula un With en C# en realidad se podría escribir así:

Nota:

En el blog es posible que se corte el código, pero lo que hay después del comentario podría/debería estar en una sola línea.

Gracias a mi amigo Dani (Seara) por recordarme que no había puesto el código.

 

// Todo en una línea:
new Computer().AddProcessor("Intel i7 920").AddRAM(6).TurnOn().Test().TurnOff();

 

Por tanto, si queremos una funcionalidad como la indicada en los ejemplos de encadenamientos de métodos, tendríamos que crear un código parecido al indicado en el artículo de Gisela, es decir, crear una interfaz en los que sus métodos devuelvan la propia interfaz en lugar de un tipo más concreto.

 

 

Fluent Interface no solo es encadenamiento de métodos

Pero si hacemos caso a Martin Fowler, a esta forma de usar Fluent Interface se conoce como method chaining (o encadenamientos de métodos), pero la "fluidez" no es sólo porque se puedan encadenar métodos… aunque yo aquí no te voy a contar lo que él ya te cuenta en su sitio, allí podrás leer más sobre nested functions (anidamiento de funciones) o de object scoping (alcance -cobertura- de los objetos) que son otras de las "gracias" de todo esto de las interfaces fluidas (fluent interface).

 

Reflexiones

En cualquier caso, todo esto está muy bien… y el que quiera usarlo que lo use y el que no, que haga como yo, que se va a dar una vuelta por la playa (o equivalente, también vale un parque o un banco en una esquina) o suda un poquillo corriendo o jugando al tenis… jejeje, que no, que es broma, es que después de un año casi sabático, tantas cosas nuevas, que no son tan nuevas, pero que ahora es cuando yo me estoy enterando de muchas de ellas, porque se usan en los lenguajes que me interesan: en general todos los incluidos en .NET Framework… la cuestión es que hay mucha información en poco tiempo y la verdad es que prefiero "emplear" sólo una parte de ese tiempo en cosas concretas o bien que me llamen la atención como ha sido la de este artículo de Gisela. ¡Gracias Gisela por hacer que le dedique un rato a esto de la programación en vez de estar pensando que podría estar en la playa refrescándome! (de todas formas esta tarde no tocaba playa, así que… bien empleado está el tiempo, jejeje)

 

Despedida y cierre

Bueno, voy a escribir el código de ejemplo y ponerlo más arriba, que sólo he dejado el espacio para que no se me fuera la idea, que con estas calores, hasta las ideas se evaporan… jejeje

 

Nos vemos.

Guillermo

P.S.

El código de ejemplo completo lo pondré en otro momento… ¿vale? pues eso… y además añadiré el correspondiente para usar esto mismo en Visual Basic .NET y si me da el punto -y se puede- también lo haré para Visual Basic 6.0

P.S.2 (23/Jul/2010 05.27)

Ya está el código de ejemplo para que lo puedas descargar desde mi sitio:

.NET/VB6: Código de ejemplo de cómo usar Fluent Interface en C#, Visual Basic .NET y Visual Basic 6.0

Tags: , , ,

Miércoles 14, ya falta menos…

Pues eso… (la explicación del título), que hoy es miércoles 14 de julio y lo de ya falta menos es que mañana (si no hay cambios de última hora) me voy a Oliva, a pasar con algunos de mis colegas "Belmontes" la fiesta de moros y cristianos.

Pero eso será mañana… hoy a seguir con las cosillas que habitualmente hago… y para empezar (a primera hora de la mañana) es las correrías matutinas, en esta ocasión no ha venido Vicky (que tenía cosas que hacer), por tanto, y teniendo en cuenta de que Antonio ya ni da señales de vida, y bien está, que hoy me lo han dicho, hemos estado Mari Ángeles, Dandy y yo.

La mitad del camino la hemos hecho corriendo, aunque la vuelta ha sido andando, de todas formas no anoté los tiempos, ya que yendo con el perrillo sabía que iríamos en plan tranquilo, que el pobre aún no tiene edad para correr mucho, aunque no se cansa… e incluso cuando Mari Ángeles lo lleva en brazos (porque pase un coche o haya otros perros con cara de buenos amigos) no aguanta ni un minuto, y enseguida se pone a lloriquear, como diciendo que quiere ir tocando tierra y corriendo…
De todas formas, al llagar al final del primer tramo, nos paramos un poquillo para que el perro jugueteara y de camino descansara un poco… bueno, y nosotros también, todo hay que decirlo…

A la vuelta, nos paramos en la Torrecilla, aunque no ha habido baño, entre unas cosas, porque Mari Ángeles se tenía que ir pronto y por otras porque me vio estornudar y me dijo que mejor no me metiera, no sea que los días que me pase en Oliva esté con el resfriado…
Al menos dimos una vueltecilla y de paso el Dandy aprovechó para juguetear con la arena y comprobar que el agua del mar está salada y no demasiado fría (al menos en estos tiempos calurosos del verano, a pesar de que la mar esté de poniente).

Aquí te dejo unas fotos de esta mañana.

 

Foto2784_lr
Foto 1. El Balcón de Europa (08.03)
hoy había más reflejos que otros días (y eso que limpié el objetivo del móvil)

 

Foto2788_lr
Foto 2. Dandy tranquilo en la arena, (08.53)
(después de comprobar que el agua está a una distancia prudencial)

Foto2789_lr
Foto 3. Comprobando cuánta playa le queda por recorrer

 

A las 12 estuve con el Migue, hablando de cosas y tomando un café/infusión/cerveza en el Anahí.

Y hace un rato me he llegado al ambulatorio a ver si el médico me dice algo del dolorcillo ese que tengo en el dedo que se engarrota (y que se está pasando también, aunque sin engarrotamiento, al dedo chico (meñique). La solución que si me molesta para usar el ratón que empiece a usarlo con la mano izquierda y que si el ibuprofeno no me quita el dolor del dedo, lo mismo me quita el de otras articulaciones… bueno, al menos me ha recetado una caja de ibuprofeno… algo es algo… en fin…

 

Bueno, después te cuento qué más cosas he hecho que ahora me voy a poner a revisar las cosas que me tengo que llevar para Oliva, por si esta tarde tengo que comprar algo… que seguro que algo se me olvida…

 

Mientras sí, mientras no, pues… he publicado en mi sitio una nueva colaboración de RFOG (Rafael Ontiveros, alias el "rano") en la que sigue explicando cómo modificar el comportamiento de los controles, y todo ello usando puntos y comas y esas cosas raras de los "developers" si es que… ¡que gente más rara hay por ahí! jejeje.
Este es el enlace (y un poco de descripción) del artículo… espero que lo disfrutes, pero al fresquito, que con estas calores…

C++/MFC: Cambiando el comportamiento predefinido de un control (II)

Heredando el nuevo control

Siguiendo con el texto del mes pasado, ahora nos toca heredar nuestro control a partir del que Visual Studio nos ha colocado por defecto en el cuadro de diálogo.

 

 

(La tarde)

Al final no tenía nada que comprar, aún así mi amiga (la chófer) me preguntó que si necesitaba algo que me llevaba… pero como no había nada que necesitase de sus "servicios", pues… quedamos para las ocho en el tenis…

Y allí estuvimos, (en el tenis), y hoy miércoles también vino bastante gente, bueno, en la pista 1 nos quedamos Vicky, Chiqui, San y yo, en la pista 2 estuvieron Manolo, Rafa (que viene cuando se lo permite el trabajo), Miguel y Alexis, después llegó otro muchacho (que ya vino ayer martes, creo) y primero se quedó entrenando con nosotros y después se quedó con el otro grupo.

Después de entrenar a varias cosillas, que si don en un lado de la pista y otro en el otro, que si de derecha que si de revés (ya no recuerdo todas las cosas que hicimos, que ya han pasado más de dos días y… pues eso…), nos fuimos para la pista 2. Y aunque éramos cuatro, en vez de jugar a dobles, por aquello de que es más aburrido, pues… "alguien" decidió que mejor jugar individuales, a tres puntos ganados, (para no andar con lo de 15, 30, 40…) y sin ventaja, de forma que quién ganara seguía jugando y los demás íbamos rotando, y así… y la cosa es que estuvo bien la cosa, además de que no estábamos demasiado tiempo sin jugar… como mucho dos juegos, que lo más que llegaban era a cinco puntos en total.

 

Una vez terminada la hora del tenis, nos quedamos un ratillo allí, viendo cómo entrenaba Antonio Fajardo a Patri y a Manolo, que se quedó y aprovechó que sólo estaba Patri en ese entrenamiento/clases de Antonio.
Chiqui hoy no tenía mucha prisa, así que, se quedó también con San y conmigo.
Le preguntamos a Antonio que otros días daba clases por las tardes (después de las clases de Ángel) y dijo que ahora mismo no tenía a nadie, salvo a Patri y Manolo y que podía quedar cuando fuese necesario… para ver de que de vez en cuando nos diera unas cuantas "lecciones" a San y a mí… y quedamos en que ya hablaríamos o quedaríamos la semana que viene… a ver si podemos ir los dos, más alguien más (para que salga más barato) y a ver si de esa forma mejoramos los golpes, ya que si además de las clases semanales le añadimos este extra en estos días de verano, pues… algo se tendrá que mejorar ¿no? pues eso…

 

Después de estar un rato allí, nos fuimos y nos despedimos, en mi caso, sería hasta el lunes, ya que me voy mañana jueves para Oliva, Valencia a pasar unos días con mis amigos "Belmontes", y de paso ver los Moros y Cristianos que se celebran por estas fechas en Oliva… ¿que ya lo he dicho antes? bueno, pues así te enteras mejor, jejejeje.
Ah, que dice San que le lleve algo de recuerdo, le dije que si se apañaba con una aceituna (por el chiste fácil de oliva…) pero dice que no…
Bueno, a ver qué hay de "típico" en Oliva que se pueda llevar uno…

 

Y con esto creo que ya puedo dejar como terminado la "crónica" de este miércoles 14 de julio… que sí, que pasaron más cosas, pero… no es plan de contarlo todo…

 

 

Nos vemos.
Guillermo

Tags: , , , , ,