Mostrando entradas con la etiqueta Forms. Mostrar todas las entradas
Mostrando entradas con la etiqueta Forms. Mostrar todas las entradas

TFrameStand: FireMonkey TFrame a la enésima potencia


Este post está dedicado a TFrameStand: un componente FireMonkey que he desarrollado
en los últimos meses (en mi tiempo libre). En primer lugar, cómo obtenerlo: el
componente (y demostraciones) están disponibles en GitHub, y se pueden
utilizar libremente. En el último número (45-46) de Blaise Pascal  encontrará mi
artículo que explica los fundamentos y muestra de las demos incluidas
actualmente en el repositorio. Nota: gran 
parte del código ha sido desarrollado con XE8, últimamente estoy usando
la versión 10 Seattle (por lo que no se ha probado en las versiones anteriores,
aunque también debe ser compatible con XE7).











Introducción





Especialmente durante el
desarrollo de aplicaciones móviles, muchos desarrolladores simplemente añaden
una gran cantidad de controles al formulario principal del proyecto (que a
menudo es el único form disponible). Esto conduce rápidamente a problemas de mantenimiento
del proyecto, porque este enfoque no fomenta la reutilización de componentes.


El concepto de TFrame se
introdujo hace mucho tiempo (incluso en el VCL) para dar al 


desarrollador la
capacidad de unir algunos elementos de la interfaz de usuario (componentes) y
su comportamiento (código) en una sola unidad, reutilizable. Esto es bueno
porque se puede dividir su uso en porciones que se pueden diseñar de forma
individual y posiblemente re-utilizarlas en otras aplicaciones!. Simplemente
poniendo una instancia de un 


TFrame en un objeto
contenedor (puede ser un form, una página de un TTabControl o


 cualquier otro componente visual ... FMX).


Un ejemplo típico en el
que un acercamiento a TFrame puede simplificar mucho es cuando se puede dividir
su aplicación móvil en un conjunto de "vistas" para mostrar al
usuario en base a la situación de la solicitud. A continuación, puede
implementar las funciones de aplicación de forma independiente, mostrando esto
o aquello "vista" (TFrame) dependiendo del estado de la propia
aplicación (como lo haría con un TTabControl, usando una 


página diferente para
cada "punto de vista").





Estos "pie" se
definen mediante una características de FireMonkey muy básica: 


los estilos!


Cada componente tiene
una propiedad TFrameStand un manual de estilo, una referencia que puede ser
utilizada para definir la colección de soporte disponible. Junto con unas
simples convenciones de nomenclatura serán la base del funcionamiento del
componente


 (por ejemplo, para definir el punto exacto
donde usted quiere que su TFrame está incrustado en el stand se debe dar un
nombre específico "contenedor" para el componente visual que debe
actuar como matriz de TFrame).





TFrameStand que nace en
este contexto le permite ir un poco más allá, ya que le da la oportunidad de
tener un nivel intermedio entre el TFrame y el objeto contenedor. Esta capa
intermedia (el"pie", de ahora en adelante) puede ser visto como la
parte visual (UI) que no está estrictamente vinculada a los efectos del TFrame
que está mostrando, sino más bien está ligado a la forma en que la TFrame se
presenta al usuario.






















Stand and TFrames








Uno de los aspectos clave de TFrameStand es lo que le permite volver a
utilizar un stand con diferentes clases TFrame descendientes y también para
hacer lo contrario, es decir, para mostrar la misma clase TFrame utilizando
diferentes stands. En ambos casos, esto permite obtener un buen nivel
de   coherencia visual en su aplicación (y / o entre diferentes
aplicaciones), en beneficio de la experiencia  del usuario.








Mismo stand, varios TFrame








Por ejemplo, imagine que tiene un stand que implementa un
"camino" para mostrar un TFrame, por ejemplo, con un efecto LightBox:
a continuación, será capaz de mostrar diferentes contenidos (TFrame diferentes
instancias) utilizando el mismo efecto visual (utilizando una "caja de luz
"). Las ventajas son evidentes, por ejemplo, es necesario aplicar el
efecto visual (stand / soporte) una sola vez y luego se puede volver a utilizar
y, al hacerlo, cualquier cambio (mejora) en el stand afectará a todas las
partes de laaplicación que lo utiliza (consistencia!).








TFrame iguales, diferentes stands








Imagine que tiene una serie de soportes que ayudan al usuario a reconocer
el  contexto. Por ejemplo, usted puede tener un soporte que indica claramente
que el contenido está relacionado con una notificación de error, otro soporte
para situaciones de atención (advertencia) y otra acción del usuario cuando se requiere
(confirmaciones, opciones , y así sucesivamente). Si, por ejemplo, usted tiene
una TFrame específico para llevar a cabo ciertas tareas y tiene que mostrar los
resultados al usuario, es posible que desee que se muestre al usuario el uso de
diferentes significados (número de stand!).








Tenga en cuenta que, puesto una vez implementado para todas las opciones,
puede  usarlos con cualquier TFrame 
y se puede elegir de vez en cuando, que opción usar.





En una aplicación real, muchas situaciones caen en estas dos categorías.





Funcionalidad





Hasta ahora, hemos hablado de algunas de las ventajas de este enfoque, que
son: descomponer la complejidad de una aplicación utilizando el TFrame y el uso
de los componentes TFrameStand que descomponen de alguna manera la forma en que  se
muestra el TFrame con respecto al contenido específico.





Hay algunos otros beneficios al utilizar TFrameStand, aquí hay una lista de
los


principales:





1.  Puede trabajar
en tiempo de diseño ya 
que es el TFrame que el soporte;





2.  Hay un soporte
integrado para la realización de una tarea en segundo plano (utilizando
la biblioteca de programación en paralelo internamente) y al mismo tiempo
mostrar una interfaz gráfica adecuada (stand + TFrame) al usuario; Una vez
finalizada la operación, esta "forma de espera" se puede ocultar
fácilmente (con un poco de programación asincrónica muy simplificada);





3.     TFrameStand es capaz
de iniciar automáticamente


4.       un poco de animación (objetos
TAnimation y descendientes) que      consten en la definición de base o en la
instancia TFrame; Se admiten      actualmente dos eventos: OnShow y OnHide
(esto significa que se puede      utilizar transiciones animadas en el
proceso para mostrar y ocultar las      acciones fácilmente y sin tener que
escribir código);





5.  Hay un (simple) mecanismo
de inyección de dependencia que permite obtener fácilmente una referencia a
objetos en su 
contexto, incluso en el código de la aplicación
específica para cada TFrame para mostrar.








6.  No es una forma de
representar comportamientos compartidos (piezas de código compartido)
 a
través de diferentes combinaciones de soporte / TFrame.





7.  Hay una manera
(altamente personalizable) para reemplazar la clase
TFrame utilizada en tiempo de 
ejecución; Esto significa que
usted puede desarrollar una clase considerando TFrame  "padre" y luego tener que ejecutar
una instancia de una clase descendiente, seleccionando sobre la base de un
algoritmo completamente personalizable (por ejemplo, puede decidir utilizar
clases descendientes que difieren dependiendo de la Plataforma  de
ejecución);


Estos




son los videos con la demo en funcionamiento (en Win32):


























Conversor de Delphi a Cpp y de C a Delphi


Este post consta de dos partes, una es un programa (Delphi2Cpp) que convierte código fuente Delphi a C++ y la segunda es otro programa que convierte código C a Delphi.





1) CONVERSOR DE Delphi a C++





Migración de Delphi a C ++






Con Delphi de Windows se pueden crear aplicaciones rápidamente. Pero a veces es necesario acelerar su desarrollo a través de código optimizado, de modo que en algún momento se necesitará la migración de una aplicación de Delphi al lenguaje de programación C++ . Su desarrollo continuará ya sea con Delphi, donde el código es traducido en repetidas ocasiones, o bien continuará con  C++ Builder u otra herramienta.


La decisión de migrar a C++ bajó debido al alto coste de portar y lo difícil que era hasta ahora. Este requisito se reduce drásticamente con el programa Delphi2Cpp de conversión automática.





conversor "Delphi2Cpp"






Delphi2Cpp se basa en una completo analizador para Delphi 7, y produce resultados de traducción óptimos mediante el uso de la información de tipo de la VCL y otras unidades incluidas.


El código fuente no necesita ser preparado. Las definiciones condicionales de compilación se pueden configurar en las opciones de Delphi2Cpp. Un pre-procesamiento del código es traducido directamente.


Delphi2Cpp puede codificar todo C++ . El C++ Builder es particularmente adecuado debido a sus extensiones de lenguaje. Pero también existe la opción de código para otros compiladores como Visual C ++ o gcc .


Delphi2Cpp está disponible en dos versiones.


La interfaz de usuario de Delphi2Cpp:


Delphi2Cpp_Gui40.jpg





Traducción de catálogos de archivos con la versión Profesional de Delphi2Cpp:




Delphi2CppManager40.jpg





Comparación de la versión de estudiantes y la versión profesional







La siguiente tabla es un resumen general de las diferencias entre la versión de  estudiante y la versión profesional de Delphi2Cpp.
















Delphi2Cpp estudiante prof. 
Preprocessor + + 
Traductor + + 
Verwenung como herramienta de línea de comandos - + 
Separa pre-procesamiento y la traducción - + 
Archivo Administrador - + 
Tras la sustitución de identificadores - + 
Posibilidad Preparación de código Delphi - + 
Macros DECLARE_DYNAMIC, IMPLEMENT_DYNAMIC - + 
Generación de código C - + 
Definición de prefijos de propiedades - + 
Generación de espacios de nombres - + 
Anulación del "System.pas" - + 
Simulación de Delphi Meta-Características - + 







+ Característica Disponible 


- No es función disponible





Documentación on-line aquí





Novedades de la última versión



03.09.2015 Versión 1.7.0






{ Lo siguiente es traducido con "Google Translator" }







  • Secciones de código en el que "CPP" se define -como bloques {$ ifdef Cpp} - son opcionales ya que no se unifican en la ortografía, pero se copian fielmente. Es decir, entre otras cosas, mayúsculas / minúsculas ahora se mantienen sin cambios.

  • Los bucles de traducción simple se pueden generar ahora opcionalmente, lo que puede, sin embargo, dar un error en algunos casos. 

  • Constantes con tipo pueden ahora ser tratadas opcionalmente como constantes sin tipo. Así, el comportamiento actual de Delphi se reproduce donde estas constantes no se pueden cambiar en circunstancias normales.

  • Todos los espacios incluyendo saltos de línea antes "(* _ _ * ...)" y "(* _ _ * ...)" antes del primer token ahora estarán en C ++ .

  • Los registros se pasan por los valores de funciones, por lo que ya no se convierten en una constante de referencia (por ejemplo, const TRecord y rec), pero permanecen como parámetros de valor verdadero (TRecord rec).

  • "ShortInt" ya no se traduce incorrectamente como "int short" , sino como "char signed".

  • La inicialización automática de variables ahora se puede desactivar.

  • Muchas otras pequeñas mejoras






Descargar la versión demo






Delphi2Cpp se puede probar con una versión demo de forma gratuita sin límite de tiempo. El programa demo ofrece traducciones de la misma calidad que el programa bajo licencia. Sin embargo, la cantidad de código de salida para la parte de implementación de 10000 caracteres es limitado y la carga y el código de ahorro y opciones no es posible. Al comprar un Delphi2Cpp licencia un enlace a una versión de es Delphi2Cpp entregado, en el que todas las funciones del programa se puede desactivar por medio de la licencia.

















documentación en formato PDF (también en el instalador)





2) CONVERSOR DE C a Delphi






Convertidor del lenguaje C a Delphi: Convierte el codigo fuente  C a Delphi y Pascal   y por lo tanto ayuda a programar en aplicaciones C ; si tiene que traducir varios archivos funciona en modo secuencial por lotes, y también se pueden ejecutar desde la línea de comandos






C 2 Delphi convertidor



Conversor de Delphi a Java




Migración de Delphi a Java






Ispirer MnMTK 2015 convierte aplicaciones Delphi en Java.


Esta demo muestra cómo Ispirer MnMTK puede convertir Delphi a Java.






Funciones de conversión



Migrar a Delphi Java


  • Convierte código fuente Delphi  (* .pas) a los paquetes de clases en Java 



Delphi:

  

unit DemoCode;
 
interface
 
uses
Windows, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms,
Dialogs, StdCtrls;
 
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
 
var
Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
begin
Button1.Caption := 'Changed';
end;
 
end.


Java:

 

import java.awt.event.*;
 
public class DemoCode
{
TForm1 Form1 = null;
public DemoCode()
{
Form1 = new TForm1();
Form1.setVisible(true);
Form1.getButton1().addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent event)
{
Button1Click(null);
}
});
}
public void Button1Click(Object Sender)
{
Form1.getButton1().setText("Changed");
}
 
}
 


La conversión se basa en la forma de inicialización. La Clase Java convertida tiene un enlace al formulario de JFrame y se inicializa en el constructor. SQLWays utiliza el procedimiento addActionListener con la creación anónima de Action añadiendo a los controladores de eventos de botones y un método sustituto llamado  actionPerformed.


  • Convierte los forms de Delphi (* .dfm) a archivos  frames de Java de la interfaz de usuario (Swing, SWT, Java FX, etc.)



Delphi:

 
object Form1: TForm1
Left = 0
Top = 0
Width = 554
Height = 289
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Button1: TButton
Left = 232
Top = 128
Width = 75
Height = 25
Caption = 'Button1'
TabOrder = 0
OnClick = Button1Click
end
end
 

 


Java:

 

import javax.swing.*;
 
public class TForm1 extends JFrame
{
private static final long serialVersionUID = 1L;
private JButton Button1 = null;
public JButton getButton1()
{
return this.Button1;
}
public TForm1()
{
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(0,0,593,305);
setTitle("Form1");
getContentPane().setLayout(null);
initTForm1();
}
private void initTForm1()
{
this.Button1 = new JButton();
//
// Button1
//
this.Button1.setBounds(232,128,75,25);
this.Button1.setText("Button1");
getContentPane().add(this.Button1);
}
}
 




DelphiJava
Migrar a Delphi JavaMigrar a Delphi Java




Archivos DFM constan de varias propiedades. Para estos guiones las clases de Java SQLWays ha generado una vista. Los Forms de Delphi se convierten a Java JFrame con el mismo nombre. SQLWays crea análogos elementos de Delphien los que los campos de la clase son iguales para todos. Las Propiedades del molde están en el constructor de la clase con sus propiedades según el método especificado.


  • Convierte  acceso a datos de Delphi (BDE, ADO, etc.) a los programas Java de acceso a base de datos (JDBC, Hibernate, par, etc.)



Delphi:

 

object Form1: TForm1
Left = 0
Top = 0
Width = 554
Height = 289
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Button1: TButton
Left = 232
Top = 128
Width = 75
Height = 25
Caption = 'Button1'
TabOrder = 0
OnClick = Button1Click
end
end object Form2: TForm2
Left = 0
Top = 0
Width = 156
Height = 198
Caption = 'Test'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object DBGrid1: TDBGrid
Left = 32
Top = 8
Width = 81
Height = 120
DataSource = DataSource1
TabOrder = 0
TitleFont.Charset = DEFAULT_CHARSET
TitleFont.Color = clWindowText
TitleFont.Height = -11
TitleFont.Name = 'Tahoma'
TitleFont.Style = []
Columns = <
item
Expanded = False
FieldName = 'col1'
Visible = True
end>
end
object ADOConnection1: TADOConnection
Connected = True
ConnectionString =
'Provider=MSDASQL.1;Persist Security Info=False;
User ID=sa;Data S'
+
'ource=MSSQL_VMDBSRV002_ETEST'
Left = 24
Top = 136
end
object ADOQuery1: TADOQuery
Active = True
Connection = ADOConnection1
CursorType = ctStatic
Parameters = <>
SQL.Strings = (
'select col1 from tab1_test')
Left = 56
Top = 136
end
object DataSource1: TDataSource
DataSet = ADOQuery1
Left = 88
Top = 136
end
end


Java:

 
import java.awt.*;
import java.sql.*;
import java.util.Vector;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
 
public class TForm2 extends JFrame
{
private static final long serialVersionUID = 1L;
private JTable DBGrid1 = null;
private Connection ADOConnection1 = null;
private PreparedStatement ADOQuery1 = null;
private ResultSet DataSource1 = null;
public JTable getDBGrid1()
{
return this.DBGrid1;
}
public Connection getADOConnection1()
{
return this.ADOConnection1;
}
public PreparedStatement getADOQuery1()
{
return this.ADOQuery1;
}
public ResultSet getDataSource1()
{
return this.DataSource1;
}
public TForm2()
{
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(0,0,172,229);
setTitle("Test");
getContentPane().setLayout(null);
initTForm2();
}
private void initTForm2()
{
DefaultTableModel DBGrid1TM = new DefaultTableModel();
DBGrid1TM.addColumn("col1");
this.DBGrid1 = new JTable(DBGrid1TM);
JPanel DBGrid1Panel = new JPanel();
DBGrid1Panel.setLayout(new BorderLayout());
JScrollPane DBGrid1ScrollPane = new JScrollPane(this.DBGrid1);
DBGrid1Panel.add(DBGrid1ScrollPane, BorderLayout.CENTER);
DBGrid1Panel.setBounds (32, 8,81,120);
getContentPane().add(DBGrid1Panel);
 
try
{
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
String connectionUrl = "jdbc:sqlserver://vmdbsrv002:1433;
databaseName=etest;user=sa;password=Ispirer_1999;"
;
DriverManager.setLoginTimeout(30);
this.ADOConnection1 = DriverManager.getConnection(connectionUrl);
}
catch (SQLException | ClassNotFoundException e)
{
e.printStackTrace();
}
 
try
{
this.ADOQuery1 = ADOConnection1.prepareStatement(
"select col1 from tab1_test");
}
catch (SQLException e1)
{
e1.printStackTrace();
}
 
try
{
this.DataSource1 = ADOQuery1.executeQuery();
}
catch(SQLException e)
{
e.printStackTrace();
}
 
try
{
while(this.DataSource1.next())
{
Vector<Object> row = new Vector<Object>();
for
(int i = 1;
i <= this.DataSource1.getMetaData().getColumnCount(); i++)
{
row.addElement(this.DataSource1.getObject(i));
}
DBGrid1TM.addRow(row);
}
}
catch (SQLException e)
{
e.printStackTrace();
}
}
}
 

 




DelphiJava
Migrar a Delphi JavaMigrar a Delphi Java




Es un ejemplo de la conversión SQLWays DBGrid con el uso TADOConnection TADOQuery y TDataSource. Como resultado SQLWays generados con JTable llenan la clase Java de la base de datos. También SQLWays pueden cambiar automáticamente, los maps XML se  cambian por tablas de la base de datos.


  • Convierte paquetes Delphi (* .dpk) a paquetes Java con Classen





¿Por SQLWays?



SQLWays automatiza todo el proceso de migración para su aplicación Delphi existente para Java. Tanto más cuanto más se utiliza SQLWays ya que puede eliminar los riesgos ordinarios y reducir los gastos internos de manera significativa. Todos los beneficios están disponibles a un precio razonable, por lo que SQLWays es una herramienta muy atractiva para un tipo de proyectos.


Nuestra garantía de  tecnología de conversión:


  • Código Legible y mantenible
    generación de código legible y mantenible con la calidad de la conversión manual

  • Transformación de código y refactorización
    transformación código con el uso de las mejores prácticas de Java sin la emulación de la tecnología antigua en la nueva plataforma

  • Las tecnologías más modernas
    Ya que utilizan los frames y las tecnologías de Java

  • Código Java puro
    No hay bibliotecas (bibliotecas) de Ispirer o IP a usarse después de la conversión



SQLWays es eficiente para la conversión de grandes secuencias de comandos, que contienen miles o millones de líneas de código:


  • Resuelve automáticamente las dependencias
    puede resolver automáticamente las dependencias y conflictos entre ellas.

  • Configuraciones
    pueden leer información de varios archivos de configuración y de proyecto (archivos de configuración SQLWays, archivos .xml)

  • Rápida y potente personalización
    capas de abstracción, patrón reutilizable para la conversión,  conversión del lenguaje interno y herramientas de personalización.





Puede descargar ejemplos de código fuente Delphi y los resultados de la transformación:







Simulación del movimiento de los electrones en un campo electrico

Espectacular simulación realizada con OpenGL del movimiento de los electrones cuando atraviesan un campo eléctrico. Como muestra la image...