Process Pool Demo: Difference between revisions

m
Changed web property to regular property
m (Reverted Web property to normal property)
m (Changed web property to regular property)
Line 15: Line 15:
Use cRegistry.pkg
Use cRegistry.pkg
Use cIniFile.pkg
Use cIniFile.pkg
 
Define PROCESS_VM_READ          for |CI$0010
Define PROCESS_VM_READ          for |CI$0010
Define PROCESS_QUERY_INFORMATION for |CI$0400
Define PROCESS_QUERY_INFORMATION for |CI$0400
 
// Wrap all these in #IFNDEF/#ENDIF blocks to avoid any conflicts
// Wrap all these in #IFNDEF/#ENDIF blocks to avoid any conflicts
// with the same things already defined in the application
// with the same things already defined in the application
 
#IFNDEF get_GetLastError
#IFNDEF get_GetLastError
External_Function GetLastError "GetLastError" Kernal32.DLL Returns DWord
External_Function GetLastError "GetLastError" Kernal32.DLL Returns DWord
#ENDIF
#ENDIF
 
#IFNDEF get_GetCurrentProcessId
#IFNDEF get_GetCurrentProcessId
External_Function GetCurrentProcessId "GetCurrentProcessId" Kernel32.Dll Returns Integer
External_Function GetCurrentProcessId "GetCurrentProcessId" Kernel32.Dll Returns Integer
#ENDIF
#ENDIF
 
#IFNDEF get_EnumProcesses
#IFNDEF get_EnumProcesses
External_Function EnumProcesses "K32EnumProcesses" Kernel32.DLL ;
External_Function EnumProcesses "K32EnumProcesses" Kernel32.DLL ;
Line 37: Line 37:
     Returns Integer
     Returns Integer
#ENDIF
#ENDIF
 
 
#IFNDEF get_OpenProcess
#IFNDEF get_OpenProcess
External_Function OpenProcess "OpenProcess" Kernel32.Dll ;
External_Function OpenProcess "OpenProcess" Kernel32.Dll ;
Line 45: Line 45:
     Returns Handle
     Returns Handle
#ENDIF
#ENDIF
 
#IFNDEF get_ProcessHandle
#IFNDEF get_ProcessHandle
External_Function ProcessHandle "OpenProcess" Kernel32.DLL ;
External_Function ProcessHandle "OpenProcess" Kernel32.DLL ;
Line 53: Line 53:
     Returns Handle
     Returns Handle
#ENDIF
#ENDIF
   
   
#IFNDEF get_ProcessImageFileName
#IFNDEF get_ProcessImageFileName
External_Function ProcessImageFileName "K32GetProcessImageFileNameA" Kernel32.DLL ;
External_Function ProcessImageFileName "K32GetProcessImageFileNameA" Kernel32.DLL ;
Line 61: Line 61:
     Returns DWord
     Returns DWord
#ENDIF
#ENDIF
 
#IFNDEF _struct_stAllMyState
#IFNDEF _struct_stAllMyState
// Struct to hold state
// Struct to hold state
Line 75: Line 75:
End_Struct
End_Struct
#ENDIF
#ENDIF
 
#IFNDEF C_CRLF
#IFNDEF C_CRLF
// Just for formatting the result of the Yes/No cascade in this case:
// Just for formatting the result of the Yes/No cascade in this case:
Define C_CRLF for (Character(13) + Character(10))
Define C_CRLF for (Character(13) + Character(10))
#ENDIF
#ENDIF
 
// The following items will (almost always) have different values in
// The following items will (almost always) have different values in
// different processes in the WebApp process pool, but will remain static
// different processes in the WebApp process pool, but will remain static
// in any given process.
// in any given process.
 
Global_Variable Integer giRandom
Global_Variable Integer giRandom
Move (Random(10000)) to giRandom
Move (Random(10000)) to giRandom
 
// This will be a property of oWabApp:
// This will be a property of oWabApp:
Property Integer piRandom (Random(10000) + 10000)
Property Integer piRandom (Random(10000) + 10000)
 
// Will be opened in the WebApp
// Will be opened in the WebApp
Open Flexerrs
Open Flexerrs
Line 96: Line 96:
Move (Random(99) + 1) to Flexerrs.Recnum
Move (Random(99) + 1) to Flexerrs.Recnum
Find EQ FlexErrs by Recnum
Find EQ FlexErrs by Recnum
 
//==============================================================================
//==============================================================================
// This is a Modal Dialog which will be called from the View,
// This is a Modal Dialog which will be called from the View,
Line 108: Line 108:
     Set pbShowClose to False        // is to click "OK"
     Set pbShowClose to False        // is to click "OK"
     Set pbServerOnSubmit to True    // enable the OnSubmit event
     Set pbServerOnSubmit to True    // enable the OnSubmit event
   
   
     Object oMainPanel is a cWebPanel
     Object oMainPanel is a cWebPanel
         Set piColumnCount to 12
         Set piColumnCount to 12
       
       
         Object oProcess is a cWebForm
         Object oProcess is a cWebForm
             Set piColumnSpan to 0
             Set piColumnSpan to 0
Line 119: Line 119:
             Set piLabelOffset to 210
             Set piLabelOffset to 210
         End_Object
         End_Object
       
       
         Object oCaller is a cWebForm
         Object oCaller is a cWebForm
             Set piColumnSpan to 0
             Set piColumnSpan to 0
Line 127: Line 127:
             Set piLabelOffset to 210
             Set piLabelOffset to 210
         End_Object
         End_Object
       
       
         Object oGlobal is a cWebForm
         Object oGlobal is a cWebForm
             Set piColumnSpan to 0
             Set piColumnSpan to 0
Line 135: Line 135:
             Set piLabelOffset to 210
             Set piLabelOffset to 210
         End_Object
         End_Object
               
               
         Object oRegProp is a cWebForm
         Object oRegProp is a cWebForm
             Set piColumnSpan to 0
             Set piColumnSpan to 0
Line 143: Line 143:
             Set piLabelOffset to 210
             Set piLabelOffset to 210
         End_Object
         End_Object
               
               
     End_Object  
     End_Object
   
   
     Object oBottomPanel is a cWebPanel
     Object oBottomPanel is a cWebPanel
         Set piColumnCount to 4
         Set piColumnCount to 4
         Set peRegion to prBottom
         Set peRegion to prBottom
 
         Object oOkButton is a cWebButton
         Object oOkButton is a cWebButton
             Set psCaption to C_$OK
             Set psCaption to C_$OK
             Set piColumnSpan to 1
             Set piColumnSpan to 1
             Set piColumnIndex to 3
             Set piColumnIndex to 3
 
             Procedure OnClick
             Procedure OnClick
                 Send Ok
                 Send Ok
             End_Procedure
             End_Procedure
           
           
         End_Object  
         End_Object
 
     End_Object  
     End_Object
 
     Procedure OnSubmit
     Procedure OnSubmit
         Send Ok
         Send Ok
     End_Procedure
     End_Procedure
   
   
     Procedure PopupTheDialog  Handle hReturnObj Integer iCaller
     Procedure PopupTheDialog  Handle hReturnObj Integer iCaller
         Send Popup hReturnObj
         Send Popup hReturnObj
       
       
         WebSet psValue of oProcess to (GetCurrentProcessId())
         WebSet psValue of oProcess to (GetCurrentProcessId())
         WebSet psValue of oCaller  to iCaller
         WebSet psValue of oCaller  to iCaller
Line 175: Line 175:
         WebSet psValue of oRegProp to (piRandom(Self))
         WebSet psValue of oRegProp to (piRandom(Self))
     End_Procedure
     End_Procedure
 
     Function DialogResult Returns String
     Function DialogResult Returns String
         String sResult
         String sResult
       
       
         WebGet psValue of oProcess to sResult
         WebGet psValue of oProcess to sResult
         Function_Return sResult
         Function_Return sResult
     End_Function
     End_Function
 
End_Object
End_Object
 
//==============================================================================
//==============================================================================
// This is the actual view
// This is the actual view
Line 192: Line 192:
     Set psCaption to "Process Pooling Effects Demo"
     Set psCaption to "Process Pooling Effects Demo"
     Set pbServerOnShow to True
     Set pbServerOnShow to True
   
   
    { WebProperty=Client }
     Property Integer[] paiWebAppProcs
     Property Integer[] paiWebAppProcs
 
     // Display this view at start up:
     // Display this view at start up:
     Delegate Set phoDefaultView to Self
     Delegate Set phoDefaultView to Self
   
   
     // Work out the web application name from the WebServiceDispatcher.wo
     // Work out the web application name from the WebServiceDispatcher.wo
     // file in AppHTML, which we treat like a .ini file
     // file in AppHTML, which we treat like a .ini file
Line 204: Line 203:
         Handle hoIni
         Handle hoIni
         String sName
         String sName
       
       
         Get Create (RefClass(cIniFile)) to hoIni
         Get Create (RefClass(cIniFile)) to hoIni
         Set psFileName of hoIni to ;
         Set psFileName of hoIni to ;
Line 213: Line 212:
         Function_Return sName
         Function_Return sName
     End_Function
     End_Function
   
   
     // Will be set to return value of above function at start-up.
     // Will be set to return value of above function at start-up.
     // This is a regular property because the web app name can't
     // This is a regular property because the web app name can't
Line 252: Line 251:
         UChar[]    ucaFile
         UChar[]    ucaFile
         String    sPath sImage
         String    sPath sImage
       
       
         Move (Uppercase(GetApplicationFileName(ghoApplication)))   to sPath
         Move (Uppercase(GetApplicationFileName(ghoApplication))) to sPath
         // Strip off drive designation:
         // Strip off drive designation:
         Move (Pos("\", sPath))                                     to iPos
         Move (Pos("\", sPath))                                 to iPos
         Move (Right(sPath, (Length(sPath) - iPos)))                 to sPath
         Move (Right(sPath, (Length(sPath) - iPos)))             to sPath
         Move (Length(sPath))                                       to iPathLen
         Move (Length(sPath))                                   to iPathLen
         Move 4096                                                   to iSize
         Move 4096                                               to iSize
 
         Move (ResizeArray(auiProcs, iSize))                         to auiProcs
         Move (ResizeArray(auiProcs, iSize))                     to auiProcs
         Move (iSize * SizeOfType(UInteger))                         to uiCb
         Move (iSize * SizeOfType(UInteger))                     to uiCb
         Move 0                                                     to uiNeeded
         Move 0                                                 to uiNeeded
 
         Move (EnumProcesses(AddressOf(auiProcs), ;
         Move (EnumProcesses(AddressOf(auiProcs), ;
                             uiCb, ;
                             uiCb, ;
                             AddressOf(uiNeeded)))                   to iOK
                             AddressOf(uiNeeded)))               to iOK
       
       
         // Just for debugging:
         // Just for debugging:
         If not iOK ;
         If not iOK ;
             Move (GetLastError())                                   to uiErr
             Move (GetLastError())                               to uiErr
       
       
         Move (uiNeeded / SizeOfType(UInteger))                     to iSize
         Move (uiNeeded / SizeOfType(UInteger))                 to iSize
         Move (ResizeArray(auiProcs, iSize))                         to auiProcs
         Move (ResizeArray(auiProcs, iSize))                     to auiProcs
         Decrement iSize
         Decrement iSize
       
       
         For i from 0 to iSize
         For i from 0 to iSize
             Move (OpenProcess(PROCESS_VM_READ + PROCESS_QUERY_INFORMATION, ;
             Move (OpenProcess(PROCESS_VM_READ + PROCESS_QUERY_INFORMATION, ;
                                                     True, auiProcs[i])) to hProc
                                                     True, auiProcs[i])) to hProc
           
           
             If (hProc <> 0) Begin  // We DID get a handle to the process
             If (hProc <> 0) Begin  // We DID get a handle to the process
                 Move (ResizeArray(ucaFile, 0))                         to ucaFile
                 Move (ResizeArray(ucaFile, 0))                 to ucaFile
                 Move (ResizeArray(ucaFile, 2048))                       to ucaFile
                 Move (ResizeArray(ucaFile, 2048))               to ucaFile
                 Move (ProcessImageFileName(hProc, ;
                 Move (ProcessImageFileName(hProc, ;
                       AddressOf(ucaFile), 2048))                       to uiSize
                       AddressOf(ucaFile), 2048))               to uiSize
                 Move (ResizeArray(ucaFile, uiSize))                     to ucaFile
                 Move (ResizeArray(ucaFile, uiSize))             to ucaFile
                 Move (Uppercase(UCharArrayToString(ucaFile)))           to sImage
                 Move (Uppercase(UCharArrayToString(ucaFile)))   to sImage
                 Move (Right(sImage, iPathLen))                         to sImage
                 Move (Right(sImage, iPathLen))                 to sImage
               
               
                 If (sImage = sPath) ;
                 If (sImage = sPath) ;
                     Move auiProcs[i] to aiWebAppProcs[SizeOfArray(aiWebAppProcs)]     
                     Move auiProcs[i] to aiWebAppProcs[SizeOfArray(aiWebAppProcs)]     
             End
             End
           
           
         Loop
         Loop
       
       
         WebSet paiWebAppProcs to aiWebAppProcs
         Set paiWebAppProcs to aiWebAppProcs
     End_Procedure
     End_Procedure
   
   
     Procedure OnShow
     Procedure OnShow
         Send UpdateProcInfo
         Send UpdateProcInfo
     End_Procedure
     End_Procedure
   
   
     // Registry object for getting the WebApp info from the registry:
     // Registry object for getting the WebApp info from the registry:
     Object oReg is a cRegistry
     Object oReg is a cRegistry
         Set phRootKey to HKEY_LOCAL_MACHINE
         Set phRootKey to HKEY_LOCAL_MACHINE
         Set pfAccessRights to Key_Read
         Set pfAccessRights to Key_Read
       
       
         Function BaseKey Returns String
         Function BaseKey Returns String
             String[] asParts
             String[] asParts
           
           
             Move "SOFTWARE"                to asParts[0]
             Move "SOFTWARE"                to asParts[0]
             Move "Data Access Worldwide"    to asParts[1]
             Move "Data Access Worldwide"    to asParts[1]
Line 316: Line 315:
             Move "WebApp Server"            to asParts[4]
             Move "WebApp Server"            to asParts[4]
             Move "Web Applications"        to asParts[5]
             Move "Web Applications"        to asParts[5]
           
           
             // If it is a 64-bit machine:
             // If it is a 64-bit machine:
             If (KeyExists(Self, "SOFTWARE\Wow6432Node")) ;
             If (KeyExists(Self, "SOFTWARE\Wow6432Node")) ;
                 Move (InsertInArray(asParts, 1, "Wow6432Node")) to asParts
                 Move (InsertInArray(asParts, 1, "Wow6432Node")) to asParts
           
           
             Function_Return (StrJoinFromArray(asParts, "\"))
             Function_Return (StrJoinFromArray(asParts, "\"))
         End_Function
         End_Function
       
       
         Function DWKeyValue String sApp String sVal Returns Integer
         Function DWKeyValue String sApp String sVal Returns Integer
             Boolean bOK
             Boolean bOK
             Integer iVal
             Integer iVal
             String  sKey
             String  sKey
           
           
             Move (BaseKey(Self) + "\" + sApp)  to sKey
             Move (BaseKey(Self) + "\" + sApp)  to sKey
             Get KeyExists sKey                  to bOK
             Get KeyExists sKey                  to bOK
   
   
             If not bOK ;
             If not bOK ;
                 Function_Return 0
                 Function_Return 0
           
           
             Get OpenKey sKey to bOK
             Get OpenKey sKey to bOK
           
           
             If not bOK ;
             If not bOK ;
                 Function_Return 0
                 Function_Return 0
               
               
             Move (ReadDWord(Self, sVal)) to iVal
             Move (ReadDWord(Self, sVal)) to iVal
             Send CloseKey
             Send CloseKey
           
           
             Function_Return iVal
             Function_Return iVal
         End_Function
         End_Function
       
       
     End_Object
     End_Object
   
   
     // Refresh all the displayed information
     // Refresh all the displayed information
     Procedure UpdateProcInfo
     Procedure UpdateProcInfo
         String  sApp
         String  sApp
         Integer iMin iMax
         Integer iMin iMax
       
       
         Get psWebAppName                to sApp
         Get psWebAppName                to sApp
         WebSet psValue of oMinProc      to (DWKeyValue(oReg(Self), sApp, "MinPool"))
         WebSet psValue of oMinProc      to (DWKeyValue(oReg(Self), sApp, "MinPool"))
         WebSet psValue of oMaxProc      to (DWKeyValue(oReg(Self), sApp, "MaxPool"))
         WebSet psValue of oMaxProc      to (DWKeyValue(oReg(Self), sApp, "MaxPool"))
         WebSet psValue of oCurrProcs    to "Unknown"
         WebSet psValue of oCurrProcs    to "Unknown"
       
       
         WebSet psValue of oCurrProcess  to (GetCurrentProcessId())
         WebSet psValue of oCurrProcess  to (GetCurrentProcessId())
         WebSet psValue of oGlobalVal    to giRandom
         WebSet psValue of oGlobalVal    to giRandom
         WebSet psValue of oRegProp      to (piRandom(Self))
         WebSet psValue of oRegProp      to (piRandom(Self))
         WebSet psValue of oDBRec        to FlexErrs.Recnum
         WebSet psValue of oDBRec        to FlexErrs.Recnum
       
       
         Send FindWebAppProcs
         Send FindWebAppProcs
         Send GridRefresh of oProcList
         Send GridRefresh of oProcList
         Send Focus of oCallServer
         Send Focus of oCallServer
     End_Procedure
     End_Procedure
       
       
     Object oWebMainPanel is a cWebPanel
     Object oWebMainPanel is a cWebPanel
         Set piColumnCount to 8
         Set piColumnCount to 8
       
       
         Object oExplanation is a cWebLabel
         Object oExplanation is a cWebLabel
             Set piColumnSpan to 0
             Set piColumnSpan to 0
Line 385: Line 384:
                 ' MUST test Web Apps OUTSIDE the debugger.')
                 ' MUST test Web Apps OUTSIDE the debugger.')
         End_Object
         End_Object
               
               
         Object oProcPoolGrp is a cWebGroup
         Object oProcPoolGrp is a cWebGroup
             Set piColumnCount to 8
             Set piColumnCount to 8
             Set piColumnSpan to 0
             Set piColumnSpan to 0
             Set psCaption to "Process Pool Information:"
             Set psCaption to "Process Pool Information:"
           
           
             Object oPoolInfo is a cWebGroup
             Object oPoolInfo is a cWebGroup
                 Set pbShowBorder to False
                 Set pbShowBorder to False
Line 396: Line 395:
                 Set piColumnCount to 12
                 Set piColumnCount to 12
                 Set piColumnSpan to 6
                 Set piColumnSpan to 6
               
               
                 Object oAppName is a cWebForm
                 Object oAppName is a cWebForm
                     Set piColumnSpan to 0
                     Set piColumnSpan to 0
Line 404: Line 403:
                     Set psValue to (psWebAppName(Self))
                     Set psValue to (psWebAppName(Self))
                 End_Object
                 End_Object
           
           
                 Object oMinProc is a cWebForm
                 Object oMinProc is a cWebForm
                     Set piColumnSpan to 5
                     Set piColumnSpan to 5
Line 411: Line 410:
                     Set psLabel to "Minimum Pool:"
                     Set psLabel to "Minimum Pool:"
                 End_Object
                 End_Object
               
               
                 Object oMaxProc is a cWebForm
                 Object oMaxProc is a cWebForm
                     Set piColumnSpan to 5
                     Set piColumnSpan to 5
Line 418: Line 417:
                     Set psLabel to "Maximum Pool:"
                     Set psLabel to "Maximum Pool:"
                 End_Object
                 End_Object
               
               
                 Object oCurrProcs is a cWebForm
                 Object oCurrProcs is a cWebForm
                     Set piColumnSpan to 5
                     Set piColumnSpan to 5
Line 425: Line 424:
                     Set psLabel to "Current Pool:"
                     Set psLabel to "Current Pool:"
                 End_Object
                 End_Object
               
               
             End_Object
             End_Object
           
           
             Object oProcList is a cWebList
             Object oProcList is a cWebList
                 Set piColumnIndex to 6
                 Set piColumnIndex to 6
Line 435: Line 434:
                 // Adjust this to see more/less process numbers without scrolling:
                 // Adjust this to see more/less process numbers without scrolling:
                 Set piHeight to 200
                 Set piHeight to 200
 
                 Object oProcsCol is a cWebColumn
                 Object oProcsCol is a cWebColumn
                     Set psCaption to "Pool Process IDs"
                     Set psCaption to "Pool Process IDs"
                     Set piWidth to 100
                     Set piWidth to 100
                 End_Object
                 End_Object
               
               
                 Procedure OnManualLoadData tWebRow[] ByRef aTheRows String ByRef sCurrentRowID
                 Procedure OnManualLoadData tWebRow[] ByRef aTheRows String ByRef sCurrentRowID
                     Integer[] aiWebProcs
                     Integer[] aiWebProcs
                     Integer i iLast iThis
                     Integer i iLast iThis
                   
                   
                     WebGet paiWebAppProcs of oProcPoolDemo to aiWebProcs
                     Get paiWebAppProcs of oProcPoolDemo to aiWebProcs
                     Move (GetCurrentProcessId())           to iThis
                     Move (GetCurrentProcessId())       to iThis
                   
                   
                     Move (SizeOfArray(aiWebProcs))         to iLast
                     Move (SizeOfArray(aiWebProcs))     to iLast
                     WebSet psValue of oCurrProcs           to iLast
                     WebSet psValue of oCurrProcs       to iLast
                     Decrement iLast
                     Decrement iLast
                   
                   
                     For i from 0 to iLast
                     For i from 0 to iLast
                         Move aiWebProcs[i] to aTheRows[i].sRowID
                         Move aiWebProcs[i] to aTheRows[i].sRowID
                         Move aiWebProcs[i] to aTheRows[i].aCells[0].sValue
                         Move aiWebProcs[i] to aTheRows[i].aCells[0].sValue
                       
                       
                         If (aiWebProcs[i] = iThis) Begin
                         If (aiWebProcs[i] = iThis) Begin
                             Move aiWebProcs[i] to sCurrentRowID
                             Move aiWebProcs[i] to sCurrentRowID
                         End
                         End
                       
                       
                     Loop
                     Loop
                   
                   
                     Forward Send OnManualLoadData (&aTheRows) (&sCurrentRowID)
                     Forward Send OnManualLoadData (&aTheRows) (&sCurrentRowID)
                 End_Procedure
                 End_Procedure
               
               
             End_Object
             End_Object
           
           
         End_Object
         End_Object
       
       
         Object oCurrProcess is a cWebForm
         Object oCurrProcess is a cWebForm
             Set piColumnIndex to 0
             Set piColumnIndex to 0
Line 477: Line 476:
             Set piLabelOffset to 250
             Set piLabelOffset to 250
         End_Object
         End_Object
       
       
         Object oGlobalVal is a cWebForm
         Object oGlobalVal is a cWebForm
             Set piColumnIndex to 0
             Set piColumnIndex to 0
Line 486: Line 485:
             Set piLabelOffset to 250
             Set piLabelOffset to 250
         End_Object
         End_Object
 
         Object oRegProp is a cWebForm
         Object oRegProp is a cWebForm
             Set piColumnIndex to 0
             Set piColumnIndex to 0
Line 495: Line 494:
             Set piLabelOffset to 250
             Set piLabelOffset to 250
         End_Object
         End_Object
 
         Object oDBRec is a cWebForm
         Object oDBRec is a cWebForm
             Set piColumnIndex to 0
             Set piColumnIndex to 0
Line 504: Line 503:
             Set piLabelOffset to 250
             Set piLabelOffset to 250
         End_Object
         End_Object
 
         Object oWebValue is a cWebForm
         Object oWebValue is a cWebForm
             Set piColumnIndex to 0
             Set piColumnIndex to 0
Line 513: Line 512:
             Set piLabelOffset to 250
             Set piLabelOffset to 250
         End_Object
         End_Object
       
       
         Object oNote is a cWebLabel
         Object oNote is a cWebLabel
             Set psCaption to "(This is a web property - psValue of oWebValue - so will not change unless YOU change it)"
             Set psCaption to "(This is a web property - psValue of oWebValue - so will not change unless YOU change it)"
Line 519: Line 518:
             Set piColumnSpan to 4
             Set piColumnSpan to 4
         End_Object
         End_Object
       
       
         Object oButtonSpacer is a cWebSpacer
         Object oButtonSpacer is a cWebSpacer
             Set piHeight to 20
             Set piHeight to 20
         End_Object
         End_Object
       
       
         Object oCallServer is a cWebButton
         Object oCallServer is a cWebButton
             Set piColumnIndex to 0
             Set piColumnIndex to 0
             Set piColumnSpan to 2
             Set piColumnSpan to 2
             Set psCaption to "Call Server"
             Set psCaption to "Call Server"
           
           
             Procedure OnClick
             Procedure OnClick
                 Send UpdateProcInfo
                 Send UpdateProcInfo
             End_Procedure
             End_Procedure
           
           
         End_Object
         End_Object
                   
                   
         Object oInfo is a cWebButton
         Object oInfo is a cWebButton
             Set piColumnIndex to 2
             Set piColumnIndex to 2
             Set piColumnSpan to 2
             Set piColumnSpan to 2
             Set psCaption to "Info Box"
             Set psCaption to "Info Box"
           
           
             Procedure OnClick
             Procedure OnClick
                 Integer iProc
                 Integer iProc
               
               
                 Move (GetCurrentProcessId()) to iProc
                 Move (GetCurrentProcessId()) to iProc
                 Send ShowInfoBox ("InfoBox in process" * String(iProc))
                 Send ShowInfoBox ("InfoBox in process" * String(iProc))
                 Send UpdateProcInfo
                 Send UpdateProcInfo
             End_Procedure
             End_Procedure
           
           
         End_Object
         End_Object
       
       
         Object oYesNo is a cWebButton
         Object oYesNo is a cWebButton
             Set piColumnIndex to 4
             Set piColumnIndex to 4
             Set piColumnSpan to 2
             Set piColumnSpan to 2
             Set psCaption to "Yes/No"
             Set psCaption to "Yes/No"
           
           
             // Web Property to hold state between browser/server round-trips
             // Web Property to hold state between browser/server round-trips
             { WebProperty=Client }
             { WebProperty=Client }
             Property stAllMyState ptState
             Property stAllMyState ptState
           
           
             // Is called in response to user's second answer:
             // Is called in response to user's second answer:
             Procedure ProcessSecondAnswer Integer eAnswer
             Procedure ProcessSecondAnswer Integer eAnswer
                 stAllMyState tState
                 stAllMyState tState
                 String[]    asInfo
                 String[]    asInfo
 
                 WebGet ptState                              to tState
                 WebGet ptState                              to tState
                 Move (GetCurrentProcessId())                to tState.iProc3
                 Move (GetCurrentProcessId())                to tState.iProc3
                 Move (CurrentDateTime())                    to tState.tmAnswered2
                 Move (CurrentDateTime())                    to tState.tmAnswered2
                 Move (If((eAnswer = cmYes), "Yes", "No"))  to tState.SecondAnswer
                 Move (If((eAnswer = cmYes), "Yes", "No"))  to tState.SecondAnswer
               
               
                 // Assemble results:
                 // Assemble results:
                 Move ("You clicked the 'Yes/No' button at" * String(tState.tmClicked) * ;
                 Move ("You clicked the 'Yes/No' button at" * String(tState.tmClicked) * ;
Line 581: Line 580:
                     "in process" * String(tState.iProc3)) ;
                     "in process" * String(tState.iProc3)) ;
                                                     to asInfo[SizeOfArray(asInfo)]
                                                     to asInfo[SizeOfArray(asInfo)]
               
               
                 Send ShowInfoBox (StrJoinFromArray(asInfo, C_CRLF)) "Results"
                 Send ShowInfoBox (StrJoinFromArray(asInfo, C_CRLF)) "Results"
               
               
                 Send UpdateProcInfo
                 Send UpdateProcInfo
             End_Procedure
             End_Procedure
             WebPublishProcedure ProcessSecondAnswer  // Publish the proc to receive control after second answer
             WebPublishProcedure ProcessSecondAnswer  // Publish the proc to receive control after second answer
           
           
             // Is called in response to user's first answer:
             // Is called in response to user's first answer:
             Procedure ProcessFirstAnswer  Integer eAnswer
             Procedure ProcessFirstAnswer  Integer eAnswer
                 stAllMyState tState
                 stAllMyState tState
               
               
                 WebGet ptState to tState
                 WebGet ptState to tState
               
               
                 Move (GetCurrentProcessId())                to tState.iProc2
                 Move (GetCurrentProcessId())                to tState.iProc2
                 Move (CurrentDateTime())                    to tState.tmAnswered1
                 Move (CurrentDateTime())                    to tState.tmAnswered1
                 Move (If((eAnswer = cmYes), "Yes", "No"))  to tState.sFirstAswer
                 Move (If((eAnswer = cmYes), "Yes", "No"))  to tState.sFirstAswer
                 WebSet ptState                              to tState
                 WebSet ptState                              to tState
               
               
                 Send ShowYesNo Self (RefProc(ProcessSecondAnswer)) ;
                 Send ShowYesNo Self (RefProc(ProcessSecondAnswer)) ;
                     ("Do you REALLY want to do this? (Proc:" * String(tState.iProc2) + ")") ;
                     ("Do you REALLY want to do this? (Proc:" * String(tState.iProc2) + ")") ;
Line 604: Line 603:
             End_Procedure
             End_Procedure
             WebPublishProcedure ProcessFirstAnswer  // Publish the proc to receive control after first answer
             WebPublishProcedure ProcessFirstAnswer  // Publish the proc to receive control after first answer
           
           
             // Triggers the question cascade:
             // Triggers the question cascade:
             Procedure OnClick
             Procedure OnClick
                 stAllMyState tState
                 stAllMyState tState
               
               
                 Move (CurrentDateTime())        to tState.tmClicked
                 Move (CurrentDateTime())        to tState.tmClicked
                 Move (GetCurrentProcessId())    to tState.iProc1
                 Move (GetCurrentProcessId())    to tState.iProc1
                 WebSet ptState                  to tState
                 WebSet ptState                  to tState
               
               
                 Send ShowYesNo Self (RefProc(ProcessFirstAnswer)) ;
                 Send ShowYesNo Self (RefProc(ProcessFirstAnswer)) ;
                     ("Do you want to do this? (Proc:" * String(tState.iProc1) + ")") ;
                     ("Do you want to do this? (Proc:" * String(tState.iProc1) + ")") ;
                     "First question"
                     "First question"
             End_Procedure
             End_Procedure
           
           
         End_Object
         End_Object
       
       
         Object oDialog is a cWebButton
         Object oDialog is a cWebButton
             Set piColumnIndex to 6
             Set piColumnIndex to 6
             Set piColumnSpan to 2
             Set piColumnSpan to 2
             Set psCaption to "Popup Dialog"
             Set psCaption to "Popup Dialog"
           
           
             Procedure OnCloseModalDialog Handle hoModalDialog
             Procedure OnCloseModalDialog Handle hoModalDialog
                 Integer iProc1 iProc2
                 Integer iProc1 iProc2
               
               
                 If (hoModalDialog = oTestDialog) Begin
                 If (hoModalDialog = oTestDialog) Begin
                     Get DialogResult of oTestDialog to iProc1
                     Get DialogResult of oTestDialog to iProc1
Line 634: Line 633:
                         ("Dialog in process" * String(iProc1) + C_CRLF + ;
                         ("Dialog in process" * String(iProc1) + C_CRLF + ;
                         "Returned to process" * String(iProc2)) "Result"
                         "Returned to process" * String(iProc2)) "Result"
 
                     Send UpdateProcInfo
                     Send UpdateProcInfo
                 End
                 End
               
               
             End_Procedure
             End_Procedure
           
           
             Procedure OnClick
             Procedure OnClick
                 Send PopupTheDialog of oTestDialog Self (GetCurrentProcessId())
                 Send PopupTheDialog of oTestDialog Self (GetCurrentProcessId())
             End_Procedure
             End_Procedure
           
           
         End_Object
         End_Object
       
       
     End_Object  
     End_Object
 
End_Object
End_Object
</source>
</source>


[[Category: Web Applications]]
[[Category: Web Applications]]