Warning: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"? in /var/www/vhosts/cadetill.com/domains/cadetill.com/public_html/wp-content/plugins/qtranslate-x/qtranslate_frontend.php on line 497

Warning: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"? in /var/www/vhosts/cadetill.com/domains/cadetill.com/public_html/wp-content/themes/suffusion/functions/media.php on line 666

Warning: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"? in /var/www/vhosts/cadetill.com/domains/cadetill.com/public_html/wp-content/themes/suffusion/functions/media.php on line 671

Warning: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"? in /var/www/vhosts/cadetill.com/domains/cadetill.com/public_html/wp-content/themes/suffusion/functions/media.php on line 684

Warning: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"? in /var/www/vhosts/cadetill.com/domains/cadetill.com/public_html/wp-content/themes/suffusion/functions/media.php on line 689

Warning: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"? in /var/www/vhosts/cadetill.com/domains/cadetill.com/public_html/wp-content/themes/suffusion/functions/media.php on line 694
El blog de cadetill – Página 7 – Cosas de programación……. y de la vida
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

 

nov 022011
 

Buenas,

Haciendo unas aplicaciones que usan el componente TWebBrowser, me surgió la necesidad de interactuar con las páginas cargadas en él, en concreto el manejo de los formularios. Consultando a Google llegué a delphi.about.com donde encontré una serie de artículos que me ayudaron a solucionar mis necesidades.

Gracias a estos artículos he creado una clase (TWebControl) que engloba buena parte de lo expuesto en esos artículos.

Entre las funciones interesantes que tiene esta clase tenemos:

  • procedure WebLinks: se encarga de carturar todas las etiquetas «a href» que contenga la página y las pone en la propiedad Links.
  • procedure WebFormNames: se encarga de capturar todos los formularios que contenga la página y los almacena en la propiedad Forms.
  • procedure WebFormFields: dado el nombre de un formulario, se encarga de rellenar la propiedad Fields con los campos del mismo.
  • procedure WebFormSetFieldValue: dado un formulario y un campo del mismo, establece un valor a dicho campo.
  • procedure WebFormSubmit: dado un formulario, lo acepta.
  • function WebFormFieldValue: dado un formulario y un campo del mismo, devuelve el valor que contiene.
  • function WebHTMLCode: devuelve el código HTML de la página web.
  • function WebContent: devuelve el contenido de la página web.
  • procedure WebSaveAsHTML: dado un nombre de archivo, guarda la página web.
  • procedure WebLoadHTML: dado un código HTML, lo carga directamente en el TWebBrowser.
  • procedure WebAddHTML: dado un código HTML, lo añade a la página existente.
  • procedure WebPrintWithoutDialog: imprime la página web sin mostrar ningún dialogo.
  • procedure WebPrintWithDialog: lanza el diálogo de impresión.
  • procedure WebPrintPreview: realiza una previsualización de la impresión de la página web.
  • procedure WebPrintPageSetup: realiza una llamada al diálogo del setup.

La forma de funcionar de la clase es sencilla. Basta con crear un objeto de la misma pasándole en el constructor el objeto TWebBrowser que contenga la página a controlar.

Como siempre, podéis descargaros el programa demo y la unit con la clase desde aquí.

Nos leemos

nov 232010
 

Buenas,

Hoy nuestro viaje lo iniciaremos en Nueva York e iremos tan tranquilos hasta Pekin, aquí al lado vamos, jejeje

Para ver cómo podemos llegar, iremos a Google Maps y pondremos las ciudades de origen y destino en las casillas correspondientes que aparecen al pulsar en «Cómo llegar».

Esta vez la curiosidad la tenemos en el punto 31. Sólo de pensarlo ya me entran todos los males, jejejeje

Espero os guste

Nos leemos

nov 232010
 

Buenas,

Es de muchos sabidos que Catalunya está inmersa en plena campaña de elecciones al Parlament de Catalunya, campaña que dirá quién dirigirá esta región española durante los próximos años.

Pues bien, como catalán que soy, se me cae la cara de vergüenza de ver a los políticos que tenemos, que sólo son capaces de hacer una campaña electoral que hace que este país sea el hazmereír de toda España con vídeos electorales como estos:

PP catalán

Partido de Laporta

Y no son los únicos, hay más, pero no vale la pena seguir con ello. Realmente es penoso que los partidos políticos tengan/quieran ganar unas elecciones así en lugar de haciendo política.

En fin, toda una vergüenza para la clase política catalana y para Catalunya en general.

Nos leemos

nov 172010
 

Buenas,

Pues al fin se ha conseguido, ayer la Unesco declaró a los castells Patrimonio Inmaterial de la Humanidad.

Desde aquí felicitar a todas esas personas que se dedican a hacer esas tremendas torres humanas (la próxima temporada a ver si «los míos» y yo mismo formamos parte de ellos).

Nos leemos

nov 162010
 

Buenas,

Pues siguiendo el viaje que empezamos en el mensaje anterior, hoy nos vamos a dirigir a Taiwan, pero esta vez vamos a ir andando, así que vamos a poner en el Google Maps que queremos ir de China a Taiwan escogiendo el hombrecito que indica andando.

Ahora vamos a ir bajando hasta encontrar el punto 298, jejejejeje

La verdad es que prefiero los 782 km de la moto de agua 😀

Nos leemos