Tomando como punto de partida el ejemplo Testpane.prg que viene en los samples podrás meter muchos datos dentro de una ventana... muy últil para cuando los datos no caben en un solo dialogo.
DEFINE WINDOW oWnd TITLE "Scroll"
@ 10, 10 PANEL oPanel OF oWnd ;
SIZE oWnd:nWidth() - 26, oWnd:nHeight() - 48 PIXEL
@ 6, 3.8 SAY "Name:" OF oPanel SIZE 40, 15
@ 7, 8 GET cName OF oPanel SIZE 100, 18
@ 7.8, 2.1 SAY "Address:" OF oPanel SIZE 50, 15
@ 9, 8 GET cAddress OF oPanel SIZE 120, 18
@9.8, 3.8 SAY "Calle:" OF oPanel SIZE 40, 15
@ 11, 8 GET cCalle OF oPanel SIZE 100, 18
@ 11.5,2.1 SAY "Colonia:" OF oPanel SIZE 50, 15
@ 14.0,7.5 GET cColonia OF oPanel SIZE 120, 18
ACTIVATE WINDOW oWnd
Pero dicho código tiene un defecto muy feo... conforme sigas metiendo datos terminarás teniendo un código similar a siguiente
@19.1,14.5 SAY "Estado" OF oPanel SIZE 80, 15
@23.5,11.0 GET oDbf:NXESTADO PICTURE "@!" OF oPanel SIZE 111, 18
@21.7,0.5 SAY "Teléfono de Casa" OF oPanel SIZE 110, 15
@26.4,0.5 GET oDbf:NXTELCASA PICTURE "@!" OF oPanel SIZE 118, 18
@24.1,0.5 SAY "Domicilio entre la calle" OF oPanel SIZE 130, 15
@29.3,0.5 GET oDbf:NXCALLE1 PICTURE "@!" OF oPanel SIZE 195, 18
@26.7,0.5 SAY "Y la calle" OF oPanel SIZE 80, 15
@32.2,0.5 GET oDbf:NXCALLE2 PICTURE "@!" OF oPanel SIZE 195, 18
@29.2,0.5 SAY "Referencia de ubicación" OF oPanel SIZE 140, 15
@35.2,0.5 GET oDbf:NXREFUBI PICTURE "@!" OF oPanel SIZE 195, 18
@27.2, 5 BUTTON aBtns[1] PROMPT "Guardar" OF oPanel SIZE 60,20 ;
ACTION ( Guardar1( oDbf, oWnd ) )
@27.2,18 BUTTON aBtns[2] PROMPT "Salir" OF oPanel SIZE 60,20 ;
ACTION ( oWnd:End() )
Date cuenta que las coordenadas del botón están en el renglón 27 y las coordenadas para el dato "Referencia de ubicación" están en el 29.... por si fuera poco el GET está en el renglón 35
¿Cómo arreglarlo?
Usa en cada control la claúsula PIXEL
@605,7 SAY "Ingresos comprobables" OF oPanel SIZE 120, 15 PIXEL
@620,7 COMBOBOX oDbf:NXINGRE ITEMS aIngresos OF oPanel SIZE 150, 250 PIXEL
@645,7 SAY "Tipo de vivienda" OF oPanel SIZE 120, 15 PIXEL
@660,7 COMBOBOX oDbf:NXTIPOVIVI ITEMS aVivienda OF oPanel SIZE 150, 250 PIXEL
@685,7 SAY "Descripción de la vivienda" OF oPanel SIZE 180, 15 PIXEL
@700,7 COMBOBOX oDbf:CFDESCVIVI ITEMS aDesVivi OF oPanel SIZE 150, 250 PIXEL
@725,7 SAY "Número de niveles" OF oPanel SIZE 120, 15 PIXEL
@740,7 GET oDbf:CFNIVELES PICTURE "99" OF oPanel SIZE 40, 18 PIXEL
@780,7 BUTTON aBtns[1] PROMPT "Guardar" OF oPanel SIZE 60,20 ;
ACTION ( Guardar1( oDbf, oWnd ) ) PIXEL
@780,95 BUTTON aBtns[2] PROMPT "Salir" OF oPanel SIZE 60,20 ;
ACTION ( oWnd:End() ) PIXEL
Asi todos datos están en forma progresiva como debe ser. De ésta manera que menciono es más fácil y rápido programar, por que la separación entre GET y el siguiente SAY siempre es de 25 y la separación de SAY al siguiente GET es de 15.
Otra cosa más.... siguiendo con el ejemplo del Testpane.prg. Si lo usastes para tus desarrollos o usas la clausula PIXEL. Cuando son mas de 20 datos... la primera vez que entras a la ventana, los datos se desplazan rápido. Pero si sales y vuelves a entrar, verás que ahora el desplazamiento es muy lento.
¿Cómo se soluciona?
Fácil, en el ACTIVATE WINDOW oWnd agrega la claúsula MODAL
ACTIVATE WINDOW oWnd MODAL
Ahora notarás que no pierdes velocidad alguna.
Saludos
Fernando Leal