ene 072013
 

Buenas

Seguro que en alguna ocasión hemos tenido que controlar el tiempo que tarda en realizarse algún trozo de código o proceso, y seguro que para ello se ha recurrido a la función Now (definida en la unidad SysUtils) o a la función del API de Windows GetTickCount. Otra opción es crearnos una unit que contenga la clase expuesta por Zarko en uno de sus artículos de delphi.about.com (ver How to Accurately Measure Elapsed Time Using High-Resolution Performance Counter).

Continue reading »

dic 282012
 

Buenas,

Los que tengan nociones de POO (Programación Orientada a Objetos) sabrán perfectamente cómo añadir funcionalidades a una clase creando una nueva.

Por ejemplo, imaginemos que tenemos la clase TMyClass definida de la siguiente manera:

type
  TMyClass = class
    procedure MyProc;
    function MyFunc: Integer;
  end;
....
procedure TForm1.Button1Click(Sender: TObject);
var
  C1: TMyClass;
begin
  C1 := TMyClass.Create;
  C1.MyProc;
  C1.MyFunc;
  C1.Free;
end;

Si queremos añadir funcionalidad a esta clase, lo primero que se nos puede venir a la cabeza es la herencia, es decir, crear una nueva clase que contenga las nuevas funcionalidades o especializaciones, quedando como ésto:

  TMyCustomClass = class(TMyClass)
    procedure AnotherProc;
  end;
.....
procedure TForm1.Button1Click(Sender: TObject);
var
  C1: TMyCustomClass;
begin
  C1 := TMyCustomClass.Create;
  C1.MyProc;
  C1.MyFunc;
  C1.AnotherProc; // <- hacemos uso del nuevo método
  C1.Free;
end;

El «inconveniente» de hacerlo así es que, como vemos, si queremos usar el método AnotherProc tendremos que crear un objeto de tipo TMyCustomClass. Pero, ¿qué pasa si tenemos un proyecto que hace uso masivo de TMyClass? En ese caso tendríamos que cambiar todas las referencias de TMyClass por TMyCustomClass, y eso podría ser un trabajo tedioso, y más si lo que queremos es ampliar la clase, no especializarla.

Para ese menester, Delphi (de echo la POO) nos brinda con las Helper Class (también aplicable a los records). Una Helper Class es una clase que, asociada a otra clase, añade nuevos métodos o propiedades a la clase asociada y que pueden ser usados por ésta. Es una forma de expandir una clase sin necesidad de herencia.

La sintaxis de las Helper Class es la siguiente:

type
   identifierName = class|record helper [(ancestor list)] for TypeIdentifierName
     memberList
   end;

La implementación para nuestro ejemplo sería así:

type
  TMyHelperClass = class helper for TMyClass
    procedure AnotherProc;
  end;
.......
procedure TForm1.Button1Click(Sender: TObject);
var
  C1: TMyClass; // <- objeto de la clase base....
begin
  C1 := TMyCustomClass.Create;
  C1.MyProc;
  C1.MyFunc;
  C1.AnotherProc; // <- ... pero que puede usar el nuevo método
  C1.Free;
end;

Para más información podéis consultar la docwiki de Embarcadero sobre este tema en Class and Record Helpers (Delphi).

Nos leemos

nov 242012
 

Stack Exchange Q&A site proposal: Stack Overflow in Spanish Buenas a todos

Ya os he hablado en otras ocasiones sobre esta propuesta del amigo Juan Antonio (aquí y aquí). Pues bien, me complace deciros que la propuesta ha alcanzado una nueva fase, la de compromiso.

Como siempre, el amigo Juan Antonio, en su blog, hace una entrada explicando todo muy bien. ¡¡Hasta yo lo he entendido!! jejeje

Os animo a que leáis la entrada de Juan Antonio, pero sobre todo os animo a comprometeros con el proyecto de StackOwerflow en español.

Sigamos pasando la voz y haciendo llegar la propuesta a cuantos más mejor para que pronto la tengamos en fase beta 🙂

Hasta la próxima entrada.

Nos leemos

 

nov 122012
 

Buenas,

Varios usuarios de la comunidad Delphi me han comentado a ver si existiría la posibilidad de hacer compatible la GMLib con FireMonkey. Recordemos que la GMLib es un conjunto de componentes para Delphi/C++ Builder que encapsulan el API de Google Maps y que necesitan de un navegador para poder mostrar los resultados de las acciones que quiere realizar el usuario. Dado que Delphi sólo trae un navegador (el TWebBrowser), los componentes dependen de él. El problema es que el TWebBrowser sólo está para el framework de la VCL.

Queriendo dar solución a esta parte de la comunidad Delphi y comentando con ellos la necesidad de tener un navegador compatible con FMX, nos «topamos» con los componentes DCEF (Delphi Chromium Embedded Framework), un navegador que encapsula Chrome y que es compatible con los dos frameworks de Delphi, la VCL y FMX (aunque con matices como ahora veremos).

Hay que decir algunas cosas de este navegador. Existen dos versiones, la DCEF1 y la DCEF3, cada una con sus peculiaridades que tendremos que tener en cuenta si queremos usarlos.

DCEF1

Es la primera versión que se ha hecho de estos componentes. Parece una versión que no tendrá más cambios, pero según el autor no es una versión congelada.

Esta versión compila hasta XE2, tanto para VCL como para FireMonkey, pero no lo hace en XE3, al menos el paquete que podemos descargarnos desde su web. Digo ésto porque en los grupos de los componentes he visto una solución para hacerlo compatible con XE3, tanto para VCL como para FireMonkey.

DCEF3

Es la segunda y actual versión de los componentes (no he visto que exista una DCEF2). De momento no tiene todas las características de DCEF1, pero poco a poco se van añadiendo. Esta versión compila hasta XE3, sin embargo no es compatible con FireMonkey, es exclusivamente VCL. Esto es importante saberlo porque si lo que queremos es hacer aplicaciones FireMonkey tenemos que decantarnos sí o sí por DCEF1.

Aparte de lo comentado de cada una de las versiones de TChromium, decir que no existe una versión Win64 para ninguna de las versiones, aunque no porque el autor de los componentes no haya querido, sino porque para Windows aun no hay versión 64 bits de Chrome.

Para terminar los comentarios sobre DCEF, quiero dejar algunos enlaces de interés sobre los mismos:

Con lo que respecta a la GMLib, decir que se hará compatible con la versión DCEF1 dado que es, hasta la fecha, la única versión compatible con FireMonkey. Espero tener pronto preparada esta nueva versión, mientras tanto, a seguir con la VCL jejeje.

Nos leemos

oct 052012
 

Buenas,

Me ha alegrado la noticia de ver que dos sets de componentes opensource con más recorrido en el mundo Delphi como son la JVCL y la ZeosLib han vuelto a cobrar vida.

JVCL Jedi Por lo que a la JVCL respecta, dado que ni en el changelog que acompaña el paquete ni en la web oficial dicen nada de esta nueva versión, entiendo que no trae novedad alguna, «simplemente» se han dedicado a hacerlo compatible con las nuevas versiones de Delphi/C++ Builder.

ZeosLib En cuanto a las Zeos, si bien es cierto que hace pocas horas que ha sido liberada esta nueva versión, en su web oficial tampoco se hace mención a los cambios que pueda llevar. No obstante, en el paquete que nos podemos descargar, en la carpeta doc, sí que tenemos (en formato pdf y html) un listado de las nuevas mejoras. Os invito que le deis un vistazo a las mismas.


Ya puestos, también me gustaría compartir con vosotros una serie de enlaces que puso nuestro compañero Salvador Jover.

Para terminar, decir que nuestro compañero Luis Felipe ha empezado una serie de artículos que hablarán de DataSnap en XE3. El primero es DataSnap: Introducción y ejemplo simple. Documento en Español y Video.

No puedo terminar la entrada sin felicitar a nuestro compañero Juan Antonio (jachguate) por la labor que está realizando traduciendo al castellano el libro Programación paralela con OmniThreadLibrary, el libro.

Ahora sí que ya me despido hasta la próxima.

Nos leemos

oct 052012
 

Buenas,

Hoy liberamos una nueva versión de los componentes GMLib para Delphi/C++Builder. No hay muchos cambios «visibles», pero sí cambios internos y un nuevo componente (y cada vez quedan menos para terminar 🙂 ).

Aquí la lista de cambios:

  • nuevo: compilado para Delphi/C++Buildes XE3.
  • nuevo: nuevo componente TGMElevation para el cálculo de elevaciones de terreno entre diferentes puntos.
  • error: general -> corregidos todos los memory leack encontrados.
  • error: TGMDirection -> no disparaba el evento OnDirectionsChanged.
  • cambio: TBasePolyline -> las clases TLinePoints y TLinePoint se desvinculan de TPolyline y se traspasan a la unit GMClasses.
  • cambio: TBasePolyline -> implementa la interfaz ILinePoint

Como siempre, podéis ver más explicaciones y descargar los componentes en su página.

Qué los disfrutéis!

Nos leemos

sep 182012
 

Stack Exchange Q&A site proposal: Stack Overflow in Spanish Buenas,

Hace poco más de un mes hice una entrada referente a una propuesta realizada por nuestro compañero Juan Antonio (o jachguate como se hace llamar en la red) en el Area51 para la creación de un StackOverflow en español. Para que no sea una propuesta que caiga en saco roto, hoy vuelvo a escribir sobre ella y animar a la gente que se una a la propuesta.

Vamos a ver qué tal anda el proyecto a estas alturas. Las normas de Area51 dicen que, para que un proyecto supere el estatus de definicion, éste deve cumplir unos requisitos:

  1. Tener 60 seguidores: a fecha de hoy estamos en 71, así que esta meta está superada (en principio, luego veremos que aun faltan).
  2. Tener 40 preguntas de ejemplo con al menos 10 votos netos cada una (un voto neto es la suma entre votos positivos y negativos):  aquí es donde andamos cojos dado que sólo tenemos 14 preguntas que cumplan con esta condición.

Dado que necesitamos 40 (o más) preguntas con 10 votos (ésto es un mínimo de 400 votos) y cada seguidor puede votas a 5 preguntas, esto implica que necesitamos al menos 80 seguidores. Dado que hay preguntas que tienen más de 10 votos, necesitamos más de 80 segudores.

A los que estéis interesados en el proyecto tenéis que tener esto presente, necesitamos preguntas con 10 votos, pero no hace falta que tengan más de 10! Así que votar por las preguntas que tengan menos de 10 votos 😉

Además, y dado que tenemos 71 seguidores, se podrían haber emitido 355 votos. Si asumimos que no hay votos negativos (que sería lo lógico en este caso) y que se han realizado 172 votos, tenemos a unos 36 seguidores que no han votado ninguna pregunta. Animo a éstos a hacerlo 🙂

Vamos, que ya queda poco para superar esta primera fase!

Nos leemos

sep 122012
 

Buenas,

Estoy aquí de nuevo con otra versión de los componentes GMLib para Delphi/C++ Builder. En esta ocasión no tenemos nuevo componentes (es lo que tiene venir de vacaciones jejejeje), pero al menos he puesto al día los existentes con las nuevas características de la API de Google Maps y les he añadido alguna que otra mejora.

También he incluido un par de librerías OpenSource, la MarkerWithLabel y la StyledMarker. No descarto que en próximas versiones se incluya alguna otra de estas magníficas librerías.

Aquí la lista de cambios:

  • error: algún memory leak corregido (aun queda alguno que miraré de ir corrigiendo) (gracias Donovan)
  • cambio: TGMCircle -> modificados métodos Set y ShowElement para que usen el nuevo método ChangeProperties heredado de TLinkedComponent
  • cambio: GMFunctions -> añadidas nuevas funciones de transformación de tipos
  • cambio: TGMGeoCode-> añadida propiedad booleana PaintMarkerFound. A true se generarán automáticamente los marcadores (si hay un TGMMarker asociado) (por Luis Joaquin Sencion)
  • cambio: TGMGeoCode-> en DoMarkers se codifica la URL generada en UTF8 para evitar problemas con carácteres especiales (ñ, acentos, ….)
  • cambio: TGMMap.TNonVisualProp -> añadida propiedad MapMaker. A true si queremos que los mosaicos de Map Marker se muestren en lugar de los normales
  • cambio: TLatLngEvent -> los eventos de este tipo ahora reciben un nuevo parámetro, X y Y, de tipo Real, con la información del punto (X,Y)
  • cambio: TLinkedComponent -> añadida propiedad booleana ShowInfoWinMouseOver. A true, se mostrará el InfoWindows mientras el ratón esté encima del objeto. Actualmente válido sólo para TMarker (por Luis Joaquin Sencion).
  • cambio: TLinkedComponent -> añadido método protegido ChangeProperties para centralizar en un sólo sitio el cambio de las propiedades de los objectos.
  • cambio: TGMMarker -> modificados métodos Set y ShowElement para que usen el nuevo método ChangeProperties heredado de TLinkedComponent
  • cambio: suprimida clase TMarkerLatLng. Ahora se usa directamente la clase TLatLng
  • cambio: TMarker -> la pripiedad Position ahora es de tipo TLatLng.
  • cambio: TMarker -> añadida propiedad MarkerType para especificar el tipo de marcador a mostrar (mtStandard, mtColored, mtStyledMarker).
  • cambio: TMarker -> añadida propiedad ColoredMarker para especificar la forma del marcador si MarkerType = mtColored.
  • cambio: TMarker -> añadida propiedad StyledMarker para especificar la forma del marcador si MarkerType = mtStyledMarker.
  • cambio: TGMMarker -> añadido método público LoadFromCSV para una carga masiva de marcadores que estén en un archivo CSV (unos 50 marcadores/seg.).
  • cambio: TGMMarker-> 4 nuevos eventos: OnLoadFile y AfterLoadFile para el procesado del fichero CSV, y OnColoredMarkerChange y OnStyledMarkerChange para el cambio de las propiedades
  • cambio: TGMPolygon -> modificados métodos Set y ShowElement para que usen el nuevo método ChangeProperties heredado de TLinkedComponent
  • cambio: creada clase intermedia (TBasePolyline) entre TLinkedComponent y TPolyline. TPolygon desciende ahora de TBasePolyline.
  • cambio: creada clase intermedia (TGMBasePolyline) entre TGMLinkedComponent y TGMPolyline. TGMPolygon desciende ahora de TGMBasePolyline.
  • cambio: TGMPolyline -> modificados métodos Set y ShowElement para que usen el nuevo método ChangeProperties heredado de TLinkedComponent
  • cambio: TPolyline -> nueva propiedad Icon para definir el tipo de linea de la polilinea.
  • cambio: TGMRectangle -> modificados métodos Set y ShowElement para que usen el nuevo método ChangeProperties heredado de TLinkedComponent

Como siempre, podéis ver más explicaciones y descargar los componentes en su página.

Qué los disfrutéis!

Nos leemos

ago 222012
 

Buenas,

Salgo de mi letargo solamente para daros esta noticia. Imagino que ya la habréis visto en algunos foros/blogs, pero quizás lo que no habéis visto es el vídeo introductorio de las novedades, así que aquí os lo dejo (lo puso el compañero fredycc en DelphiAccess).

También os dejo un enlace a todas las fechas del RAD Studio XE3 World Tour, así como al formulario para incribirse a las que se realizan en España (yo espero ir, así que, a ver si nos vemos).

Nos leemos (o vemos) pronto 😉

ago 142012
 

Buenas,

Hace ya algún tiempo que quería poner esta entrada, pero como ando liado con el tema de la GMLib, lo había estado dejando de lado hasta hoy.

Aun recuerdo cuando, programando en versiones antiguas de Delphi (Delphi 3, 6 y 7), para saber ciertas carpetas de sistema tenías que recurrir al API de Windows, o al manipular carpetas, esas típicas funciones recursivas recorriendolas para listar o saber archivos,….

A partir de Delphi 2010, en el que Embarcadero incluyó la nueva unit IOUtils, estos «dolores de cabeza» terminaron y todas estas funciones que teníamos almacenados en units de «funciones generales» pasan a una mejor vida.

Esta unit tiene tres clases, la TDirectory, la TPath y la TFile, todas ellas repletas de procedimientos y funciones de clase, por lo que no necesitaremos instanciar ningún objeto, facilitándonos, aun más, la programación.

Por ejemplo, si queremos saber la carpeta temporal de Windows, simplemente haremos lo siguiente

uses System.IOUtils;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(TPath.GetTempPath);
end;

O si queremos saber los archivos contenidos en una carpeta

uses System.IOUtils, System.Types;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  Files: TStringDynArray;
begin
  Files := TDirectory.GetFiles('C:\Archivos de programa\Embarcadero\RAD Studio\7.0', '*.*', TSearchOption.soAllDirectories);

  Memo1.Lines.Clear;
  for i := Low(Files) to High(Files) do
    Memo1.Lines.Add(Files[i]);
end;

O si queremos saber la fecha/hora de creación de un fichero

uses System.IOUtils;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(DateTimeToStr(TFile.GetCreationTime('c:\prueba.txt')));
end;

Y así podríamos seguir con cantidad de procedimientos/funciones que nos harán la vida (al menos la de programador) más simple.

Os animo a que reviséis el código fuente de esta unit por dos principales motivos. El primero y fundamental es el de conocer qué hace internamente, qué APIs se lleman,…. Y el segundo para que veáis algunas técnicas de programación que quizás algunos desconozcan (yo el primero hasta que lo vi aquí) como la «referencia a funciones» (ver, por ejemplo, la función «class function TDirectory.DoGetFiles«).

Pues nada, espero que os sea de utilidad.

Nos leemos