Construir una App de escritorio OSX paso a paso

Logo MVP

La tercera parte de ésta serie de artículos corresponde a la creación de una aplicación OSX utilizando los mismos componentes y el mismo código que se ha utilizado para otros ambientes, como lo hemos visto ya en los artículos anteriores Construir una App iOS paso a pasoConstruir una App de escritorio Metrópolis paso a paso.

Sin más preámbulo, comencemos por abrir un nuevo proyecto, seleccionando la opción «Firemonkey Desktop Application» como se muestra en la siguiente imagen.

OSX-01

Seleccionamos el tipo de aplicación Firemonkey, en éste caso selecioné una aplicación HD y presionamos OK.

OSX-02

Por omisión Delphi nos sugiere aplicaciones Windows 32 bits, lo que tenemos que hacer es agregar la plataforma para OSX, clic derecho en Target Platfforms, Add y nos mostrará una ventana donde podremos seleccionar la plataforma OSX, aceptamos y ya podemos comenzar a copiar y pegar los componentes y el código que ya tenemos en las otras aplicaciones que hemos desarrollado.

OSX-03

He decidido copiar los componentes de la aplicación Metrópolis de nuestro artículo anterior. Simplemente seleccionamos el componente TListBox el cual contiene todos los componentes necesarios, así como los componentes TButton. Al hacer ésto es posible que se modifique la estética de los objetos, sin embargo, es cosa de acomodar las propiedades necesarias para que tenga una bena apariencia.

OSX-04

Una vez que adaptamos visualmente la forma, ya estámos listos para copiar el código de todos y cada uno de los objetos de  nuestra aplicación.

OSX-05

Lo único relevante de éste copiar y pegar código y para que no se nos muestre un error en el momento de correr nuestra aplicación OSX, es necesario hacer una pequeñísima modificación en la lectura del archivo XML que nos entrega el servicio Web que estamos consumiendo.

 
  //Indice 1 para el nodo hijo
  //en iOS y OSX se utiliza 0

  //Antes
  dsNode := xml.ChildNodes[1].ChildNodes[1];
  //Después
  dsNode := xml.ChildNodes[0].ChildNodes[1];

Con ésto hemos terminado nuestra aplicación y antes de correrla nos aseguramos que el ambiente en nuestra MAC está listo para conectarse, es decir, nos aseguramos que la aplicación  PAServer está en ejecución.

Si todo sale bien entonces podremos ver que nuestra aplicación funciona perfectamente en una plataforma más.

OSX-06

OSX-07

En la imagen que vemos a continuación podemos observar la información de la aplicación que Delphi nos ha generado y ahora sé que Delphi genera un archivo .app, el cual contiene todo lo necesario para que se pueda ejecutar sin problema.

OSX-08

Con ésto hemos terminado éste artículo, espero que les sea útil y ya sólo nos falta desarrollar la aplicación de escritorio para windows, la cual tengo pensado hacerla en 32 y 64 bits.

Como dato informativo, hacer ésta aplicación fué muy rápido ya que sólo es copiar, pegar, ordenar y compilar, qué más se puede pedir 🙂

Los otros tres artículos de la serie son:

Happy coding!!!!

Descargas


Si lo deseas puedes descargar el código fuente de ésta entrada, espero sea de utilidad.

[download id=»14″]
[download id=»15″]


Ésta entrada y el código fuente son libres para su uso y publicación, lo único que te pido, si te parece justo, es mencionar la fuente de donde se obtuvo.

Construir una App de escritorio Metrópolis paso a paso

Hola amigos, tal como lo mencioné en el artículo anterior Construir una App iOS paso a paso, intento demostrar que se puede desarrollar diferentes aplicaciones con los mismos componentes y con el mismo código base, y en ésta entrega le toca el turno a una aplicación estilo Metrópolis.

Por supuesto, habrá algunas cosas que van a ser diferentes, agregando o descartando algunos objetos y/o algo del código base y ésto porque estamos «migrando» de una aplicación móvil a una aplicación de escritorio, pero nada de que preocuparse, al final podrán sentirse cómodos con la forma como podremos solucionar los requerimientos de nuestros clientes sin tener que aprender otro lenguaje de programación.

Éste artículo mostrará como migrar el código hecho para un iPhone a una aplicación estilo Metrópolis. Para ello, comenzaremos por lo básico, que es, crear nuestra forma METRO, lo cual es realmente sencillo y lo mostraré a través de imágenes.

Seleccionamos Aplicación Metrópolis Firemonkey:

Seleccionamos una Aplicación FireMonkey en Blanco:

Ya tenemos nuestra «Blank Form» lista para comenzar:

Ya estamos listos para comenzar a migrar los componentes y el código a nuestra nueva aplicación, y para ello utilizaremos el método C&P, es decir, Copiar y Pegar. Abrimos nuestra aplicación anterior y copiamos el componente ListBox, el cual, contiene los componentes que necesitamos para que nuestra aplicación pueda funcionar.

Lo primero que podemos observar que las banderas que se tenían en nuestra aplicación anterior no fueron mostradas en ésta forma, parece que vamos a trabajar un poquito más en ésta migración, pero nada de que preocuparse.

Para preparar nuestra interfáz gráfica, agregamos 1 TButton, modificamos el estilo de los botones, el color de los textos y el tamaño de los campos numéricos. Además ajustamos la posición de los textos para colocar las banderas de cada una delas monedas.

Agregamos 7 objetos TImage y asignamos la bandera de cada una de las monedas.

Ya tenemos todo listo para comenzar a migrar el código a nuestra aplicación.

1.Comenzamos por agregar la unidad DgieWS.pas a nuestro proyecto, ésta unidad la encuentran en el directorio de nuestra aplicación anterior.
2. Copiamos las unidades requeridas al USES de nuestra aplicación.

//Unidades adicionales
System.StrUtils, XMLDoc, XMLIntf, DgieWS;

3. Copiamos las variables requeridas a nuestra aplicación

 
//Variables de trabajo
Servicio: DgieWSPort;
Index: integer;
ParidadSel: currency;
TC, ValorME: string;
Valor: Currency;

4. Copiamos cada uno de los métodos de los TListBoxItem’s a nuestra aplicación.

 
  TC := StringReplace(label1.Text,'

5. Modificamos la línea de asignación de las imagenes en cada uno de los métodos de los TListBoxItem’s

 
  //Éste
  lbMonedaExt.ItemData.Bitmap := (Sender as TListBoxItem).ItemData.Bitmap;
  //Por éste
  Image6.Bitmap := Image1.Bitmap;

6. Copiamos el código del método OnClick del TButton para consumir el Servicio Web de Banxico a nuestra aplicación.

 
procedure TForm1.Button2Click(Sender: TObject);
var
  Retorno: string;
  xml: IXMLDocument;
  dsNode: IXMLNode;
  ID: String;
  Paridad: Currency;
  ParidadStr: string;
  I: Integer;
begin
  Servicio := GetDgieWSPort(true, '', nil);
  retorno := Servicio.tiposDeCambioBanxico;
  xml := NewXMLDocument();
  xml.XML.Text := retorno;
  xml.Active := true;
  //Indice 1 para el nodo hijo, en iOS se utiliza 0
  dsNode := xml.ChildNodes[1].ChildNodes[1];
  if dsNode <> nil then
  for I := 0 to dsNode.ChildNodes.Count - 1 do
  begin
    if dsNode.ChildNodes[I].HasChildNodes then
    begin
      ParidadStr := dsNode.ChildNodes[I].ChildNodes[0].AttributeNodes.Nodes['OBS_VALUE'].NodeValue;
      if ParidadStr <> 'N/E' then
      begin
        Paridad := strtofloat(ParidadStr);
        ParidadStr := format('%3.4m',[Paridad])
      end
      else
        ParidadStr := 'No Disponible';
      ID := dsNode.ChildNodes[I].AttributeNodes.Nodes['IDSERIE'].NodeValue;
      case AnsiIndexStr( ID,['SF43718', 'SF46410', 'SF60632', 'SF46406', 'SF46407']) of
        0: label1.Text := ParidadStr;
        1: label3.Text := ParidadStr;
        2: label2.Text := ParidadStr;
        3: label4.Text := ParidadStr;
        4: label5.Text := ParidadStr;
      end;
    end;
  end;
end;

7. Copiamos el método OnExit del objeto TEdit2 a nuestra aplicación

 
procedure TForm1.Edit2Exit(Sender: TObject);
begin
  valorME := StringReplace(edit2.Text,'

Con ésto terminamos de copiar todo lo necesario para que nuestra aplicación compile y sea ejecutada.

Sí, así de fácil es crear diferentes aplicaciones con los mismos componentes y el mismo código. Ustedes pueden comprobarlo creando sus propias aplicaciones.

Metro07

Metro08

Los otros tres artículos son:

Happy coding!!!!


Descargas

Si lo deseas puedes descargar el código fuente de ésta entrada, espero sea de utilidad.


Ésta entrada y el código fuente son libres para su uso y publicación, lo único que te pido, si te parece justo, es mencionar la fuente de donde se obtuvo.

Construir una App iOS paso a paso

Hola amigos, en ésta ocasión vamos a desarrollar una aplicación para iOS paso a paso, para éste artículo usaremos la interfaz de un iPhone5, pero bien pueden hacerlo para iPhone estándar y/o para iPad.

Antes de comenzar éste tutorial, quiero comentar, que es requisito contar con una MAC o al menos un servicio como el macincloud para poder compilar y ejecutar nuestra aplicación móvil.

Como ya es mi costumbre, vamos a desarrollar un cliente que consuma un Servicio Web pero desde un dispositivo móvil, vamos a tomar el ejemplo que publiqué hace unos meses (Probando Delphi for iOS) del cual no pude hablar más a fondo debido a que aún era un producto beta pero que me sirvió mucho para aprender un poco de ésta nueva característica que cuenta la más reciente versión de Delphi.

Lo primero que vamos a hacer es crear una aplicación Delphi para Móvil con Firemonkey como se muestra en la siguiente imagen:

Acto seguido, Delphi nos muestra una ventana con diferentes  plantillas de aplicaciones móviles con FireMonkey, donde elegiremos para efectos de éste ejercicio, la plantilla que contiene encabezado y pié de página.

Posteriormente y antes de comenzar a desarrollar nuestra aplicación,  Delphi nos muestra un experto que  nos ayudará a configurar el ambiente de desarrollo para la construcción de aplicaciones móviles para iOS, es decir, como configurar la MAC y RAD Studio para trabajar en conjunto.

Pueden seguir éste excelente artículo de mi buen amigo Germán Estévez (Neftalí) para configurar el entorno de trabajo iOS.

Minimizamos o cerramos el experto y tendremos ya nuestra forma lista para comenzar a escribir nuestra primera aplicación móvil para iOS.

Comenzamos por elegir el dispositivo para el cual vamos a desarrollar nuestra aplicación móvil. En mi caso elegí el iPhone5.

También colocamos un texto en el encabezado de nuestra forma, éste ejemplo será un conversor de monedas a través del consumo de un Servicio Web creado por el Banco de México, el cual nos proporciona el tipo de cambio de algunas monedas.

Ahora necesitamos decidir que objetos vamos a colocar en nuestra forma, en mi caso decidí colocar los siguientes:

  • 1 TListBox
  • 7 TListBoxItem’s
  • 2 TListBoxGroupHeader’s
  • 5 TLabel’s
  • 2 TEdit’s

También conseguí 6 banderas de los países que vamos (en éste ejemplo) a disponer de paridad cambiaria contra el peso mexicano.

Después de agregar los objetos y acomodarlos según me pareció adecuado, nos ha quedado como se muestra en la imagen.

  El primer paso es agregar el TListBox a nuestra forma y configuramos las siguientes propiedades:

  • GroupingKind = gsGrouped
  • StyleLookup = transparentlistboxstyle

Damos clic derecho del mouse en el ListBox donde nos mostrará un menú emergente donde seleccionaremos la opción AddItem y agregamos:

  • 7 TListBoxItem’s
  • 2 TListBoxGroupHeader’s

Continuamos agregando imágenes a los TListBoxItem; en éste ejemplo utilizaremos banderas de cada país del cual se tiene paridad cambiaria con el Peso mexicano, damos clic en la propiedad ItemData del TListBoxItem, damos clic en la propiedad BitMap y nos mostrará una ventana donde podrémos seleccionar la imagen que deseamos. También editamos el texto que se va a mostrar en la propiedad Text.

Adicionalmente colocamos los 2 TEdit y las 5 TLabel como se muestra en la imagen siguiente:

El siguiente paso es  generar nuestra clase que consumirá el Servicio Web del Banco de México y que nos proporcionará las paridades o tipos de cambio de las monedas que vamos a utilizar en nuestra aplicación, el WSDL de éste servicio web es el siguiente:

http://www.banxico.org.mx/DgieWSWeb/DgieWS?WSDL

Vamos a utilizar la forma tradicional de importar el WSDL a nuestra aplicación con el importador de WSDL como se muestra a continuación:

Éste importador genera el código necesario para poder consumir el servicioWeb y ya sólo nos resta escribir el código para que nuestra aplicación se conecte y nos muestre las paridades para cada una de las monedas seleccionadas y usarlas para convertir la cantidad de la moneda extranjera al peso mexicano. Por supuesto, ustedes pueden utilizar otro proveedor de paridades para ajustarlo a su moneda.   Ya tenemos todo para comenzar a escribir nuestro código.

Y como todo lo nuevo, hay algunos detalles que hay que tomar en cuenta a la hora de escribir nuestro código,

por ejemplo:

¿Cómo hacer que nuestra aplicación se ajuste en la pantalla para que no se encime en los contoles donde vamos a capturar el monto a convertir?.

La solución la encontré en uno de los ejemplos que vienen con delphi y se llama «ScrollableForm» el cual se encuentra en el directorio «RAD Studio\11.0\Samples\FireMonkeyMobile».

Se requirió de agregar dos componentes más, un TVertScrollBox y un TLayout para poder ajustar la pantalla cuando se intenta escribir en los controles sin que interfiriera el teclado numérico.

 

{******************************************************************************}
{  código para ajustar los objetos cuando se muestra el teclado en la pantalla }
{******************************************************************************}

procedure THeaderFooterForm.RestorePosition;
begin
  VertScrollBox1.ViewportPosition := PointF(VertScrollBox1.ViewportPosition.X, 0);
  Layout1.Align := TAlignLayout.alClient;
  VertScrollBox1.RealignContent;
end;

procedure THeaderFooterForm.UpdateKBBounds;
var
  LFocused : TControl;
  LFocusRect: TRectF;
begin
  FNeedOffset := False;
  if Assigned(Focused) then
  begin
    LFocused := TControl(Focused.GetObject);
    LFocusRect := LFocused.AbsoluteRect;
    LFocusRect.Offset(VertScrollBox1.ViewportPosition);
    if (LFocusRect.IntersectsWith(TRectF.Create(FKBBounds))) and
       (LFocusRect.Bottom > FKBBounds.Top) then
    begin
      FNeedOffset := True;
      Layout1.Align := TAlignLayout.alHorizontal;
      VertScrollBox1.RealignContent;
      Application.ProcessMessages;
      VertScrollBox1.ViewportPosition :=
        PointF(VertScrollBox1.ViewportPosition.X,
               LFocusRect.Bottom - FKBBounds.Top);
    end;
  end;
  if not FNeedOffset then
    RestorePosition;
end;

procedure THeaderFooterForm.FormCreate(Sender: TObject);
begin
  VertScrollBox1.OnCalcContentBounds := CalcContentBoundsProc;
end;

procedure THeaderFooterForm.FormVirtualKeyboardHidden(Sender: TObject;
  KeyboardVisible: Boolean; const Bounds: TRect);
begin
  FKBBounds.Create(0, 0, 0, 0);
  FNeedOffset := False;
  RestorePosition;
end;

procedure THeaderFooterForm.FormVirtualKeyboardShown(Sender: TObject;
  KeyboardVisible: Boolean; const Bounds: TRect);
begin
  FKBBounds := TRectF.Create(Bounds);
  FKBBounds.TopLeft := ScreenToClient(FKBBounds.TopLeft);
  FKBBounds.BottomRight := ScreenToClient(FKBBounds.BottomRight);
  UpdateKBBounds;
end;

procedure THeaderFooterForm.CalcContentBoundsProc(Sender: TObject;
  var ContentBounds: TRectF);
begin
  if FNeedOffset and (FKBBounds.Top > 0) then
  begin
    ContentBounds.Bottom := Max(ContentBounds.Bottom,
                                2 * ClientHeight - FKBBounds.Top);
  end;
end;
{******************************************************************************}

Scroll Vertical para reajustar la pantalla

Otro detalle era pasar el monto, la bandera y el texto de cada moneda, lo cual fué algo simple de resolver pasando las propiedades al seleccionar la moneda deseada hacia el objeto destino.

 
procedure THeaderFooterForm.lbDolarUSAClick(Sender: TObject); 
begin 
  TC := StringReplace(label1.Text,'

Escribimos el código necesario en el evento OnExit del Edit donde capturamos la cantidad a convertir para que nos muestre el valor en peso de acuerdo a la moneda seleccionada.

 
procedure THeaderFooterForm.Edit2Exit(Sender: TObject);
begin
  valorME := StringReplace(edit2.Text,'

Compilamos y Delphi XE4 hace su trabajo generando todo lo necesario para que nuestra aplicación sea ejecutada en el simulador.

Convertimos dólares a pesos

Convertimos Euros a pesos

Con ésto hemos terminado el primer artículo de una serie que intentará demostrar que se puede desarrollar 4 aplicaciones diferentes utilizando los mismo componentes y el mismo código, espero no defraudarlos 🙂

Los otros tres artículos son:

Happy coding!!!!

Descargas


Si lo deseas puedes descargar el código fuente de ésta entrada, espero sea de utilidad.

Ésta entrada y el código fuente son libres para su uso y publicación, lo único que te pido, si te parece justo, es mencionar la fuente de donde se obtuvo.