Ventajas de migrar de Delphi 7 a Delphi 2007 for Win32 Release 2

By: Andreano Lanusse

Abstract: Para los desarrolladores Win32, los motivos para actualizar su versión de Delphi

Estimados Desarrolladores,

Muchos desarrolladores que utilizan la versión 7 se Delphi preguntan cuales son las razones para cambiar a una nueva versión de Delphi, en este momento la mas nueva versión de Delphi 2007 para Win32, exclusivamente para desarrollo nativo – Win32. Como las discusiones sobre el asunto se extienden, vamos a presentar, en este articulo, las principales razones para hacer esta migración, presentando todos los nuevos recursos desde la versión de Delphi 7.

Continuamos buscando mas calidad y mejor desempeño en el IDE y las aplicaciones generadas, con Delphi 2007 for Win32 tenderás mas desempeño en tiempo de desarrollo y en la aplicación final comparado a Delphi 7.

    Novedades en el compilador y el lenguaje desde Delphi 7

    Directiva inline

Se trata de una nueva directiva que va aumentar el desempeño del compilador con solo agregar la palabra reservada “inline”. En este caso, el método es expandido, evitando su lectura a todo momento. Esta forma de acceso presenta mejores resultados para métodos pequeños, fuera del alcance de la unit o para rutinas con muchos parámetros. Para el caso de rutinas mas grandes, se recomienda hacer una análisis de costo-benefició en cuanto a su utilización

A continuación se muestra el código una aplicación de consola, utilizando “inline” en la función Max.

program InlineDemo;
{$APPTYPE CONSOLE}

uses
  MMSystem;

  function Max(const X,Y,Z: Integer): Integer;inline
  begin
    if X > Y then
      if X > Z then Result := X
               else Result := Z
    else
      if Y > Z then Result := Y
               else Result := Z
  end;

const
  Times = 10000000; // 10 millón
var
  A,B,C,D: Integer;
  Start: LongInt;
  i: Integer;

begin
  Random; // 0
  A := Random(4242);
  B := Random(4242);
  C := Random(4242);
  Start := TimeGetTime;
  for i:=1 to Times do
    D := Max(A,B,C);
  Start := TimeGetTime-Start;
  writeln(A,', ',B,', ',C,': ',D);
  writeln('Calling Max ',Times,' times took ',Start,' milliseconds.');
  readln

end.

Al ejecutar esté código y comparar los resultados se encuentra una reducción importante en el tiempo de respuesta. Los siguientes resultados se obtuvieron después de que se ejecutó la función Max 10 millones de veces en una computadora Pentium M 1.8GHz con 2GB RAM. . Aunque estos valores pueden cambiar una computadora a otra, las proporciones son similares.

Con inline

Sin inline

25 milisegundos

68 milisegundos

De acuerdo con lo visto en la tabla anterior, se observa que al utilizar la capacidad “inline”, el código compilado puede aumentar, su rendimiento más de un 50%.

    Sobrecarga de operadores

Este recurso se tiene para clases y registros (records). A través de algunas funciones implícitas, el compilador genera automáticamente la llamada más apropiada durante la ejecución. A continuación, un ejemplo de su utilización.

type
   TMyClass = class
     class operator Sumar(a, b: TMyClass): TMyClass;      // Sumar las clases de tipo TMyClass
     class operator Restar(a, b: TMyClass): TMyclass; // Restar las clases de tipo TMyClass
     class operator Implicit(a: Integer): TMyClass;     // Conversión implícita  para la clase de tipo TMyClass
     class operator Implicit(a: TMyClass): Integer;     // Conversión implícita de la clase TmyClass para Integers.
     class operator Explicit(a: Double): TMyClass;      // Conversión explicita de un Double para la clase TMyClass
   end;

// Ejemplo de implementación del método Sumar
class operator TMyClass.Add(a, b: TMyClass): TMyClass;
begin
   // ...
end;

var
x, y: TMyClass;
begin
   x := 12;      // Conversión implícita de un Integer, ejecuta el método Implicit
   y := x + x;   // Ejecuta TMyClass.Add(a, b: TMyClass): TMyClass
   b := b + 100; // Ejecuta TMyClass.Add(b, TMyClass.Implicit(100))
end;

    Class Helpers

Los Class Helpers permiten extender clases sin utilizar herencia. Este recurso es importante, pues algunas clases, llamadas clases Selead, no pueden ser heredadas. La utilización de este nuevo recurso es muy apreciada. A continuación se muestra un ejemplo.

type
   TMyClass = class
      procedure MyProc;
      function  MyFunc: Integer;
   end;

   ...

   procedure TMyClass.MyProc;
   var X: Integer;
   begin
      X := MyFunc;
   end;

   function TMyClass.MyFunc: Integer;
   begin
       ...
   end;

...

type 
   TMyClassHelper = class helper for TMyClass
     procedure HelloWorld;
     function MyFunc: Integer;
   end;

   ...

   procedure TMyClassHelper.HelloWorld;
   begin
      writeln(Self.ClassName); // Self hace referencia al tipo TMyClass y no TMyClassHelper
   end;

   function TMyClassHelper.MyFunc: Integer;
   begin
     ... 
   end;
 
...
   
var 
  X: TMyClass;
begin
  X := TMyClass.Create;
  X.MyProc;    // Ejecuta TMyClass.MyProc
  X.HelloWorld; // Ejecuta TMyClassHelper.HelloWorld
  X.MyFunc;    // Ejecuta TMyClassHelper.MyFunc

Vale la pena observar que la referencia es siempre a la clase TMyClass. El compilador sabe cuando ejecutar la llamada a TMyClassHelper.

    Strict private y Strict protected

Ahora en Delphi Win32 y .NET se tienen dos formas adicionales de determinar la visibilidad de los atributos de una clase: strict private y strict protected.

Strict private: todos los atributos de la clase son visibles únicamente en la clase que fueron declarados. Estos atributos no estarán visibles para métodos declarados en la misma unit y para aquellos que no forman parte de la clase.

Strict protected: Específica que los atributos da clase son visibles para la propia clase y sus descendentes.

    Los Records ahora soportan métodos

Las capacidades de los registros (records) han sido incrementadas, pasando a ser casi lo mismo que una clase (Class), con soporte ha:

  • Constructores.
  • Sobre posición de operadores.
  • Declaración de métodos no-virtuales.
  • Métodos y propiedades estáticos.

Veamos un ejemplo de la implementación de un registro con estas nuevas características:

Type
    TMiRegistro = Record
    Type
         TTipoColor = Integer;
    Var
         Rojo : Integer;
         Class Var
         Azul : Integer;
         Procedure imprimirRojo();
Constructor Create(Val : Integer);
         Property pRojo : TTipoColor Read Rojo Write Rojo;
         Class Property  pAzul : TTipoColor Read Azul Write Azul;
    End;

    Constructor TMiRegistro.Create(Val: Integer);
Begin
  Rojo := Val;
End;

Procedure TMiRegistro.imprimirRojo;
Begin
  WriteLn('Rojo: ', Rojo);
End;

De acuerdo a lo visto anteriormente los registros pueden utilizar muchas de las funcionalidades que hasta entonces eran exclusivas de las clases, sin embargo los registros no son clases y tienen muchas diferencias:

  • Los Registros no tienen soporte a herencia;
  • Los Registros pueden tener partes variable, las clases no;
  • Los Registros son tipos de datos y pueden, entre otras cosas, ser copiados, clases no;
  • Los Registros no tienen destructores;
  • Los Registros no tienen soporte a métodos virtuales;

    Class abstract, Class sealed, Class const, Class type, Class var, Class property

Diversas nuevas formas de declaración de clases, tipos, variables y propiedades.

Class abstract - Especifica una clase abstracta.

Class sealed - Especifica que la clase no puede ser heredada.

Class const - Especifica una constante para la clase, que puede ser accedida sin necesidad de crear instancias de la clase.

Class type - Define uno tipo para la clase que puede ser accedida sin necesidad de crear instancias de la clase.

Class var - Define una variable en el scope de la clase que puede ser accedida sin necesidad de crear instancias de la clase.

Class property - Define propiedad que puede ser accedida sin la necesidad de crear instancias de la clase.

    Nested Clases

De una forma más didáctica, las clases Nested (o anidadas) serian como subclases, que pueden ser accedidas a partir de una clase y su tipo declarado dentro del contexto. Ejemplo de clase:

type
      TOuterClass = class
       strict private
          myField: Integer;
 
       public
          type
             TInnerClass = class
              public
                myInnerField: Integer;
                procedure innerProc;
             end;

         procedure outerProc;
       end;

El método de la clase interna se implementa de la siguiente manera:

procedure TOuterClass.TInnerClass.innerProc;
begin
   ...
end;

Finalmente el siguiente código muestra como acceder al método que está en la clase anidada:

var
   x: TOuterClass;
   y: TOuterClass.TInnerClass;

begin
   x := TOuterClass.Create;
   x.outerProc;
   ...
   y := TOuterClass.TInnerClass.Create;

    Métodos finales

Los Métodos declarados con final especifican que el mismo método no pode ser sobrepuesto (override) en clases descendentes, sin embargo se puede declarar uno método con el mismo nombre siendo virtual.

    Static class method

Son clases que cuando son declaradas como Static no necesitan ser instanciadas para ser accedidas.

    For … in

Ahora es posible hacer un for directo en objetos que contengan collections, arrays, expresiones string y expresiones de tipo set, tanto para Delphi Win32 como para .NET. Ejemplos:

Ejemplo: Iteración en un Array

var
  IArray1: array[0..9] of Integer   = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
  I: Integer;

begin
  
  for I in IArray1 do 
     begin 
         // Hacer algo aquí...
     end;

Ejemplo: iteración en un String:

var
  C: Char;
  S1, S2: String;

  OS1, OS2: ShortString;
  AC: AnsiChar;
  
begin

  S1 := ‘Nuevos recursos en Delphi 2007';
  S2 := '';

  for C in S1 do
    S2 := S2 + C;

  if S1 = S2 then
    WriteLn('SUCESSO #1');
  else
    WriteLn('FALHOU #1');

  OS1 := 'Migrando de Delphi 7 para Delphi 2007...';
  OS2 := '';

  for AC in OS1 do
    OS2 := OS2 + AC;

  if OS1 = OS2 then
    WriteLn('EXITO #2');
  else
    WriteLn('FALLOU #2');

end.

    Novedades en el IDE desde Delphi 7

El IDE trae una serie de novedades, como:

MSBuild à controle todo el proceso de compilación de su aplicación, los pasos antes y después de compilar un proyecto, esto es excelente para los desarrolladores que necesitan automatizar la compilación. Cuando abrir un proyecto en Delphi 2007, automáticamente el mismo va ser convertido para el nuevo formato y con la extensión DPROJ, para soportar MSBuild.

Vista e XP Themes à el IDE soporta los temas para Windows Vista y XP. Ahora es default y puedes habilitar y deshabilitar a través de las opciones de proyecto.

Project Manager à el project manager soporta múltiplas selecciones y con esto permite abertura, grabación y borrar mas de un archivo simultáneamente.

File Browser à con el File Browser no tenemos que abrir Windows Explorer o ir al menú File Open todo tiempo para abrir un archivo, pues File Browser ofrece acceso directo a su árbore de carpetas de dentro del IDE.

    Live Templates, Block Completion, indicador de líneas alteradas

Los nuevos recursos de live template extienden la capacidad de crear plantillas de código en Delphi. Estas plantillas son creadas en un archivo XML y ayudan a programar escribiendo menos código.

Hide image
Figura1

Figure 1. Creando un try..finally utilizando la capacidad de LiveTemplates.

La capacidad de block completion es uno de los recursos que habilitan el begin y end automático. ¿Quién nunca se perdió con begin y end?

En la figura 1, tenemos una marcación amarilla y otra verde, la amarilla representa las líneas que fueron cambiadas, mientras las verdes son líneas que no cambiaran.

    Histórico de los cambios

Independiente de una herramienta de control de versiones, las alteraciones en fuentes son versionadas localmente, permitiendo la comparación entre las versiones.

Hide image
Click to see full-sized image

Figura 2. Versionamento local y comparación entre 2 fuentes

    Depurador

El nuevo depurador trae diversas mejoras en variables locales, call stack y otros, sin embargo una de las principales novedades es la visualización en árboles. Véase un ejemplo:

Hide image
Click to see full-sized image

Figura 3. Depurando una aplicación y visualizando las variables en TreeView

También es posible configurar la barra de enrollamiento de la ventana de eventos y abrir separadamente cada ítem de la ventana de CPU, con un simples drag-and-drop presionando la tecla CTRL, la ventana se queda transparente, facilitando la lectura del código durante la depuración.

    Refactoring

Esta es una de las capacidades que más les gustan a los usuarios de Delphi 7, ya que a través de los refactorings se pueden renombrar clases, variables y métodos de manera que al hacer un cambio de nombre se cambien automáticamente todas las líneas de código en los que se hacía referencia al nombre anterior. Mediante esta capacidad de refactoring es posible también cambiar los parámetros de clases, seleccionar parte del código y generar un método a partir del bloque seleccionado, también es posible mover métodos de una clase a otra, entre muchas otras cosas.

    Unidades de Prueba

La integración con unidades de pruebas a través de DUnit facilitan la creación de métodos y en general código de pruebas que se usa para probar el código de la propia aplicación. Esto facilita la notablemente la prueba de las aplicaciones, pues es como si se tuviese un “programa que prueba al programa”.

    SQL Window - Query Builder

Ahora a través del DataExplorer podemos construir querys visualmente utilizando el Query Builder, desde simples sentencias select hasta complejos querys utilizando joins.

Hide image
Click to see full-sized image

Figure 4 SQL Window integrado a Query Builder

    Modelado UML

Una de las nuevas capacidades de Delphi es la creación de proyectos UML, utilizando UML 1.5 o UML 2.0, que también son conocidos como proyectos de diseño. Podemos considerar estos proyectos como proyectos de análisis y, como tal, no poseen ninguna interacción con el código fuente. La ventaja de estos proyectos es permitir que se utilice Delphi 2007 en la fase de refinamiento del alcance, en dónde todavía no tienen definido si el proyecto va ser implementado en la plataforma Win32 o en la plataforma .Net. Cuando posteriormente se defina la plataforma, Delphi 2007 puede transformar el proyecto de análisis en un proyecto de implementación en Delphi Win32 o en Delphi .Net.

Adicionalmente, se puede hacer la ingeniería reversa del código actual y crear un diagrama de clase, como el que se muestra en la siguiente figura:

Hide image
Click to see full-sized image

Figura 5. Diagrama de clase de la unit Buttons.pas

    Auditorias y Métricas

Con la capacidad de Métricas de Delphi es posible que los desarrolladores mejoren la calidad de sus aplicaciones con una productividad que no existe en ninguna otra herramienta. A través de las Métricas, es posible seleccionar cualquier indicador para medir (cohesión, complejidad, acoplamiento etc...) al mismo tiempo que se definen sus criterios de aceptación como: líneas de código por clase, nivel de if, while, for y otros ciclos, así como límites de herencia entre otros.

¿Cuantas veces usted ya definió un guía de mejores prácticas de codificación que evitan que su equipo de desarrolladores cometa errores de codificación de modo que conviertan el código en algo muy ineficiente o incluso incomprensible?

¿Supongamos que su equipo tiene un guía de mejores prácticas, la siguiente pregunta sería: Como podemos garantizar que esta guía de mores prácticas realmente se esta siguiendo?

La respuesta nuevamente seria: revisión de código (code review) y si realizamos tal plática en un contexto de un proyecto con miles de líneas de código, sabemos que el resultado puede ser catastrófico en relación a tiempo.

A través de la capacidad de auditorias de código (QA Audits) de Delphi 2007, usted podrá finalmente definir un conjunto de buenas prácticas de codificación y garantizar que estas prácticas están sendo seguidas en sus proyectos. Traduciendo al día-a-día, usted podrá detectar errores que pueden ocurrir en su aplicación antes de incluso de que está se ejecute.

Hide image
Click to see full-sized image

Figura 6. Resultado das métricas a través do Grafico de Kiviat: los puntos fuera del círculo rojo representan violación de las métricas

Todo esto puede ejecutarse en el código desarrollado en Delphi 7 al migrar a Delphi 2007.

    Documentación

¿Cuantos proyectos usted tiene en Delphi que no tienen ningún tipo de documentación? Con Delphi 2007 usted podrá hacer una ingeniería reversa de todas las units de un proyecto, generar los diagramas de clase y los de secuencia, en seguida, generar un sitio web conteniendo estés diagramas de una forma bastante estructurada.

Hide image
Click to see full-sized image

Figura 7. Documentación generada a partir do código

    Novedades en Base de Datos

    dbExpress Framework

Una de las grandes novedades en Delphi 2007 es la completa reestructuración de la arquitectura de dbExpress, que ahora tienes sus drivers escritos 100% en Delphi. Hicimos algunos testes de desempeño en nuestros laboratorios, simulando situaciones diversas con varias bases de datos y en llegamos a tener 100% de gaño de desempeño en algunas situaciones.

DBExpress 4 también es un marco para las aplicaciones desarrolladas en Delphi que requieren conectividad con base de dados, la nueva arquitectura fue preparada para soportar Win32 y .NET. Los componentes dbExpress son el nuevo padrón para desarrollo .NET con Delphi en RAD Studio 2007.

Hide image
Click to see full-sized image

Figure 8. Arquitectura de dbExpress para soportar Win32 y .NET

É importante recordar que las aplicaciones desarrolladas en las versiones anteriores de Delphi son 100% compatibles con Delphi 2007. Cambiamos apenas la infraestructura de dbExpress.

El DBX Framework es un nuevo conjunto de clases que facilita el acceso y manipulaciones de bases de dados, teniendo total acceso a las informaciones de sus bases de dados con el framework e no solamente con los componentes SQLConnection, SQLDataSet, SQLQuery y otros.

    dbExpress 4 - Drivers

Nuevos drivers fueran adicionados a dbExpress, son eles: InterBase 2007, MySQL 4.1 e MySQL 5.0.

Los drivers para Oracle, InterBase e MySQL soportan Unicode.

Nuevos conceptos que llamamos de “Delegate Driver” y “Pools Connections” están disponibles en dbExpress.

DelegateDriver permite conectar una clase a su tracer y así capturar las informaciones que pasan por sus conexiones, funcionando como un SQL Monitor, col la diferencia de poder extender y personalizar su clase a partir de la clase DBXTrace y manipular las informaciones de su manera. Puedes imaginar una solución de replicación, “Delegates” es una grande ayuda. Abajo el resultado de un log generado por el Delegate en lenguaje Delphi. Es más fácil leer, entender y até mismo de ejecutar nuevamente.

La configuración de un trace, como no ejemplo que seguí, irá capturar los eventos de acuerdo con el parámetro TraceFlags y irá grávalos en el archivo c:\dbxtrace.txt el log. Su conexión dbExpress tendrá un parámetro indicando las configuraciones del trace, por ejemplo: DelegateConnection= DBXTraceConnection

[DBXTraceConnection]
DriverName=DBXTrace
TraceFlags=EXECUTE;COMMAND;CONNECT
TraceDriver=true
TraceFile=c:\dbxtrace.txt

Resultado del log generado:

Log Opened ==========================================
{CONNECT        } ConnectionC1.Open;
{COMMAND      } CommandC1_1 := ConnectionC1.CreateCommand;
{COMMAND      } CommandC1_1.CommandType := 'Dbx.SQL';
{COMMAND      } CommandC1_1.CommandType := 'Dbx.SQL';
{COMMAND      } CommandC1_1.Text := 'select * from employee';
{PREPARE          } CommandC1_1.Prepare;
{COMMAND      } ReaderC1_1_1 := CommandC1_1.ExecuteQuery;
{COMMAND      } CommandC1_2 := ConnectionC1.CreateCommand;
{COMMAND      } CommandC1_2.CommandType := 'Dbx.MetaData';
{COMMAND      } CommandC1_2.Text := 'GetIndexes "localhost:C:\CodeGear\InterBase\examples\database\employee.ib"."sysdba"."employee" ';
{COMMAND      } ReaderC1_2_1 := CommandC1_2.ExecuteQuery;
{READER         }  { ReaderC1_2_1 closed.  6 row(s) read }
{READER         } FreeAndNil(ReaderC1_2_1);
{COMMAND    } FreeAndNil(Comm

Ustedes también pueden utilizar, nativamente, pools de conexión con dbExpress. Abajo un alias (Pool_DelegateDemo) de dbExpress, delegando a DBXPoolConnection el controle del pool de conexiones, donde está configurado un número máximo de 16 conexiones.

[DBXPoolConnection]
DriverName=DBXPool
MaxConnections=16
MinConnections=0
ConnectTimeout=0

[Pool_DelegateDemo]
DelegateConnection=DBXPoolConnection
DriverName=Interbase
DriverUnit=DBXDynalink
DriverPackageLoader=TDBXDynalinkDriverLoader
DriverPackage=DBXCommonDriver110.bpl
DriverAssemblyLoader=Borland.Data.TDBXDynalinkDriverLoader
DriverAssembly=Borland.Data.DbxCommonDriver,Version=11.0.5000.0,Culture=neutral,PublicKeyToken=a91a7c5705831a4f
Database=localhost:C:\CodeGear\InterBase\examples\database\employee.ib
RoleName=RoleName
User_Name=sysdba
Password=masterkey
ServerCharSet=
SQLDialect=3
BlobSize=-1
CommitRetain=False
WaitOnLocks=True
ErrorResourceFile=
LocaleCode=0000
Interbase TransIsolation=ReadCommited
Trim Char=False

    dbExpress 4 - VCL

Algunas alteraciones fueran necesarias en los componentes de dbExpress, visando facilitar el desarrollo, manteniendo su aplicación compatible.

Todos los cambios en los componentes están documentados en el help de Delphi 2007 (ms-help://borland.bds5/devnet/dbexpressframeworkcompat_xml.html).

Abajo un ejemplo de una aplicación console que utiliza recursos de conexión con base de datos, lee parámetros de conexión, ejecuta la query, lee el resultado de una query y utiliza transacción.

program DBX4Example;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  DBXDynalink,
  Dialogs,
  DBXCommon;

var

  aConnName: string;
  aDBXConn: TDBXConnection;
  aDBXTrans : TDBXTransaction;
  aCmnd: TDBXCommand;
  aReader: TDBXReader;
  i, aColCount: integer;

begin

    aDBXConn := TDBXConnectionFactory.GetConnectionFactory.GetConnection('EMPLOYEE','sysdba','masterkey');

    // Write the all connection parameters
    Writeln( '================= Connection Properties ============' );
    WriteLn(  aDBXConn.ConnectionProperties.Properties.Text);
    Writeln( '====================================================' );
    Writeln( '' );

    if aDBXConn <> nil then
    begin

      aCmnd := aDBXConn.CreateCommand;

      // Start transaction
      aDBXTrans:= aDBXConn.BeginTransaction(TDBXIsolations.ReadCommitted);

      for I := 1 to 100000 do
      begin
      // Prepare and execute the SQL Statement
      aCmnd.Text := 'SELECT * FROM Country';
      aCmnd.Prepare;
      aReader := aCmnd.ExecuteQuery;

      aColCount := aReader.ColumnCount;
      Writeln( 'Results from Query: ' + aCmnd.Text );
      Writeln( 'Number of Columns:  ' + IntToStr(aColCount) );

      while aReader.Next do
      begin
        Writeln( aReader.Value['Country'].GetAnsiString );
      end;

      Writeln( '====================================================' );
      Writeln( '' );

      end;
      // Commit transaction
      aDBXConn.CommitFreeAndNil(aDBXTrans);

      Readln;
      aReader.Free;
      aCmnd.Free;
      aDbxConn.Free;

    end;

end.

    Manipulando metadata con DBX 4

La tecnologia dbExpress 4 viene evolucionando rápidamente y dos nuevas clases permiten total interacción con los metadatos de bases de datos soportadas por dbExpress - DbxReadOnlyMetadata y DbxMetadata.

DbxReadOnlyMetadata nos permite obtener informaciones directamente de la base de datos en aplicaciones Win32 y .NET, las clases ya existían desde la creación de dbExpress 4 y ahora fueron extendidas para permitir el acceso a nuevos metadatos de la base de datos.

Podemos obtener los metadatos a través del CommandType Metadata que retorna un cursor, como si fuese un query normal obteniendo total independencia para quien necesita escribir aplicaciones independientes de la base de datos.

Abajo se indica la lista de metadatos disponibles con DbxReadOnlyMetadata desde Delphi 2007 para Win32:

  • Tipos de Datos
  • Tablas
  • Columnas (de tablas, vistas, etc)
  • Índices
  • Campos que compone cada índice
  • Claves Extranjeras
  • Campos que componen cada clave extranjera
  • Stored Procedures
  • Parámetros de Stored Procedures
  • Usuarios

Ahora también podrá obtener más información como:

  • Catalogs
  • Schemas
  • Views
  • Synonms
  • Código Fuente de Stored Procedures
  • Package Stored Procedures
  • Código Fuente de Package Stored Procedures
  • Parámetros de Package Stored Procedures
  • Roles
  • Palabras Reservadas

DbxMetadata es la clase responsable de generar los comandos SQL de Create, Alter y Drop de acuerdo con la colección enviada. Estas colecciones pueden ser tablas, vistas, índices, procedures y otros más, está disponible solamente en Delphi .NET, en futuro estará disponible para Win32.

El siguiente código crea una tabla CLIENTE con 4 campos utilizando el TDBXMetaDataTable

var
  MetaDataTable: TDBXMetaDataTable;
begin
  MetaDataTable := TDBXMetaDataTable.Create; 

  MetaDataTable.TableName := ‘CLIENTE’;
  MetaDataTable.AddColumn(TDBXInt32Column.Create(’ID′));
  MetaDataTable.AddColumn(TDBXStringColumn.Create(’NOMBRE′, 40));
  MetaDataTable.AddColumn(TDBXDecimalColumn.Create(’SALDO′, 10, 2));
  MetaDataTable.AddColumn(TDBXUnicodeCharColumn.Create(’ACTIVO′, 1));
  MetaDataProvider.CreateTable(MetaDataTable); 

En este ejemplo el driver de dbExpress determinará el SQL para creación de la tabla de acuerdo con la base de datos conectada.

    Blackfish SQL

Blackfish SQL es la nueva base de datos para .NET de CodeGear, fue desarrollado 100% en Delphi .NET, 100% manage code, su base es JDataStore que ahora se llama Blackfish SQL for Java y para los que conozcan JDataStore automáticamente podrán trabajar con Blackfish SQL para .NET.

Una base de datos Blackfish puede ser compartida entre servidores .NET o JAVA, pues la estructura de las bases de datos es la misma.

De acuerdo con su licencia de Delphi usted podrá distribuir gratuitamente Blackfish SQL hasta un determinado número de conexiones de usuarios, en caso de que este número no sea suficiente usted podrá adquirir licencias adicionales, pues Blackfish SQL for .NET es el más nuevo producto de CodeGear.

  • CodeGear Delphi 2007 for Win32 R2 Architect y Enterprise permite la distribución ilimitada de Blackfish SQL desktop y server hasta 1 CPU, core ilimitado, 5 usuarios/20 conexiones y soporta bases de datos hasta 2GB.
  • CodeGear Delphi 2007 for Win32 R2 Professional permite distribución ilimitada de Blackfish SQL desktop hasta 1 CPU, core ilimitado, 1 usuario/4 conexiones y soporta bases de datos hasta 512MB.

Un de los grandes recursos de Blackfish SQL es permitir escribir StoreProcedures y Triggers en lenguaje Delphi, este recurso nos permite utilizar nuestro conocimiento en Delphi 100% integrado con la base de datos.

Abajo se muestra una clase en Delphi que contiene 2 métodos, en verdad son 2 stored procedures que serán ejecutadas en Blackfish SQL.

unit Procedures;

interface

uses System.Data,System.Data.Common, Borland.Data.DataStore;

type

  TProcs = class
  public
    { public declarations }
    class function Times2( value : Integer) : Integer;static;
    class function AllNames(Connection: DbConnection):DbDataReader;static;
  end;


implementation

{ TProcs }

class function TProcs.AllNames(Connection: DbConnection): DbDataReader;
var
  Command : DbCommand;
begin

  Command := Connection.CreateCommand;
  Command.CommandText := 'Select * from Employee';
  Result := Command.ExecuteReader;

end;

class function TProcs.Times2(value: Integer): Integer;
begin
  Result := value * 2;
end;

end.

Para ejecutar el procedimiento AllNames se haría lo siguiente: call AllNames, no es necesario pasar el parámetro Connection, pues será considerado el de la conexión actual.

Para ejecutar el procedimiento Times2, utilizamos junto con un SQL: Select ID, Times2(ID) from Customer, y así tenderemos una columna con el retorno de la multiplicación del ID por 2.

Blackfish SQL trae 3 drivers para acceso:

         Local à donde el servidor de base de datos es ejecutado en el mismo proceso

         Remoto à conectarse en base de datos remota o local a través de TCP/IP

         DbxClient à drivers para acceso en aplicaciones Win32

El acceso a través del DbxClient utiliza el protocolo JSON/RPC que es similar a XML-RPC, dando origen al más nuevo driver para dbExpress, sin embargo es un driver dbExpress para acceso a servidores BlackfishSQL, y también trae los fuentes de DbxClient que están disponibles en RAD Studio 2007 y en Delphi 2007 for Win32 Release 2.

Fue liberado en CodeCentral el manual completo de BlackfishSQL – “Blackfish SQL Developer Guide” - http://cc.codegear.com/Item/24980

    Nuevos recursos da VCL y de RTL (Runtime Library) desde o Delphi 7

    VCL y Windows Vista

Todas las aplicaciones compiladas en Delphi 2007 correrán en Windows Vista, sin embargo, compilando ya estará compatible. La VCL en Delphi 2007 fue actualiza para soportar Windows Vista, además de incorporar nuevos componentes específicos para Windows Vista.

Los nuevos componentes son:

  • TFileOpenDialog
  • TFileSaveDialog
  • TTaskDialog

También nuevas clases fueran creadas, como:

  • TCustomFileDialog
  • TCustomFileOpenDialog
  • TCustomFileSaveDialog
  • TCustomTaskDialog
  • TFavoriteLinkItem
  • TFavoriteLinkItems
  • TFavoriteLinkItemsEnumerator
  • TFileTypeItem
  • TFileTypeItems
  • TTaskDialogBaseButtonItem
  • TTaskDialogButtonItem
  • TTaskDialogButtons
  • TTaskDialogButtonsEnumerator
  • TTaskDialogProgressBar
  • TTaskDialogRadioButtonItem

Los componentes de caja de dialogo pasan a tener la misma interface de Windows Vista.

¿Que pasa con la aplicación que correr sobre Windows XP? No se preocupe, pues la VCL es compatible con los dos sistemas operativos y va a saber como presentar las cajas de dialogo.

La función TaskMessageDlg fue creada para soportar Windows Vista, esta tiene la misma funcionaldiade que el conocido MessageDlg, mas con algunos parámetros adicionales para soportar las características de Windows Vista, su aplicación al correr en Windows XP, automáticamente va a ejecutar MessageDlg, la VCL gerencia esto.

Cuando recebe TRUE, la variable global UseLatestCommonDialogs define que todas los componentes de dialogo (TOpenDialog, TSaveDialog, TOpenPictureDialog e TSavePictureDialog) tengan el diseño de equivalente al de Windows Vista. Por ejemplo, su Open Dialog quedaría así en Windows Vista:

Hide image
FileOpenDialog

Figure 9. Open Dialog en Windows Vista

Ya el Save Dialog quedaria así:

Hide image
Click to see full-sized image

Figure 10. Save Dialog en Windows Vista

Las units abajo tuvieran cambios para soportar las nuevas API’s de Windows.

  • UxThemes – nuevo
  • DwnApi – nuevo
  • ActiveX – actualizado
  • Windows – actualizado
  • Messages – actualizado
  • CommCtrl – actualizado
  • ShlObj - actualizado

    Nuevas propiedades da VCL – margins y padding

Los componentes da VCL ahora tienen dos nuevas propiedades que permiten definir los márgenes internos e externos de cada componente lo que nos ayuda cuando alineamos componentes alClient y no queremos que queden junto a componentes externos. Así, podemos definir las márgenes superiores, inferiores, derechos e izquierdos.

    TFlowPanel

Nuevo componente que permite el posicionamiento automático de los componentes en un panel.

    TGridPanel

Nuevo componente, que funciona como una tabla donde son definidas las líneas y columnas, de modo que diversos componentes pueden ser insertados y automáticamente posicionados.

Hide image
Click to see full-sized image

Hide image
Click to see full-sized image

Figura 11. Ejemplo do TFlowPanel

Figura 12. Ejemplo do TGridPanel como una tabla

    TCategoryButtons

Este componente nos permite crear botones y agruparlos en categorías como si fuesen una barra de Outlook y lo que ayuda a realzar el diseño de sus aplicaciones.

Hide image
Click to see full-sized image

Figura 13.Ejemplo de una aplicación usando lo TCategoryButtons

    TButtonGroup

Este componente permite el agrupamiento de diversos botones en un panel.

    TTrayIcon

El famoso icono da barra de Windows para representar la aplicación es ahora soportado nativamente, permitiendo colocar iconos animados y enviar mensajes a través de balones, de acuerdo con el siguiente ejemplo:

Hide image
Click to see full-sized image

Figura 14. TryIcon en acción

    Soporte a IntelliMouse

IntelliMouse es el suporte al desplazamiento de la ventana en la aplicación. En Delphi 2007, la VCL tiene soporte a esta tecnología, basta declarar la unit IMOUSE en su aplicación.

    Nuevo motor de memoria u nuevas funciones da RTL

Diversas funciones da RTL fueron actualizadas aumentando el rendimiento de sus aplicaciones. La más importante de ellas, es FASTMM, nuevo motor que maneja la memoria de aplicaciones Win32, ganando mas rendimiento con la compilación en Delphi 2007 y al asignar True a la variable ReportMemoryLikeonShutdown.

Nuevamente, con solo hacer la compilación sus aplicaciones en Delphi 2007, se gana rendimiento y al mismo tiempo que se pueden detectar las fugas de memoria.

    TeeChart 7

Uno de los componentes mas utilizados por los desarrolladores Delphi es el TeeChart, que ahora está en la versión y es parte de Delphi 2007, trae nuevos recursos que facilitan el trabajo con gráficos en Delphi.

Hide image

Figure 15. Componentes do TeeChart 7

    Rave Reports 7.5

La nueva versión de Rave Reports, conjunto de componentes para reportes, trae nuevos recursos y actualizaciones, además permite reportes en PDF, RTF, HTML y texto.

    QuickReport

Con el QuickReport Standard todas sus aplicaciones pueden ser migradas.

Hide image
Click to see full-sized image

Figura 1. QuickReport en Delphi 2007

Aquellos usuarios que actualizaron a Delphi 2007 for Win32 tienen acceso al QuickReport Standard vía download.

    Conclusión

Muchos son los nuevos recursos y capacidades que se tienen desde Delphi 7. Lo más importante es que todos permiten al desarrollador crear nuevas aplicaciones: más rápidas, con mejor calidad, soportando las nuevas tecnologías e innovando el desarrollo.

Yo espero que este artículo haya puesto de manifiesto todas las razones y beneficios que se obtienen al migrar de Delphi 7 a Delphi 2007 for Win32.


Saludos y hasta el próximo artículo.

Server Response from: ETNASC04