183 lines
11 KiB
Plaintext
183 lines
11 KiB
Plaintext
{*************************************************************************}
|
||
{ }
|
||
{ MicroCalc Spread Sheet }
|
||
{ Version 2.0 }
|
||
{ }
|
||
{ This program is hereby donated to the public domain for non-commercial }
|
||
{ use only. }
|
||
{ }
|
||
{ The MicrCalc program has been included on our TURBO PASCAL disk for two}
|
||
{ reasons. One, as a sample program for you to study, modify, etc. and }
|
||
{ also as a usefull program that will meet the spread sheet needs of the }
|
||
{ majority of TURBO PASCAL users. }
|
||
{ }
|
||
{ Many users have expressed the neeed for more sample programs written in}
|
||
{ TURBO PASCAL for them to look at and study. While most of us will never}
|
||
{ take full advantage of the powers offered by the average spread sheet }
|
||
{ on the market these days. Thus, MicroCalc serves two usefull perposes. }
|
||
{ }
|
||
{ INSTRUCTIONS : }
|
||
{ 1. Compile this program using the TURBO.COM compiler. }
|
||
{ A. Type 'TURBO' <CARRIAGE RETURN> at the operating system command }
|
||
{ line. }
|
||
{ B. Type 'Y' to Include error messages }
|
||
{ C. Type 'W' for Workfile }
|
||
{ D. Type 'CALC' for Workfile name }
|
||
{ E. Type 'R' for run }
|
||
{ 2. If you receive a Compiler Overflow message - Error # 99 then }
|
||
{ A. follow steps A through D above }
|
||
{ B. Type 'O' for compiler Options }
|
||
{ C. Type 'C' for .COM file }
|
||
{ D. Type 'Q' to Quit compiler Options }
|
||
{ E. Type 'C' for Compile }
|
||
{ F. Type 'Q' to Quit TURBO PASCAL }
|
||
{ G. Type 'CALC' at the operating system command line. }
|
||
{ }
|
||
{*************************************************************************}
|
||
|
||
|
||
|
||
{*************************************************************************}
|
||
{ }
|
||
{ Main MicroCalc Module }
|
||
{ Last Modified 7-22-85 }
|
||
{ }
|
||
{ The MicroCalc program has been divided into several modules. Each }
|
||
{ module contains related routines, thus enabling the programmer to }
|
||
{ follow the code more easily. Following is a description of each of the }
|
||
{ modules : }
|
||
{ }
|
||
{ Module Name : Main MicroCalc Module }
|
||
{ FileName : CALC.PAS }
|
||
{ Contents : }
|
||
{ 1. Global Variable Declarations }
|
||
{ 2. Procedure Commands (* called when user types "/" *) }
|
||
{ 3. Main program body }
|
||
{ }
|
||
{ Module Name : MicroCalc Module 000 }
|
||
{ FileName : CALC.INC }
|
||
{ Contents : }
|
||
{ 1. Miscellaneous routines }
|
||
{ }
|
||
{ Module Name : MicroCalc Module 001 }
|
||
{ FileName : CALC.INC }
|
||
{ Contents : }
|
||
{ 1. Procedure Grid - Displays the spread sheet on the }
|
||
{ screen }
|
||
{ 2. Procedure Init - Initializes all cells in the spread }
|
||
{ sheet }
|
||
{ 3. Procedure Clear - clears the current spread sheet }
|
||
{ }
|
||
{ Module Name : MicroCalc Module 002 }
|
||
{ FileName : CALC.INC }
|
||
{ Contents : }
|
||
{ 1. Procedure DisplayType - indicates the type and }
|
||
{ contents of a cell }
|
||
{ 2. Cursor movement procedures - called when user presses }
|
||
{ the arrow keys }
|
||
{ }
|
||
{ Module Name : MicroCalc Module 003 }
|
||
{ FileName : CALC.INC }
|
||
{ Contents : }
|
||
{ 1. Procedures Load, Save and Print - Load a new spread }
|
||
{ sheet, Save the current spread sheet, and print the }
|
||
{ current spread sheet }
|
||
{ 2. Procedure Help - on line help system }
|
||
{ Special Note : If you are operating under MS/PC-DOS, you can take }
|
||
{ full advantage of DOS's filename ficilities by mod- }
|
||
{ -ifying line 56 (* remove comments *) }
|
||
{ }
|
||
{ Module Name : MicroCalc Module 004 }
|
||
{ FileName : CALC.PAS }
|
||
{ Contents : }
|
||
{ 1. Procedure Evaluate - Evaluates a string passed to it }
|
||
{ 2. Procedure ReCalculate - Recalculates each cell in the }
|
||
{ spread sheet }
|
||
{ }
|
||
{ Module Name : MicroCalc Module 005 }
|
||
{ File Name : CALC.PAS }
|
||
{ Contents : }
|
||
{ 1. Procedure GetCell - I/O routine that gets cell's }
|
||
{ contents from the user. }
|
||
{ 2. Procedure Format - allows user to format a range of }
|
||
{ cells. }
|
||
{ }
|
||
{*************************************************************************}
|
||
|
||
|
||
Program MicroCalc;
|
||
|
||
const
|
||
FXMax : Char = 'G'; { Maximum number of columns in spread sheet }
|
||
FYMax = 21; { Maximum number of lines in spread sheet }
|
||
EofLine = ^M;
|
||
Numbers : set of Char = ['0'..'9'];
|
||
|
||
type
|
||
Anystring = string[70];
|
||
String3 = string[3];
|
||
ColumnName = 'A'..'G';
|
||
Attributes = (Constant,Formula,Txt,OverWritten,Locked,Calculated);
|
||
SetOfAttri = Set of Attributes;
|
||
|
||
{ The spreadsheet is made out of cells. Each cell is defined as the }
|
||
{ following record: }
|
||
|
||
CellRec = record
|
||
CellStatus : set of Attributes; { Status of cell (see type def.) }
|
||
Contents : String[70]; { Contains a formula or some text }
|
||
Value : Real; { Last calculated cell value }
|
||
DEC, FW : 0..20; { Decimals and Cell Width }
|
||
end;
|
||
|
||
Cells = array['A'..'G',1..FYMax] of CellRec;
|
||
|
||
const
|
||
{Initialize the array XPOS to hold the left most position of each column.}
|
||
XPOS : array['A'..'G'] of Integer = (3,14,25,36,47,58,68);
|
||
|
||
var
|
||
Sheet : Cells; { Definition of the spread sheet }
|
||
FX : ColumnName; { Culumn of current cell }
|
||
FY : Integer; { Line of current cell }
|
||
Ch : Char; { Last read Character }
|
||
MCFile : file of CellRec; { File to store sheets in }
|
||
AutoCalc,
|
||
Form : boolean; { Recalculate after each entry? }
|
||
FileName : AnyString;
|
||
Line : string[100];
|
||
|
||
{$I CALC.INC}
|
||
|
||
{*************************************************************************}
|
||
{ THIS IS WHERE THE PROGRAM STARTS EXECUTING }
|
||
{*************************************************************************}
|
||
|
||
begin
|
||
Init; { 001 }
|
||
Welcome; { 001 }
|
||
ClrScr;
|
||
Grid; { 001 }
|
||
GotoCell(FX,FY); { 002 }
|
||
repeat
|
||
Read(KBD,Ch); { Read KeyBoard without echoing to screen }
|
||
if KeyPressed then { Check for remaining characters in buffer, }
|
||
begin { if a character remains then a key with an }
|
||
Read(KBD,Ch); { extended scan code was pressed. Thus, read }
|
||
IBMCh(Ch); { the second character. }
|
||
end;
|
||
case Ch of {Based on the value of Ch execute the appropriate routine. }
|
||
^E : MoveUp; { 002 }
|
||
^X, ^J : MoveDown; { 002 }
|
||
^D, ^M, ^F : MoveRight; { 002 }
|
||
^S, ^A : MoveLeft; { 002 }
|
||
'/' : Commands;
|
||
^[ : GetCell(FX,FY); { 004 }
|
||
else
|
||
if Ch in [' '..'~'] then
|
||
GetCell(FX,FY); { 005 }
|
||
end;
|
||
until True = False; { (program stops in procedure Commands) }
|
||
end.
|
||
|
||
|