Dialog with timer bar

This forum is for eXpress++ general support.
Post Reply
Message
Author
skiman
Posts: 1199
Joined: Thu Jan 28, 2010 1:22 am
Location: Sijsele, Belgium
Contact:

Dialog with timer bar

#1 Post by skiman »

Hi,

I want to display a message for a minimum time. I don't want a user can proceed immediately, but the message should remain 5 seconds. I have done this with a do while and with waitperiod(() (xbtools).

I was wondering if I could display some timer-bar in the messagebox.

I checked functions as dcmsgbox(). This would be usable if there would be some parameter as TIMESTOP where can be defined the minimum time.

Any ideas how I could implement this. If I add a progressbar to my dialog, I don't see how I can accomplish what I need. I use progressbars but they are never part of another dialog.
Best regards,

Chris.
www.aboservice.be

bwolfsohn
Posts: 649
Joined: Thu Jan 28, 2010 7:07 am
Location: Alachua, Florida USA
Contact:

Re: Dialog with timer bar

#2 Post by bwolfsohn »

how about:

DCMSGBOX "WARNING!! WARNING" TIMEOUT 10

will give you the timeout, but no progressbar..
Brian Wolfsohn
Retired and traveling around the country to music festivals in my RV.
OOPS.. Corona Virus, so NOT traveling right now...
http://www.breadmanrises.com
FB travel group: The Breadman Rises

User avatar
rdonnay
Site Admin
Posts: 4813
Joined: Wed Jan 27, 2010 6:58 pm
Location: Boise, Idaho USA
Contact:

Re: Dialog with timer bar

#3 Post by rdonnay »

Chris -

I'm not sure what you mean by a timer bar.
Are you saying that you want a progress bar and message that times out after a specified time?

Do you want it to be modal?
The eXpress train is coming - and it has more cars.

skiman
Posts: 1199
Joined: Thu Jan 28, 2010 1:22 am
Location: Sijsele, Belgium
Contact:

Re: Dialog with timer bar

#4 Post by skiman »

Hi Brian, Roger,

It is not the timeout I'm looking for.

I want to display a message which has to stay at least 5 seconds before the user can proceed. The message is for the accounting when there are open invoices. Users now say that they haven't seen the message because they click on OK before reading it. I want some kind of alert that remains 5 seconds before they can proceed. I do this now with a do while loop.

I would like to add some timer bar to my dialog. They can't proceed now with my do while waitperiod() ... enddo, but they don't see why. A timer bar would make this clear.
Best regards,

Chris.
www.aboservice.be

Wolfgang Ciriack
Posts: 484
Joined: Wed Jan 27, 2010 10:25 pm
Location: Berlin Germany

Re: Dialog with timer bar

#5 Post by Wolfgang Ciriack »

Hi,
can`t you use this ?

Code: Select all

dc_WaitOn("Wait......")
sleep(500)
dc_impl(cDialog)
_______________________
Best Regards
Wolfgang

skiman
Posts: 1199
Joined: Thu Jan 28, 2010 1:22 am
Location: Sijsele, Belgium
Contact:

Re: Dialog with timer bar

#6 Post by skiman »

Hi,

No, I don't want it to disappear after 5 seconds. It must stay on the screen untill the user clicks OK. If he clicks OK before 5 seconds, nothing may happen. After 5 seconds the OK should work. It's also possible that the user clicks only after 15 seconds.
Best regards,

Chris.
www.aboservice.be

User avatar
Tom
Posts: 1234
Joined: Thu Jan 28, 2010 12:59 am
Location: Berlin, Germany

Re: Dialog with timer bar

#7 Post by Tom »

Hi, Chris.

You may try this code. The main function is "MessageWithTimer". It has up to three parameters. If it fits your needs, you may replace "SetTimerEvent" by a thread.

Code: Select all

FUNCTION MessageWithTimer(nTimeOut,cMessage,cTimeOutMessage)
LOCAL GetList := {}, GetOptions := {}, oGroup

DCGET OPTIONS NOTITLEBAR

DEFAULT nTimeOut := 30, cMessage := 'Warning'

TimeOutMessage(nTimeOut)

@ 1,1 DCGROUP oGroup CAPTION 'Information' SIZE 60,4.5 NOTABSTOP
@ 1,1 DCSAY cMessage SIZE 58,3 PARENT oGroup ;
      SAYOPTIONS XBPALIGN_VCENTER+XBPALIGN_HCENTER+XBPSTATIC_TEXT_WORDBREAK


@ 6,1 DCSAY {||TimeOutMessage()} OBJECT oTimeOutMessage

@ 8,1 DCPUSHBUTTON CAPTION 'Close' SIZE 5,1 WHEN {||TimeOutDialogCanBeClosed()} ;
      ACTION {||DC_ReadGuiEvent(DCGUI_EXIT_OK,GetList)} OBJECT oCloseButton

DCREAD GUI TITLE 'Information' OPTIONS GetOptions FIT EVAL {||SetTimerEvent(100,{||DC_GetRefresh(GetList)})}

SetTimerEvent()

RETURN nil

FUNCTION TimeOutDialogCanBeClosed(lSet)
STATIC lCanBeClosed := .F.
IF PCount()>0
  lCanBeClosed := lSet
ENDIF
RETURN lCanBeClosed

FUNCTION TimeOutMessage(nSetSeconds)
STATIC nWaitSeconds, nSecondsAtStart
LOCAL cTimeOutMessage := 'Wait [TIMELEFT] seconds to close this dialog',nSecondsLeft
IF PCount() > 0
  TimeOutDialogCanBeClosed(.F.)
  nWaitSeconds := nSetSeconds
  nSecondsAtStart := Seconds()
ENDIF
IF Seconds()-nSecondsAtStart >= nWaitSeconds
  TimeOutDialogCanBeClosed(.T.)
  cTimeOutMessage := 'You may close the dialog now'
  ELSE
  nSecondsLeft := nWaitSeconds-(Seconds()-nSecondsAtStart)
  cTimeOutMessage := StrTran(cTimeOutMessage,'[TIMELEFT]',LTrim(Str(nSecondsLeft,5,0)))
ENDIF

RETURN cTimeOutMessage
The attached pictures show what the function does.
Attachments
chris2.jpg
chris2.jpg (10.29 KiB) Viewed 11677 times
chris1.jpg
chris1.jpg (10.16 KiB) Viewed 11677 times
Best regards,
Tom

"Did I offend you?"
"No."
"Okay, give me a second chance."

Cliff Wiernik
Posts: 605
Joined: Thu Jan 28, 2010 9:11 pm
Location: Steven Point, Wisconsin USA
Contact:

Re: Dialog with timer bar

#8 Post by Cliff Wiernik »

I also use a method which is a modification of dc_msgbox where the message is displayed until they enter a specific override key. That forces them to at least acknowledge that they had a message, pressing enter does not work:

Code: Select all

    
    DO WHILE !LB_MsgBoxOverride({'Transaction posted to non-existent account.; Press @ to continue and Check log.'},'Transaction Error','W','@')
    END DO


#define oYes         aLocals[1]
#define oNo          aLocals[2]
#define l_YesNo      aLocals[3]
#define oOk          aLocals[4]
#define o_Static     aLocals[5]
#define lExitStatus  aLocals[6]
#define cOverridekey aLocals[7]
#define l_Escape     aLocals[8]
#define l_EscHit     aLocals[9]

*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
*+      FUNCTION LB_MsgBoxOverRide(aMessage, cTitle, cSys_Icon, cOverKey)
*+
*+      // Function returns lExitStatus so it should be called from a while loop...
*+
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
FUNCTION LB_MsgBoxOverride ( aMessage, cTitle, cSys_Icon, cOverKey)

  LOCAL nWidth, i, oDlg, oXbp, oParent, oOwner, ;
        GetList := {}, GetOptions, aLocals[9], lOk, ;
        oAppFocus := SetAppFocus(), nLine, cKey

  lExitStatus := .F.
  cOverridekey := cOverKey

  IF Valtype( aMessage ) = 'C'
    aMessage := { aMessage }
  ENDIF
  
  DC_VALTYPE(  @aMessage,{},  @cTitle,DC_MsgBoxTitle(), @cSys_Icon,'', @cOverridekey,'@' )
  
  cTitle := cTitle + ' [ '+cOverridekey+' ]'                                      // PC CAW 10-13-09 display override key

  FOR i := 1 TO LEN(aMessage)
    aMessage[i] := DC_XtoC(aMessage[i])
  NEXT

  IF LEN(aMessage)>0
    CLEAR TYPEAHEAD
  ENDIF

  nWidth := 0
  FOR i := 1 TO LEN(aMessage)
    nWidth := MAX( nWidth, LEN(aMessage[i]) )
  NEXT

  nWidth := MAX(nWidth,LEN(cTitle)+4)

  @ 1,1 DCSTATIC TYPE XBPSTATIC_TYPE_SYSICON SIZE 5,1.5 ;
            CAPTION IIF(cSys_Icon = "I",XBPSTATIC_SYSICON_ICONINFORMATION,;
                                 IIF(cSys_Icon = "E",XBPSTATIC_SYSICON_ICONERROR,;
                                 IIF(cSys_Icon = "Q",XBPSTATIC_SYSICON_ICONQUESTION,;
                                 IIF(cSys_Icon = "W",XBPSTATIC_SYSICON_ICONWARNING,;
                                                     XBPSTATIC_SYSICON_ICONINFORMATION))))

  IF nWidth < 25
    nWidth := 20
  ENDIF
      
  nLine := 3.5

  IF LEN(aMessage) = 1                           // Don't center message if only one line   // PC CAW  changed to have blank line prior
    nLine++
    @ nLine, 1 DCSAY aMessage[1] SIZE 0,0 
    nLine++
  ELSE
    nLine++
    FOR i := 1 TO LEN(aMessage)
      @ nLine, 1 DCSAY aMessage[i] SIZE 0,0                                     // PC CAW 02-09-09 changed to left justify all lines
      nLine++
    NEXT
  ENDIF

  @ nLine,0 DCSTATIC TYPE XBPSTATIC_TYPE_TEXT SIZE 9, 1.3 OBJECT o_Static   

  @ 0, 0 DCPUSHBUTTON;
          CAPTION DC_LangMsg(DCMSG_OK) ;      // BITMAP_OK_1
          TABSTOP ;
          SIZE 9,1.3 ;
          PARENT o_Static ;
          OBJECT oOk ;
          ACTION {||PostAppEvent( xbeP_Close,nil,nil,oDlg )} ;
          EVAL {|o|SetAppFocus(o)}

  DCGETOPTIONS  ICON DC_IconDefault() ;
           NOMAXBUTTON NOMINBUTTON ;
           BUTTONALIGN DCGUI_BUTTONALIGN_CENTER ;
           FITPAD 10 ;
           HIDE

  DC_ClearEvents()

  DCREAD GUI FIT MODAL TITLE cTitle OPTIONS GetOptions ;
         SETAPPWINDOW        ;                                          // PC CAW 03-01-05 was not set for modal window
         HANDLER S_MsgBoxOverDlgHandler   REFERENCE aLocals ;
         ENTEREXIT ;
         PARENT @oDlg ;
         EVAL {|o|S_CenterStatic(o, aLocals), o:Show()}

  SetAppFocus(oAppFocus)

  RETURN lExitStatus

*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
*+      STATIC FUNCTION S_MsgBoxOverDlgHandler( nEvent, mp1, mp2, oXbp, oDlg,aGetlist, aLocals )
*+
*+
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
STATIC FUNCTION S_MsgBoxOverDlgHandler ( nEvent, mp1, mp2, oXbp, oDlg, GetList, aLocals )

  IF nEvent == xbeP_Keyboard .AND. !lExitStatus
    IF mp1 == ASC(cOverridekey)
      lExitStatus := .T.
    ELSE
      lExitStatus := .F.
    ENDIF
    SetAppFocus(oOk)
    PostAppEvent(xbeP_Keyboard,xbeK_ENTER,,oOk)
  ENDIF

RETURN DCGUI_NONE


skiman
Posts: 1199
Joined: Thu Jan 28, 2010 1:22 am
Location: Sijsele, Belgium
Contact:

Re: Dialog with timer bar

#9 Post by skiman »

Hi Tom, Cliff,

Thanks for the code. It looks as both are a solution. I will test them both to see what I can use.
Best regards,

Chris.
www.aboservice.be

Post Reply