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

martes, 29 de octubre de 2024

Directorio Virtual en IIS con netcore

Se tiene un sitio ejemplo https://MiSitio/home.aspx

Si queremos tener un directorio virtual en nuestra aplicacion para acceder a las evidencias guardadas en un directorio diferente al de nuestra aplicacion y acederlas desde nuestra aplicacion de la siguiente manera

https://MiSitio/Evidencias/imagen1.jpg

https://MiSitio/Evidencias/imagen2.png

https://MiSitio/Evidencias/evidencia1.pdf


En aplicaciones en NET Core montadas en el IIS crear un diretorio de la forma tradicional no es posible, acontinuacion explicamos el por que

Diferencias entre ASP.NET Framework y ASP.NET Core en IIS:

  1. Manejo de Solicitudes por IIS:
    • En ASP.NET Framework, IIS manejaba directamente la mayoría de las solicitudes, incluyendo archivos estáticos y recursos dentro de directorios virtuales. En ese modelo, IIS gestionaba tanto las solicitudes a archivos estáticos (imágenes, CSS, JavaScript) como las solicitudes dinámicas (páginas ASP.NET o servicios).
    • ASP.NET Core, por otro lado, usa el AspNetCoreModule en IIS, que actúa como un proxy y redirige todas las solicitudes al servidor Kestrel integrado en ASP.NET Core, que es el que realmente maneja las solicitudes. IIS en este caso funciona más como un "front-end" que pasa las solicitudes a Kestrel, en lugar de manejar directamente archivos estáticos.
  2. Middleware en ASP.NET Core:
    • ASP.NET Core no maneja los directorios virtuales de la misma forma en que lo hace ASP.NET Framework. En lugar de delegar directamente a IIS, ASP.NET Core tiene un pipeline de middleware que se encarga de manejar las solicitudes. Esto significa que debes configurar explícitamente en el middleware qué rutas o directorios son accesibles como archivos estáticos.
    • Si quieres que un directorio virtual sea accesible en una aplicación ASP.NET Core, debes configurarlo en Startup.cs a través del middleware UseStaticFiles para decirle explícitamente a la aplicación qué carpetas deberían ser servidas como archivos estáticos.
  3. ASP.NET Core y el manejo de archivos estáticos:
    • En ASP.NET Framework, IIS podía acceder directamente a cualquier archivo en un directorio virtual definido, sin involucrar demasiado a la aplicación en ese proceso.
    • En ASP.NET Core, los archivos estáticos deben ser servidos explícitamente a través del middleware UseStaticFiles. El middleware controla qué carpetas son accesibles y bajo qué rutas virtuales. Esto ofrece más control y seguridad, pero también significa que los directorios virtuales tradicionales de IIS no funcionarán sin ser configurados en el middleware.
  4. Separación de Concerns (Responsabilidades):
    • En ASP.NET Core, el manejo de archivos estáticos es un componente explícito de la aplicación y forma parte del pipeline de solicitudes de la misma. El objetivo de ASP.NET Core es manejar las solicitudes de una manera más flexible y controlada, en lugar de delegar completamente a IIS para que maneje archivos estáticos.
    • Por eso, IIS no maneja directorios virtuales en ASP.NET Core de la manera tradicional, ya que todo el procesamiento de archivos estáticos se delega al servidor Kestrel (a menos que se configure de otra forma en el middleware de ASP.NET Core).

¿Por qué usar el middleware en Startup.cs?

  • Control: El middleware en Startup.cs te permite tener control completo sobre qué carpetas o rutas son accesibles. Puedes configurar rutas virtuales y servir archivos estáticos de diferentes carpetas de manera controlada.
  • Seguridad: Solo las carpetas que explícitamente defines en UseStaticFiles estarán disponibles al público. Esto reduce el riesgo de exposición accidental de archivos.
  • Flexibilidad: Puedes definir múltiples carpetas o rutas virtuales, aplicar reglas de caché, configurar qué tipos de archivos deben ser servidos, y más


Ejemplo Basico de Startup.cs


public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // Configurar archivos estáticos para la carpeta "wwwroot" (por defecto)
    app.UseStaticFiles();

    // Configurar archivos estáticos desde un directorio virtual (como Evidencias)
    app.UseStaticFiles(new StaticFileOptions
    {
        FileProvider = new PhysicalFileProvider(@"D:\EvidenciasDataSys\MisEvidencias"),
        RequestPath = "/Evidencias"
    });
}

Para crear una aplicación en .NET Core que solo sirva como un repositorio de imágenes y archivos PDF (sin mostrar páginas) y que funcione como una subaplicación en tu aplicación principal hecha en GeneXus, puedes seguir estos pasos:

1. Visual Studio Code (integrated terminal):

  • Si usas Visual Studio Code como tu editor, puedes abrir un terminal integrado en Visual Studio Code.
  • Abre VS Code, y en el menú superior selecciona Terminal > New Terminal.
  • Se abrirá un terminal en la parte inferior, y allí puedes ejecutar el comando para crear el proyecto:
  • dotnet new web -n FileRepositoryApp
    Crea el archivo Startup.cs en el proyecto generado

2. Configurar el manejo de archivos estáticos en Startup.cs:

En esta aplicación, solo necesitas configurar el middleware para servir archivos estáticos como imágenes y PDFs. Aquí te dejo un ejemplo de cómo debe ser el archivo Startup.cs:


using Microsoft.Extensions.FileProviders;

namespace FileRepositoryApp
{
    public class Startup(IConfiguration configuration)
    {
        private readonly IConfiguration _configuration = configuration;

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            // Configuración básica para servir archivos estáticos desde wwwroot
            app.UseStaticFiles();

            // Obtener la ruta externa desde appsettings.json
            string? rutaExterna = _configuration["ExternalFilePath"];
            string? ExternalRequestPath = _configuration["ExternalRequestPath"];

            if (!string.IsNullOrEmpty(rutaExterna) && Directory.Exists(rutaExterna))
            {
                // Configuración para servir archivos desde una carpeta externa
                app.UseStaticFiles(new StaticFileOptions
                {
                    FileProvider = new PhysicalFileProvider(rutaExterna),
                    RequestPath = ExternalRequestPath // Ruta virtual para acceder a la carpeta
                });
            }
            else
            {
                // Manejo del caso donde la ruta es nula o no existe
                throw new Exception("La ruta externa para los archivos estáticos no está configurada correctamente o no existe.");
            }
        }
    }
}

He creado un proyecto llamado FileRepositoryApp. Puedes ver el código y contribuir en mi repositorio de GitHub:
GitHub Repository

FileRepositoryApp

Descripción

FileRepositoryApp es una aplicación diseñada para servir archivos estáticos (como imágenes y PDFs) a través de una API personalizada. Utiliza configuraciones definidas en el archivo appsettings.json para controlar las rutas de los archivos servidos.

Configuración

appsettings.json

  • ExternalFilePath: Especifica la ruta física en el servidor donde están almacenados los archivos.

    {
      "ExternalFilePath": "C:\Files\ExternalContent"
    }
    

    En este ejemplo, los archivos se encuentran en C:\Files\ExternalContent.

  • ExternalRequestPath: Define la ruta virtual (URL) a través de la cual los archivos serán accesibles.

    {
      "ExternalRequestPath": "/content"
    }
    

    Los archivos estarán disponibles en una URL como https://misitio.com/content.

web.config

El archivo web.config es necesario si la aplicación está siendo desplegada en IIS. La sección aspNetCore se utiliza para configurar cómo el servidor IIS maneja la ejecución de la aplicación ASP.NET Core.

Ejemplo de configuración:

<configuration>
  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
    </handlers>
    <aspNetCore processPath="dotnet" arguments=".\FileRepositoryApp.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="InProcess" />
  </system.webServer>
</configuration>
  • processPath: Especifica el proceso que inicia la aplicación (dotnet en este caso).
  • arguments: Indica el archivo de la aplicación que debe ser ejecutado (FileRepositoryApp.dll).
  • stdoutLogFile: Define dónde almacenar los logs de salida estándar.

Uso

  1. Configura las rutas en appsettings.json:

    • ExternalFilePath: Ruta física donde se almacenan los archivos.
    • ExternalRequestPath: Ruta virtual a través de la cual se acceden los archivos.
  2. Ejecuta la aplicación:

    • La aplicación puede ejecutarse localmente utilizando .NET Core o desplegarse en un servidor IIS.
    • Si está desplegada en IIS, asegúrate de que la sección aspNetCore esté correctamente configurada en el archivo web.config.
  3. Acceso a los archivos:

    • Los archivos almacenados en la carpeta física especificada en ExternalFilePath serán accesibles a través de la URL especificada en ExternalRequestPath.
    • Por ejemplo, si ExternalFilePath está configurado en C:\Files\ExternalContent y ExternalRequestPath está en /content, un archivo image.png en esa carpeta será accesible en:
      https://misitio.com/content/image.png
      

Instalación

  1. Clona este repositorio:

    git clone https://github.com/genexusmancilla/FileRepositoryApp.git
    
  2. Configura las rutas de los archivos en appsettings.json.

  3. Ejecuta la aplicación localmente o despliega en un servidor IIS.

Contribuciones

Si deseas contribuir a este proyecto, por favor, envía un pull request con una descripción detallada de los cambios propuestos.

Licencia

Este proyecto está bajo la licencia MIT.

martes, 16 de enero de 2024

Como agregar entrada al web.config desde Genexus al hacer el deploy


Al agregar o modificar un elemento del web.config en la carpeta web del modelo (RutaDeMiModelo\CSharpModel\Web\web.config) al hacer el deploy la configuracion por defecto de genexus, no considera lo que se ponga adicionalmente en el web.config

si queremos hacer un deploy y que el web.config tenga una personalizacion una forma es modificando los archivos 

  1. C:\Program Files (x86)\GeneXus\GeneXus17\Deploy\CSharp\GeneXus.csharp.Server.targets 
  2. C:\Program Files (x86)\GeneXus\GeneXus17\ApplicationServers\Templates\CSharpWeb\IIS_Base.stg



Vamos a modificar el archivo IIS_Base.stg agregando

 
location()::=<<
/*otro codigo existente */
$if (MiNuevaPropiedadSupport)$
	$locationNueva()$
$endif$
>>

locationNueva()::=<<
<location path="miruta">
 <system.webServer>
  <httpErrors errorMode="Detailed" />
 </system.webServer>
</location>
>>

Vamos a crear un arhivo MisPropiedades.prop y lo vamos a guardar en donde mas les sea de su agrado, en este archivo vamos a definir nuestras propiedades



<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 <PropertyGroup>
  <!-- Agregar nuevas propiedades o sobrescribir propiedades existentes -->
  <MiNuevaPropiedadSupport>true</MiNuevaPropiedadSupport>		
 </PropertyGroup>
</Project>

Ahora vamos a modificar el archivo GeneXus.csharp.Server.targets

En la parte superior del archivo vamos agregar el Import a nuestro archivo MisPropiedades.props


<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >
 <Import Project="$(GX_PROGRAM_DIR)\Packages\Gxpm\Platforms\GeneXus.CSharp.WorkflowEngine.targets"/>
 <Import Project="$(GX_PROGRAM_DIR)\Packages\Gxpm\Platforms\GeneXus.CSharp.WorkflowClient.targets"/>
 <Import Project="$(GX_PROGRAM_DIR)\Library\GAM\GAM_Backend\Net\GAM_Backend.targets" Condition="'$(IncludeGAMBackend)' == 'true'"/>
		
 <Import Project="MiRuta\MisPropiedades.props" Condition="Exists('MiRuta\MisPropiedades.props')" />
    //... Mas codigo existente

por ultimo vamos agregar codigo en el elemento <GenerateFromTemplate


<GenerateFromTemplate
 TemplateGroupFile="$(WebConfigTemplate)"
 TemplateName="generateConfig"
 Properties="
   DisplayName=$(ProjectName);
   Namespace=$(Namespace);
   IntegratedSecurity=$(IntegratedSecurity);
   RestEnabled=$(RestSupport);
   APIRestSupport=$(APIRestSupport);
   SDEnabled=$(SDSupport);
   HttpsEnabled=$(Https);
   IncludeQueryViewer=$(IncludeQueryViewer);
   WebNotificationSupport=$(WebNotificationSupport);
   HasWorkflow=$(HasWorkflow);
   HasBC=$(HasBCs);
   HasAPIs=$(HasAPIs);
   ChatbotSupport=$(ChatbotSupport);
   DeployOfflineReplicator=$(DeployOfflineReplicator);
   MiNuevaPropiedadSupport = $(MiNuevaPropiedadSupport);"

Ahora al hacer un Deploy va verificar la propiead y va agregar el fragmento que necesitamos en el web.config

Referencias:

StringTemplate

domingo, 9 de agosto de 2020

Redirect https con JavaScript

 

Hay varias formas de redirigir una pagina

aqui les dejo una forma para redirigir a una pagina

<html>

<head>

<body>


<!-- codigo que tu necesites --> 


<script type="text/javascript">  

function JSRedirectOnload() {

    if (window.location.protocol != "https") {  

    window.location = "https://" + window.location.hostname + '/wwpbaseobjects.home.aspx';

  }

}

if (window.addEventListener)

    window.addEventListener("load", JSRedirectOnload, false);

else if (window.attachEvent)

    window.attachEvent("onload", JSRedirectOnload);

else window.onload = JSRedirectOnload;

</script>

</body>

</html>


Referencias:

https://www.w3schools.com/js/js_window_location.asp

jueves, 15 de noviembre de 2018

MaxWebConfigFileSizeInKB e IIS 10

Cuando el archivo web.config supera el tamaño de los 250kb el IIS genera el error
"No se puede leer el archivo de configuración porque supera el tamaño máximo de archivo iis"
"IIS - Cannot read configuration file because it exceeds the maximum file size"

para solucionarlo hay que agregar en regedit las siguientes entradas


Agregar la clave "Configuration"
Agregar el valor DWORD "MaxWebConfigFileSizeInKB"

En las siguientes ubicaciones:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\InetStp
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\InetStp

jueves, 18 de abril de 2013

Como hacer un menu usando el GAM


Se parte de que se tiene activado el GAM en su propiedad Enable Integrated Security = True
Y la propiedad Default Integrated Security = Authorization
Al tener esta ultima propiedad en autorización el gam se encarga de agregar los objetos utilizados en Genexus a los permisos de la aplicación
La forma en que los agrega es poniéndoles _NombreDel Evento
Ejemplo.- si tengo una transacción Menu  agregara los siguientes permisos
menu_Execute (significa que puede ejecutar el objeto)
menu_Insert (permite insertar)
menu_Update (permite modificar)
menu_Delete (permite eliminar)
menu_FullControl  (Permite agregar todos los permisos anteriores)


Se cuenta con tres pasos para tener los permisos en usuario
a) Primero debe existir el permiso en la aplicación
                en este punto en el caso de los menus principales que no llaman a un objeto deben de darse de alta en los permisos de la aplicación usando las opciones de agregar permisos a la aplicación.
b) Se debe agregar los permiso a los roles
c) Por último se debe agregar los roles al usuario

ahora procederemos a crear una transacción Menu con los campos necesarios para guardar los datos de las opciones que componen al menú como se muestra en la figura siguiente


MenuIsHeader.- se utiliza para indicar que es un menú principal pero que no va a llamar a ningún objeto para ejecutarse.
trim(MenuObject)+'_Execute' IF not MenuObject.isempty();
trim(MenuName)+'_Execute' IF  MenuObject.isempty();
MenuObjectNull.- se utiliza para indicar va llamar a un objeto o no
MenuObject IF MenuIsHeader=False
Se debe crear un subtipo con los siguientes atributos
MenuParentId
MenuParentName




De esta forma tenemos un menú recursivo
Hasta aquí ya tenemos la transacción menú para dar de alta nuestras opciones de menú
Ahora en la master page se debe agregar el user control de su preferencia para mostrar el menú
En este ejemplo usaremos  SmoothNavMenu


Agregamos el user control SmoothNavMenu a nuestra master page como se muestra en la figura

 en la pestaña de eventos de nuestra master page se debe agregar el código que muestra la imagen, se esta llamando en el evento start el data provider que devuelve la SDT con los datos del menú que se debe mostrar.

Ahora en el data provider se debe llenar de la siguiente forma:
order MenuOrder
where MenuParentId = &MenuParentId or (&MenuParentId=0 and MenuParentId.IsNull() )
Where GAMRepository.CheckPermission(MenuGAMObject)
{
      Id = str(MenuId)
      Title = MenuName
      Description = MenuDescription

      //Link = iif(MenuObjectNull.IsEmpty(),!"#",MenuObject+'.aspx') //generador C#
      Link = iif(MenuObjectNull.IsEmpty(),!"#",MenuObject) //generar java
     
      Items = SmoothNavMenuDP.udp(MenuId)
}



La siguiente instrucción GAMRepository.CheckPermission(MenuGAMObject)
Nos devuelve si tiene permisos el usuario autentificado al objeto enviado como parámetro a la funcion



Asi es como debe aparecer el menú del ejemplo

si usas otro user control solo debes hacer algunos cambios para llenar la SDT del menu, el principio de este ejemplo es el mismo para cualquier User Control de Menu

si quieres el ejemplo completo en xpz comenta esta entrada y dale en ++Google
Espero les sea de utilidad



jueves, 25 de octubre de 2012

Ejemplo Servicio Rest con Genexus Java

Servicio Rest con Genexus Java

Crear el modelo de genexus con el generador de java y el DataStore de SQL Server

Configurar modelo con el generador Java
agregar en el classpath las siguientes librerias
(Se pueden encontrar en el directorio <GenexusInstall>\gxjava):
jackson-core-asl-1.5.5.jar
jackson-jaxrs-1.5.5.jar
jackson-mapper-asl-1.5.5.jar
jersey-core-1.4.jar
jersey-json-1.4.jar
jersey-server-1.4.jar


Classpath = gxclassr.zip;GxUtils.jar;.;lucene-core-2.2.0.jar;iText.jar;.\drivers\jtds-1.2.jar;.\drivers\jt400.jar;.\ojdbc14.jar;C:\Tomcat 6.0\lib\servlet-api.jar;jackson-core-asl-1.5.5.jar;jackson-jaxrs-1.5.5.jar;jackson-mapper-asl-1.5.5.jar;jersey-core-1.4.jar;jersey-json-1.4.jar;jersey-server-1.4.jar

ahora ya puedes crear los objetos de tu proyecto

en el momento que lo requieras Generar y ejecuta la aplicacion(F5), la primeras vez les pide los datos de la base de datos
si te marca error en la creacion de la base de datos debes asegurarte que el servidor de sql server permite la conexiones tcpip y el puerto 1433 este configurado

Si el documento te sirvio deja tu comentario o dale clic a google+

Ejemplo:
para consumir el servicio Rest

Crear procedimiento SyncReceive

Rules:
parm(out:&LVC);
Source:
&serverHost = !"192.168.0.3"&serverRestBaseURL = !"/appJavaEnvironment/rest/"&Port = 8080 //para tomcat&Url = !'GetDatos1?fmt=json'&httpclient.Host = &serverHost&httpclient
.Port = &Port&httpclient
.BaseUrl = &serverRestBaseURL&httpclient
.AddHeader(!'Content-type',!'application/json')&httpclient.Execute(!'GET', &Url)&i = 0&Datos1List.FromJson(&httpclient.ToString())
For
&Datos1 in &Datos1List  new     DatoId = &Datos1.DatoId     DatoNombre =
&Datos1.DatoNombre     DatoDireccion =
&Datos1.DatoDireccion
  endnew &i+= 1endforcommit
if
&i = 0
  &LVC = " No existen registros para agregar"else  &LVC = &i.ToString() + " registros agregados"endif

fuentes:
http://www2.gxtechnical.com/portal/hgxpp001.aspx?15,4,61,O,E,0,,31458

Requerimientos Android Smart Device en Genexus

Instalación de ambiente Android

Introducción
Android es el sistema operativo desarrollado por un consorcio liderado por Google que se ha masificado gracias a su licenciamiento de código abierto, lo que permite que cualquier fabricante lo utilice.
Android está basado en Linux y el lenguaje de programación que se debe utilizar para poder programar aplicaciones es Java.
Requisitos Es necesario tener el JDK de Java en versión 5 o 6, el mismo se puede descargar desde:
http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u25-download-346242.html
Para poder desarrollar aplicaciones en Android es necesario instalar el Android SDK
El mismo se puede descargar desde: http://developer.android.com/sdk/index.html
 Setup
Luego de instalado el SDK de Android es necesario ejecutar el SDK Manager.exe del directorio de instalación
Esto desplegará la siguiente ventana que muestra los paquetes disponibles para instalar, es necesario instalar el Android SDK 2.1 y Google API 7 y el Android SDK 4.0.3 Google API 15


Después de instalado el SDK, ya se podrá generar y prototipar aplicaciones generadas en Android.

¿Por qué es necesario instalar tanto a nivel de API?
Nivel API 15 es necesario para compilar la aplicación. Sin embargo API 7 incluye un emulador más rápido, así que tener dos niveles de API instalada la aplicación se compila utilizando 15 y ejecute con 7.

Comprobación de la instalación del SDK de Android

Si tiene dudas sobre lo que Android SDK versión que ha instalado y / o qué niveles de API que soporta usted puede:
  • ejecute el comando siguiente para obtener una lista de todas las API instalado: "
    • c:\SDK_Installation_Directory\Tools\android.bat list target
  • ejecutar el Administrador de SDK en el menú Inicio de Windows o el comando siguiente:
    • c:\SDK_Installation_Directory\"SDK manager"


fuentes: http://wiki.gxtechnical.com/commwiki/servlet/hwiki?Android+Requirements,

martes, 14 de agosto de 2012

Mi primer User Control


User Control “Hola Mundo”


El propósito de este documento es explicar como crear un simple UserControl (UC) “Hola Mundo”. Una Vez terminado este ejemplo paso a paso, se tendrá un user control llamado “HolaMudo” en la caja de herramientas.

Después de arrastrar este user control a un formulario web (como lo hace normalmente con los cuadros de texto, Grid, Tablas etc.) el control solo mostrara un mensaje “Hola Mundo” en su aplicación Genexus con el color y la fuente que configure en las propiedades del control.

Lo más probable es que la creación de un user control "Hola Mundo" no va a sonar muy atractivo, pero recuerde que esto es sólo para fines de aprendizaje. Después de leer este tutorial se puede empezar a pensar en la creación de controles de usuario muy interesantes, como los menús, treeviews, los controles de Silverlight, etc.

Así que primero vamos a definir qué es exactamente el control va a hacer.

Definición del User Control “Hola Mundo”
El control deberá hacer lo siguiente:
·         Mostrar un mensaje “Hola Mundo”
·         Permitir al programador configurar el color del texto “Hola Mundo”
·         Permitir al programador configurar la fuente del texto “Hola Mundo”
·         Permitir al programador configurar el tamaño del texto “Hola Mundo”

Crear el Control
Ejecutar "UserControlEditor.exe" que se encuentra en el directorio de instalación de Genexus y pulse el botón Nuevo.

[01] User Control Designer

Introduzca el nombre del control de usuario y la ubicación de la carpeta. Todos los controles de usuario se deben colocar en el directorio UserControls que también está en el directorio de instalación de Genexus.

Nombre del User Control: HolaMundo
Ubicación del User Control:
“C:\Program Files (x86)\ARTech\GeneXus\GeneXusXEv1\UserControls\HolaMundo”

[02] Nuevo User Control

Ficha Definición del control (Control Definition)
En la ficha Definición de control, establezca el "Icono (utilizado en la caja de herramientas)" de propiedad. En este caso estamos usando un icono llamado HolaMundoIcon.ico que tiene que ser colocado en la carpeta HolaMundo que hemos creado en el paso 1. Debido a que este es un ejemplo sencillo, no hay más trabajo que hacer en esta ficha.

[03] Control Definition

 
Ficha Propiedades
Como mencionamos anteriormente, el control debe tener 3 propiedades que nos permitan establecer el "Hola Mundo" texto, la fuente y el tamaño. En consecuencia, en la pestaña Propiedades, tenemos que crear 3 propiedades:

•FontFace ◦Type: Combo
◦Default: Verdana
◦Values: Arial=Arial,Verdana=Verdana,Comic Sans MS=Comic Sans MS

•FontColor ◦Type: Text
◦Default: #000000 (black)

•FontSize ◦Type: Text
◦Default: 10

[04] Font Face
[05]Font Color

[06] Font Size


Ficha “JScript Runtime Render”
En el momento de renderizar nuestro control, Genexus invocara el método Show de nuestro archivo de render en tiempo de ejecución (se especificó bajo la ficha de definición de control).
Este archivo se puede acceder en la ficha “JScript Runtime Render” y es donde vamos a tener que programar toda la lógica principal de nuestro control. En este caso, ya que sólo desea mostrar un "Hola Mundo" con el mensaje de una fuente determinada, el color y el tamaño, el archivo de procesamiento contendrá lo siguiente:
[07] JScript Runtime Render

Tenga en cuenta que todo el código de sombreado en gris es generada automáticamente por el editor por lo que sólo tendrá que añadir el texto "Hola Mundo" con los parámetros (tipo de letra, color y tamaño) que recibe de GeneXus. En este caso la línea es:
var buffer= '<font face="' + this.FontFace +
            '" color="' +  this.FontColor +
            '" size="' + this.FontSize +
            '">Hello World!!!</font>';        
this.setHtml(buffer);


Ficha XSL Designer Render

Este paso es opcional. Cuando creas un user control, indica como mostrar su control en tiempo de diseño (en el IDE de Genexus). Puede, por ejemplo, mostrar una imagen que representa el control o que puede hacer cosas más sofisticadas, como renderizar el control de forma dinámica de acuerdo a sus propiedades.

En este caso, vamos a mostrar un simple texto "Control Hola Mundo" cuando el control se arrastra al web form. Para ello, es necesario editar en la ficha "XSL Designer Render", agregando solo el texto "Control Hola Mundo" como se muestra a continuación:


[08] XSL Designer Render - Control Hola Mundo

Después de eso el control se vera asi:

[09] UC Hola Mundo


 
Instalar el user control en Genexus

Cierre Genexus si esta abierto, y ejecute "Genexus.exe /install" bajo en directorio de instalación de Genexus. A continuación, iniciar Genexus como de costumbre.

[10] Instalar User Control

El control está terminado y listo para usarse!


Usando el user control

Ahora vamos a utilizar el control que acabamos de crear. Este es un proceso muy sencillo:


[09] Cree un web panel y arrastre el control “Hola Mundo” de la caja de herramientas

[11] Configure las propiedades
[12] Ejecute


Imagen en el user control

Ahora vamos hacer que en lugar del texto “Control Hola Mundo” aparezca una imagen
En la ficha "XSL Designer Render" vamos a cambiar esta línea
      Control Hola Mundo

Por estas:
<img>
<xsl:attribute name="src">
<xsl:value-of select="gxca:GetMyPath()"/>

<xsl:text>\HolaMundo.jpg</xsl:text>
</xsl:attribute>
<xsl:call-template name="AddStyleAttribute"/>
</img>

[13] Poner Imagen en el User Control

[14] User Control con la imagen