Recordatorio próximo seminario web

febrero 13, 2012 en Delphi, Delphi Prism, Entrada Diario, Noticias, Recordatorio, Seminario web, XE2

Os recuerdo: miércoles 15 de febrero se celebrará el seminario web La Base de Datos Integrada, organizado por Embarcadero.

La Base de Datos Integrada

Horario de celebración:

  • California, EE. UU. –  9:00 AM
  • México y Centroamérica –  11:00 AM
  • Colombia–  12:00 PM
  • Argentina – 2:00 PM

Podéis registraros en el siguiente enlace Asistir

El seminario aborda el área de conocimiento de Interbase XE.

Se podrá conocer:
• Lo nuevo en seguridad, escalabilidad y rendimiento de InterBase XE.
• Cómo los fabricantes de software y clientes utilizan InterBase para diseñar, implementar y optimizar sus
aplicaciones.
• Cómo utilizar servicios en la nube con InterBase.
• Cómo aprovechar la sólida integración de InterBase con RAD Studio XE2 y FireMonkey para crear aplicaciones
en múltiples plataformas.
• Desarrollo rápido de aplicaciones de bases de datos multi-capas con InterBase, utilizando DataSnap™.
• Migración de versiones previas de InterBase a XE.

 

El misterio de los 200…

enero 26, 2012 en Advertencia, Artículos, Comunidad, Delphi, Enlace interesante, Entrada Diario, FireMonkey, LiveBindings, XE2

Aunque ya he comentado el contenido de esta entrada en el foro de facebook, necesitaba colgar de algún lado las fuentes que había utilizado para revisar el tema y de paso, dar la oportunidad para quien todavía no forme parte del mismo pueda acceder a su contenido, o por lo menos a las cosas que parecen interesantes. Es por esa razón que he acabado añadiéndola.

En este caso concreto, el hilo de comentarios del foro se originaba cuando uno de los compañeros, siguiendo las indicaciones del código publicado en el blog de Jim Tierney, que forma parte de los blogs de Embarcadero,  se extrañaba de que al intentar llenar los items de un componente TListBox (en tiempo de ejecución) desde una fuente de datos (un clientdataset, el numero de items añadidos al TListBox era como máximo igual o menor a 200. Y eso sucedía aun cuando dicha fuente de datos contuviera una cantidad mayor.

Esta es la entrada en la que me he basado para reproducir el problema y comprenderlo.

LiveBindings: Code to create TBindLink and fill a Listbox

Creo que lo mas interesante de estas lineas no es ya la corrección que se ha hecho para solucionar el problema, que solo ha consistido en añadir la linea de asignación en el procedimiento FillList( ) de la unidad UMain.pas

LBindList.BufferCount:= ARecordCount;

sino en destacar el punto que originaba el problema:

constructor TBindScopeDBEnumerator.Create(ABindScope: TCustomBindScopeDB;
  const AMemberName: string; ABufferCount: Integer);
begin
  FBindScope := ABindScope;
  FMemberName := AMemberName;
  FSaveActiveRecord := FBindScope.FDataLink.ActiveRecord;
  FNextRecord := FSaveActiveRecord;
  if ABufferCount > 0 then
    FBindScope.FDataLink.BufferCount := ABufferCount
  else
    FBindScope.FDataLink.BufferCount := 200;  // default to max 200 records in buffer
end;

 Al final, ese era el motivo por el que, no estando definido el valor del campo BufferCount en TBindList, cualquier movimiento hacia adelante de la estructura del enumerador, comprobaba si habia llegado al ultimo registro por lo que aunque existiera una cantida mayor en el dataset, el enlace le indicaba que había llegado al último.

:-)

En fin… cosas de los valores por defecto que supongo que sería fijado por algún motivo, porque de hecho el comentario en la misma linea corrobora que se hizo por alguna razón que ahora mismo ciertamente no comprendo.

Lo mas gracioso de todo es que pienso que esto debería por la forma en que se ha planteado afectar en tiempo de diseño por lo que quizás deberíamos comprobar que al crear una relación TBindList desde el editor de expresiones, en tiempo de diseño, el valor del campo en cuestión es correcto. Podéis hacer la prueba y comentamos en el foro. Para probarlo, simplemente acceded a la propiedad LiveBindings del TListBox y cread un nuevo enlace de tipo TBindList. Y seguidamente definid para la propiedad Format un nuevo item con los valores indicados en la rutina FillList( ). En las pruebas que he hecho, también se reproduce el error.

Tened en cuenta este punto para no caer en el problema.

 

 

unit UMain;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, Data.DB, Data.Win.ADODB,
  Datasnap.DBClient, FMX.Layouts, FMX.ListBox, FMX.Bind.Editors, Data.Bind.Components,
  Data.Bind.DBScope, Datasnap.Provider, Data.Bind.EngExt, Fmx.Bind.DBEngExt;

type
  TfrmFillListBox = class(TForm)
    lbxData: TListBox;
    bnFill: TButton;
    bnClear: TButton;
    cdsData: TClientDataSet;
    Conexion: TADOConnection;
    qData: TADOTable;
    dsData: TDataSource;
    dspData: TDataSetProvider;
    cdsDataOrderNo: TFloatField;
    cdsDataCustNo: TFloatField;
    BindScopeDB1: TBindScopeDB;
    lbRecordCount: TLabel;
    lbItemsCount: TLabel;
    BindingsList1: TBindingsList;
    procedure bnClearClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure bnFillClick(Sender: TObject);
  private
    { Private declarations }
    procedure FillLabelRecordCount;
    procedure FillLabelItemsCount;
  public
    { Public declarations }
  end;

var
  frmFillListBox: TfrmFillListBox;

implementation

{$R *.fmx}

//fuente del procedimiento: http://blogs.embarcadero.com/jimtierney
//         http://blogs.embarcadero.com/jimtierney/2011/10/03/31601
//
//  El procedimiento encapsula los pasos para rellenar distintos
//  tipos de controles, siguiendo lo que haria el usuario en tiempo de
//  diseño. Es util para el tiempo de ejecución
//
procedure FillList(AControl: TComponent; const AControlExpression: string;
  ASource: TBaseBindScopeComponent; const ASourceExpression: string; ARecordCount: Integer; const ASourceMemberName: string = '');
var
  LBindList: TBindList;
begin
  LBindList := TBindList.Create(nil);
  try
    // Turn off auto properties.
    LBindList.AutoFill := False;
    LBindList.AutoActivate := False;
    LBindList.ControlComponent := AControl;
    LBindList.SourceComponent := ASource;
    LBindList.SourceMemberName := ASourceMemberName;
    LBindList.BufferCount:= ARecordCount; //<- Linea añadida
    with LBindList.FormatExpressions.AddExpression do
    begin
      SourceExpression := ASourceExpression;
      ControlExpression := AControlExpression;
    end;
    LBindList.FillList;
  finally
    LBindList.Free;
  end;
end;

procedure TfrmFillListBox.bnClearClick(Sender: TObject);
begin
  lbxData.Clear;
  FillLabelItemsCount;
  FillLabelRecordCount;
end;

procedure TfrmFillListBox.bnFillClick(Sender: TObject);
begin
  FillList(lbxData, 'Text', BindScopeDB1, 'AsString', dsData.DataSet.RecordCount, 'OrderNo', );
  FillLabelItemsCount;
  FillLabelRecordCount;
end;

procedure TfrmFillListBox.FillLabelItemsCount;
begin
  lbItemsCount.Text:=  'Items.Count: '+IntToStr(lbxData.Items.Count);
end;

procedure TfrmFillListBox.FillLabelRecordCount;
begin
  lbRecordCount.Text:=  'RecordCount: '+IntToStr(cdsData.RecordCount);
end;

procedure TfrmFillListBox.FormCreate(Sender: TObject);

begin
  Conexion.ConnectionString:= 'Provider=Microsoft.Jet.OLEDB.4.0;'+
                              'Data Source=C:\Program Files\Common Files\CodeGear Shared\Data\dbdemos.mdb;'+
                              'Persist Security Info=False';
  cdsData.Open;

  FillLabelItemsCount;
  FillLabelRecordCount;
end;

end.

Nada mas por comentar. Si deseáis ver el ejemplo podéis acceder al siguiente enlace:

Descargar fuentes

Mi método doble valor y expresiones con LiveBindigns

enero 20, 2012 en Artículos, Delphi, Entrada Diario, LiveBindings, Noticias, Noticias Delphi, Ofertas, XE2

Durante los próximos meses, vamos a ser muchos los compañeros que tomemos contacto con áreas nuevas de nuestro entorno de desarrollo, en esa fase de acercamiento a RadStudio XE2, como pueda ser LiveBindigns, los estilos, las capacidades gráficas 2D/3D. Y es que tenemos por delante, la difícil tarea de asimilar todas estas novedades y comprender de que forma se pueden acoplar a nuestra programación diaria, o del día a día.  Y por lo menos a mí, no me queda duda de que va a ser un proceso largo y evidentemente no trivial. Esa realidad, difícilmente se puede negar o esconder. De hecho, vamos a afrontarla a medida que requiramos funcionalidades más avanzadas y confrontemos la plataforma con las necesidades reales de los proyectos. Es entonces cuando mas echaremos en falta una buena documentación y nos veremos en la necesidad de salir a la red en búsqueda de respuestas. A diferencia de etapas anteriores,  contamos con la dificultad añadida que es la ausencia de documentación o en su defecto, la deficiente calidad de la misma. Y su juventud, que hace dificilmente comparable nuestra VCL con FireMonkey, y que se manifiesta en que todavía no exista ese banco de respuestas que nos permite contrastar si la dificultad ya ha sido enfrentada por otros compañeros.  Esa es la parte mas negativa y creo que ser realista es distinto de ser agorero, actitud en la que muchos van a caer, en ese discurso fácil y destructivo.

Resaltemos también las cosas buenas: En lo positivo, está el hecho reconocido y valorado por muchos compañeros, entre ellos yo, de que Embarcadero conoce esto, es consciente de ello, -el primer paso para solucionarlo- y está haciendo un verdadero esfuerzo por dotar a la nueva plataforma de actualizaciones, que corrijan los errores que van siendo detectados y por supuesto, de nuevos ejemplos que puedan ayudar mitigando o aliviando la falta de documentación.

Estos días anteriores hemos conocido la disponibilidad de la cuarta actualización de RadStudio XE2. ¡La cuarta…! Es una prueba evidente de esa voluntad de hacer las cosas bien, que argumentaba en lineas anteriores. Nosotros siempre preferimos ver el vaso medio lleno antes que medio vacío, por lo que, fuera de la incomoda tarea de las instalaciones y la pereza de hacerlas, prevalece la necesidad de que sean corregidos y mejorados cuantos detalles mejor.

Release Notes for XE2 Update 4

Así que leed con atención las indicaciones de instalación, que son similares a las que pudimos tener en updates anteriores.

Comentaba, siguiendo un poco lo que decía, que van siendo cada vez mas frecuentes las preguntas acerca de estas novedades, pudiendo contar con alguna que otra en el foro de Delphi Solidario.

Hoy por ejemplo, se ha dejado una pregunta en el aire sobre LiveBindings y el componente TListBox, en donde se compartía un problema al llenar la lista interna TStrings que mantiene el componente, para mostrar los distintos items de selección. La persona que hacía la pregunta mostraba que tan solo había conseguido recuperar 200 registros de una tabla que almacenaba una cantidad mayor. Y realmente creo que su problema era no saber si estaba haciendo algo no correcto o era una limitación, cosa improbable aunque difícil de adivinar si no cuentas con una buena documentación o accedes a las fuentes y ves que está sucediendo realmente. Así que tenemos también nosotros, todos los que participamos en la Comunidad, la tarea de aportar toda nuestra ayuda y os invito a volcarnos en nuestros foros y participar de ellos. No me cabe la menor duda que en unos días se resolverá ese problema, ese y los sucesivos, que van a ir apareciendo desde distintos puntos de nuestra Comunidad.

Posiblemente en unos meses también contemos ya con la publicación de los libros que están ahora escribiéndose, el de Marco Cantú (en inglés) o el de Francisco Charte (en español). O se haya añadido mas detalle a la documentación actual, fruto de un nuevo Update. Tengo confianza de que sea como sea, vamos a seguir adelante, mas si prevalece el espíritu que ha marcado siempre a nuestra Comunidad hispana.

Yo, por mi parte, -ya me conocéis- también intento poner mi granito de arena, con independencia de que no siempre podamos resolver los problemas. Siempre acaba uno aprendiendo algo en ese proceso de ayuda y eso es lo verdaderamente importante.

Hace algo mas de una semana compartía con un compañero de ecuador varios correos y me pedía algún enlace al tema de livebindings y el componente TDBLookupCombo. Ya sabéis que la nueva plataforma FireMonkey nos ha dotado de un nuevo sistema de enlace a datos, livebindings, alternativo en la VCL al tradicional uso del [control-datasource-dataset], que ya conocemos. Y mientras todavía nos es factible el uso de ambos sistemas desde la VCL, en los desarrollos ligados a firemonkey solo tenemos disponibles los controles que accedan a datos a través de la nueva tecnología. Quiere decir que ya no existen ni el TDBEdit, ni el TDBLookCombo, etc. y nos valemos de cualquier componente que pueda ser compatible o que acepte el enlace a datos. Y quien dice cualquier, dice eso precisamente…  :-)

 Creo que no somos conscientes de la increíble mejora a medio/largo plazo que eso puede suponer. Es un tema de mayor calado que nos puede ayudar en la búsqueda de mejores perspectiva de la Orientación a Objetos.

De mis pesquisas sobre el tema que se me planteaba, pude contrastar algunos detalles que posiblemente podamos compartir mas adelante con algún ejemplo. El hecho es de que el componente TComboBox no se adapta correctamente a lo que podemos demandar de un TDBLookupCombo. No porque no sea capaz de desplegar una lista que lo es, sino porque precisamente le falta lo que le hace distinto: tener una fuente de datos que provea la clave primaria o key value asociada y no el item selector. Esa es la clave del asunto y que dificultaba resolver el problema. El usuario visualiza un item de una lista de alternativas y de ese proceso de selección, lo que guardamos es una clave, cumpliendo las normas habituales de normalización de tablas, de las cuales huelga comentarios.

Os muestro una imagen que compartía con él, en ese intercambio de correo:

Pruebas sobre campos lookup

Había preparado un formulario en el que existían 3 tablas muy básicas. Una con una lista de personas, otra con una lista de grupos y una tercera que se alimentaba de las dos y que las relacionaba, formando equipos de personas asignados a grupos.  Pero bueno… al final, que uno consiga poner un parche y simular el comportamiento del componente no es suficiente ni siempre es correcto. Y realmente, acababa las lineas de mi correo, comentándole que no me gustaba la solución y no la consideraba válida, quedando a la espera de encontrar alguna idea en la red o documentación.

Asumiendo el peligro de equivocarme, creo que ninguno de los enlaces o expresiones existentes, tal y como está ahora mismo, se adaptan al componente TComboBox de forma que se simule el comportamiento de un TDBLookupCombo, por cuanto aunque somos capaces de rellenar la lista de items, cosa que puede hacer el enlace TBindList, al que nos basta indicarle en la propiedad Text del TComboBox, y Value del campo vinculado al origen de datos, produciendo de forma automática que sea relleno cada item de la lista con los valores de la tabla, tropezaremos con el problema que los enlaces o expresiones van a intentar hacer una correspondencia directa entre el item selector y el campo destino. Si optamos en ese camino se mostraran advertencias del tipo: Vd. intenta guardar un string y esperaba un valor entero… ¡Mal camino!.

Otra alternativa, es la de optar por un TBinPosition, para conseguir sincronizar el itemindex del combo con valor actual de la clave guardada en la tabla. Aquí tambien nos encontraremos con un problema. En los ejemplos que usa Embarcadero, que se encuentran  en el directorio Samples/Livebindings (podéis hacer una búsqueda con el término del nombre del proyecto que agrupa los ejemplos: BindSamplesGroup.groupproj) hay uno que se pone en varios foros como muestra de trabajo con TListBox, similar al TComboBox en cuanto a la gestión de cadenas, y siempre se utiliza el enlace TBinPosition para resituar y sincronizar el recno de la tabla con el itemindex… El detalle está en este caso, es que el Recno no se utiliza y no es aplicable a lo que buscamos, porque lo que tiene sentido es el valor de la clave (FieldByName(‘IDGrupo’).AsInteger y no el valor de la propiedad RecNo del registro).  :-)   Y el itemindex muestra la posición del item seleccionado pero no existe una correspondencia con lo que nosotros hubieramos identificado con el keyvalue de cada item.

Así que ese camino esta también lleno de problemas y nos obliga a añadir al componente ComboBox varios enlaces a datos, uno para llenar la lista, otro para sincronizar desde el control a la fuente de datos y un tercero para enfocar el sentido contrario, desde la fuente de datos al componente. Todo demasiado complicado, en relación a lo sencillo que es el enlace que hubieramos planteado desde la plataforma VCL.  :-(

Pero decía también al principio de la entrada que el hecho ayudar a alguien implica también el constante aprendizaje que uno recibe y que nos hace descubrir cosas o aspectos que en principio no esperabamos. Y digo esto porque el problema realmente no ha estado en la tecnología sino en el aprendizaje de su uso.

El motor de expresiones que se ha incorporado para sostener el corazón de LiveBindings es algo que aun está por descubrir por la Comunidad y que poco a poco va a ir siendo conocido a medida que vayamos teniendo buena documentación y aprendamos como valernos de él, en lugar de luchar contra él.

Alguien pensaría que los métodos que en tiempo de diseño nos muestra el entorno y que podemos utilizar para generar las expresiones va a ser algo inmutable y nada mas lejos de la realidad. Vamos a ver un ejemplo muy sencillo adaptado sobre los que acompañan a la unidad System.Bindings.Methods y que va a permitir que sea calculado el valor doble del introducido en un casilla cualquiera.

 

Mi método Doble Valor

unit UMyMethod;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, System.Bindings.Methods,
  System.Rtti, System.TypInfo, System.Generics.Collections, System.Bindings.Evaluator,
  System.Bindings.ObjEval, System.Bindings.EvalProtocol, System.Bindings.Consts,
  FMX.Edit, Data.Bind.EngExt, Fmx.Bind.DBEngExt, System.Bindings.Outputs,
  Data.Bind.Components, Fmx.Bind.Editors;

resourcestring
  sInvalidValueError = 'Valor no aplicable a la operación';

type
  TfrmDobleValor = class(TForm)
    edValor: TEdit;
    edDobleValor: TEdit;
    lbDobleValor: TLabel;
    lbValor: TLabel;
    BindingsList1: TBindingsList;
    BindExpressionedDobleValor1: TBindExpression;
    Label1: TLabel;
    procedure edValorChange(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmDobleValor: TfrmDobleValor;

implementation

{$R *.fmx}

function MakeMethodDoubleValue: IInvokable;
var
  str: String;
begin
  Result := MakeInvokable(function(Args: TArray): IValue
  var
    v1: IValue;
    LExt: Extended;
  begin
    if Length(Args) <> 1 then
      raise EEvaluatorError.Create(sFormatArgError);
    v1 := Args[0];
    str:= Trim(v1.GetValue.AsString);
    //manejamos el caso de valor vacio
    if v1.GetValue.IsEmpty then
      Exit(TValueWrapper.Create(nil))
    else
    begin
       if TryStrToFloat(str, LExt) then
         Exit(TValueWrapper.Create(LExt * 2))
       else raise EEvaluatorError.Create(sInvalidValueError);
    end;
  end);
end;

const
  sIDDoubleValue = 'DoubleValue';

 
procedure RegisterMyMethod;
begin
  TBindingMethodsFactory.RegisterMethod(
    TMethodDescription.Create(
      MakeMethodDoubleValue,        //AInvokable:IInvokable
      sIDDoubleValue,               //AID
      sIDDoubleValue,               //AName
      '',                           //AUnitName
      True,                         //ADefaultEnabled
      '',                           //ADescription
      nil));                        //AFrameworkClass
end;

procedure UnRegisterMyMethod;
begin
   TBindingMethodsFactory.UnRegisterMethod(sIDDoubleValue);
end;

procedure TfrmDobleValor.edValorChange(Sender: TObject);
begin
 BindingsList1.Notify(edValor, 'Text');
end;

initialization
  RegisterMyMethod;

finalization
  UnRegisterMyMethod;

end.

Descargar fuentes

La moraleja de la historia creo que se adivina: Cuando caía hace un par de días sobre dicha unidad (System.Bindings.Methods), fruto de querer resolver el problema, y podía ver como se habían generado las expresiones del editor, y realmente apreciaba la “facilidad” que existía en crearlas y usarlas, y la potencia que podía aportar, sin tener que depender de la que mostraba el editor, sino crearme las propias expresiones, me hacía también suponer que se abrían alternativas, pudiendo generar adicional mente vías para entiquecer el flujo de datos entre el componente y la fuente, que era precisamente lo que ahora pienso que me impedía resolver el problema. Posiblemente, la expresión que recorre la tabla para llenar la lista pueda adicionalmente rellenar los valores de las claves o keyvalues, por lo que no necesite mas de dos enlaces entre ellos: el que alimenta la lista de cadenas y el que hace corresponder una clave con un valor en la tabla, mostrando el texto selector.

Nada mas por hoy. Un abrazo a todos y estamos de vuelta para pelear por la Comunidad. Si hay algo que nadie puede prohibirme es seguir aprendiendo y disfrutando de ello.

Enlaces sobre el tema imprescindibles:

http://www.jcolibri.com/articles/firemonkey/livebindings_delphi_xe2/livebindings_delphi_xe2.html

http://www.danieleteti.it/2011/08/30/in-the-core-of-livebindings-expressions-of-rad-studio-xe2/

http://neftali.clubdelphi.com/?p=1783

Videos demostrativos Firemonkey – Demos (Danysoft)

noviembre 29, 2011 en 64bits, Comunidad, Delphi, Enlace interesante, FireMonkey, Nos deja la semana..., Seminario web, Videos, XE2

 

Con fecha de hoy, Danysoft ha subido a YouTube dos vídeos demostrativos, que sin duda os van a parecer interesantes y es por eso el remarcarlos aquí e incluirlos en esta entrada.

Ambos son parte de la misma sesión: El primero de ellos aborda el tema de Firemonkey desde la perspectiva de Windows, mostrando algunas posibilidades de la plataforma,  como efectos y calidad gráfica propia de los nuevos componentes y del uso de la GPU. El segundo vídeo prosigue la ejecución de la demo en el lado del compilador para Mac, mostrando la ejecución del programa en el simulador de iPhone.

Ya he añadido, igualmente, los enlaces al grupo de Facebook Delphi Solidario, para quienes estáis siguiendo el día a día en él. Gran trabajo el que está haciendo el partner español de Embarcadero, Danysoft, al generar esta colección de recursos que van quedando disponibles para todos nosotros.

Que los disfrutéis.

 

Parte 1.

Rad Studio XE2 | FireMonkey | demo windows

Parte 2.

Rad Studio XE2 | FireMonkey | demo Mac

 

Ultima promoción de Danysoft para RadStudio XE2

noviembre 15, 2011 en 64bits, Delphi, Noticias, Noticias Delphi, Ofertas, Promociones, updates, XE2

Os incluyo en la tabla inferior un detalle de la ultima oferta de Danysoft para RadStudio XE2.

Uno de los aspectos interesantes de la misma, fuera de lo que es el producto en si, es que la oferta permite hasta el 30 de Diciembre y con carácter extraordinario,  actualizarse desde versiones anteriores a Delphi 2007,  desligándose de las condiciones habituales que marcan el fin del derecho de actualizaciones y la obligación de la compra de nueva licencia.

Me ha parecido que se puede resaltar y por ello os incluyo el texto íntegro de la pagina de Danysoft. Para mas información sobre la misma podeis contactar en los enlaces que se detallan.

 

DETALLE DE LA ULTIMA PROMOCIÓN DE DANYSOFT PARA RADSTUDIO XE2

Ver pagina Danysoft: Actualización Delphi, C++Builder, RAD Studio 2006 y versiones anteriores Texto inferior extraído de la oferta existente en dicha páginaimage

 

Fecha oferta: 15/11/2011

 

Actualización Delphi, C++Builder, RAD Studio 2006 y versiones anteriores

Si dispones de Delphi, C++Builder, o RAD Studio 2006 o de una versión anterior, aprovecha esta oportunidad única y actualiza tu software, consiguiendo todas las ventajas de la versión XE2 a un precio increíble. Aprovecha esta oportunidad antes del 30 de diciembre de 2011 solo con Danysoft.


Oportunidad especial para actualizar Delphi, C++Builder, RAD Studio 2006 y versiones anteriores

Si eres usuario registrado de Delphi, C++ Builder, Borland Developer Studio 2006, o de una versión anterior, ahora tienes otra oportunidad para conseguir la nueva versión XE2 con un descuento de hasta el 45% respecto al precio del producto nuevo, pero solo hasta el 30 de Diciembre de 2011.

Además de este descuento, al realizar ahora la compra, también disfrutarás de una promoción especial y obtendrás FastCube, Rapid SQL y más herramientas de análisis de forma totalmente gratuita (valoradas en 2935€), dependiendo de la actualización escogidaclick aquí para más información.

La versión XE2 de estos productos es la más avanzada hasta el momento, los desarrolladores reconocen las nuevas capacidades de la versión XE2, la nueva versión de 64-bits desarrollada para Windows. Además el mismo código fuente es utilizado tanto para Windows como para Mac en Delphi y C++. También se están consiguiendo nuevos desarrollos para móviles en iOS y Android con RadPHP(parte de RAD Studio XE2).

Si eres usuario de Delphi o C++ Builder, tu puedes actualizar a la versión XE2 de tu herramienta o conseguir RAD Studio. Si tu eres usuario de Borland Developer Studio, puedes actualizar a RAD Studio XE2 el cual incluye la nueva versión XE2 de Delphi, C++Builder, Embarcadero Prism para .NET y RadPHP para web y dispositivos moviles. También puedes cambiar el tipo de tu edición, por ejemplo con tu versión profesional, puedes actualizar tanto a profesional como a enterprise de XE2.

Si observas algunas de las posibilidades que ofrecemos de actualización, podrás ver que es solo para versiones 2007 en adelante, pero no te preocupes gracias a esta promoción podrás conseguir cualquier actualización desde cualquier versión, pero solo antes del 30 de Diciembre de 2011. Por ello no dejes pasar esta oportunidad, ya que a partir de 2012 para conseguir la versión de XE2 o futuras versiones tendrás que adquirirlo como producto nuevo.

XE2

Productos que puedes actualizar

Usuarios de las versiones 2006 o anteriores que hayan comprado cualquiera de los productos:

• Delphi
• C++Builder
• Borland Developer Studio
• Delphi for .NET
• C#Builder
• Kylix
• Turbo Delphi Professional
• Turbo C++ Professional

Todas las actualizaciones regulares de Delphi XE2, C + + Builder XE2 y RAD Studio XE2 están disponibles para versiones 2007 y posteriores. La actualización de “Starter” SKUs no está incluida. Esta promoción es solo para Delphi, C + + Builder y RAD Studio. Contacta con Danysoft para más información.

Más información condiciones actualización

Adquirir Actualización Delphi, C++Builder, RAD Studio 

 

Testeando XE2 (FastReport)

noviembre 14, 2011 en Delphi, Entrada Diario, fastreport, XE2

Estas semanas anteriores, compartimos algunos mensajes en el muro de DelphiSolidario que hacían referencia a FastReport. Se cruzaron bastantes comentarios, muy interesantes, en la linea de valorar esta suite de componentes de impresión frente a otras disponibles para nuestro entorno también como: QReport, RaveReports o ReportBuilder y, tras la lectura de la discusión, me pareció un tema interesante para esta entrada del blog, donde pudieramos conocer algunos detalles de la versión que se ha incluido en el IDE.

Quizás la peor parada de aquella discusión fuera RaveReports. Yo he estado un tiempo utilizándola pero sinceramente, si las sucesivas versiones de RadStudio siguen incluyendo FastReport me quedaría sin duda con esta última. RaveReports me pareció un poco rebuscada y oscura, frente al uso del resto citado. Si bien, QReport tradicionalmente es quizás la mas conocida, pues nos acompañó durante muchos años, entre ReportBuilder y FastReport  la balanza está mas equilibrado y puestos a invertir las dos pueden ser una buena inversión. Pero claro, si el ide nos trae una versión estandar en mi opinión cobra ventaja Fast Report.

Tomad estos comentarios simplemente como una opinión personal ya que fueron diversas y razonables todas las opiniones que se compartieron en el muro de facebook.

Para empezar os contaré que lo primero que hice fue abrir el entorno de RadStudio XE2 para comprobar si efectivamente incorporaba FastReport en la paleta de componentes. Y mi sorpresa fue darme cuenta de que no aparecía por ningún lado…, lo cual me hacia suponer que estaria disponible para la descarga y así fue.

Lógicamente, su descarga esta condicionada a los usuarios registrados de RadStudio XE2, que pueden acceder al enlace:

 ID: 28514, FastReport VCL 4 RAD Edition for Delphi and C++Builder XE2

Editor

Tras la descarga del ejecutable, la instalación  no merece ninguna reseña especial, y hecha ésta, podremos acceder a los componentes instalados en nuestra paleta de componentes, ya listos para su uso. La instalación automatizada, hace los detalles que a veces quedan olvidados como añadir las rutas de las fuentes en el directorio de instalación. También ha creado unas entradas en el menú inicio donde podemos acceder a un pdf con la documentación de uso “FastReport User Manual”, básica para comprender e iniciarse en el diseño de los informes. Asimismo, y me parece una muy buena idea, tenemos a la mano una demo compilada de los distintos tipos de informes.

Esta es una imagen del ejecutable que contiene la demo.

FastReport Demo

Y finalmente, también podemos acceder al compilador de recursos que nos va a permitir que los informes se nos muestren en el idioma deseado. Esta opción es otro de los detalles que me gustan de FastReport, que nos permite fácilmente y sin problemas recompilar los recursos y cargar los adecuados al idioma que va a mostrar el informe.

Compilador de recursos

Ehhhhhhhhh…. ya os disteis cuenta. La opción de RadStudio XE2 no aparece por ningún lado, por lo que el siguiente paso fue averiguar -cual astuto detective – qué tenía que hacer en ese caso.  :-(    Ciertamente, este detalle da una idea de que la adición de los componentes a nuestro IDE se hizo con cierta premura si atendemos a los dos detalles comentados: que no se incluya en la release del producto y que existan detalles como éste que no ha dado tiempo a resolver (aunque os diría aun así creo que vale la pena que se haya incluido porque es un producto muy bueno y de gran calidad).

En fin… vamos a husmear un poco:

http://www.fast-report.com/en/forum/index.php?showtopic=8406

Si atendéis a los comentarios no parece que tengan claro cuando van a facilitar el nuevo exe y de momento las respuestas van en la linea de hacer este proceso de forma manual.

No os preocupéis para los que no tengáis demasiada experiencia en el tema. Es muy sencillo y mi consejo es que primeramente accedáis a la carpeta [Res] donde FastReport guarda los recursos para los distintos  idiomas.

C:\Program Files\FastReports\FastReport 4 Embarcadero edition\Res

Los pasos son sencillos (los teneis en el archivo install_res.txt)

1. Remove the following files from the FastReport 4\Lib folder:
- frxrcClass.dcu
- frxrcDesgn.dcu
- frxrcInsp.dcu
- frxrcExports.dcu

2. Go folder with desired language and run mk.bat file. This will make
.pas files from .frc files and copy them to all necessary FR folders.

3. Recompile the FastReport packages (see install.txt file,
  section III or IV). Only frx*.dpk, frxe*.dpk packages need to
  be recompiled ('*' = your Delphi version).

Eliminar los cuatro archivos indicados en el paso 1. Acceder a la carpeta concreta del idioma que deseamos recompilar y el archivo de lotes mk.bat en el paso 2 y finalmente, recompilar los paquetes que indica en el paso 3.

No obstante, yo en el pequeño ejemplo que vamos a compartir he optado por una solución intermedia, de forma que voy a cargar los recursos dinámicamente, tal y como se indica en el interior del archivo de lotes mkall.bat

Para ello, basta incluir la llamada a la función

uses frxRes;
frxResources.LoadFromFile('english.xml');

Sustituir ‘english.xml‘ por el nombre del archivo de recursos que vais a cargar. Y ¡voila!. Trabajo hecho. Ah. Olvidaba decir que previamente debéis de ejecutar mkall.bat para que se genere un xml que contiene todos los recursos (con extensión frc) y que es precisamente el que vais a usar para cargar el idioma español.

En esta imagen, podéis ver el contenido de la carpeta Spanish

directorio de recursos

 Con estos comentarios vais a poder iniciar los primeros pasos sin problemas. Pero bueno… ya que estamos metidos en harina me preguntaba si os apetece curiosear un poco mas y escribimos unas lineas de código.

Bien. Vamos a investigar un poco y el próximo día lo compartimos…

Que tengáis una buena semana.