Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   FireMonkey (https://www.clubdelphi.com/foros/forumdisplay.php?f=50)
-   -   ¿Como construir una aplicación multiplataforma? (https://www.clubdelphi.com/foros/showthread.php?t=91509)

rcarrillom 21-02-2017 23:56:08

¿Como construir una aplicación multiplataforma?
 
Un saludo

La pregunta va más para los compañeros que ya han desarrollado con Firemonkey: hasta ahora no había desarrollado para multi dispositivos y me toca realizar un proyecto nuevo para que corra en Windows, OSX, iOS, Android. Con la plataforma Windows estaba acostumbrado al manejo de ventanas modales, MDI, y uso el framework básico Un día con los mayores . Me comentan que el ventaneo en móviles ya no se maneja igual, que las ventanas modales ya no existen como tal y me sugieren el modelo: Una sola ventana (MainForm) y ahí incrustar Frames bajo demanda.

La aplicacion es un CRUD que correrá en equipos de sobremesa para alimentar los datos de un POS, pero tambien sobre tablets, celulares están descartados. El diseño es un menú tipo lista a la Izquierda y deja libre el resto de la pantalla. Originalmente lo requerian para Win, Mac y el tema de ventaneo no era problema, incluyeron las tablets y ya cambió todo.

Cómo han diseñado las aplicaciones internamente? Qué técnicas usan para el manejo de ventanas o frames? Si alguien ha adaptado este Framework para Firemonkey y móbiles le agradeceria me orientara para igual usarlo con Datasnap REST.

Gracias de antemano

AgustinOrtu 22-02-2017 00:38:16

Desconozco totalmente el framework que comentas, aun asi te comparto mi opinion.

Uno de los paradigmas mas populares es tener el MainForm como comentas y ponerle un TTabControl. Aca un pequeño tutorial


A mi particularmente me gusta ocultar las pestañas, seteando la propiedad TabPosition al valor TTabPosition.None

De este modo la unica forma de navegar es hacerlo programaticamente (es decir, cambiando la propiedad ActiveTab o bien por el indice, usando TabIndex). Nuevamente mi estilo preferido de hacerlo es usando el metodo SetActiveTabWithTransition ya que de este modo se realiza la tipica animacion deslizante y queda mucho mas elegante. Tambien es posible usar descendientes especializados de TAcion, tales como TNextTabAction y TPreviousTabAction

Ejemplo aca

Luego lo que suelo hacer es crear un menu (inspirado en los de las aplicaciones de Google), para esto utilizo TMultiView. Acá hay un ejemplo y si revisas en los ejemplos que vienen con Delphi todavia hay mas. Tipicamente dentro del TMultiView metes botones o un listbox o algo que implemente un menu. Luego conectas cada menu con el TAction que muestra el Frame que corresponda o bien escribes eventos estilo OnClick

Luego lo que sigue es tanto meter TFrames como comentas o si quieres TForms dentro de las pestañas. En Firemonkey tenes gran flexibilidad a la hora de crear controles compuestos, porque cualquier control puede ser contenedor de otros controles. Esto hace posible que puedas meter un Frame entero dentro de un TTabItem. Para hacerlo basta con tener un procedimiento asi, en donde en realidad se puede escribir de esta manera para que sea mas flexible:

Código Delphi [-]
procedure EmbedControl(const Target: TControl; const Parent: TFmxObject);
begin
  while Target.ControlsCount > 0 do
    Target.Children[0].Parent := Parent;
end;

Luego para crear los Form/Frame bajo demanda basta con utilizar propiedades dentro de tu Form principal, de este estilo:

Código Delphi [-]
function GetFrameXXX: TFrameXXX;
begin
  if not Assigned(FFrameXXX) then
  begin
    FFrameXXX := TFrameXXX.Create(Self);
    // incrustar en pestaña correspondiente
    EmbedControl(FFrameXXX, TabControl1.Tabs[Indice]);
  end;

  Result := FFrameXXX;
end;

Si lo que queres es ahorrar memoria al maximo, quiza lo ideal sea realizar la creacion del Frame cuando realizas el cambio de pestaña (es decir, cuando hacen click en el menu, creas el Frame, lo incrustas en la nueva pestaña y luego cambias la pestaña activa) y no mantener variables de instancia

Con respecto al acceso a datos y CRUD, no hay diferencias en cuanto a la programacion multicapas con la VCL. Sigues accediendo al servidor DataSnap a traves de la clase proxy que generan los asistentes (TServerMethodsClient). Lo que quiza si cambia un poco es la presentacion, aunque cosas como LiveBindings (a mi no me gustan mucho) te pueden ahorrar tiempo y hacer la curva de aprendizaje mas amigable

mamcx 22-02-2017 00:55:00

Lo *mas correcto* a cara del usuario es que una app IOS funcione y luzca como una app iOS, no como una windows enchuzpada.


Asi que puedes reusar widgets parcialmente, pero construirías una interface x plataforma. Esta es la opcion profesional.

No es solo lo visual. Es la interacción. Una app iOS tiene una interacción *totalmente diferente* a un desktop.

Una forma inferior, pero potencialmente pasable, es hacerla como si fuera una app web. Al menos asi, tendria el usuario una similitud con algo que ya conoce.

Nota, sin embargo, que en Web usan el término "Responsive" para denotar que la pagina se debe ajustar al tamaño de la ventana (que muchas veces se traduce: Para cada tipo de dispositivo - desktop, celular, tableta, etc), asi que es el mismo tema desde otro angulo.

Una app que sea *visualmente* idéntica en toda plataforma es casi siempre sinonimo de mediocre.

AgustinOrtu 22-02-2017 01:10:02

Estoy muy de acuerdo con lo que dice Mario

Lo interesante con Delphi es que el codigo de logica de negocios es casi 100% reutilizable. Lo complicado y tedioso es hacer los GUI (aunque parezca mentira) porque tienes que *copiar* el look&feel de la plataforma en cuestion y su filosofia. El truco es que las clases que hagan GUI solo hagan GUI! Es decir, manejar la presentacion y luego la interaccion esperada.

De este modo tendrias 3 o 4 aplicaciones en donde solo cambias la presentacion pero comparten el corazon (logica de negocios+acceso datos)

A mi forma de ver las cosas abstraer el look&feel es una perdida total de tiempo y muchisimo esfuerzo y terminas logrando algo mediocre como muy bien dice Mario.

AgustinOrtu 22-02-2017 01:13:35

Delphi tiene una tecnologia en la que te permite definir una "View maestra" (o Master View) con todo lo "comun" y luego Views especificas para cada tipo de target (target = sistema operativo + dispositivo). Esto es a nivel de TForm. Osea tendrias un TForm "maestro" con todo los controles, propiedades, eventos y codigos comunes a todos, y luego creas un Form especifico para cada target. Es "similar" a la herencia visual, pero en este caso en realidad no tenes varias clases sino que se utiliza un distinto archivo recurso (.fmx, el .dfm de Firemonkey) para instanciar el Form. FMX elije el recurso de acuerdo al dispositivo en cuestion en donde esta corriendo. Mas info aca

jafera 22-02-2017 13:21:01

Aunque no soy el destinatario de la respuesta, no puedo mas que agradecer a Agustin el trabajo en elaborar este "mini tutorial" ya que a mi tambien me servira.
Estoy intentando migrar de VCL a FMX por el tema del multidispositivo aunque no creo que lo implemente en moviles aunque puede que si en tablets.

Repidot gracias

Josep

roman 22-02-2017 16:48:43

Cita:

Empezado por AgustinOrtu (Mensaje 513578)
Un montón de cosas útiles.

Chapeau Agustín.


LineComment Saludos

newtron 22-02-2017 20:38:43

Aunque suelte una tontería (como casi siempre) yo particularmente pienso que es complicado intentar unificar el funcionamiento de una aplicación para escritorio/tablet a no ser que sea algo muy simple.

Yo en particular tengo la manía de intentar, en las aplicaciones de escritorio, que (por ejemplo) se use el ratón lo menos posible y le doy al programa un "sistema", por así decirlo, de funcionamiento que sería imposible de conseguir con una tablet o un móvil, sin tener en cuenta de que no es lo mismo manejar una pantalla de 17" que las de los dispositivos móviles que son bastante más pequeñas.

Con todo esto lo que quiero decir es que, aunque todavía no he hecho nada para dispositivos móviles, si en algún momento tengo que hacer algo me decantaré por hacer formularios independientes para escritorio/tablets.

Saludos

rcarrillom 23-02-2017 01:45:41

Gracias AgustinOrtu, muy ilustrativa tu opinión, sirve muy bien de guía. Con respecto a los demás comentarios del look & feel de cada plataforma, acertados de los demás compañeros, se lo dejo a la plataforma ya que manejamos el modelo vista-controlador. Gracias por su opinión y si surgen mas ideas y experiencias, son bienvenidas.

Ñuño Martínez 24-02-2017 12:41:49

Creo que en este caso hay que insistir en dos importantes cosas que hay que hacer cuando se quiere que la aplicación sea multiplataforma:

La primera, que debe planificarse bien. Hay que perder mucho tiempo en esta fase, más de lo normal. Yo creo que primero hay que planificar como si fuera para una plataforma y luego, antes de codificar nada, ver qué problemas dará en otras plataformas y modificarlo. No empezar a escribir nada de código hasta que esté todo claro.

La segunda, separar la parte lógica de la parte gráfica. Esto debería hacerse incluso si el proyecto no es multiplataforma, pero es vital si lo va a ser. Al separar ambas partes será más fácil mantener el programa, ya que la parte lógica la mayoría de las veces puede mantenerse idéntica en todas las plataformas, siendo la parte gráfica la única que suele cambiar.

Javier13 24-06-2017 19:02:56

Como descargo embarcadero ex7 para programos sistemas para moviles

Casimiro Notevi 24-06-2017 19:08:59

En la web de embarcadero.

Javier13 24-06-2017 19:16:52

Lo quiero conseguir crakeado tu no lo tienes?

Casimiro Notevi 24-06-2017 19:19:53

Sí, mira aquí. En el punto 19.

disley 21-08-2017 16:09:29

Desarrollo para móviles y multidispositivos
 
Hola amigo, el desarrollo con Firemonkey es muy sencillo, si tienes la base de Delhi te adaptarás rápido, lo más complicado en mi opinión es tener en cuenta el diseño resposive, es decir que se adapte a las distintas resoluciones, también debes tener presente las características especiales de cada dispositivo, ejemplo si usas una API en particular de Windows debes especificar en el código que para Windows ($IFDEF MSWINDOWS.....) use este código y para Android este otro, en fin nada complicado, me adapté muy fácil, verás como vos también lo harás.


La franja horaria es GMT +2. Ahora son las 23:24:25.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi