Problemas con CALL FORM y DIALOG

Buenos dias a todos

Mi duda es la siguiente, estoy tratando de hacer una barra de progreso personalizada y estoy tratando de usar comunicacion entre el proceso original y la ventana de progreso, para esto estoy usando CALL FORM, estoy ejecutando el siguiente metodo para llamar el formulario

<code 4D>
$window_:=Open form window(“PRG_Progreso”;Palette form window;Horizontally centered;Vertically centered)
SET WINDOW TITLE(“Espere…”;$window_)
CALL FORM($window_;“PRG_Configurar”;$titulo;$subtitulo;$clase;$maximo)
DIALOG(“PRG_Progreso”;*)

</code 4D>

Como pueden ver hago una primera llamada al formulario com CALL FORM, al hacer esta llamada el sistema configura correctamente la informacion dentro del formulario, sin embargo, si trato de hacer una llamada justo despues de DIALOG el formulario no se actualiza sino que justo depues de terminar el proceso ejecuta todo lo demas.

Que puedo hacer para que actualice la informacion en la ventana al llamarla con CALL FORM despues del DIALOG, o de que manera puedo solucionar esto sin usar DIALOG?

Aprecio mucho su ayuda

Buenas tardes Jorge:

Te recomiendo ejecutar CALL FORM luego de DIALOG. Ya que estás llamando a DIALOG con el parámetro *, la ejecución de las líneas sucesivas continúa normalmente.

Saludos,

Hola, ya lo intente y no funciona, no cambia la informacion de la ventana, que mas puedo hacer, el codigo es:

<code 4D>
$window_:=Open form window(“PRG_Progreso”;Palette form window;Horizontally centered;Vertically centered)
SET WINDOW TITLE(“Espere…”;$window_)
DIALOG(“PRG_Progreso”;*)
CALL FORM($window_;“PRG_Configurar”;$1;$2;$3;$4)

</code 4D>

no cambia la informacion de los titulos ni la informacion de la ventana

incluso llegue a pensar que faltaba un REDRAW WINDOW, pero tampoco funciono

Agradezco la ayuda

Hola Jorge:

CALL FORM funciona correctamente luego de DIALOG, al menos en 4D v17.

La ventaja de CALL FORM es que no hay que llamar a REDRAW WINDOW luego.

¿Desde dónde llamas CALL FORM luego?
¿Qué contiene PRG_Configurar?
Mencionas que hay otro proceso. El otro proceso es el que debe llamar a CALL FORM.

Usualmente lanzas un nuevo proceso usando CALL WORKER. Y desde el método que llamó a CALL WORKER, puedes llamar a CALL FORM. Lo importante es que le pases la referencia de ventana a CALL WORKER para que sepa luego dónde actualizar el progreso.

Saludos,

Bueno, el proceso es el siguiente:

Ejecuto un metodo el cual hara una operacion secuencial, por ejemplo, leer los registros de un archivo, lo que busco es mostrar una barra de progreso para controlar en que va dicha importacion.

para eso me cree el metodo PRG_Iniciar con el cual inicio la ventana y cargo la informacion de configuracion (titulo, subtitulo, que tipo de barra voy a usar y si tengo un tope maximo para un contador), esto es lo que trae ese metodo:

<code 4D>

// ----------------------------------------------------
// Usuario (SO): JorgeSanchez
// Fecha y hora: 01/18/19, 07:46:07
// ----------------------------------------------------
// Método: PRG_Iniciar
// Descripción
//
// Metodo para inicializar las variables que se ejecutaran al cargar el formulario de la barra de progreso
//
// Parámetros
//
// $titulo [text] <- $1: Titulo del mensaje de progreso
// $subtitulo [text] <-$2: Subtitulo del mensaje de progreso
// $clase [number] <-$3: Clase de progreso, se pueden usar la constantes del tipo de barra de OBJECT SET INDICATOR TYPE
//
// Resultado
//
// $result [number] -> $0: Referencia a la ventana creada
//
// ----------------------------------------------------

C_TEXT($titulo;$subtitulo)
C_LONGINT($window_;$clase;$maximo)

$titulo:=$1
$subtitulo:=$2
$clase:=Barber shop
$maximo:=0

If (Count parameters>=3)
$clase:=$3
End if

If (Count parameters=4)
$maximo:=$4
End if

$window_:=Open form window(“PRG_Progreso”;Palette form window;Horizontally centered;Vertically centered)
SET WINDOW TITLE(“Espere…”;$window_)
CALL FORM($window_;“PRG_Configurar”;$titulo;$subtitulo;$clase;$maximo)
DIALOG(“PRG_Progreso”;*)

$0:=$window_

</code 4D>

el metodo PRG_Configurar simplemente contiene la informacion de las variables a llenar al configurar la ventana por primera vez:

<code 4D>

// ----------------------------------------------------
// Usuario (SO): JorgeSanchez
// Fecha y hora: 01/18/19, 09:05:39
// ----------------------------------------------------
// Método: PRG_Configurar
// Descripción
//
// Metodo para actualizar la configuracion en la venta de progreso recien creada
//
// Parámetros

// $titulo [text] <- $1: Titulo del formulario
// $subtitulo [text] <- $2: Subtitulo del formulario
// $clase [number] <- $3:clase de barra de progreso, usar las contantes del metodo OBJECT SET INDICATOR TYPE
// $maximo [number] <- $4: Valor maximo para el calculo del paso a paso si es barra de progreso
//
// Resultado
//
// Parametros configurados de la ventana
//
// ----------------------------------------------------

C_TEXT($titulo;$1;$subtitulo;$2)
C_LONGINT($clase;$3;$maximo;$4)

$titulo:=$1
$subtitulo:=$2
$clase:=$3
$maximo:=$4

$prg:=OBJECT Get pointer(Object current;“vlProgreso”)
OBJECT SET INDICATOR TYPE($prg->;$clase)

vtTitulo:=$titulo
vtSubtitulo:=$subtitulo
vlMaximo:=$maximo
$prg->:=100 // Arrancar en 1 para el Barber shop

</code 4D>

El sistema retorna la referencia a la ventana creada, con este valor ejecuto CALL FORM cada vez con una actualizacion de la informacion en la ventana de progreso, por ejemplo:

<code 4D>
$ventana:=PRG_Iniciar (“Por favor espere”;“Analizando informacion (1 de 35000)”)
For ($i;1;10)
CALL FORM($ventana;“PRG_ActualizarProgreso”;"Corriendo "+String($i))
DELAY PROCESS(Current process;60*1)
End for

</code 4D>

antes de ejecutar el DIALOG, CALL FORM funciona, si lo llamo despues, deja de funcionar, al parecer el comando espera a terminar la ejecucion del metodo para realizar los cambios, sin embargo DIALOG cierra la ventana

Este es el proceso que se lleva a cabo

Jorge:

Cuando se usan ventanas aparte de progreso, es mejor enviar el procesamiento pesado a un Worker y actualizar la ventana de progreso desde éste.

Ej:
Este código debe ser lanzado desde un botón desde una ventana principal, de lo contrario no funciona DIALOG(;)
<code 4D>
// Lanzar el procesamiento de datos
$ventana:=Open form window(“Progreso”)
DIALOG(“Progreso”;
)
CALL WORKER(“WK1”;“Procesar_Datos”;$ventana)
</code 4D>

CALL WORKER lanza un nuevo proceso, de esta forma el procesamiento se da forma asincrónica, sin bloquear la interfaz principal y a su vez actualiza el progreso. Se hace una comunicación interproceso.
Método Procesar datos:

<code 4D>
C_LONGINT($1;$ventana)
$max:=200
$ventana:=$1
For ($i;1;$max)
CALL FORM($ventana;“PRG_Actualizar”;"Actualizando datos ";"Procesando “+String($i)+” de "+String($max);100*$i/$max)
DELAY PROCESS(Current process;1)
End for

CALL FORM($ventana;“PRG_Cerrar_Ventana”)
</code 4D>

PRG_Actualizar

<code 4D>
C_TEXT($1;$2)
C_REAL($3)

OBJECT SET TITLE(;“txtPrincipal”;$1)
OBJECT SET TITLE(
;“txtSecond”;$2)
vrProgreso:=$3

</code 4D>

PRG_Cerrar_Ventana

<code 4D>
CANCEL
</code 4D>

Saludos,