Delphi básico & Velneo desde cero

Julio 4, 2009

Valoración de Quality Central: mi opinión es…

Archivado en: Delphi, Enlace interesante, Entrada Diario — Etiquetas:, , , , — Salvador @ 9:49 am

Esta mañana estaba leyendo la entrada del blog de Chris Pattinson:

http://blogs.embarcadero.com/chrispattinson/2009/07/01/38908

donde el autor valora el vigente sistema de corrección de bugs, Quality Central, y se reflexiona sobre si realmente se corrigen los errores conocidos, compartiendo algunos datos sobre este tema. Este es un tema un tanto polémico y de hecho, algunos programadores replican en sus comentarios y expresan su desacuerdo. Y estoy casi seguro de que muchos compañeros creen que no siempre se hace lo suficiente.

¿Mi valoración?

No tengo una opinión clara. Siempre hemos dicho que los viejos bugs se olvidaron en el armario de los cadaveres y que algunos ya huelen, sin embargo reconozco que esa opinión es un tanto por inercia, una frase fácil. Habría que ser mas objetivos y analizar con cifras reales la cantidad y la calidad de las correcciones. Las interpretación de esas cifras, puede tener muchas lecturas y unos pueden ver el vaso medio lleno mientras que otros lo vean medio vació :-D

En fin. Pensaba que sería interesante dejar esa encuesta y que pudierais opinar. El día 31 de Julio se cerrará automaticamente y podremos conocer que pensais. Si esto vale de algo o no vale no puedo saberlo a ciencia cierta. Los blogs nos estamos poco a poco convirtiendo en cadena de transmisión de la opinión de un grupo de personas, un feedback valorado en ocasiones por las empresas y eso no es malo. :-)

Así que vosotros mismos. Estais en vuestra casa. En la barra lateral está la encuesta abierta en Twigs.

Julio 1, 2009

El futuro de Delphi parece más claro que nunca (Stefaan Lesage)

El futuro de Delphi parece más claro que nunca
Stefaan Lesage 23/06/2009
Traducción de su artículo en
http://www.devia.be/news/article/the-future-of-delphi-looks-brighter-than-ever-before/

Hace unas semanas, fui invitado a un encuentro cordial en Bruselas, con David Intersimone, más conocido como David I.  en la comunidad de Delphi. David nos iba a contar algo acerca del mapa de proyecto para Delphi.

Los ultimos 10 años, he estado desarrollando software usando Borland Delphi (más tarde en Codegear y ahora en Embarcadero) y esta era la oportunidad perfecta para sacar alguna información  de lo que aparece entre lineas.

Delphi para todo

El mensaje era muy claro, pero fue como una sorpresa para mi cuando David I. mencionó el objetivo principal: Delphi para todo.  Mas tarde, durante la sesión dijo: Delphi nativo para todo, mencionando MacOsX, Linux pero tambien dispositivos móviles. El incluso auguró la posibilidad de construir aplicaciones con Delphi para telefonía. (inclusive iPhone)

En ese momento, yo no supe que pensar acerca de eso, pero la posibilidad de desarrollar aplicaciones para dispositivos móviles sonaba bien … para ser honesto, sonaba como un sueño. Pero durante el curso del resto de presentaciones, yo advertí que ellos podrían hoy estar cercanos a cumplirlo.

image

Delphi Touch

Bien, ellos actualmente lo han llamado Delphi Natural Input para ser correcto. El fin es permitir a Delphi y a sus componentes de la VCL interactuar con diferentes formas de dispositivos de entrada, desde pantallas táctiles, tablas digitales, dispositivos sensores, gps, dispositivos de habla, Webcams,…

Todas esas características vendrán incluidas en una futura versión de la VCL de Delphi. Desde que trabajo sobre Mac, y estoy usando iPhone, tenía un buen conocimiento acerca de las posibilidades pero nunca pensé que fuera posible lograr algo así con Delphi. Bien, David I. nos enseñó una demo y me probó lo equivocado que estaba…

La demo era bastante sencilla, y no requería programación alguna. Todo lo que se tenía que hacer era añadir un nuevo componente GestureManager a la aplicación. El paso siguiente sería crear la “comunicación” o usar algunas de las ya predefinidas, disponibles en el GestureManager. La única cosa que se había hecho era añadir algo de código en el evento OnGestureEvent y ejecutar el código en el evento que lo activaría.

Para éstos que habían sido desarrollados en Delphi,  podrías actualmente compararlos al componente TActionList, en el cual se pueden añadir algunas acciones por defecto y permite que puedas añadir las propias también.

En este punto, empezaba a estar claro para mi que las posibilidades de crear aplicaciones para Dispositivos móviles usando Delphi ya no era un sueño. Aparentemente ellos ya habian ocupado bastante trabajo en ello y  se demostró que podía actualmente ser una realidad.

El mapa del proyecto Delphi (Delphi Roadmap)

Yo estaba contento de ver que el equipo de Delphi, estaba ocupado trabajando en la próxima salida de Delphi. Aparentemente los desarrolladores habían sido divididos en grupos de equipos trabajando unos pocos proyectos a reparar. Voy a dar una apunte de esos proyectos y sobre lo que ellos  enfocarán.  No me preguntes sobre fechas de salida, ya que ellos no mencionaron ninguna. Como David prudentemente dijo:  Hay 75 o más caminos de preguntarnos cuando estará preparado y solo hay una respuesta correcta: “Cuando esté preparado”.

Proyecto Weaver

El proyecto Weaver sera el principal foco de las grandes y pequeñas mejoras del IDE, que aumentarán la usabilidad y la productividad.
Con soporte añadido para dispositivos de entrada naturales como táctiles y de expresión,..
Mejorar la documentacion y aumentar la productividad de equipo.
DatanSnap con soporte http en el servidor REST, y .Net proxies para DataSnap.
IDE Insight ™ (teclado con acceso a todo)
Soporte del API de windows 7 y direct 2D
Soporte de  RTTI mejorado.
Control de código fuente con una nueva interface Open Tools Api que provee soporte para Gestor de Control de codigo fuentte ( Weaver tendrá alguna implementacion de Subversion)
.Net Aspect Oriented Programing -Programacion .Net orientada a Aspectos- (esto me pareció completamente impresionante)

Proyecto Delphi X

Plataforma cruzada Windows, Linux y MacOs.
Algunas otras caracteristicas a considerar:
Libreria de componentes compatible.
DataSnapX con la caracteristica de crear tanto el servidor como el cliente tanto en las tres plataformas y en la web.

Proyecto Chromium

La principal caracteristica de Chromium será la calidad, calidad y calidad.
La atención se pone sobre la productividad del desarrollador (mejoarar la usabilidad, eliminar las tareas largas detenidas, cerrar los bugs tan pronto como sea posible, fijando un nuevo estandar de reusabilidad.
Lightweig O/R mapping  -Mapeado ligero (Object/Relational)-
Documentacion  OTA (Open Tools Api)
Un nuevo modelo de mapeado de datos (DataBinding model)
Mayor integración con las herramienta de bases de datos.

Proyecto Commodore

Permitirá desarrollo de 64 bits nativo para delphi y c++ builder.
Algunas caracteristicas a considerar:
Compilador completo, con soporte RTL y VCL para compilación nativa de 64 bits.
Aplicaciones Multi-Core/Multi-Thread
Soporte para desarrollo paralelo en la RTL.

Y mucho mas por venir

Parece que hay mucho mas por venir y algunos proyectos podrían venir a la vez. Tristemente, no nos han dado información sobre cuando un producto estaría disponible al publico. La unica cosa que David I. mencionó que el plan era dar una nueva versión de delphi cada año.

TMS SMOOTH CONTROLS.

Aquí en Belgica contamos con pocos desarrolladores de Delphi y nosotros tambien tenemos compañias como TMSSoftware quienes estan desarrollando buenos componentes. Habían algunas personas de TMSSoftware en la sala y ellos nos dieron una pequeña demo del paquete TMS Smooth Control pack,  el cual es un conjunto rico en caracteristicas, de controles de sofisticada apariencia y animación.

Los controles relamente eran impresionantes e inmediatamente me dieron la impresión que se tendría cuando se usa una aplicación de iPhone. Los componente parence lilmpios, bonitos y con muchas animaciones.

Algunos de nosotros, que hemos estado usando iPhone conocemos lo que estoy comentando. Cuando navegamos desde una pagina a otra en la ventana de una aplicación iPhone tu tienes una buena animación en lugar de un simple repintado de la ventana. Bien, los Smooth Controls hicieron exactamente lo mismo sobre Windows. Esto nos dio la misma vista y presentación.

CONCLUSION

Me perdí la primera parte del dia debido al trafico pero llegue a tiempo para la parte del mapa de proyecto de Delphi y debo decir que me parecia impresionante. Han habido días cuando nosotros no sabiamos que esperar de Delphi y alguna gente pensó incluso que los viejos días se acabaron para Delphi. Para algunos de vosotros que todavíadudais acerca del futuro de Delphi… bien… dejarme que os diga:

El futuro de Delphi parece más claro que nunca!.

Nota de la traducción: Pido perdon si la traducción no es completmente literal y si pueden existir alguna que otra errata. Espero, de ser así recibir vuestros comentarios para subsanarlas.

Salvador Jover

Junio 28, 2009

Un pequeño resumen, por favor…

Ayer haciendo pruebas, dejé en la barra lateral, embebido, uno de los iframes de google, del servicio egoogle.books y que contenía una vista parcial de un libro que hablaba de sql server. Concretamente ,de Sql Server 2000 (”SQL Server 2000 Fast Answers for dbas and developers” de Joseph Sack). Y por error, olvide eliminar el frame, por lo que hace un rato he visto con asombro que todavía estaba. :-)

El caso es que estaba viendo que tal quedaba y comprobando si existían libros que hablaran de Delphi o de cualquier otro tema que pudiera ser de interés, y facilitar un acceso desde una entrada, o bien desde la barra lateral. Y sí, existen algunos (bastantes mas recortados que esté que finalmente he dejado y que habla del servidor).

No está de más saberlo, por si en algún momento nos pueden sacar de un apuro.  Pero dado que algunos estan muy recortados y pertenecen a versiones anteriores de Delphi, y tampoco hay demasiados, he desistido en la idea de ir subiendolos al blog (tal y como lo he hecho en la barra lateral). De todas formas, siempre podeis hacer una busqueda dentro de ese servicio para ver si existe alguna vista completa de libros que puedan ayudaros en un determinado momento.

http://books.google.com/books

Creo que hoy se puede percibir un cierto pesimismo en mi estado de ánimo, por un par de comentarios que he dejado en Twibes. No iba a escribir esta entrada pero al final aquí estoy, como muchas noches.

Esta semana que ha acabado ha tenido algunos apuntes interesantes. Mi amigos, con los que comparto correo que habitualmente no tiene nada que ver con la programación, suelen repetir esa frase. Cuando alguien inserta un comentario de esos pesones, que da pereza leer, alguien comenta por lo bajini:

- A ver… ¿un resumen?.

Esta estrategia obliga al que entrega el comentario  tostón a resumirlo en cuatro o cinco palabras, para ver si a alguien le puede interesar… :-)

¡Nos hemos hecho comodos hasta para eso!

Estas son algunas de las referencias que hacía.

Pero quedaron en el tintero, hacer referencia al video de Marco Cantú, dentro de las sesiones que organizó en Delphi Live y que creo que tenían un título similar a “La cara divertida de Delphi”. La sesión transcurre en un ambiente relajado y desenfadado. Y los asistentes, pudieron conocer aspectos de unicode, dentro de un ejemplo que va incrementando en complejidad y que se vale del servicio de igoogle para personalizar títulos y etiquetas. Está en inglés.

http://blog.marcocantu.com/blog/video_fun_side_delphi.html

Tambien os recomiendo que le sigais la pista a los comentarios que va aportando Zarko Gajic. Mas que noticias, lo que aporta son lo que aqui podemos llamar “trucos” con la diferencia de que no se limita a expresar como se hace tal o cual cosa sino que dedica las entradas que hagan falta para explicarlo.

Respecto a los enlaces de velneo que se puede ver en mi pagina, dentro del seguimiento de los  Twitter diarios, ya sabeis que salió la primera “release” de la V7 y que la compañía está volcada en darle vida a esa primera versión. Todavía es muy pronto para tener una visión real y justa de lo que puede aportar esa filosofía.  Fijaos que no digo producto. Los productos se van mejorando y se van haciendo mejores con el tiempo, sobretodo  si la filosofía sobre la que subyacen es buena y solida. Una empresa que no sabe lo que quiere es como un barco sin timon y sin rumbo, a la deriva de las modas y los intereses económicos. Una sola vez he hablado con Alfonso Gutierrez, CEO de Velneo, personalmente, y reconozco que se tiene muy claro cual es la filosofia de Velneo y que esperan de sus productos. Tuve una muy buena impresión durante el transcurso de esa conversación distendida y muy cordial.

En fin, creo que es justo reconocerlo, con independencia de que la V7 sea realmente un punto de partida y no un punto de llegada, que puede ser lo que algunos programadores pueden pensar. Saben qué quieren: Esa es la impresión que siempre he tenido de ellos, como empresa.

Y bueno, ya para acabar, comentar que estoy haciendo un esfuerzo por acercar la comunidad de Delphi de habla inglesa a la nuestra, y no se que tal se está percibiendo esto desde las personas que leen el blog. Me ayudaría saber vuestra opinión. La cantidad de recursos que disponen es muy grande  pero existe el “inconveniente” de que están en inglés y muchos compañeros, como yo mismo, tienen dificultades para seguirlos. Yo me puse las pilas y estoy en ello, mejorando mi inglés, con la única intención de poder ir incorporando estos recursos en el blog. Es uno de los motivos por los que dispongo de menos tiempo para escribir.

Vereis… esta tarde estaba desanimado y lo estaba porque creo que nos faltan recursos en castellano y parece que a todo el mundo le da igual. Veo mucha apatía y eso me desanima en ocasiones. Yo no quiero que vengan a Madrid a venderme un producto… no… lo que quiero es poder sacarle el 200 %. ¿Cuántas publicaciones escritas se han editado de las nuevas versiones (libros, revistas, etc…)? ¿Cuantos nuevos recursos se van sumando y cuantos estan desapareciendo espantados hacia el mundo de punto net de la mano de Visual Studio y similares?. ¿Por qué cada vez los foros y web hispanos son mas escasos mientras crecen exponencialmente las publicaciones de microsoft en castellano de sus productos, de sus MVPs.? etc. etc.

Seguro que mañana veo las cosas de otra forma.

Junio 17, 2009

El mundo en un conjunto…

Los conjuntos son de esos tipos que muchas veces nos pasan desapercibidos. :-)  Se podría incluso decir que pasan sin pena ni gloria. No tienen la importancia de una clase o de un registro. Y se situan dentro del ranking de popularidad entre los Enumerados y los Subrango,  que es casi lo mas bajo que uno puede caer :-)  Al menos siempre tuve esa impresión. :-D

Hablando en serio, ya que hemos acabado las cinco entradas donde todo giraba en torno a pensar en clases, parece que se hacía apropiado comentar algo de los tipos personalizados. Y digo lo de apropiado, porque los tipos personalizados no son imprescindibles puesto que al final los identificadores son representaciones de un valor ordinal. Pero pensar en términos de clases incluye un premisa que hasta ahora habia quedado un poco en el aire, y es simplemente que el código debe ser también lo mas claro posible. Y en eso, sin duda, puede ayudarnos la existencia de los tipos personalizados, tanto enumeraciones, subrangos, conjuntos o registros, (éstos últimos, con un peso mucho mayor lógicamente).

Realmente, ese pensamiento, que mi código sea claro, sencillo, limpio, nos debería acompañar siempre. Nuestra “supervivencia” depende un poco de eso. Nuestros razonamientos deben seguir caminos similares. No supone un rasgo de inteligencia enrevesar nuestro código adrede y hacerlo ilegible incluso para nosotros mismos, (a poco que pasen algunos meses desde que lo escribimos,  puede convertirse involuntariamente en una realidad, y en un momento posterior en una pequeña pesadilla). Y eso, a menudo, pasa mas de lo que quisiéramos. :-)

Y entre algunos de esos “problemas”, de refilón puede haberse colado no haber hecho uso de los tipos personalizados: ¿Métodos que recibían parámetros de tipo Integer y que escondían un tipo personalizado?. Puede ser uno de los ejemplos que me vienen a la mente:

-¡Ahí la cagaste, amigo!-, pensaba para mí…- ¡podías haber utilizado un tipo enumerado!-.

Y así podríamos enumerar muchos mas.  Es cierto que es muy subjetivo pero creo que todos estaremos de acuerdo en que resulta mas legible algo como

function ElUsuarioEligio: TDia;

siendo TDia =(dLunes, dMartes, dMiercoles, dJueves, dViernes))

que

function ElUsuarioEligio: Integer;

Pero empecemos por el principio, y es entender que es una Enumeración: Una enumeración es un tipo ordinal, definido como un conjunto ordenado de valores en el que cada valor tiene un unico antecesor y un unico sucesor, a excepción del primer valor o del último, dado que el primer valor no tiene antecesor y el ultimo carece de sucesor, por definición.

¿No es demasiado intuitiva, no?

Pero es eso: Un conjunto de valores ordenado. No hay mucho mas.

Si tuviéramos que identificar los dias de las semana para poder referirnos a ellos en nuestro código, siempre podríamos apoyarnos en las constantes. Tal que así:

   const
     klunes = 1;
     kmartes = 2;
     kmiercoles = 3;
     kjueves = 4;
     kviernes = 5;
     ksabado=6;
     kdomingo=7

Lo cual puede ser claro, pero no nos seria demasiado útil en algunos casos, ya que no tengo un indice ínterno que me permita recorrer todos los valores y hacer algo para cada día, salvo que me pueda crear también “algo” que haga la misma función, mediante una variable entera y un bucle que recorra los valores desde 1 hasta 7.

Por lo que, resulta natural que el lenguaje me ofrezca la forma de agrupar esos valores en un tipo (enumerado) de forma que dicho tipo pueda representar a cualquiera de ellos. El tipo TDiaSemana se representaría:

TDiaSemana = (seLunes, seMartes, seMiercoles, seJueves, seViernes, seSabado, seDomingo)

Desde ese momento, contando con los tipos enumerados, ya resulta mas fácil en un procedimiento cualquiera hacer uso de un parámetro de tipo TDiaSemana en lugar del mismo de tipo Integer. Ofrece mas claridad al revisar el código y menor posibilidad de errar al invocarlo, evaluando un valor que no se establece en la precondición.

Por defecto, la enumeración se iniciaría en el valor 0 (cero) pero eso tampoco es obligatorio, como podemos observar en el ejemplo que he añadido. Podríamos iniciar la semana en el valor 1, por eso de que es el primer día… :-)

TDiaSemana = (seLunes = 1, seMartes = 2, seMiercoles = 3, seJueves =4 , seViernes = 5, seSabado = 6, seDomingo = 7)

Y ya casi para acabar con los tipos enumerados, al igual que  sucede con los tipos ordinales, disponen de un índice que permite ser recorrido, y existen a nuestra disposición algunas funciones predefinidas que podemos usar para manipularlos dentro de nuestro código:

  • Ord (Valor de una expresión ordinal).
  • Pred (Valor antecesor del citado por la expresión)
  • Succ (Valor sucesor del citado por la expresión)
  • High (Valor máximo que puede tomar el tipo)
  • Low ( Valor mínimo que puede tomar el tipo)

Eso con respecto a los tipos enumerados.

Otro tipo personalizado, es el Subrango, que representa un subconjunto de un tipo ordinal (de cualquiera de ellos). Y se construye mediante un valor minimo y un mayor maximo separados por dos puntos, siendo ese mínimo y ese máximo expresiones de un tipo de valor ordinal. Admite un máximo de 256 valores

TMisFavoritos = seViernes...seDomingo;

Pero bueno… también podemos hacer:

TMiRangoPorcentajes = 0..199;
TAlfabeto = 'a'..'z';

Lo mas habitual es que definamos variables de tipo y, como comentábamos lineas mas arriba, hagamos uso de las funciones predefinidas para movernos por el rango de valores que especifica el tipo.

Y finalmente, llegamos a los conjuntos, que era lo que me movía a iniciar la entrada. Puede ser que fuera porque, pienso yo, al igual que muchos compañeros, si bien usamos habitualmente los tipos enumerados y los subrangos, no lo hacemos con las misma frecuencia que los conjuntos y siempre quedan como mas relegados. Y eso a pesar que los vemos presentes en propiedades de clases tan habituales como la clase TFont, en lla propiedad Style[] . Por citar una de las que me parecen mas intuitivas para citar.

¿Que es un conjunto?

Pues un conjunto es una colección de valores ordinales, con un máximo de 256 elementos (1 byte). Se utliza la sintaxis:

Type
TMiConjunto = Set of TMiTipoOrdinal;

Olvidaba comentar que al admitir el valor nulo como posible valor de dominio, es decir, el conjunto vacío, no tenemos disponibles 256 valores sino 255 distintos de este valor nulo.

En el caso que comentabamos, el de los días de la semana, podríamos establecer un conjunto que representara los días laborables de semana y utilizarlo para indicar que días había trabajado de la misma.

type
   TDiasTrabajo = seLunes..seViernes;
   TMiJornada = Set of TDiasTrabajo;
var
   MiSemana: TMiJornada;
begin
//la variable no contiene ningun elemento
   MiSemana:= [];

Es decir. Esa semana no hemos dado palo al algua… :-)

Estas son las funciones que tenemos disponibles y que podeis ampliar información consultando en la ayuda del entorno: (las pongo en función del ejemplo para que se van mas claras)

Si incluimos un elemento, podemos valernos del operador (+) o de la función Include

MiSalida:= MiSemana + [seLunes];  o bien
Include(MiSemana, seLunes)

Y si deseo excluir un elemento del conjunto, podemos hacer uso del operador (-) o de la función Exclude

MiSalida:= MiSemana - [seLunes];  o bien
Excude(MiSemana, seLunes)

En el caso de los conjuntos, tenemos formas de saber si un elemento pertenece a un conjunto. ¿como?

Muy fácil, haciendo uso del operador (in), que nos permite evaluar en una expresion booleana la pertenencia del elemento.

if (seLunes in MiSemana) then

También, desde Delphi 2005 es posible recorrer los valores que pertenecen a un conjunto haciendo uso de for (ValorOrdinal) in (Conjunto). Lineas mas abajo lo podréis ver.

Bueno… Lo mejor, es que lo veamos en un ejemplo muy sencillo. Vamos a usar una ventana modal para preguntar al usuario que meses va a elegir, suponiendo que este proceso sea parte de otro mas general del que valernos para obtener una consulta (ej: estadísticas de ventas en los meses deseados, etc.). Al cerrar la ventana de dialogo, nos copiará la selección deseada en el listbox, permitiendo que al volver a ser llamada se restablezca la selección anterior.

He intentado que el ejemplo contenga las expresiones mas generales. Esta es la imagen de la ventana modal, que va a ser llamada para que el usuario pueda elegir que meses desea incluirl modulo principal:

Y este es el código que se ejecutará:

unit UMeses;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons;

type
  TMeses = (meEnero = 1,
            meFebrero = 2,
            meMarzo = 3,
            meAbril = 4,
            meMayo = 5,
            meJunio = 6,
            meJulio = 7,
            meAgosto = 8,
            meSeptiembre = 9,
            meOctubre = 10,
            meNoviembre = 11,
            meDiciembre = 12);

  TAnual = Set of TMeses;

  TDialogoMeses = class(TForm)
    grbMeses: TGroupBox;
    chbEnero: TCheckBox;
    chbFebrero: TCheckBox;
    chbMarzo: TCheckBox;
    chbJulio: TCheckBox;
    chbMayo: TCheckBox;
    chbJunio: TCheckBox;
    chbAgosto: TCheckBox;
    chbSeptiembre: TCheckBox;
    chbOctubre: TCheckBox;
    chbAbril: TCheckBox;
    chbNoviembre: TCheckBox;
    chbDiciembre: TCheckBox;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    FSeleccion: TAnual;
    procedure SetSeleccion(const Value: TAnual);
    { Private declarations }
  public
    { Public declarations }
    property Seleccion: TAnual read FSeleccion write SetSeleccion;
  end;

var
  DialogoMeses: TDialogoMeses;

implementation

{$R *.dfm}

procedure TDialogoMeses.FormClose(Sender: TObject; var Action: TCloseAction);
var
  i: Integer;
begin
  for i := 0 to grbMeses.ControlCount - 1 do
     if TCheckBox(grbMeses.Controls[i]).Checked then
       Include(FSeleccion, TMeses(grbMeses.Controls[i].Tag));
end;

procedure TDialogoMeses.FormCreate(Sender: TObject);
begin
  Seleccion:= [];
end;

procedure TDialogoMeses.SetSeleccion(const Value: TAnual);
var
  i: Integer;
begin
  FSeleccion := Value;
  for i := 0 to grbMeses.ControlCount - 1 do
     if TMeses(grbMeses.Controls[i].Tag) in Seleccion then
                 TCheckBox(grbMeses.Controls[i]).Checked:= True;
end;

end.

Como podéis ver es muy sencillo y claro. Creamos el conjunto con un valor vacio y tan solo si es asignado a través de la propiedad Selección, reponemos la elección previa que hizo el usuario.

Y esta es la imagen del formulario principal, donde llamaremos a la ventana modal y recogeremos los valores elegidos:

unit UMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TMain = class(TForm)
    btnsiguiente: TButton;
    lbxSeleccion: TListBox;
    labPaso1: TLabel;
    Label1: TLabel;
    btnCerrar: TButton;
    procedure btnsiguienteClick(Sender: TObject);
    procedure btnCerrarClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Main: TMain;

implementation

uses UMeses;

{$R *.dfm}

procedure TMain.btnCerrarClick(Sender: TObject);
begin
  Close;
end;

procedure TMain.btnsiguienteClick(Sender: TObject);
const
  MESES: array [TMeses] of String = ('Enero',
                                     'Febrero',
                                     'Marzo',
                                     'Abril',
                                     'Mayo',
                                     'Junio',
                                     'Julio',
                                     'Agosto',
                                     'Septiembre',
                                     'Octubre',
                                     'Noviembre',
                                     'Diciembre');
var
  i: Integer;
  fMes: TMeses;
begin
  DialogoMeses:= TDialogoMeses.Create(nil);
  try
    //vamos a restaurar la seleccion previa en la ventana modal
    //y solo lo hacemos si existen items de una seleccion anterior
    if lbxSeleccion.Items.Count > 0 then
      for i := 0 to lbxSeleccion.Items.Count - 1 do
         DialogoMeses.Seleccion:= DialogoMeses.Seleccion +
                               [TMeses(Integer(lbxSeleccion.Items.Objects[i]))];
    //lanzamos la ventana modal
    if DialogoMeses.ShowModal = mrOk then begin
       lbxSeleccion.Clear;
       for fMes in DialogoMeses.Seleccion do begin
            lbxSeleccion.AddItem(MESES[fMes], TObject(fMes));
       end;
    end;
  finally
    FreeAndNil(DialogoMeses);
  end;
end;

end.

Descargar

Tambien hubiera podido ser correcto, en el interior de un bucle mas general que recorriera los valores que puede tomar la variable fMes:

If (fMes in DialogoMeses.Seleccion) then begin
            lbxSeleccion.AddItem(MESES[fMes], TObject(fMes));

Hay un detalle que os puede ser de interes y es el uso de la constante MESES, que permite recuperar el valor literal. Es muy habitual hacer uso de un array de dimensión el Tipo ordinal (en este caso TMeses).

 const
   MESES: array [TMeses] of String

Esta es una imagen del ejemplo en tiempo de ejecución.

Nada mas por hoy. La idea era compartir con vosotros la necesidad de que el código sea lo mas intuitivo posible. Y los tipos personalizados, tanto las enumeraciones, los subrangos o los conjuntos, enriquecen nuestro código aportando información adicional, semántica, que permite lo que hemos escrito sea mas fácil de comprender, tanto para nosotros como para otras personas que lo compartan con nosotros. Ese es, un poco el resumen.

Junio 14, 2009

Lo mas destacado… :-)

Suelo reservar la tarde del domingo, un rato al menos, para hacer un repaso mental de lo que me ha parecido mas interesante a nivel de enlaces durante toda la semana. Quizás, antes -hablo de bastantes meses atrás- dedicaba mas tiempo a buscar paginas nuevas,  o entradas nuevas, si fuera el caso de que fueran conocidas y ya las hubiera incluido en mis enlaces, pero ahora, desde que empecé a incorporar los breves mensajes de Twitter (o Twibes) la situación cambió, y en lugar de mi busqueda tradicional, me he concentrado en seleccionar los comentarios que tuvieran mas interés.

El domingo anterior ya lo hice. Y si os dais cuenta, de no hacerlo así, muchos de esos comentarios pueden llegar a perderse ya que quedaran sepultados por los nuevos mensajes y por desgracia, algo como “voy a pasear al perro” en respuesta de “que es lo que estas haciendo” o “voy a trabajar duramente”, será inevitablemente el ejecutor de que no acaben siendo visibles y se oculten por los siglos de los siglos. Eso si algun dia NO deja de existir ese invento de las url cortas y nos dejan sin una referencia real a la que apuntar (ni forma de acceder) :-)

Huele que hay algo en esta nueva concepción de internet que no me acaba de gustar del todo. Recuerdo cuando en los foros tradicionales, donde recibiamos un correo en respuesta de la pregunta de un compañero, el moderador -yo en las ocasiones en las que lo he sido- era capaz de “recriminar” que un compañero X se fuera por los cerros de ubeda y nos contara su vida. Y eso era así porque los foros, en aquellos momentos, tenían un cariz mas “profesional” o al menos se entendía así. Era otro momento, y entiendase el recriminar, sin connotación negativa puesto que el principal objetivo de aquellos foros era basicamente apoyar al programador en sus tareas cotidianas.

Sin embargo, los años y la necesidad de marcar nuevas directrices y de llamar de otra forma a lo que ya existía, nos han hecho necesitar virtualmente conocer algo mas de los interlocutores y así, podemos llegar a saber que nuestro autor favorito un día se rompió el brazo o detalles mas escatológicos sobre su vida privada (dicho esto entre comillas). :-) Estamos casi obligados a tener un perfil repartido entre el facebock, twitter, los spaces de microsoft, blogger, wordpress, tuenti, etc… para existir en el mundo virtual.

Ya se que me repito. Pero son cosas que nos afectan. La servidumbre de asimilar estas nuevas ideas dentro de los blogs tienen costes adicionales. Yo por ejemplo, pagué ayer con una hora de sueño, cuando a las 2 de la mañana, acabando la entrada del blog y en el momento de hacerla publica, tras varias horas editandola, subiendo al servidor las imagenes, el codigo, revisando los errores… me di cuenta de que no se podía visualizarla. ¿Y por qué razon? Pues porque uno de los complementos o pluggins de wordpress generaba un error e impedía que se cargara correctamente la pagina. Así que me costó una hora descubrir que lo que realmente fallaba era el pluggin y localizarlo para intentar resolver el problema.

Hace poco, no fue una hora sino una tarde y por otro motivo similar…

Todo no es malo. No. Muchos de los mensajes contienen referencias a entradas que posiblemente nos pasarían inadvertidas, no porque no tuvieran importancia sino porque uno al final visita las paginas que conoce y dificilmente sale de su entorno.

Podriamos llamar a esta sección “And the winner is…”. Esta semana me quedo con la entrada http://alex.ciobanu.org/?p=232 de  Alexandru Ciobanu, en la que abordaba la posibilidad de extender la instancia de TObject y referenciar a una estructura o a otro objeto, que pueda tener un sentido dentro del dominio de nuestra aplicación.

Y me he decantado por esta (habia otra que hacia referencia al futuro de Delphi http://www.theregister.co.uk/2009/06/12/embarcadero_codegear_tools_future/) porque me ha permitido descubrir algunos detalles que desconocía.

* Que el tamaño en bytes de las instancias de TObject, fue modificado en Delphi 2009, pasando a 8 bytes en lugar de los 4 tradicionales. Sobre este punto encontre un artículo que introducía muy bien el tema y lo explicaba, y de paso, me permitía conocer la existencia de un puntero escondido a una nueva instancia de la clase TMonitor (que supuestamente era un tipo clase para sincronizar y facilitar los accesos concurrentes de los hilos de ejecución). O al menos entendí algo similar.

Así que una entrada me llevó a la otra: http://blogs.teamb.com/craigstuntz/2009/03/25/38138/ (Craig Stuntz) donde la información era mucho mas detallada sobre este punto, que habia levantado preguntas en algunos foros sobre el paso de 4 bytes a 8. (http://stackoverflow.com/questions/679022/what-data-does-a-tobject-contain)

Y tambien accidentalmente descubrí al hilo de todas estas investigaciones de sabueso, algunas entradas que comentaban aspectos de la VMT (la tabla de métodos virtuales)

Un del año 2000:  http://oreilly.com/catalog/delphi/chapter/ch02.html

y otra mas actual, que contiene unas imagenes muy directas para comprender que es lo que realmente está sucediendo al instaciarse TObject, entre bastidores.

http://pages.cs.wisc.edu/~rkennedy/vmt

Nada más.

Que tengais una buena semana.

:-)

Entradas más antiguas »

174 queries. 1,341 seconds. Gestionado con WordPress

(c)2003 Salvador Jover
2003 / 2009






Virgén del Pilar

Free counter and web stats