FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour ¿Cómo crear un Diálogo haciendo clic fuera del mismo para que se cierre?
Posts: 537
Joined: Mon Jan 16, 2006 03:42 PM
¿Cómo crear un Diálogo haciendo clic fuera del mismo para que se cierre?
Posted: Thu Dec 04, 2025 03:15 PM

Buenos Dias
tengo este codigo para cerrar dialogo cuando se hace click afuera, hace bien eso, el problema que al ocupar el calendario me bloquea.

#include "FiveWin.ch"
#include "dtpicker.ch"
#include "calendar.ch"
#include "wcolors.ch"
#include "TSButton.ch"

#Define CLR_NARANJA RGB(249,196,98)
#Define CLR_NADA RGB(255,255,255)
#DEFINE WS_EX_DLGMODALFRAME 0x0001
#define TME_LEAVE 2
#define WM_MOUSELEAVE 675

FUNCTION Main()
LOCAL oWnd
LOCAL oFecha := Dtoc(Date())
LOCAL oBtn

SET DATE TO BRITISH
SET EPOCH TO 1980
SET DATE FORMAT "dd-mm-yyyy"

DEFINE WINDOW oWnd TITLE "Ventana Principal con Botón"

 @ 10, 10 BUTTON  oBtn   PROMPT oFecha OF oWnd  SIZE 150, 40  action MostrarCalendario( oFecha, oWnd:nLeft, oWnd:nTop + 100,oBtn)

ACTIVATE WINDOW oWnd MAXIMIZED

RETURN NIL

STATIC FUNCTION MostrarCalendario (xFecha, nX, nYm, oBtn)
LOCAL oCalWnd
LOCAL nCalWidth := 520
LOCAL nCalHeight := 380
LOCAL dFecha := Date()
local oCal,oFntCal,oMarco
LOCAL lSunday := .T.
LOCAL lSaturday := .T.
Local oFecha

DEFINE FONT oFntCal NAME "Segoe UI" SIZE 0, -16

DEFINE DIALOG oCalWnd FROM oBtn:nRight, oBtn:nTop TO oBtn:nRight + nCalWidth, oBtn:nTop + nCalHeight PIXEL STYLE WS_POPUP
// ,LARGO
@ 0, 0 CALENDAR oCal VAR dFecha SIZE 280,230 ;
DBLCLICK ( oFecha:=oCal:GetDate(),oCalWnd:End() ) DAYSTATE of oCalWnd FONT oFntCal COLOR CLR_BLACK,RGB(95, 179, 35 )

oCal:SetNoTodayCircle( .t. )
oCal:SetNoToday( .t. )
oCal:SetWeekNumbers( .f. )
oCal:SetMinRange( Date() )
oCal:SetColor( 5, CLR_NADA )

oCalWnd:bStart = { || SetCapture( oCalWnd:hWnd ) }

ACTIVATE DIALOG oCalWnd ;
ON CLICK If( nRow < 0 .or. nCol < 0 .or. ;
nRow > oBtn:nTop + nCalHeight .or. nCol > oBtn:nRight + nCalWidth,;
oCalWnd:End(),)

RETURN nil

Saludos

Posts: 8515
Joined: Tue Dec 20, 2005 07:36 PM
Re: ¿Cómo crear un Diálogo haciendo clic fuera del mismo para que se cierre?
Posted: Thu Dec 04, 2025 05:33 PM

Yo haria asi:

// c:\fwh\samples\JBRITA.PRG

#include "FiveWin.ch"
#include "dtpicker.ch"
#include "calendar.ch"
// #include "wcolors.ch"
// #Include "TSButton.ch"  //???

#define CLR_NARANJA RGB(249,196,98)
#define CLR_NADA RGB(255,255,255)
#define WS_EX_DLGMODALFRAME 0x0001
#define TME_LEAVE 2
#define WM_MOUSELEAVE 675

STATIC oWnd, lSalir := .F.

FUNCTION Main()

   LOCAL oFecha, oBtn, oBtnExit

   SET CENTURY ON
   SET DATE BRITISH
   SET EPOCH TO YEAR( DATE() ) - 30
   SETCANCEL( .F. )
   SET DATE FORMAT "dd-mm-yyyy"

   oFecha := DToC( Date() ) // date atual

   DEFINE WINDOW oWnd TITLE "Ventana Principal con Botón"

   @ 10, 10 BUTTON oBtn PROMPT oFecha OF oWnd SIZE 150, 40  ;
      ACTION MostrarCalendario( oFecha, oWnd:nLeft, oWnd:nTop + 100, oBtn )

   @ 180, 300 BTNBMP oBtnExit OF oWnd SIZE 150, 40 RIGHT ;
      PROMPT "&Salir" FILE "..\BITMAPS\Exit.bmp" 2007 ;
      ACTION( lSalir := .T., oWnd:End() )

   oBtnExit:cToolTip := "Salir - Exit - Cancelar"

   // oBtnExit:lEllipse = .T.
   oBtnExit:lCancel := .T.

   ACTIVATE WINDOW oWnd MAXIMIZED

RETURN NIL

FUNCTION MostrarCalendario( xFecha, nX, nYm, oBtn )

   LOCAL oDlg, cTitle, oBtnExit, oBmp, oBrush
   LOCAL nCalWidth  := 520
   LOCAL nCalHeight := 380
   LOCAL dFecha     := Date()
   LOCAL oCal, oFntCal, oMarco
   LOCAL lSunday    := .T.
   LOCAL lSaturday  := .T.
   LOCAL oFecha

   cTitle := "Testing Calendar of jBrita"

   SetDlgGradient( { { 1, RGB( 199, 216, 237 ), RGB( 237, 242, 248 ) } } )

   DEFINE BRUSH oBrush FILENAME "..\bitmaps\backgrnd\gradien.bmp"
   DEFINE FONT oFntCal NAME "Segoe UI" SIZE 0, - 16

   // DEFINE DIALOG oDlg FROM oBtn:nRight, oBtn:nTop TO oBtn:nRight + nCalWidth, oBtn:nTop + nCalHeight PIXEL // STYLE WS_POPUP
   DEFINE DIALOG oDlg FROM 210, 150 TO 520, 700 TITLE cTitle PIXEL FONT oFntCal // BRUSH oBrush // STYLE WS_POPUP

   oDlg:LHelpIcon := .F.

   // ,LARGO - DBLCLICK NO FUNCIONA ?
   @ 00, 00 CALENDAR oCal VAR dFecha SIZE 280, 230 ;
      DBLCLICK ( oFecha := oCal:GetDate(), lSalir := .T., oDlg:End() ) DAYSTATE OF oDlg ;
      FONT oFntCal COLOR CLR_BLACK, RGB( 95, 179, 35 )

   oCal:SetNoTodayCircle( .T. )
   oCal:SetNoToday( .T. )
   oCal:SetWeekNumbers( .F. )
   oCal:SetMinRange( Date() )
   oCal:SetColor( 5, CLR_NADA )

   @ 125, 10 BITMAP oBmp FILE "..\BITMAPS\QUESTION.BMP" OF oDlg ;
       SIZE 20, 30 PIXEL NOBORDER 

   oBmp:lTransparent = .t.

@ 130, 120 BTNBMP oBtnExit OF oDlg SIZE 50, 20 FONT oFntCal RIGHT ;
    PROMPT "&Salir" FILE "..\BITMAPS\Exit.bmp" 2007 ;
    ACTION( lSalir := .T., oDlg:End() )

   oBtnExit:cToolTip := "Salir - Exit - Cancelar"

   oBtnExit:lEllipse = .T.
   oBtnExit:lCancel := .T.

   // TRABA EL DIALOGO/CALENDARIO
   // oDlg:bStart = { || SetCapture( oDlg:hWnd ) } // Para que sirve en este caso?

   ACTIVATE DIALOG oDlg CENTERED ;
      ON CLICK Salir( oDlg )     ;
      VALID( lSalir )

   lSalir := .F.

   oBrush:End()
   oFntCal:End()

RETURN NIL

FUNCTION Salir( oDlg )

   lSalir := .T.
   oDlg:End()

RETURN NIL

// FIN / END
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 537
Joined: Mon Jan 16, 2006 03:42 PM
Re: ¿Cómo crear un Diálogo haciendo clic fuera del mismo para que se cierre?
Posted: Fri Dec 05, 2025 12:26 AM

karinha, no resulta, incluso el caledar con dialogo no cambia los colores no asi con define windows

saludos

Posts: 199
Joined: Wed Jan 02, 2019 08:36 AM
Re: ¿Cómo crear un Diálogo haciendo clic fuera del mismo para que se cierre?
Posted: Fri Dec 05, 2025 09:46 AM

Buenos dias

Prueba esto. No es perfecto, pero a lo mejor te puede inspirar una solución.
Saludos

#include "fivewin.ch"

function Main()

LOCAL oWnd

   DEFINE WINDOW oWnd TITLE "ISOVER.PRG"

   @2,2 BUTTON "Crear Diálogo" OF oWnd SIZE 150,40 ACTION MiDialogo()

   ACTIVATE WINDOW oWnd MAXIMIZED

RETURN(NIL)

FUNCTION MiDialogo()

LOCAL oDlg

   DEFINE DIALOG oDlg TITLE "Mi Dialogo" FROM 200,300 TO 400,500 PIXEL

   oDlg:bStart := { || SetCapture( oDlg:hWnd ) }

   oDlg:bLClicked := { |nRow, nCol, nFlags| CerrarSiFuera( oDlg ) }

   ACTIVATE DIALOG oDlg

RETURN NIL


//*----------------------------------------------------------------------------
FUNCTION CerrarSiFuera( oDlg )

LOCAL aPt   := GetCursorPos()
LOCAL aRect := { oDlg:nLeft, oDlg:nTop, oDlg:nLeft + oDlg:nWidth, oDlg:nTop  + oDlg:nHeight }

   IF aPt[2]<aRect[1] .OR. aPt[2]>aRect[3] .OR. aPt[1]<aRect[2] .OR. aPt[1]>aRect[4]
      oDlg:End()
   ENDIF

RETURN NIL
Jesús Marín
deumare@gmail.com
Posts: 8515
Joined: Tue Dec 20, 2005 07:36 PM
Re: ¿Cómo crear un Diálogo haciendo clic fuera del mismo para que se cierre?
Posted: Fri Dec 05, 2025 12:59 PM

Jesús, el problema es que si usas DTPICKER o CALENDAR, la función SETCAPTURE() congela el diálogo/calendario. Es un defecto de SETCAPTURE().

// C:\FWH\SAMPLES\DLGCLICK.PRG

#include "FiveWin.ch"
#include "dtpicker.ch"
#include "calendar.ch"

#define CLR_NARANJA RGB(249,196,98)
#define CLR_NADA RGB(255,255,255)

FUNCTION Main()

   LOCAL oDlg, cTitle, oBtnExit, oBmp, oFont
   LOCAL nCalWidth  := 520
   LOCAL nCalHeight := 380
   LOCAL dFecha     := Date()
   LOCAL oCal, oFntCal, oMarco
   LOCAL lSunday    := .T.
   LOCAL lSaturday  := .T.
   LOCAL oFecha

   cTitle := "Testing Calendar of jBrita"

   SetDlgGradient( { { 1, RGB( 199, 216, 237 ), RGB( 237, 242, 248 ) } } )

   DEFINE FONT oFont NAME "Segoe UI" SIZE 0, - 16

   DEFINE DIALOG oDlg FROM 210, 150 TO 520, 700 TITLE cTitle PIXEL

   oDlg:lHelpIcon := .F.

   @ 00, 00 CALENDAR oCal VAR dFecha SIZE 280, 230 ;
      DBLCLICK ( oFecha := oCal:GetDate(), oDlg:End() ) DAYSTATE OF oDlg ;
      FONT oFont COLOR CLR_BLACK, RGB( 95, 179, 35 )

   oCal:SetNoTodayCircle( .T. )
   oCal:SetNoToday( .T. )
   oCal:SetWeekNumbers( .F. )
   oCal:SetMinRange( Date() )
   oCal:SetColor( 5, CLR_NADA )

   // oDlg:bGotFocus  := {|| oDlg:End() }
   // oDlg:bLostFocus := {|| oDlg:End() }

   oDlg:bStart := { || SetCapture( oDlg:hWnd ) }

   oDlg:bLClicked := { |nRow, nCol, nFlags| CerrarSiFuera( oDlg ) }

   ACTIVATE DIALOG oDlg CENTERED /* ;
      ON CLICK( oDlg:End() ) */


RETURN NIL

FUNCTION CerrarSiFuera( oDlg ) // By Jesus Marin.

   LOCAL aPt   := GetCursorPos()
   LOCAL aRect := { oDlg:nLeft, oDlg:nTop, oDlg:nLeft + oDlg:nWidth, oDlg:nTop  + oDlg:nHeight }

   IF aPt[2]<aRect[1] .OR. aPt[2]>aRect[3] .OR. aPt[1]<aRect[2] .OR. aPt[1]>aRect[4]

  oDlg:End()

   ENDIF

RETURN NIL

// FIN / END

Regards, saludos.

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 8515
Joined: Tue Dec 20, 2005 07:36 PM
Re: ¿Cómo crear un Diálogo haciendo clic fuera del mismo para que se cierre?
Posted: Fri Dec 05, 2025 02:50 PM

NO FUNCIONA! CONGELA/TRABA TODO..

// C:\FAHW\SAMPLES\TESTE.PRG

#include "FiveWin.ch"
#include "dtpicker.ch"
#include "calendar.ch"
#include "wcolors.ch"

FUNCTION Main()

   LOCAL oDlg, oCal, oDtp1, oDtp2, oDtp3, oDtp4, oCbx, cTitle, oFont
   LOCAL oSayClr
   LOCAL nColor
   LOCAL dDate1, dDate2, dDate3, dDate4, dDate5, dDate6
   LOCAL cItemClr
   LOCAL lWeekNumbers   := .F.
   LOCAL lNoTodayCircle := .F.
   LOCAL lNoToday       := .F.
   LOCAL lDayState      := .F.
   LOCAL oRange3, aRanges2 := { , }
   LOCAL oRange4
   LOCAL aColorItems    := { "MCSC_BACKGROUND  " ,;
                             "MCSC_TEXT        " ,;
                             "MCSC_TITLEBK     " ,;
                             "MCSC_TITLETEXT   " ,;
                             "MCSC_MONTHBK     " ,;
                             "MCSC_TRAILINGTEXT" }
   LOCAL oDayOfWeek, cDayOfWeek:="Monday", aDayOfWeek:={"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"}                          
   

   LOCAL oCal2
   LOCAL oRange1, aRanges := { , }
   LOCAL oRange2
   LOCAL oMax, nMax
   LOCAL lSunday   := .T.
   LOCAL lSaturday := .T.

   SET DATE TO BRITISH
   SET EPOCH TO 1980

   dDate1 = Date()
   dDate2 = Date()
   dDate3 = Date()
   dDate4 = Date() + 7
   dDate5 = Date()
   dDate6 = Date()
 
   cTitle := "Testing Calendar of jBrita"

   SetDlgGradient( { { 1, RGB( 199, 216, 237 ), RGB( 237, 242, 248 ) } } )

   DEFINE FONT oFont NAME "Segoe UI" SIZE 0, - 16

   DEFINE DIALOG oDlg FROM 210, 150 TO 450, 1200 TITLE cTitle PIXEL

   oDlg:lHelpIcon := .F.
  

   @ 000, 000 CALENDAR oCal2 VAR dDate3, dDate4 OF oDlg PIXEL MULTISELECT DAYSTATE ;
      DBLCLICK MsgInfo( oCal2:GetDate() ) SIZE 550, 170 COLOR CLR_BLACK, CLR_HRED

   oCal2:bGotFocus  := {|| oCal2:SetTitleBk( CLR_YELLOW ) }
   oCal2:bLostFocus := {|| oCal2:SetTitleBk( CLR_HRED ) }

   nMax = oCal2:GetMaxSelCount()

   OnGetState( oCal2, lSunday, lSaturday )

   oCal2:bOnGetState = { | oCal | OnGetState( oCal, lSunday, lSaturday ) }

   oDlg:bStart := { || SetCapture( oDlg:hWnd ) }

   oDlg:bLClicked := { |nRow, nCol, nFlags| CerrarSiFuera( oDlg ) }
  	
   ACTIVATE DIALOG oDlg CENTERED /* ;
      ON CLICK( oDlg:End() ) */
 
RETURN NIL

Function OnGetState( oCal, lSun, lSat )

   LOCAL i, imax, j, jmax, nDay, nDayState, nMonth
   LOCAL dStartDate 
   LOCAL dCurrentDay := oCal:dDate 
  

   oCal:GetMonthRange()
   

   dStartDate = oCal:dDate 

   imax   := Len( oCal:aDayState )
   nMonth := Month( dStartDate )

   FOR i:=1 TO imax
      nDayState := 0

  FOR j:=1 TO 31
     nDay := DoW( dStartDate ) - 2
     IF nDay < 0
        nDay += 7
     ENDIF

     IF nDay == 5 .AND. lSat
        oCal:SetArrayDayState( i, j )
     ENDIF

     IF nDay == 6 .AND. lSUN
        oCal:SetArrayDayState( i, j )
     ENDIF
     
     dStartDate ++

     IF Month( dStartDate ) <> nMonth
        EXIT
     ENDIF
  NEXT

  nMonth       := Month( dStartDate )
   NEXT

   oCal:SetDate( dCurrentDay )

return nil

FUNCTION CerrarSiFuera( oDlg ) // By Jesus Marin.

   LOCAL aPt   := GetCursorPos()
   LOCAL aRect := { oDlg:nLeft, oDlg:nTop, oDlg:nLeft + oDlg:nWidth, oDlg:nTop  + oDlg:nHeight }

   IF aPt[2]<aRect[1] .OR. aPt[2]>aRect[3] .OR. aPt[1]<aRect[2] .OR. aPt[1]>aRect[4]

  oDlg:End()

   ENDIF

RETURN NIL

Regards, saludos.

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 199
Joined: Wed Jan 02, 2019 08:36 AM
Re: ¿Cómo crear un Diálogo haciendo clic fuera del mismo para que se cierre?
Posted: Fri Dec 05, 2025 06:26 PM

Buenas de nuevo.
Prueba esto. A mi si me funciona.
Lo que desconozco es como funciona la clase tCalendar. Nunca la he utilizado.

#include "fivewin.ch"
#include "calendar.ch"


STATIC oDlg

function Main()

LOCAL oWnd

   DEFINE WINDOW oWnd TITLE "ISOVER.PRG - Si hacemos click fuera del diálogo"

  @2,2 BUTTON "Crear Diálogo" OF oWnd SIZE 150,40 ACTION MiDialogo()

  oWnd:bGotFocus := {||  IsOver() }

   ACTIVATE WINDOW oWnd MAXIMIZED

RETURN(NIL)

//-----------------------------------------------------------------------------
FUNCTION MiDialogo()

LOCAL oCal, oFecha, dFecha:=Date()

   DEFINE DIALOG oDlg TITLE "Mi Dialogo" FROM 200,300 TO 400,860 PIXEL

  @ 00, 00 CALENDAR oCal VAR dFecha SIZE 280, 230 ;
  DBLCLICK ( oFecha := oCal:GetDate(), oDlg:End() ) DAYSTATE OF oDlg ;
  COLOR CLR_BLACK, RGB( 95, 179, 35 )

   ACTIVATE DIALOG oDlg NOWAIT

RETURN NIL

//-----------------------------------------------------------------------------
FUNCTION IsOver()

IF VALTYPE(oDlg)="O"
   oDlg:End()
   oDlg:=NIL
ENDIF

RETURN NIL
Jesús Marín
deumare@gmail.com
Posts: 8515
Joined: Tue Dec 20, 2005 07:36 PM
Re: ¿Cómo crear un Diálogo haciendo clic fuera del mismo para que se cierre?
Posted: Fri Dec 05, 2025 08:28 PM

Jesus, con NOWAIT, funciona parcial, hay erros en SETCAPTURE y en CALENDAR. -> DBLCLICK - NO FUNCIONA.

// c:\fwh\samples\ISOVER.PRG by Jesus Marin.

#include "fivewin.ch"
#include "calendar.ch"
#include "dtpicker.ch"
#include "wcolors.ch"

#Define CLR_NARANJA RGB(249,196,98)
#Define CLR_NADA RGB(255,255,255)

STATIC oDlg, oWnd

FUNCTION Main()

   LOCAL oBtn

   SET CENTURY ON
   SET DATE BRITISH
   SET EPOCH TO YEAR( DATE() ) - 30
   SETCANCEL( .F. )
   SET DATE FORMAT "dd-mm-yyyy"

   DEFINE WINDOW oWnd TITLE "ISOVER.PRG - Si hacemos click fuera del diálogo"

   @ 180, 100 BTNBMP oBtn OF oWnd SIZE 150, 40 RIGHT          ;
      PROMPT "&Crear Diálogo" FILE "..\BITMAPS\Open.bmp" 2007 ;
      ACTION MiDialogo()

   oWnd:bGotFocus := { ||  IsOver() }

   ACTIVATE WINDOW oWnd MAXIMIZED

RETURN NIL

FUNCTION MiDialogo()

   LOCAL oCal, oFecha, dFecha := Date(), oFont, cTitle

   cTitle := "Testing Calendar of jBrita"

   SetDlgGradient( { { 1, RGB( 199, 216, 237 ), RGB( 237, 242, 248 ) } } )

   DEFINE FONT oFont NAME "Segoe UI" SIZE 0, - 16

   DEFINE DIALOG oDlg TITLE cTitle FROM 200, 300 TO 420, 860 PIXEL

   oDlg:lHelPIcon := .F.

   //-> DBLCLICK - NO FUNCIONA Jesus!
   @ 00, 00 CALENDAR oCal VAR dFecha SIZE 280, 230                       ;
      DBLCLICK ( oFecha := oCal:GetDate(), oDlg:End() ) DAYSTATE OF oDlg ;
      COLOR CLR_BLACK, RGB( 95, 179, 35 )

   oCal:SetNoTodayCircle( .T. )
   oCal:SetNoToday( .T. )
   oCal:SetWeekNumbers( .F. )
   oCal:SetMinRange( Date() )
   oCal:SetColor( 5, CLR_NADA )

   ACTIVATE DIALOG oDlg NOWAIT

   oFont:End()

RETURN NIL

FUNCTION IsOver()

   IF VALTYPE(oDlg)="O"

  oDlg:End()
  oDlg:=NIL

   ENDIF

RETURN NIL

// FIN / END

Regards, saludos.

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 537
Joined: Mon Jan 16, 2006 03:42 PM
Re: ¿Cómo crear un Diálogo haciendo clic fuera del mismo para que se cierre?
Posted: Sun Dec 07, 2025 03:13 PM

Buenos dias.. ahora va funcionando bien, por favor si lo pueden proban,el detalle que me aparecen mas calendarios al lado derecho y abajo..
saludos

STATIC oDlg,oFecha,oCal

function Main()

LOCAL oWnd

   DEFINE WINDOW oWnd TITLE "ISOVER.PRG - Si hacemos click fuera del diálogo"

  @2,2 BUTTON "Crear Diálogo" OF oWnd SIZE 150,40 ACTION MiDialogo()

  oWnd:bGotFocus := {||  IsOver() }

   ACTIVATE WINDOW oWnd MAXIMIZED

RETURN(NIL)

//-----------------------------------------------------------------------------
FUNCTION MiDialogo()

LOCAL dFecha:=Date()
local oFntCal

DEFINE FONT oFntCal NAME "Segoe UI" SIZE 0, -16
                                                         //abajo,al lado
   DEFINE DIALOG oDlg  FROM 200,300 TO 450,590 PIXEL    STYLE WS_DLGFRAME

   @ 0, 0 CALENDAR oCal VAR dFecha SIZE 280,230 DAYSTATE  of oDlg  FONT oFntCal


   ACTIVATE DIALOG oDlg  ON INIT InitState(oCal) NOWAIT
RETURN NIL

//-----------------------------------------------------------------------------
FUNCTION IsOver()

IF VALTYPE(oDlg)="O"
   oDlg:End()
   oDlg:=NIL
ENDIF

RETURN NIL

FUNCTION InitState(oCal)

oCal:SetNoTodayCircle( .t. )
oCal:SetNoToday( .t. )
oCal:SetWeekNumbers( .f. )
oCal:SetMinRange( Date() )
oCal:SetColor( 5, CLR_NADA )
oCal:bGotFocus  := {|| oCal:SetTitleBk( RGB(95, 179, 35  ) ) }
oCal:bLDblClick := {||  ( oFecha:=oCal:GetDate(), oDlg:End() ) }

RETURN NIL

Posts: 8515
Joined: Tue Dec 20, 2005 07:36 PM
Re: ¿Cómo crear un Diálogo haciendo clic fuera del mismo para que se cierre?
Posted: Mon Dec 08, 2025 02:36 PM

Normal. Solo oCal:bLDblClick NO FUNCIONA.

// C:\FWH\SAMPLES\ISOVER2.PRG

#include "FiveWin.ch"
#include "calendar.ch"
#include "dtpicker.ch"
#include "wcolors.ch"

#Define CLR_NARANJA RGB(249,196,98)
#Define CLR_NADA RGB(255,255,255)

STATIC oDlg, oFecha, oCal, oWnd

FUNCTION Main()

   SET CENTURY ON
   SET DATE BRITISH
   SET EPOCH TO YEAR( DATE() ) - 30
   SETCANCEL( .F. )
   SET DATE FORMAT "dd-mm-yyyy"

   DEFINE WINDOW oWnd TITLE "ISOVER2.PRG - Si hacemos click fuera del diálogo"

   @2, 2 BUTTON "Crear Diálogo" OF oWnd SIZE 150, 40 ;
      ACTION( MiDialogo() )

oWnd:bGotFocus := {||  IsOver() }

   ACTIVATE WINDOW oWnd MAXIMIZED

RETURN NIL

FUNCTION MiDialogo()

   LOCAL dFecha, oFntCal

   dFecha := Date()

   DEFINE FONT oFntCal NAME "Segoe UI" SIZE 0, - 16

   // abajo, al lado
   DEFINE DIALOG oDlg  FROM 200, 300 TO 470, 590 PIXEL STYLE WS_DLGFRAME     ;
      TRANSPARENT

   @ 0, 0 CALENDAR oCal VAR dFecha SIZE 280, 230 DAYSTATE  of oDlg        ;
      FONT oFntCal

   oCal:SetNoTodayCircle( .T. )
   oCal:SetNoToday( .T. )
   oCal:SetWeekNumbers( .F. )
   oCal:SetMinRange( Date() )
   oCal:SetColor( 5, CLR_NADA )

   ACTIVATE DIALOG oDlg NOWAIT ;
      ON INIT InitState( oCal )

   oFntCal:End()

RETURN NIL

FUNCTION IsOver()

   IF ValType( oDlg ) = "O"

  oDlg:End()
  oDlg := NIL

   ENDIF

RETURN NIL

FUNCTION InitState( oCal )

   /* NO COMPRENDO ????
   oCal:SetNoTodayCircle( .T. )
   oCal:SetNoToday( .T. )
   oCal:SetWeekNumbers( .F. )
   oCal:SetMinRange( Date() )
   oCal:SetColor( 5, CLR_NADA )
   */

   oCal:bGotFocus  := {|| oCal:SetTitleBk( RGB( 95, 179, 35  ) ) }

   // NO FUNCIONA.
   oCal:bLDblClick := {||  ( oFecha := oCal:GetDate(), oDlg:End(), __QUIT() ) }

RETURN NIL

// FIN / END

Regards, saludos.

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 199
Joined: Wed Jan 02, 2019 08:36 AM
Re: ¿Cómo crear un Diálogo haciendo clic fuera del mismo para que se cierre?
Posted: Fri Dec 12, 2025 11:18 AM

Normal. Solo oCal:bLDblClick NO FUNCIONA.

Si, si funciona.
Ver el mensaje sobre uso de tCalendar
https://fivetechsupport.com/forums/viewtopic.php?t=46192
Saludos

Jesús Marín
deumare@gmail.com

Continue the discussion