Compartir a través de


Optimizar formularios y controles

También puede mejorar de forma significativa los formularios y controles de la aplicación.

Usar el entorno de datos

Si utiliza el entorno de datos del Diseñador de formularios o el Diseñador de informes, el rendimiento de la apertura de la tabla es mucho más rápido que si se ejecutan los comandos USE, SET ORDER y SET RELATION en el evento Load del formulario. Cuando use el entorno de datos, Visual FoxPro utiliza las llamadas al motor de nivel inferior para abrir las tablas y configurar los índices y las relaciones.

Limitar el número de formularios en un conjunto de formularios

Utilice conjuntos de formularios solamente cuando necesite que un grupo de formularios comparta una sesión privada de datos. Cuando utilice un conjunto de formularios, Visual FoxPro crea instancias de todos los formularios y de todos los controles de todos los formularios del conjunto, aun cuando sólo se muestre en pantalla el primer formulario del conjunto. Esto puede resultar lento e innecesario si los formularios no tienen que compartir una sesión privada de datos. En su lugar, debería ejecutar DO FORM para los otros formularios cuando sean necesarios.

Sin embargo, si utiliza un conjunto de formularios, obtendrá una pequeña mejora del rendimiento cuando tenga acceso a los formularios del conjunto, porque los formularios ya estarán cargados aunque no serán visibles.

Carga dinámica de controles de página en un marco de página

Los marcos de página, al igual que los conjuntos de formularios, cargan todos los controles de cada página en el momento de cargar el marco de página lo que da lugar a una demora perceptible cuando se carga este último. En su lugar, podría cargar los controles de página dinámicamente a medida que se fueran necesitando, creando una clase fuera de los controles de cada página y cargándolos cuando se activara la página.

Para cargar dinámicamente los controles de página

  1. Diseñe el formulario de la forma habitual, incluyendo todos los controles en todas las páginas.

  2. Una vez terminado el diseño, vaya a la segunda página del marco de página y guarde los controles allí existentes como una clase.

  3. Abra la clase que acaba de crear y compruebe que los controles sigan dispuestos de la forma correcta.

  4. Repita los pasos 2 y 3 para la tercera página y las siguientes del marco de página.

  5. En el evento Activate de la segunda página y de las siguientes del marco de página, agregue objetos y déjelos visibles.

    Por ejemplo, si la clase de controles se llama cnrpage1, debe agregar el código siguiente:

    IF THIS.ControlCount = 0
       THIS.AddObject("cnrpage1","cnrpage1")
       THIS.cnrpage1.Visible = .T.
    ENDIF
    

Enlace dinámico de controles a datos

Puede reducir el tiempo de carga de un formulario que contenga un gran número de controles enlazados a datos si retrasa el enlace de esos controles hasta el momento en que sean necesarios.

Para enlazar dinámicamente controles a datos

  1. Sitúe las tablas y vistas del formulario en el entorno de datos de modo que se abran cuando se cargue el formulario.

  2. Para cada control dependiente, agregue código al código de evento GotFocus que enlaza el control al valor de los datos. Por ejemplo, el código siguiente enlaza un control ComboBox al campo customer.company:

    * Check to see if the control has been bound yet.
    IF THIS.RecordSource = ""
       * Set the record source to the right value
       * and set the record source type to "fields"
       THIS.RecordSource = "customer.company"
       THIS.RecordSourceType = 6
       THIS.Refresh
    ENDIF
    

Retardo de la actualización de pantalla

Si realiza varios cambios en la pantalla, por ejemplo, cambia los valores de varios controles a la vez, puede reducir el tiempo global necesario para actualizar la pantalla si retarda la actualización de pantalla hasta que se realicen todos los cambios. Por ejemplo, si hace que los controles queden visibles o invisibles, cambia los colores de los controles o mueve los registros de controles dependientes, resulta mucho más eficaz retardar el relleno de color de estos controles hasta que se hayan completado todos los cambios:

Para retardar la actualización de la pantalla

  1. Establezca la propiedad LockScreen del formulario en el valor verdadero.
  2. Actualice los controles cuando sea necesario.
  3. Llame al método Refresh del formulario.
  4. Establezca la propiedad LockScreen del formulario en el valor falso.

El ejemplo siguiente cambia varias propiedades de la pantalla a la vez, se desplaza a un registro nuevo y sólo entonces actualiza la pantalla con información nueva. Si LockScreen no se hubiera establecido como verdadero, en cada una de estas operaciones se volverían a dibujar los controles afectados individualmente y el rendimiento global de la actualización parecería retardado.

THISFORM.LockScreen = .T.
THISFORM.MyButton.Caption = "Save"
THISFORM.MyGrid.BackColor = RGB (255, 0, 0) && Red
SKIP IN customers
SKIP IN orders
THISFORM.Refresh
THISFORM.LockScreen = .F.

Sugerencia   Esta técnica no proporciona ninguna ventaja si está actualizando un único control.

Reducir código en métodos usados con frecuencia

Puesto que el método Refresh y el evento Paint suelen utilizarse con frecuencia, puede aumentar el rendimiento de formularios si reduce la cantidad de código de estos métodos. De forma análoga, para reducir el tiempo de carga de un formulario, puede mover código desde el evento Init a los eventos usados con menos frecuencia como Activate, Click y GotFocus. Después, use una propiedad del control (como Tag o una propiedad personalizada) para hacer un seguimiento de si el control ya ha ejecutado el código que sólo necesita ejecutarse una vez.

Vea también

Usar Rushmore™ para agilizar el acceso a los datos | Optimizar programas | Optimizar las aplicaciones | Optimizar el sistema