ago 082012
 

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

Buenas,

Leo en el blog del compañero Neftalí, que otro compañero, jachguate (o Juan Antonio para los colegas jejeje) ha abierto una propuesta en Area51 para crear un StackOverflow en Español.

La verdad es que me parece de lo más interesante para la comunidad hispana y en especial para todos aquellos que el nivel de inglés nos impide hacer uso extensivo de comunidades como stackoverflow.com.

Como dice el compañero Juan Antonio, si no sabes de qué te estoy hablando, te invito a leer esta entrada en su blog, donde lo explica todo, todo y todo 😉

Pasa la voz!!

Nos leemos

ago 072012
 

Buenas,

Antes de bajar la persiana por vacaciones, quiero presentaros una nueva versión de los componentes GMLib para Delphi. Hay bastantes novedades (sobretodo en el mapa al que se le han añadido varias capas -layers-) y un nuevo componente, el TGMDirections. Aquí la lista de las novedades:

  • Nuevo componente, el TGMDirection, para el cálculo de rutas. Dado que es un componente complejo (por el volumen de clases que intervienen -20 clases nuevas-), agradecería comentarios de funcionalidad.
  • Cambio: se translada a la clase base la función GetConvertedString.
  • Nuevo: TGMObjects -> nueva clase que hereda de TGMBase y de la que heredarán clases como TGMLinkedComponent o TGMDirection
  • Nuevo: TGMMaps -> añadida propiedad Layers para el acceso a las capas (layers) de Google Maps como:
    • Panoramio (clase TPanoramio)
    • Traffic (clase TTraffic)
    • Transit (clase TTransit)
    • Bicyclig (clase TBicycling)
    • Weather (clase TWeather)
  • Nuevo: TGMMaps -> añadidos eventos OnWeatherClick y FOnPanoramioClick.
  • Cambio: TGMMaps -> se cambian los métodos xxToStr y StrToxxx para reducir código.
  • Cambio: TGMMaps -> los métodos Printxxxx y SaveToJPGFile usan los métodos de la unidad WebControls.
  • Error: TGMPolyline -> corregido error cuando se intentaba mostrar una polilineasin TLinePoints.
  • Nuevo: Lang -> añadido el idioma francés (gracias Stéphane).
  • Nuevo: TWebControl -> Se añade método SaveToJPGFile.
  • Nuevo: TSizeable -> añadido método Assign.
  • Error: TSizeable -> cuando no era circular, el radio crecía más que el máximo.
  • Nuevo: TAddressComponent -> añadido método Assign.
  • Nuevo: TAddressComponentsList -> añadido método Assign.
  • Nuevo: TGeometry -> añadido método Assign.
  • Nuevo: TGeoResult -> añadido método Assign.
  • Nuevo: TGoogleBusiness -> añadido método Assign.
  • Nuevo: TGMGeoCode -> se sobreescribe el método Notification para controlar la propiedad Marker.
  • Cambio: TGMGeoCode -> se trasladan los métodos xxToStr y StrToxxx a la clase TTransform de la unidad GMFunctions.
  • Nuevo: TGMGeoCode -> añadido método Assign.
  • Nuevo: TTransform -> nueva clase con transformaciones xxxToStr y StrToxxx para transformar las propiedades tipo Set a string y de string a la propiedad tipo Set.
  • Nuevo: General -> el proyecto se ha dividido en 2 packages para poder compilar en 64 bits en XE2.
  • Nuevo: General -> Compilado para Delphi 2009 y C++ XE2

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

Qué los disfrutéis!

Nos leemos

jul 122012
 

Buenas,

Pues nada, ya estamos aquí con una nueva versón de la GMLib. Esta nueva versión viene con bastantes cambios y, como no, con un componente nuevo. Aquí tenéis la relación de las novedades:

  • Nuevo componente, el TGMGeoCode, para poder realizar Geocodificaciones (pasar de una dirección a una lat/lng o de una lat/lng a una dirección).
  • Error:  TGMBaseInfoWindow -> la función GetConvertedString ahora tiene en cuenta la comilla simple.
  • Cambio: TGMCircle -> la propiedad Radius pasa a ser un entero.
  • Nuevo: TGMCircle -> añadida propiedad AutoResize.
  • Error: TLatLng -> corregido error en la función LatLngToStr (gracias Erasmo).
  • Cambio: TLatLng -> se controla la posible excepción en la función StringToReal (cambio de string a real).
  • Cambio: TLatLngBounds -> se suprime la función GetCenter.
  • Error: TGMMarker -> se controlan la comilla simple en la propiedad Title.
  • Nuevo: TGMPolyline -> añadida propiedad CountLinePoints.
  • Nuevo: TLinePoint -> añadido método ToStr.
  • Nuevo: TLinePoint -> añadida método StringToReal.
  • Nuevo: TRectangle -> añadido método GetCenter.
  • Nuevo: TGMMap -> añadidos eventos OnActiveChange, OnIntervalEventsChange y OnPrecisionChange.
  • Error: TGMMap -> corregido error en RemoveLinkedComponent cuando se intentaba suprimir un objeto sin estar la lista creada.
  • Cambio: TGMMap -> se controlan los métodos Set de las propiedades Zoom y MapType para actualizar el mapa automáticamente.
  • Cambio: TGMMap -> Zoom, MaxZoom y MinZoom se limitan al rango de 0 a 15
  • Nuevo: TLinkedComponent -> se añade la propiedad Text (visible a todos sus descendientes menos a TMarker porque ya tiene la propiedad Title).
  • Nuevo: TGMLinkedComponent -> añadida propiedad Count.
  • Error: cuando había figuras de diferentes tipos juntas o superpuestas, daba un error de JavaScript al pasar el ratón sobre ellas (gracias Erasmo).
  • Nuevo: mega demo que incluye la gestión de todos los componentes.

Como siempre, más información en la página de los componentes.

Qué los disfrutéis

Nos leemos

jun 262012
 

Buenas,

Siguiendo con los GMLib, hoy os traigo la versión 0.1.4 Pre-Alpha, con los siguientes cambios y novedades:

  • Nuevo componente, el TCircle. Con este componente ya terminamos con las figuras.
  • Nuevo: se ha ampliado la funcionalidad del TGMMap haciéndolo imprimible mediante los métodos PrintNoDialog, PrintWithDialog, PrintPreview y PrintPageSetup, y también la posibilidad de guardar el mapa a un JPG mediante el método SaveToJPGFile.
  • Cambio: cambios en el JavaScript del mapa para evitar duplicidad de código.
  • Error: corregido error en el método LatLngToStr de la clase TLatLng (gracias Shaun)

Como siempre, más información en la página de los componentes.

Que los disfrutéis

Nos leemos

jun 212012
 

Buenas,

Hoy os traigo una nueva versión de los componentes GMLib, la versión 0.1.3 Pre-Alpha, con bastantes cambios internos y novedades:

  • Nuevo componente, el TRectangle que, como su nombre indica, no es más que un rectángulo.
  • Cambio: se ha cambiado la carpeta destino de los DCU. Ahora, cada versión de Delphi tiene la suya.
  • Nuevo: se ha añadido el evento OnChange en la clase TLatLng.
  • Nuevo: se ha añadido el método público StringToReal en la clase TLatLng. Este método tiene en cuenta la configuración regional en el momento de hacer el cambio. Con esta función se intenta corregir los problemas que había entre los países con diferente configuración regional.
  • Nuevo: se ha añadido el método GetCenter en la clase TLatLngBounds.
  • Cambio: se han publicado las propiedades NE y SW de la clase TLatLngBounds.
  • Nuevo: se ha añadido la propiedad Tag (entero) a la clase TLinkedComponent (por lo que afecta a todos los CollectionItems heredados de la misma como TMarker, TPolygon,….).
  • Nuevo: se ha añadido la propiedad FObject (TObject) a la clase TLinkedComponent.
  • Nuevo: se han añadido métodos protegidos (SetProperty) en la clase TLinkedComponent para generalizar el cambio de las propiedades y evitar la duplicidad de código.
  • Nuevo: se ha añadido la propiedad Icon al TMarker para poder especificar un icono a mostrar (en lugar del estándar). Éste puede ser un archivo en el PC o una imagen en la web. El componente lo que hace es comprobar si existe el dato especificado como archivo y, en caso de no existir, asume que es una URL (no me he complicado mucho la vida en hacer muchas comprobaciones). En blanco para la imagen por defecto.
  • Nuevo: se ha añadido el evento OnIconChange a la clase TGMMarker.
  • Cambio: se han cambiado todos los métodos Set de las clases descendientes de TLinkedComponent para evitar la duplicidad de código y hacer las llamadas a los nuevos métodos de TLinkedComponent (SetProperty).

Como siempre, más información en la página de los componentes.

Que los disfrutéis

Nos leemos

may 292012
 

Buenas,

Sigo con las nuevas actualizaciones de los componentes, hoy presentando la 0.1.2 Pre-Alpha. Las novedades de esta nueva versión son las siguientes:

  • Un nuevo componente, el TGMPolygon. Éste es como el TGMPolyline pero con la particularidad que el último punto se unirá con el primero.
  • Bug: corregido error en TGMMarker que hacía que al cambiar alguna de sus propiedades diera un error de JavaScript.
  • Cambio: cuando cambia la lat/lng de un TLinePoint, se actualiza en el mapa.
  • Bug: implementado SetPath en JavaScript.

Como siempre, más información en la página de los componentes.

Que los disfrutéis

Nos leemos

 

abr 162012
 

Buenas,

Hoy vengo a presentaros una nueva versión (la 0.1.1 Pre-Alpha) de los componentes GMLib. Las novedades de esta nueva versión son las siguientes:

  • Un nuevo componente, el TGMPolyline, para la creación de polilineas (una polilinea es un conjunto de puntos unidos entre sí mediante líneas).
  • Corrección de algún bug encontrado.
  • Se le ha añadido la propiedad AutoOpen a la clase TInfoWindow.
  • Se ha añadido el evento OnPositionChange a la clase TInfoWindow.
  • Muchos cambios en el JavaScript para hacer las funciones más genéricas.
  • Se ha añadido el método Clear a la clase base TGMLinkedComponent.
  • Se ha añadido el método Assign a la clase base TGMLinkedComponent.
  • Se ha añadido el método Clear en la clase base TLinkedComponents.
  • Se ha cambiado las referencias a la API de Google Maps al nuevo dominio.
  • Cuando se cambia la lat/lng de un marcador, se cambia automáticamente en el mapa.
  • Se ha añadido el método Assign en la clase TGMSize.

Podéis encontrar más explicaciones en la página de los componentes.

Espero que os sea de utilidad

Nos leemos

 

mar 202012
 

Buenas,

A raíz de los diferentes artículos hechos sobre el uso de la API de Google Maps desde aplicaciones Delphi, se me ocurrió el realizar una serie de componentes que encapsularan dicho funcionamiento y hacer más fácil la vida al programador.

De momento os presento los tres primeros componentes:

  • TGMMaps: componente que diseña el mapa plano, sin objetos, sólo con lo necesario para visualizar una zona y desplazarte por la misma (zoom, scroll, ……). También es el que gestiona la comunicación con el mapa a nivel de eventos y/o cambio de cualquier tipo de propiedad/objeto del mapa. A su vez, mantiene un TList con todo objeto que se linca a él y que represente algún tipo de objeto en el mapa (marcadores, ventanas de información, lineas, polilíneas, rectángulos,……).
  • TGMMarker: componente que mantiene una relación de marcadores (clase TMarker) mediante una TCollection (TMarkers).
  • TGMInfoWindow: componente que mantiene una relación de ventanas de información o balloons (clase TInfoWindow) mediante una TCollection (TInfoWindows).

El próximo componente será el TGMPolyline, para gestionar las polilíneas.

He creado una página específica de estos componente donde se explica el funcionamiento, sus propiedades y métodos y desde donde podréis descargar los fuentes y demos.

Espero que os sean de utilidad

Nos leemos

ene 052012
 

Buenas,

Hace un par de años, cuando empezó la serie de Hispania la Leyenda, me aficioné a ella. No es que sea una serie americana, pero al menos explica algo sobre nuestra historia (puede ceñirse más o menos a la historia real, pero algo es algo jejejeje).

De esta serie, A3 sacó un juego, Hispania el Juego, al cual gracias a la serie me aficioné y he estado jugando en mis tiempos libres estos últimos meses.

Pues bien, hace ya un tiempecillo hice un par de programas. El primero que hice fue éste, un compactador para poder mostrar «decentemente» las batallas y los ejércitos de los jugadores en foros o en mensajes.

Es sencillo, pero funciona, que es lo que cuenta jejejeje

Como es de costumbre en mi y ahora que está estable y «terminado», pongo a disposición de todos los fuentes del mismo. También está disponible los binarios para aquellos que no precisen de los fuentes.

Un par de capturas del programa

Nos leemos

nov 102011
 

Buenas,

Haciendo unos componentes (que a la que estén algo visibles publicaré), me encontré con la necesidad de tener que hacer algo como tienen los TStatusBar con sus paneles o los TDBGrid con sus columnas, es decir, quería tener una propiedad en que pudiera crear objetos del mismo tipo.

Pregunté en mi foro preferido, delphiaccess al respecto y el buen amigo Héctor me abrió los ojos. La solución a mis problemas era la clase TCollection. Marteens explica muy bien su uso en este trick, así que aquí sólo voy a dar 2 pinceladas.

La clase TCollection

Una característica importante de la clase es que deriva de TPersistent, con lo que no está oblidaga a tener un propietario o owner. Por esta razón, cuando derivamos de TCollection tenemos la obligación de redefinir el método GetOwner que en TPersistent devuelve un simple nil y no está redefinido en TCollection.

Una alternativa al problema anterior es derivar de TOwnedCollection, la cual ya se encarga de redefinir ese método (de hecho es lo único que hace).

A parte de este detalle, no se necesita hacer nada más en la clase que derivemos de TCollection (si no lo necesitamos, claro).

Personalizando TCollection

Los objetos que «guarda» TCollection son o tienen que derivar de TCollectionItem. A su vez, TCollection tiene una propiedad Items para devolvernos un elemento de los que contiene. No obstante, no tiene propiedad por defecto y, claro está, Items devuelve un TCollectionItem.

Estos dos detalles hacen o obligan al programador a tener que estar referenciando la propiedad Items cada vez y a tener que usar la conversión de tipos contínuamente, por lo que es aconsejable ocultar la antigua propiedad Items. Sería algo así:

  TMyCollection = class(TCollection)
  private
    function GetItems(I: Integer): TMarker;
    procedure SetItems(I: Integer; const Value: TMarker);
  public
    property Items[I: Integer]: TMarker read GetItems write SetItems; default;
  end;

implementation

function TMyCollection.GetItems(I: Integer): TMarker;
begin
  Result := TMyCollectionItem(inherited Items[I]);
end;

procedure TMyCollection.SetItems(I: Integer; const Value: TMarker);
begin
  inherited SetItem(I, Value);
end;

Con este sencillo código facilitaremos en mucho el trabajo al programador que use nuestro componente.

La clase TCollectionItem

Cómo he comentado más arriba, los objetos que almacena TCollection tienen que ser o derivar de la clase TCollectionItem. En ésta le pondremos las propiedades, métodos y eventos que necesite nuestro objeto y que podrán ser retocados en tiempo de diseño (en el caso de las propiedades published).

Cuando se hereda de esta clase, suele ser buena costumbre añadir a la nueva clase alguna propiedad de tipo string (Name, Caption, Title,… decirla cómo queráis) que nos sirva para ayudar al inspector de objetos a mostrar un nombre coherente o con sentido a simple vista. Para ello tendremos que redefinir el método GetDisplayName haciendo algo así:

  TMyCollectionItem = class(TCollectionItem)
  private
    FTitle: string;
  protected
    function GetDisplayName: String; override;
  published
    property Title: string read FTitle write FTitle;
  end;

implementation

function TMyCollectionItem.GetDisplayName: String;
begin
  if Length(Title) > 0 then
  begin
    if Length(Title) > 15 then Result := Copy(Title, 0, 12) + '...'
    else Result := Title
  end
  else
    Result := inherited GetDisplayName;
end;

Y la última cosa obligada a la que estamos es redefinir el método Assign para que Delphi sepa qué hacer en caso de asignación entre dos objetos del mismo tipo. Algo así:

  procedure TMyCollectionItem.Assign(Source: TPersistent);
begin
  if Source is TMyCollectionItem then
  begin
    Title := TMyCollectionItem(Source).Title;
    //..... el resto de propiedades
  end
  else
    inherited Assign(Source);
end;

Bueno, espero que os sirva esta breve explicación de la clase TCollection y TCollectionItem

Nos leemos