Page 1 of 2
Dialog de recurso incrustada en una ventana
Posted: Fri May 18, 2007 4:27 am
by jose_murugosa
Amigos,
Ya se que está en la tapa del libro, pero arranqué el libro por la mitad y en mis aplicaciones siempre he usado Dialogs, con excepción de la ventana principal.
Por alguna parte vi que puedo pasar todas mis dialogs a "Child No Border" y luego incrustarlas en ventanas para utilizar estos recursos que ya tengo hechos dentro de ventanas, y dar a los mismos nuevas ventajas.
Pero...., como no me acuerdo donde lo leí, podrían comentarme como incrusto las dialogs sin bordes en las ventanas ajustándolas al tamaño de la misma?
Gracias desde ya, y disculpen mi ignorancia.
Posted: Fri May 18, 2007 6:49 am
by Antonio Linares
José,
Aqui tienes un ejemplo de una técnica mejor aún, que consiste en cambiar los controles del diálogo a la ventana, usando la función SetParent():
Code: Select all
#include "FiveWin.ch"
#define COLOR_BTNFACE 15
function Main()
local oWnd
USE Customer
DEFINE WINDOW oWnd TITLE "Test" MDI
ACTIVATE WINDOW oWnd ;
ON INIT BuildChild()
return nil
function BuildChild()
local oChild
DEFINE WINDOW oChild TITLE "A Child Window" MDICHILD ;
COLOR 0, GetSysColor( COLOR_BTNFACE )
ACTIVATE WINDOW oChild ;
ON INIT BuildDialog( oChild )
return nil
function BuildDialog( oChild )
local oDlg, oBrw, oSay, cText := "Hello World!"
DEFINE DIALOG oDlg RESOURCE "DE_HEADER_BROWSE" OF oChild
oBrw = TXBrowse():New( oDlg )
oBrw:CreateFromResource( 10 )
oBrw:SetRDD()
REDEFINE BUTTON ID 20 OF oDlg
REDEFINE BUTTON ID 30 OF oDlg
REDEFINE BUTTON ID 40 OF oDlg
REDEFINE BUTTON ID 50 OF oDlg
REDEFINE BUTTON ID 60 OF oDlg
REDEFINE BUTTON ID 70 OF oDlg
REDEFINE BUTTON ID 80 OF oDlg
REDEFINE BUTTON ID 100 OF oDlg
REDEFINE BUTTON ID 1 OF oDlg
REDEFINE SAY oSay VAR cText ID 90 OF oDlg
ACTIVATE DIALOG oDlg NOWAIT ;
ON INIT ChangeParent( oDlg, oChild )
oDlg:End()
oChild:bResized = { || oBrw:SetSize( oChild:nWidth - 117, oChild:nHeight - 60 ),;
oSay:nTop := oChild:nHeight - 55, oSay:nLeft := ( oChild:nWidth / 2 ) - oSay:nWidth / 2 }
oChild:SetSize( 800, 400 )
return nil
function ChangeParent( oDlg, oChild )
local n
for n = 1 to Len( oDlg:aControls )
SetParent( oDlg:aControls[ n ]:hWnd, oChild:hWnd )
AAdd( oChild:aControls, oDlg:aControls[ n ] )
next
return nil
Posted: Fri May 18, 2007 11:54 am
by jose_murugosa
Muchas gracias Antonio por tu rápida respuesta
, lo voy a probar.
Posted: Fri May 18, 2007 3:30 pm
by Raymundo Islas M.
Hola Antonio
Estaba tambien buscando algo como esto, pero tal y como lo comenta Jose, es posible quitarle el borde al dialogo que salga sin el caption ?
Lo que busco, es que al momento de presentar las hijas, estas salgan en una posicion determinada y sin caption ni bordes.
Saludos
Posted: Fri May 18, 2007 5:35 pm
by Alfredo Arteaga
Ray, lo uso de esta forma:
DEFINE ICON oIcon RESOURCE "IconSys"
DEFINE WINDOW oWChld MDIChild FROM 1,2 TO 2,2 OF oWnd TITLE cTitle NOZOOM ICON oIcon
DEFINE DIALOG oDlg RESOURCE "Dialogo" FONT oWnd:oFont OF oWChld
...
ACTIVATE DIALOG oDlg NOWAIT VALID (oWChld:End(),.T.)
ACTIVATE WINDOW oWChld ;
ON INIT (oDlg:Move(0,0)) ;
ON RESIZE (oWChld:SetSize(oDlg:nWidth+nW,oDlg:nHeight+nH)) ;
VALID (oWChld:=Nil,Close_Dlg(),.T.)
Puedes quitara el caption y bordes con tu editor de recursos.
Posted: Fri May 18, 2007 5:38 pm
by Antonio Linares
Raymundo,
Con esta nueva forma de hacerlo (SetParent()) no se llega a mostrar el diálogo. Solo se crea, se pasan sus controles a la ventana de destino y luego se destruye el diálogo
Posted: Fri May 18, 2007 6:03 pm
by wmormar
Antonio Linares wrote:Raymundo,
Con esta nueva forma de hacerlo (SetParent()) no se llega a mostrar el diálogo. Solo se crea, se pasan sus controles a la ventana de destino y luego se destruye el diálogo
Antonio,
funciona con cualquier versión de FWH?
saludos
Posted: Fri May 18, 2007 6:04 pm
by Antonio Linares
William,
Si
Posted: Fri May 18, 2007 6:06 pm
by wmormar
Antonio Linares wrote:William,
Si
Gracias antonio
Posted: Fri May 18, 2007 7:34 pm
by Raymundo Islas M.
Hola Alfredo y Antonio :
Gracias Masters
Empezare a probar con estas opciones antes mencionadas por uds.
Saludos
Posted: Fri May 18, 2007 8:33 pm
by Raymundo Islas M.
Alfredo :
No se hice o como lo hice ( todo seguramente mal
) pero me salen 2 childs entrelazadas.
, seguire probando.
Antonio :
Hay forma de "pasar" los controles del dialogo a la child que no sean "necesarios" de REDEFINIR ? i.e. los say con -1 yo uso algunos groups solo como "separadores".
Por que me paso solo los controles que estan Redefinidos.
Saludos
Posted: Sat May 19, 2007 10:26 pm
by Antonio Linares
Esta función cambia de padre a todos los controles, incluyendo los que no estén redefinidos:
Code: Select all
#define GW_CHILD 5
#define GW_HWNDNEXT 2
function ChangeParent( oDlg, oChild )
local hCtrl := GetWindow( oDlg:hWnd, GW_CHILD )
local n
while hCtrl != 0
SetParent( hCtrl, oChild:hWnd )
hCtrl = GetWindow( hCtrl, GW_HWNDNEXT )
end
for n = 1 to Len( oDlg:aControls )
AAdd( oChild:aControls, oDlg:aControls[ n ] )
next
return nil
Posted: Sun May 20, 2007 1:55 am
by Raymundo Islas M.
Antonio :
Al aplicar la nueva funcion que comentas, muestra solo el 1er control.
Saludos
Posted: Sun May 20, 2007 8:07 am
by Antonio Linares
Raymundo,
Prueba así:
Code: Select all
#define GW_CHILD 5
#define GW_HWNDNEXT 2
function ChangeParent( oDlg, oWnd )
local hCtrl := GetWindow( oDlg:hWnd, GW_CHILD )
local n, aChilds := {}
while hCtrl != 0
AAdd( aChilds, hCtrl )
hCtrl = GetWindow( hCtrl, GW_HWNDNEXT )
end
AEval( aChilds, { | hCtrl | SetParent( hCtrl, oWnd:hWnd ) } )
for n = 1 to Len( oDlg:aControls )
AAdd( oWnd:aControls, oDlg:aControls[ n ] )
next
return nil
Posted: Mon May 21, 2007 10:53 am
by fgondi
Hola Antonio,
Gracias por esta nueva aportación
Tengo unos problemas con esta función:
1º Desde un get no funciona ni el tabulador ni el intro para cambiar a otro.
2º Uso groupbox sin redifinir en el programa (-1) para mostrar datos agrupados y con esta función no refrescan el fondo.