Sunday, 30 November 2008

Delphi 2009: Cuidado con los ribbon controls.

Una vez estas instalando Delphi 2009, nos aparece un mensajito de Microsoft indicando que no se pueden utilizar los ribbon controls en nuestras aplicaciones sin un permiso o licencia de estos. Es normal, ya que son los mismos que utiliza Office 2007. Por lo tanto, cuidado con los ribbon controls, ya que vienen con una licencia aparte de la VCL de delphi.

El mensaje es el siguiente:



Saturday, 29 November 2008

testing Delphi 2009, por fin han llegado los Ribbon Control.


Ahora que ya tengo la última versión de Delphi 2009, ya podemos utilizar los controles Ribbon que vienen incrustados con esta última versión:


Esta nueva versión trae muchas novedades, y al empezar a toquetear ya he visto que había bastantes diferencias con su antecesor Delphi 2007. Aparecen los Ribbon controls, también nueva versión de TeeChart, etc..



También han modificado la parte de configuración de la aplicación y los modos de salida de la aplicación:




De momento la cosa promete, ahora solo me falta actualizar todas mis librerías a esta versión, pero por mi primera impresión la cosa ha cambiado mucho...

Friday, 28 November 2008

Utilizando los componentes de ZeosDBO para conectarnos con MySQL desde Delphi 2007

Ahora que ya sabemos como instalar la libreria, vamos a probarla con nuestra BD MySQL. Creamos un pequeño proyecto, y añadimos un TZConnection, un TZTable, un TDataSource y una TDBGrid. Ahora los configuraremos todos para conectar con nuestra BD.



Ahora, antes de continuar, tenemos que dirigirnos a la ruta:
C:\Archivos de programa\MySQL\MySQL Server 5.0\bin
y coger la libreria libmySQL.dll y copiarla donde esté nuestro proyecto (o crear una variable de entorno para que sea visible para nuestra aplicación).

  • Configurando la conexión:


Estos son los parámetros más importantes para que la conexión tenga esto. Una vez entrados todos, si indicamos connected := true, se conecta con nuestra BD.

  • Configurando la tabla, el datasource y la Grid.
Ahora que ya tenemos la conexión montada, es mucho más fácil, solo tenemos que coger el componente TZTable, indicarle la conexión y la tabla que queremos abrir:



Una vez seleccionada la tabla, lo conectamos con el TDataSource y este a la TDBGrid, y si luego cogemos el TZTable y lo activamos veremos como nos aparecen los datos de nuestra tabla en la Grid:



El resultado final es este:



Mucho mas cómodo que utilizando ODBC explicado en el post anterior -> Conectar Delphi con una BD MySQL.

Thursday, 27 November 2008

Instalar ZeosDBO 6.6.4 en Delphi 2007


  • Descargar e Instalar el paquete
Podemos encontrar el paquete de ZeosDBO des de SourceForge aquí. La última versión es la 6.6.4 estable, y es la que he instalado.
Una vez hemos descomprimido el paquete (.zip o .rar), nos generará una serie de carpetas:


Nos dirigimos a la carpeta Packages y abrimos el fichero ZeosDbo.groupproj de la carpeta delphi11.


Ahora seleccionamos la libreria ZCore110.bpl (haciendo doble click encima), y con el botón derecho del mouse, hacemos build all from here.
Esto nos creará los ficheros .dcu en la carpeta build dentro de la carpeta delphi11:



Ahora, añadimos las carpetas en la configuración del proyecto. Nos dirigimos a Tools -> Options, y allí obtenemos:



Dentro de Library path, introducimos la ruta del build, donde están todos los .dcu, y en Browsing path, añadimos la ruta de todas las fuentes, por lo tanto tendríamos algo así:

Library Path:



Browsing Path:



Ahora, seleccionamos el package ZComponentDesign110.bpl y con el botón derecho "Install".



Ahora, en nuestra paleta de componentes, podemos ver los nuevos compontes de ZeosDBO:



Wednesday, 26 November 2008

Trabajando con ADO en Delphi

Para realizar una conexión con una BD sea cual sea (siempre que tengamos los drivers correctos), podemos hacerlo mediantes los componentes ADO que delphi nos suministra. En este caso los componentes a utilizar son estos:



  • Configuración para la conexión con ADO:
En este caso, para conectarlos debemos configurarlos y entrar los parámetros necesarios para su correcto funcionamiento. Un esquema típico seria:



El TADOConnection contiene el ConnectionString que enlaza con la BD. A este componente se le conecta el TADOQuery que contiene la consulta SQL y hace peticiones a través del TADOConnection. El DataSetProvider se conecta al TADOQuery y provee el servicio para la conexión. El ClientDataSet contiene todos los campos de la tabla de nuestra consulta y finalmente a este le apunta el DataSource.

La configuración final quedaría de la siguiente manera:


  • Ejemplo .dfm de delphi:
Aquí os dejo un ejemplo de la conexión con el .dfm del proyecto:



object ADOConnection1: TADOConnection
Connected
= True
ConnectionString
=
'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Server.mdb;Persist Security Info=False'
LoginPrompt = False
Mode
= cmShareDenyNone
Provider
= 'Microsoft.Jet.OLEDB.4.0'
Left = 711
Top = 414
end
object ADOQuery1: TADOQuery
Active
= True
Connection
= ADOConnection1
CursorType
= ctStatic
CommandTimeout
= 60
Parameters = <>
SQL.Strings = ('SELECT * FROM Table1')
Left = 739
Top = 414
end
object DataSetProvider1: TDataSetProvider
DataSet
= ADOQuery1
Left
= 768
Top = 414
end
object ClientDataSet1: TClientDataSet
Aggregates
= <>
Params = <>
ProviderName = 'DataSetProvider1'
AfterPost = ClientDataSet1AfterPost
Left
= 797
Top = 414
object ClientDataSet1Id: TIntegerField
FieldName
= 'Id'
end
object ClientDataSet1Descripcion: TWideStringField
FieldName
= 'Descripcion'
Size = 200
end
end
object DataSource1: TDataSource
DataSet
= ClientDataSet1
Left
= 825
Top = 414
end


Tuesday, 25 November 2008

Trabajando con Blob Objects en MySQL y Delphi 2007


Para poder trabajar con blob objects desde MySQL con delphi, primero podemos ver como se configura la conexión con un post que ya subí anteriormente. Una vez tenemos la BD de prueba con la que testear, creo una tabla que Prueba_blob, donde crearé un campo de tipo Blob, y luego almacenaré una imagen. (Podemos almacenar lo que queramos, ya sean documentos, textos largos, imagenes o vídeos, ya que este tipo de registros nos lo permite).
La descripción de un Blob, la podemos encontrar en la wikipedia.
El ejemplo que propongo es bastante sencillo, subiré las imágenes en jpeg, y las iré mostrando en una grid (en este caso en una QuantumGrid de DevExpress).
  • Creando la tabla en MySQL.
Create Table prueba_Blob (
ID int,
nombre Varchar(50),

Blob_col BLOB);


  • Resultado de la aplicación.


El código tanto para subir como para descargar la imágen es bastante sencillo, aquí os dejo el código de mis pruebas:




procedure TForm1.SubirImagen(Sender: TObject);
var
sFile: string;
begin
if opdlg.Execute then
begin
if not (cdsBlob.State in [dsEdit, dsInsert]) then
cdsBlob.Edit;
cdsBlob.Append;
sFile := ExtractFileName(opdlg.FileName);
if AnsiUpperCase(ExtractFileExt(
sFile)) = AnsiUpperCase('.jpg') then
begin
cdsBlobId.AsInteger := GetMaxId;
cdsBlobBlob.LoadFromFile(opdlg.FileName);
cdsBlobNom.AsString :=
sFile;
cdsBlob.Post;
end
else
ShowMessage('Imposible subir fichero');
end;
end;

procedure TForm1.DescargarImagen(Sender: TObject);
var
sFile: string;
begin
if cdsBlobNom.AsString <> '' then
begin
sFile := 'c:\temporal\' + 'BLob_' + cdsBlobId.AsString + '_';
sFile := sFile + cdsBLobNom.AsString;
cdsBLobBLob.SaveToFile(sFitxerTemp);
try
ShellExecute(self.handle, 'Open', PChar(
sFile), nil, nil, SW_SHOW);
except
ShowMessage('No se puede abrir');
end;
end;
end;



Aquí podemos ver los 2 métodos, tanto para subir la imagen como para descargarla. La función GetMaxID, devuelve el último identificador de la BD, solo hace un SELECT MAX(ID). Al subir una imagen, se abre un Open Dialog que selecciona una imagen jpeg.

Personalizar la Tool Palette de Delphi 2007

Para personalizar la barra de herramientas de Delphi 2007, hacemos botón derecho sobre la paleta, y seleccionamos las propiedades de este:



Luego en las opciones de colores, podemos personalizar el apartado de la paleta, y mejorar la vista de la paleta:

Uno de los resultados finales podria ser el siguiente:



Podemos hacer lo mismo con el Object Inspector, y hacer la vista de las propiedades un poco más diferente.

Saturday, 22 November 2008

Instalar la librería de Graphics32 en Delphi 2007

Graphics32 es una librería preparada para trabajar en Delphi/Kylix, que esta preparada para trabajar con gráficos y que además dispone de vários componentes.
  • Descargar la librería.
Podemos encontrar el último release aquí. Una vez nos descargamos el paquete, tenemos que crear el package en Delphi 2007, compilar, buildear e Instalar. El último paquete disponible es para Borland Studio 2006, por lo tanto tendremos que hacer el upgrade a nuestra versión.
  • Configurar la librería.
Una vez descargada la librería y descomprimido el paquete, ubicamos la libreria en alguna ruta que conozcamos bien, o dónde tengamos más librerias instaladas. Una vez sabemos donde ponerla, nos dirigimos a Options -> Environment Options -> Library - Win32, y añadimos la ruta de la librería en Library Path y Browsing Path. En estas 2 de momento apuntamos a los ficheros fuente .pas.
Luego abrimos uno de los ficheros .dpk (Delphi Package) que se encuentran dentro de la carpeta Packages, por ejemplo:
GR32_BDS2006.dpk
Una vez abierto, nos dirigimos con el botón derecho del mouse sobre el mismo Project Manager, y hacemos Add Existing Project..
Ahora añadimos el siguiente paquete, en este caso GR32_DSGN_BDS2006.dpk.
Una vez los tenemos añadidos en nuestro proyecto lo guardamos. Yo le he puesto el nombre ProjectGR32D11. Una vez lo tenemos todo, tendríamos que tener algo parecido a esto:

  • Cargando la librería.
Ahora, tenemos que compilar la librería y buildearla, hacemos doble click sobre GR32_BDS2006.bpl (Borland Package Library), y luego con el botón derecho del mouse, ejecutamos la opciones compile all from here y build all from here. Si no hay ningún problema, la librería compilará perfectamente. Una vez hecho esto, nos situamos sobre cada una de la librería, y haciendo botón derecho con el mouse, ejecutamos la opción Install.
Esto provocará que se instalen los componentes de la librería en la paleta del delphi:

  • Finalizando la configuración y ejemplos.
Para finalizar la instalación de la libreria, tenemos que ir a la carpeta donde tenemos la fuentes, y creamos una carpeta que se llame LibraryD11. Dentro de esta librería guardaremos todos los .dcu .inc .dcr, etc, (recursos y compilados) de nuestras fuentes, es decir, copiaremos todos los .dcu generados al buildear el proyecto dentro de esta carpeta.
Luego, nos dirigiremos a Options -> Environment Options -> Library - Win32, y dentro Library Path, quitaremos la ruta de graphics32 añadida anteriormente y la sustituiremos por la nueva carpeta LibraryD11. En Browsing Path no tocaremos nada. De esta manera, como ya hemos dejado las fuentes compiladas, cada vez que delphi cree un proyecto, no volverá a compilar las fuentes.
En la carpeta Examples, podemos ver una gran variedad de ejemplos y la potencia de la librería:




Friday, 21 November 2008

Crear un Garbage Collector en Delphi

Al igual que en java o en C++, los objetos se destruyen automáticamente cuando ya nadie los apunta. En delphi no pasa lo mismo, y siempre hay que controlar sus creaciones y destrucciones. Este ejemplo tomado de delphi 3000, nos permite utilizar un patron proxy (proxy object). Este ejemplo pretende utilizar las interfaces, ya que estas disponen de un contador de referencias. Cuando este llega a cero, el objeto se destruye. Esta es la manera de utilizar el proxy object. Creamos el objeto, y lo asociamos a nuestro proxy. Una vez nuestro objeto no tenga ningún apuntador, liberará nuestro objeto.
El código de la unit GarbageCollector es el siguiente:



unit GarbageCollector;

interface

uses
sysUtils;

type
ISafeGuard = type IUnknown;

function Guard(Obj: TObject; out SafeGuard: ISafeGuard): TObject;

implementation

type
TSafeGuard = class(TInterfacedObject, ISafeGuard)
private
FObj: TObject;
public
constructor Create(Obj: TObject);
destructor Destroy; override;
end;

constructor TSafeGuard.Create(Obj: TObject);
begin
FObj := Obj;
end;

destructor TSafeGuard.Destroy;
begin
if Assigned(FObj) then
FreeAndNil(FObj);
inherited Destroy;
end;

function Guard(Obj: TObject; out SafeGuard: ISafeGuard): TObject;
begin
Result := Obj;
SafeGuard := TSafeGuard.Create(Obj);
end;

end.


Si creamos una pequeña clase para hacer la prueba:


type
TClass1 = Class(TObject)
id : integer;
prop1 : string;
End;


Creamos un par de botones en un proyecto, y creamos los diferentes objetos, uno sin el garbage collector y otro con el proxy:


procedure TForm1.Button1Click(Sender: TObject);
var
objClass1 : TClass1;
begin
objClass1 := TClass1.Create();
objClass1.id := 1;
objClass1.prop1 := 'P1';
end;

procedure TForm1.Button2Click(Sender: TObject);
var
objClass1 : TClass1;
SafeGuard : ISafeGuard;
begin
objClass1 := TClass1(Guard(TClass1.Create, SafeGuard));
objClass1.id := 1;
objClass1.prop1 := 'P1';
end;



En el primer caso, al cerrar la aplicación, si tenemos activada la opción:
ReportMemoryLeaksOnShutDown := true;
obtenemos:


En el segundo caso, el objeto se elimina automáticamente. El ejemplo es válido siempre que nuestro objeto provenga de una clase heredada de TObject.

Thursday, 20 November 2008

Conectar delphi con una BD MySQL

Para conectar Delphi con MySQL, primero debemos instalar MySQL en nuestra máquina. Desde este enlace podemos descargarnos la última actualización -> MySQL. Para poder hacer la conexión entre ellos, debemos hacerla mediante ODBC o componentes de terceros (Third Party components como por ejemplo ZeosDBO).
Una vez instalado MySQL (en otro de los post ya hice mención a su instalación), descargamos el controlador ODBC de MySQL -> MySQL Connector/ODBC 5.1, y lo instalamos. Una vez instalado, nos aparecerá en la lista de drivers posibles al crear un nuevo DNS de sistema desde el administrador de orígenes de datos ODBC:

Desde MySQL, he creado una BD de prueba que se llama pruebasdelphi, y he creado una tabla prueba que es la que mostraré desde delphi.
Podemos ver en la siguiente imagen el administrador de MySQL, y su configuración para las pruebas:

Una vez hacemos la prueba de conexión y sale satisfactoria, nos dirigimos a Delphi, y enganchamos los componentes de conexión a una BD, y en el asistente para la conexión entramos los siguientes valores:

Una vez configurado y conectado, configuramos los siguientes componentes, en este caso para mostrar el ejemplo he puesto una DBGrid, un ADOQuery, un DataSetProvider, un ClientDataSet y un DataSource. Los conectamos entre ellos, luego añadimos unos cuantos valores a las tablas e voilà:

Ya estamos visualizando los valores de la tabla que hemos creado en MySQL desde Delphi 2007.
Los Scripts de creación e inserción de prueba son los siguientes:





CREATE DATABASE PruebasDelphi;
use PruebasDelphi;
Create Table prueba (id int, nombre varchar(20));
insert into prueba (id, nombre) values (1,'p1');
insert into prueba (id, nombre) values (2,'p2');
insert into prueba (id, nombre) values (3,'p3');



Estos son los datos que luego aparecen en el formulario de prueba.

Configurando la libreria gráfica 2D de java

La casa GeoSoft, dispone de una completa libreria de gráficos 2D para su implementación en java.

Desde el siguiente enlace, podemos encontrar la web y sus librerias-> 2D Graphics.
Para poder utilizar la librería desde nuestro IDE, por ejemplo Eclipse, solo hay que descargarse los .jar e importarlos en nuestro proyecto. Además podemos bajarnos las fuentes para ver como utilizan la librería gráfica.
Una vez tenemos creado nuestro proyecto en eclipse, hacemos botón derecho y hacemos click en propiedades, una vez allí, nos dirigimos a la pestaña "Libraries", y añadimos el external .jar que nos hemos bajado de la web.

Una vez tenemos la librería añadida a nuestro proyecto, podemos coger alguna de las demos de las que dispone la web, añadirla y ejecutarla:


Una vez la librería está funcionando, podemos empezar a jugar con ella.

Monday, 17 November 2008

Creando Grandientes con TCanvas i TImage

Para poder crear diferentes gradientes horizontales o verticales, he subido los siguientes métodos que a partir de un TImage y su TCanvas, podemos dibujar diferentes gradientes, escogiendo el color de origen y de destino:


Los métodos son los siguientes:



procedure GradienteHorizontal(image: TImage; ColorOrigen, ColorDestino: TColor);

procedure ColorToRGB(iColor: TColor; var R, G, B: Byte);
begin
R := GetRValue(iColor);
G := GetGValue(iColor);
B := GetBValue(iColor);
end;
var
dif, dr, dg, db: Extended;
C1, C2: TColor;
r1, r2, g1, g2, b1, b2: Byte;
R, G, B: Byte;
i, j: integer;
begin
ColorToRGB(ColorOrigen, R1, G1, B1);
ColorToRGB(ColorDestino, R2, G2, B2);

dif := image.ClientRect.Right - image.ClientRect.Left;
dr := (R2 - R1) / dif;
dg := (G2 - G1) / dif;
db := (B2 - B1) / dif;

j := 0;
for i := image.ClientRect.Left to image.ClientRect.Right - 1 do
begin
R := R1 + Ceil(dr * j);
G := G1 + Ceil(dg * j);
B := B1 + Ceil(db * j);
image.Canvas.Pen.Color := RGB(R, G, B);
image.Canvas.MoveTo(i, image.ClientRect.Top);
image.Canvas.LineTo(i, image.ClientRect.Bottom);
j := j + 1;
end;
end;

procedure GradienteVertical(image: TImage; ColorOrigen, ColorDestino: TColor);
procedure ColorToRGB(iColor: TColor; var R, G, B: Byte);
begin
R := GetRValue(iColor);
G := GetGValue(iColor);
B := GetBValue(iColor);
end;
var
dif, dr, dg, db: Extended;
C1, C2: TColor;
r1, r2, g1, g2, b1, b2: Byte;
R, G, B: Byte;
i, j: integer;
begin
ColorToRGB(ColorOrigen, R1, G1, B1);
ColorToRGB(ColorDestino, R2, G2, B2);

dif := image.ClientRect.Right - image.ClientRect.Left;
dr := (R2 - R1) / dif;
dg := (G2 - G1) / dif;
db := (B2 - B1) / dif;

j := 0;
for i := image.ClientRect.Top to image.ClientRect.Bottom - 1 do
begin
R := R1 + Ceil(dr * j);
G := G1 + Ceil(dg * j);
B := B1 + Ceil(db * j);
image.Canvas.Pen.Color := RGB(R, G, B);
image.Canvas.MoveTo(image.ClientRect.Left, i);
image.Canvas.LineTo(image.ClientRect.Right, i);
j := j + 1;
end;
end;