rexx-things/modules/windows/oodialog/winsystem/quickCalc.rex
2025-03-12 20:50:48 +00:00

222 lines
8.4 KiB
Rexx
Executable File

/*----------------------------------------------------------------------------*/
/* */
/* Copyright (c) 2008-2014 Rexx Language Association. All rights reserved. */
/* */
/* This program and the accompanying materials are made available under */
/* the terms of the Common Public License v1.0 which accompanies this */
/* distribution. A copy is also available at the following address: */
/* https://www.oorexx.org/license.html */
/* */
/* Redistribution and use in source and binary forms, with or */
/* without modification, are permitted provided that the following */
/* conditions are met: */
/* */
/* Redistributions of source code must retain the above copyright */
/* notice, this list of conditions and the following disclaimer. */
/* Redistributions in binary form must reproduce the above copyright */
/* notice, this list of conditions and the following disclaimer in */
/* the documentation and/or other materials provided with the distribution. */
/* */
/* Neither the name of Rexx Language Association nor the names */
/* of its contributors may be used to endorse or promote products */
/* derived from this software without specific prior written permission. */
/* */
/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */
/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */
/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */
/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */
/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */
/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */
/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */
/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */
/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */
/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */
/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
/* */
/*----------------------------------------------------------------------------*/
/**
* Name: menuCalc.rex
* Type: Example ooRexx program
*
* Description: Demonstrates how to control an application programmatically
* using the winsystm classes. Does some simple calculations
* using the Windows Calculator application.
*
* This program is similar to userwmgr.rex but more simple to
* better show what is going on.
*
* This example uses some of the public functions provided by
* the windowsSystem.frm package. That framweowork is an
* example of how to extract common function into a package and
* share that function with any number of ooRexx programs.
*
* To really understand how this program works, you will need to examine the
* the code for the external functions in windowsSystem.frm.
*
* The table below lists the external functions and classes used in this
* program and shows where to go to examine the source code for them.
*
* External function Source
* ---------------------------------------------------
* errorDialog() ooDialog
* infoDialog() ooDialog
* getPathToSystemExec() windowsSystem.frm
* findTheWindow() windowsSystem.frm
*/
-- Get the complete path to the calculator executable. This ensures we start
-- the correct application.
calcExe = getPathToSystemExe("calc.exe")
-- Abort if we have an error.
if calcExe == .nil then do
msg = "Faild to locate a definitive path to the Windows" || '0d0a'x || -
"Calculator application. This sample can not execute."
return errorDialog(msg)
end
-- Start calculator as a separate process.
"start" calcExe
-- It takes some finite period of time for an application to start. This can
-- vary substantially depending on the system load. findTheWindow() allows for
-- this, but will eventually time out if the window can not be located.
calc = findTheWindow("Calculator")
if calc == .nil then do
msg = "Could not find the Calculator application window." || '0d0a0d0a'x || -
"This example program will have to abort."
return errorDialog(msg)
end
-- Make the calculator the top-most window.
calc~ToForeground
/* Each button in a dialog has a resource ID. When the button is pushed or
* clicked, the button sends a command (WM_COMMAND) notification to its parent
* window. The command notification contains the resource ID of the button that
* was pushed. This is how the dialog knows what button(s) the user pushes or
* clicks.
*
* We can simulate a user pushing buttons by sending commands to the dialog
* using the resource ID of the button we want pushed. Here we define variables
* with the IDs of some of the buttons in the calculator application. You can
* verify that these are the correct ID numbers by exploring the window hiearchy
* of the calculator application using the displayWindowTree.rex example program
* that is included with the ooRexx distribution.
*/
divide = 90
multiply = 91
plus = 92
minus = 93
equals = 112
clear = 81
memClear = 113
memReturn = 114
memSave = 115
zero = 124
one = 125
two = 126
three = 127
four = 128
five = 129
six = 130
seven = 131
eight = 132
nine = 133
-- We also want to get a WindowObject that represents the answer field in the
-- calculator application so that we can get the answer. It so happens that
-- this is the first child window of the calculator.
answerField = calc~firstChild
-- Check that we got the right window, abort on error. The answer field is a
-- window whose class is EDIT.
if \ answerField~isA(.WindowObject) | answerField~wClass \== "Edit" then do
msg = "Failed to locate the answer field in the Calculator application." || '0d0a0d0a'x || -
"This example program will have to abort."
j = errorDialog(msg)
-- Try to close the calculator application, although we may be hosed and this
-- won't work.
calc~sendSysCommand("Close")
return 99
end
-- We will calculate 10 * 16. After each button push we will pause a bit so
-- that the user can see the numbers appear on the calculator. Then we will get
-- the answer and display a message box showing the whole thing. This starts
-- our message.
msg = "10 * 16 ="
calc~sendCommand(one)
j = SysSleep(.5)
calc~sendCommand(zero)
j = SysSleep(.5)
calc~sendCommand(multiply)
j = SysSleep(.5)
calc~sendCommand(one)
j = SysSleep(.5)
calc~sendCommand(six)
j = SysSleep(.5)
calc~sendCommand(equals)
j = SysSleep(.5)
-- Now get the answer. The 'title' of a window is the text of the window. In
-- this case the 'title' of the answer field window is the answer of the
-- calculation.
msg = msg answerField~title
j = infoDialog(msg)
-- Push the clear button
calc~sendCommand(clear)
-- Do one more calculation.
msg = "(5 + 5) * 16 / (2 + 1) ="
calc~sendCommand(memClear)
calc~sendCommand(two)
j = SysSleep(.5)
calc~sendCommand(plus)
j = SysSleep(.5)
calc~sendCommand(one)
j = SysSleep(.5)
calc~sendCommand(equals)
j = SysSleep(.5)
calc~sendCommand(memSave)
calc~sendCommand(five)
j = SysSleep(.5)
calc~sendCommand(plus)
j = SysSleep(.5)
calc~sendCommand(five)
j = SysSleep(.5)
calc~sendCommand(equals)
j = SysSleep(.5)
calc~sendCommand(multiply)
j = SysSleep(.5)
calc~sendCommand(one)
j = SysSleep(.5)
calc~sendCommand(six)
j = SysSleep(.5)
calc~sendCommand(equals)
j = SysSleep(.5)
calc~sendCommand(divide)
calc~sendCommand(memReturn)
calc~sendCommand(equals)
-- Now get the answer.
msg = msg answerField~title
j = infoDialog(msg)
-- Close the calculator by pressing Close in the system menu.
calc~sendSysCommand("Close")
::requires 'windowsSystem.frm'